import React, { useCallback, useState } from "react"; import { useRouter } from "next/router"; import useSWR from "swr"; // hook import useUser from "hooks/use-user"; // context import { useProjectMyMembership } from "contexts/project-member.context"; // services import workspaceService from "services/workspace.service"; // components import { SpreadsheetView } from "components/core"; import { WorkspaceViewsNavigation } from "components/workspace/views/workpace-view-navigation"; import { CreateUpdateIssueModal, DeleteIssueModal } from "components/issues"; import { CreateUpdateWorkspaceViewModal } from "components/workspace/views/modal"; // fetch-keys import { WORKSPACE_VIEW_ISSUES } from "constants/fetch-keys"; // types import { IIssue } from "types"; export const WorkspaceAssignedIssue = () => { const [createViewModal, setCreateViewModal] = useState<any>(null); // create issue modal const [createIssueModal, setCreateIssueModal] = useState(false); const [preloadedData, setPreloadedData] = useState< (Partial<IIssue> & { actionType: "createIssue" | "edit" | "delete" }) | undefined >(undefined); // update issue modal const [editIssueModal, setEditIssueModal] = useState(false); const [issueToEdit, setIssueToEdit] = useState< (IIssue & { actionType: "edit" | "delete" }) | undefined >(undefined); // delete issue modal const [deleteIssueModal, setDeleteIssueModal] = useState(false); const [issueToDelete, setIssueToDelete] = useState<IIssue | null>(null); const router = useRouter(); const { workspaceSlug } = router.query; const { user } = useUser(); const { memberRole } = useProjectMyMembership(); const params: any = { assignees: user?.id ?? undefined, sub_issue: false, }; const { data: viewIssues, mutate: mutateIssues } = useSWR( workspaceSlug ? WORKSPACE_VIEW_ISSUES(workspaceSlug.toString(), params) : null, workspaceSlug ? () => workspaceService.getViewIssues(workspaceSlug.toString(), params) : null ); const makeIssueCopy = useCallback( (issue: IIssue) => { setCreateIssueModal(true); setPreloadedData({ ...issue, name: `${issue.name} (Copy)`, actionType: "createIssue" }); }, [setCreateIssueModal, setPreloadedData] ); const handleEditIssue = useCallback( (issue: IIssue) => { setEditIssueModal(true); setIssueToEdit({ ...issue, actionType: "edit", cycle: issue.issue_cycle ? issue.issue_cycle.cycle : null, module: issue.issue_module ? issue.issue_module.module : null, }); }, [setEditIssueModal, setIssueToEdit] ); const handleDeleteIssue = useCallback( (issue: IIssue) => { setDeleteIssueModal(true); setIssueToDelete(issue); }, [setDeleteIssueModal, setIssueToDelete] ); const handleIssueAction = useCallback( (issue: IIssue, action: "copy" | "edit" | "delete" | "updateDraft") => { if (action === "copy") makeIssueCopy(issue); else if (action === "edit") handleEditIssue(issue); else if (action === "delete") handleDeleteIssue(issue); }, [makeIssueCopy, handleEditIssue, handleDeleteIssue] ); return ( <> <CreateUpdateIssueModal isOpen={createIssueModal && preloadedData?.actionType === "createIssue"} handleClose={() => setCreateIssueModal(false)} prePopulateData={{ ...preloadedData, }} onSubmit={async () => { mutateIssues(); }} /> <CreateUpdateIssueModal isOpen={editIssueModal && issueToEdit?.actionType !== "delete"} handleClose={() => setEditIssueModal(false)} data={issueToEdit} onSubmit={async () => { mutateIssues(); }} /> <DeleteIssueModal handleClose={() => setDeleteIssueModal(false)} isOpen={deleteIssueModal} data={issueToDelete} user={user} onSubmit={async () => { mutateIssues(); }} /> <CreateUpdateWorkspaceViewModal isOpen={createViewModal !== null} handleClose={() => setCreateViewModal(null)} preLoadedData={createViewModal} /> <div className="h-full flex flex-col overflow-hidden bg-custom-background-100"> <div className="h-full w-full border-b border-custom-border-300"> <WorkspaceViewsNavigation handleAddView={() => setCreateViewModal(true)} /> <div className="h-full w-full flex flex-col"> <SpreadsheetView spreadsheetIssues={viewIssues} mutateIssues={mutateIssues} handleIssueAction={handleIssueAction} disableUserActions={false} user={user} userAuth={memberRole} /> </div> </div> </div> </> ); };