import { useState, ReactElement } from "react"; import { useRouter } from "next/router"; import { observer } from "mobx-react"; import useSWR from "swr"; // hooks import useToast from "hooks/use-toast"; import { useIssueDetail, useIssues, useProject } from "hooks/store"; // layouts import { AppLayout } from "layouts/app-layout"; // components import { IssueDetailRoot } from "components/issues"; import { ProjectArchivedIssueDetailsHeader } from "components/headers"; import { PageHead } from "components/core"; // ui import { ArchiveIcon, Loader } from "@plane/ui"; // icons import { History } from "lucide-react"; // types import { NextPageWithLayout } from "lib/types"; // constants import { EIssuesStoreType } from "constants/issue"; const ArchivedIssueDetailsPage: NextPageWithLayout = observer(() => { // router const router = useRouter(); const { workspaceSlug, projectId, archivedIssueId } = router.query; // states const [isRestoring, setIsRestoring] = useState(false); // hooks const { fetchIssue, issue: { getIssueById }, } = useIssueDetail(); const { issues: { removeIssueFromArchived }, } = useIssues(EIssuesStoreType.ARCHIVED); const { setToastAlert } = useToast(); const { getProjectById } = useProject(); const { isLoading } = useSWR( workspaceSlug && projectId && archivedIssueId ? `ARCHIVED_ISSUE_DETAIL_${workspaceSlug}_${projectId}_${archivedIssueId}` : null, workspaceSlug && projectId && archivedIssueId ? () => fetchIssue(workspaceSlug.toString(), projectId.toString(), archivedIssueId.toString(), true) : null ); const issue = getIssueById(archivedIssueId?.toString() || "") || undefined; const project = (issue?.project_id && getProjectById(issue?.project_id)) || undefined; const pageTitle = project && issue ? `${project?.identifier}-${issue?.sequence_id} ${issue?.name}` : undefined; if (!issue) return <>; const handleUnArchive = async () => { if (!workspaceSlug || !projectId || !archivedIssueId) return; setIsRestoring(true); await removeIssueFromArchived(workspaceSlug as string, projectId as string, archivedIssueId as string) .then(() => { setToastAlert({ type: "success", title: "Success", message: issue && `${getProjectById(issue.project_id)?.identifier}-${ issue?.sequence_id } is restored successfully under the project ${getProjectById(issue.project_id)?.name}`, }); router.push(`/${workspaceSlug}/projects/${projectId}/issues/${archivedIssueId}`); }) .catch(() => { setToastAlert({ type: "error", title: "Error!", message: "Something went wrong. Please try again.", }); }) .finally(() => setIsRestoring(false)); }; const issueLoader = !issue || isLoading ? true : false; return ( <> {issueLoader ? (
) : (
{issue?.archived_at && (

This issue has been archived by Plane.

)} {workspaceSlug && projectId && archivedIssueId && ( )}
)} ); }); ArchivedIssueDetailsPage.getLayout = function getLayout(page: ReactElement) { return ( } withProjectWrapper> {page} ); }; export default ArchivedIssueDetailsPage;