import { FC, useCallback } from "react"; import { DragDropContext, DropResult } from "@hello-pangea/dnd"; import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; // components import { TOAST_TYPE, setToast } from "@plane/ui"; import { CalendarChart } from "components/issues"; // ui // types import { ICycleIssues, ICycleIssuesFilter } from "store/issue/cycle"; import { IModuleIssues, IModuleIssuesFilter } from "store/issue/module"; import { IProjectIssues, IProjectIssuesFilter } from "store/issue/project"; import { IProjectViewIssues, IProjectViewIssuesFilter } from "store/issue/project-views"; import { TGroupedIssues, TIssue } from "@plane/types"; import { IQuickActionProps } from "../list/list-view-types"; import { EIssueActions } from "../types"; import { handleDragDrop } from "./utils"; interface IBaseCalendarRoot { issueStore: IProjectIssues | IModuleIssues | ICycleIssues | IProjectViewIssues; issuesFilterStore: IProjectIssuesFilter | IModuleIssuesFilter | ICycleIssuesFilter | IProjectViewIssuesFilter; QuickActions: FC; issueActions: { [EIssueActions.DELETE]: (issue: TIssue) => Promise; [EIssueActions.UPDATE]?: (issue: TIssue) => Promise; [EIssueActions.REMOVE]?: (issue: TIssue) => Promise; [EIssueActions.ARCHIVE]?: (issue: TIssue) => Promise; [EIssueActions.RESTORE]?: (issue: TIssue) => Promise; }; viewId?: string; isCompletedCycle?: boolean; } export const BaseCalendarRoot = observer((props: IBaseCalendarRoot) => { const { issueStore, issuesFilterStore, QuickActions, issueActions, viewId, isCompletedCycle = false } = props; // router const router = useRouter(); const { workspaceSlug, projectId } = router.query; // hooks const { issueMap } = useIssues(); const { membership: { currentProjectRole }, } = useUser(); const isEditingAllowed = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; const displayFilters = issuesFilterStore.issueFilters?.displayFilters; const groupedIssueIds = (issueStore.groupedIssueIds ?? {}) as TGroupedIssues; const onDragEnd = async (result: DropResult) => { if (!result) return; // return if not dropped on the correct place if (!result.destination) return; // return if dropped on the same date if (result.destination.droppableId === result.source.droppableId) return; if (handleDragDrop) { await handleDragDrop( result.source, result.destination, workspaceSlug?.toString(), projectId?.toString(), issueStore, issueMap, groupedIssueIds, viewId ).catch((err) => { setToast({ title: "Error", type: TOAST_TYPE.ERROR, message: err.detail ?? "Failed to perform this action", }); }); } }; const handleIssues = useCallback( async (date: string, issue: TIssue, action: EIssueActions) => { if (issueActions[action]) { await issueActions[action]!(issue); } }, [issueActions] ); return ( <>
( handleIssues(issue.target_date ?? "", issue, EIssueActions.DELETE)} handleUpdate={ issueActions[EIssueActions.UPDATE] ? async (data) => handleIssues(issue.target_date ?? "", data, EIssueActions.UPDATE) : undefined } handleRemoveFromView={ issueActions[EIssueActions.REMOVE] ? async () => handleIssues(issue.target_date ?? "", issue, EIssueActions.REMOVE) : undefined } handleArchive={ issueActions[EIssueActions.ARCHIVE] ? async () => handleIssues(issue.target_date ?? "", issue, EIssueActions.ARCHIVE) : undefined } handleRestore={ issueActions[EIssueActions.RESTORE] ? async () => handleIssues(issue.target_date ?? "", issue, EIssueActions.RESTORE) : undefined } readOnly={!isEditingAllowed || isCompletedCycle} /> )} quickAddCallback={issueStore.quickAddIssue} viewId={viewId} readOnly={!isEditingAllowed || isCompletedCycle} />
); });