import React, { ReactElement, useEffect } from "react"; import { observer } from "mobx-react"; import { useRouter } from "next/router"; import { useTheme } from "next-themes"; import useSWR from "swr"; // ui import { Loader } from "@plane/ui"; // components import { EmptyState } from "@/components/common"; import { PageHead } from "@/components/core"; import { ProjectIssueDetailsHeader } from "@/components/headers"; import { IssueDetailRoot } from "@/components/issues"; // hooks import { useAppTheme, useIssueDetail, useProject } from "@/hooks/store"; // layouts import { AppLayout } from "@/layouts/app-layout"; // types import { NextPageWithLayout } from "@/lib/types"; // assets import emptyIssueDark from "public/empty-state/search/issue-dark.webp"; import emptyIssueLight from "public/empty-state/search/issues-light.webp"; const IssueDetailsPage: NextPageWithLayout = observer(() => { // router const router = useRouter(); const { workspaceSlug, projectId, issueId } = router.query; // hooks const { resolvedTheme } = useTheme(); // store hooks const { fetchIssue, issue: { getIssueById }, } = useIssueDetail(); const { getProjectById } = useProject(); const { toggleIssueDetailSidebar, issueDetailSidebarCollapsed } = useAppTheme(); // fetching issue details const { isLoading, data: swrIssueDetails, error, } = useSWR( workspaceSlug && projectId && issueId ? `ISSUE_DETAIL_${workspaceSlug}_${projectId}_${issueId}` : null, workspaceSlug && projectId && issueId ? () => fetchIssue(workspaceSlug.toString(), projectId.toString(), issueId.toString()) : null ); // derived values const issue = getIssueById(issueId?.toString() || "") || undefined; const project = (issue?.project_id && getProjectById(issue?.project_id)) || undefined; const issueLoader = !issue || isLoading ? true : false; const pageTitle = project && issue ? `${project?.identifier}-${issue?.sequence_id} ${issue?.name}` : undefined; useEffect(() => { const handleToggleIssueDetailSidebar = () => { if (window && window.innerWidth < 768) { toggleIssueDetailSidebar(true); } if (window && issueDetailSidebarCollapsed && window.innerWidth >= 768) { toggleIssueDetailSidebar(false); } }; window.addEventListener("resize", handleToggleIssueDetailSidebar); handleToggleIssueDetailSidebar(); return () => window.removeEventListener("resize", handleToggleIssueDetailSidebar); }, [issueDetailSidebarCollapsed, toggleIssueDetailSidebar]); return ( <> {error ? ( router.push(`/${workspaceSlug}/projects/${projectId}/issues`), }} /> ) : issueLoader ? (
) : ( workspaceSlug && projectId && issueId && ( ) )} ); }); IssueDetailsPage.getLayout = function getLayout(page: ReactElement) { return ( } withProjectWrapper> {page} ); }; export default IssueDetailsPage;