import { Button } from "@mui/joy"; import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { toast } from "react-hot-toast"; import { deleteWorkspaceUser } from "../helpers/api"; import useLoading from "../hooks/useLoading"; import { workspaceService } from "../services"; import { useAppSelector } from "../store"; import { unknownWorkspace, unknownWorkspaceUser } from "../store/modules/workspace"; import { showCommonDialog } from "./Alert"; import Icon from "./Icon"; import CreateWorkspaceDialog from "./CreateWorkspaceDialog"; import UpsertWorkspaceUserDialog from "./UpsertWorkspaceUserDialog"; import MemberListView from "./MemberListView"; interface Props { workspaceId: WorkspaceId; } interface State { showEditWorkspaceDialog: boolean; showUpsertWorkspaceUserDialog: boolean; } const WorkspaceSetting: React.FC = (props: Props) => { const { workspaceId } = props; const navigate = useNavigate(); const user = useAppSelector((state) => state.user.user) as User; const [state, setState] = useState({ showEditWorkspaceDialog: false, showUpsertWorkspaceUserDialog: false, }); const { workspaceList } = useAppSelector((state) => state.workspace); const loadingState = useLoading(); const workspace = workspaceList.find((workspace) => workspace.id === workspaceId) ?? unknownWorkspace; const workspaceUser = workspace.workspaceUserList.find((workspaceUser) => workspaceUser.userId === user.id) ?? unknownWorkspaceUser; useEffect(() => { const workspace = workspaceService.getWorkspaceById(workspaceId); if (!workspace) { toast.error("workspace not found"); return; } loadingState.setFinish(); }, []); const handleEditWorkspaceButtonClick = () => { setState({ ...state, showEditWorkspaceDialog: true, }); }; const handleUpsertWorkspaceMemberButtonClick = () => { setState({ ...state, showUpsertWorkspaceUserDialog: true, }); }; const handleEditWorkspaceDialogConfirm = async () => { setState({ ...state, showEditWorkspaceDialog: false, }); const workspace = await workspaceService.fetchWorkspaceById(workspaceId); navigate(`/${workspace.name}#setting`); }; const handleDeleteWorkspaceButtonClick = () => { showCommonDialog({ title: "Delete Workspace", content: `Are you sure to delete workspace \`${workspace.name}\`?`, style: "danger", onConfirm: async () => { await workspaceService.deleteWorkspaceById(workspace.id); navigate("/"); }, }); }; const handleExitWorkspaceButtonClick = () => { showCommonDialog({ title: "Exit Workspace", content: `Are you sure to exit workspace \`${workspace.name}\`?`, style: "danger", onConfirm: async () => { await deleteWorkspaceUser({ workspaceId: workspace.id, userId: workspaceUser.userId, }); navigate("/"); }, }); }; return ( <>
General

ID: {workspace.name}

Name: {workspace.title}

Description: {workspace.description || "No description."}

{workspaceUser.role === "ADMIN" && (
)}
Members {workspaceUser.role === "ADMIN" && ( )}
Danger Zone
{workspaceUser.role === "ADMIN" ? ( <> ) : ( <> )}
{state.showEditWorkspaceDialog && ( { setState({ ...state, showEditWorkspaceDialog: false, }); }} onConfirm={() => handleEditWorkspaceDialogConfirm()} /> )} {state.showUpsertWorkspaceUserDialog && ( { setState({ ...state, showUpsertWorkspaceUserDialog: false, }); }} onConfirm={async () => { setState({ ...state, showUpsertWorkspaceUserDialog: false, }); if (location.hash !== "#members") { navigate("#members"); } }} /> )} ); }; export default WorkspaceSetting;