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, useUser } 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, Button, Loader } from "@plane/ui"; // icons import { RotateCcw } from "lucide-react"; // types import { NextPageWithLayout } from "lib/types"; // constants import { EIssuesStoreType } from "constants/issue"; import { EUserProjectRoles } from "constants/project"; 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: { restoreIssue }, } = useIssues(EIssuesStoreType.ARCHIVED); const { setToastAlert } = useToast(); const { getProjectById } = useProject(); const { membership: { currentProjectRole }, } = useUser(); const { isLoading } = useSWR( workspaceSlug && projectId && archivedIssueId ? `ARCHIVED_ISSUE_DETAIL_${workspaceSlug}_${projectId}_${archivedIssueId}` : null, workspaceSlug && projectId && archivedIssueId ? () => fetchIssue(workspaceSlug.toString(), projectId.toString(), archivedIssueId.toString(), "ARCHIVED") : null ); // derived values const issue = archivedIssueId ? getIssueById(archivedIssueId.toString()) : undefined; const project = issue ? getProjectById(issue?.project_id) : undefined; const pageTitle = project && issue ? `${project?.identifier}-${issue?.sequence_id} ${issue?.name}` : undefined; // auth const canRestoreIssue = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; if (!issue) return <>; const handleRestore = async () => { if (!workspaceSlug || !projectId || !archivedIssueId) return; setIsRestoring(true); await restoreIssue(workspaceSlug.toString(), projectId.toString(), archivedIssueId.toString()) .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 && canRestoreIssue && (

This issue has been archived.

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