import { useRouter } from "next/router"; import useSWR from "swr"; // hook import useMyIssuesFilters from "hooks/my-issues/use-my-issues-filter"; import useUser from "hooks/use-user"; // services import workspaceService from "services/workspace.service"; // layouts import { WorkspaceAuthorizationLayout } from "layouts/auth-layout"; // contexts import { IssueViewContextProvider } from "contexts/issue-view.context"; // components import { SpreadsheetView } from "components/core"; import { WorkspaceViewsNavigation } from "components/workspace/views/workpace-view-navigation"; import { WorkspaceIssuesViewOptions } from "components/issues/workspace-views/workspace-issue-view-option"; // ui import { EmptyState, PrimaryButton } from "components/ui"; // icons import { PlusIcon } from "@heroicons/react/24/outline"; // images import emptyView from "public/empty-state/view.svg"; // fetch-keys import { WORKSPACE_VIEW_DETAILS, WORKSPACE_VIEW_ISSUES } from "constants/fetch-keys"; import { CheckCircle } from "lucide-react"; const WorkspaceView: React.FC = () => { const router = useRouter(); const { workspaceSlug, workspaceViewId } = router.query; const { user } = useUser(); const { data: viewDetails, error } = useSWR( workspaceSlug && workspaceViewId ? WORKSPACE_VIEW_DETAILS(workspaceViewId.toString()) : null, workspaceSlug && workspaceViewId ? () => workspaceService.getViewDetails(workspaceSlug.toString(), workspaceViewId.toString()) : null ); const { displayFilters } = useMyIssuesFilters(workspaceSlug?.toString()); const params: any = { assignees: viewDetails?.query_data?.assignees ? viewDetails?.query_data?.assignees.join(",") : undefined, state: viewDetails?.query_data?.state ? viewDetails?.query_data?.state.join(",") : undefined, priority: viewDetails?.query_data?.priority ? viewDetails.query_data?.priority.join(",") : undefined, labels: viewDetails?.query_data?.labels ? viewDetails?.query_data?.labels.join(",") : undefined, created_by: viewDetails?.query_data?.created_by ? viewDetails?.query_data?.created_by.join(",") : undefined, start_date: viewDetails?.query_data?.start_date ? viewDetails?.query_data?.start_date.join(",") : undefined, target_date: viewDetails?.query_data?.target_date ? viewDetails?.query_data?.target_date.join(",") : undefined, sub_issue: displayFilters?.sub_issue, type: displayFilters?.type ? displayFilters?.type : undefined, }; const { data: viewIssues, mutate: mutateIssues } = useSWR( workspaceSlug && viewDetails ? WORKSPACE_VIEW_ISSUES(workspaceSlug.toString(), params) : null, workspaceSlug && viewDetails ? () => workspaceService.getViewIssues(workspaceSlug.toString(), params) : null ); return ( <IssueViewContextProvider> <WorkspaceAuthorizationLayout breadcrumbs={ <div className="flex gap-2 items-center"> <CheckCircle className="h-[18px] w-[18px] stroke-[1.5]" /> <span className="text-sm font-medium"> {viewDetails ? `${viewDetails.name} Issues` : "Workspace Issues"} </span> </div> } right={ <div className="flex items-center gap-2"> <WorkspaceIssuesViewOptions /> <PrimaryButton className="flex items-center gap-2" onClick={() => { const e = new KeyboardEvent("keydown", { key: "c" }); document.dispatchEvent(e); }} > <PlusIcon className="h-4 w-4" /> Add Issue </PrimaryButton> </div> } > <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 user={user} /> {error ? ( <EmptyState image={emptyView} title="View does not exist" description="The view you are looking for does not exist or has been deleted." primaryButton={{ text: "View other views", onClick: () => router.push(`/${workspaceSlug}/workspace-views`), }} /> ) : ( <div className="h-full w-full flex flex-col"> <SpreadsheetView spreadsheetIssues={viewIssues} mutateIssues={mutateIssues} handleIssueAction={(...args) => {}} disableUserActions={false} user={user} userAuth={{ isGuest: false, isMember: false, isOwner: false, isViewer: false, }} /> </div> )} </div> </div> </WorkspaceAuthorizationLayout> </IssueViewContextProvider> ); }; export default WorkspaceView;