import { FC, FormEvent, useCallback, useRef, useState } from "react"; import { observer } from "mobx-react"; import { useRouter } from "next/router"; import { EditorRefApi } from "@plane/rich-text-editor"; import { TIssue } from "@plane/types"; import { Button, ToggleSwitch, TOAST_TYPE, setToast } from "@plane/ui"; // components import { InboxIssueTitle, InboxIssueDescription, InboxIssueProperties, } from "@/components/inbox/modals/create-edit-modal"; // constants import { ISSUE_CREATED } from "@/constants/event-tracker"; // helpers import { renderFormattedPayloadDate } from "@/helpers/date-time.helper"; // hooks import { useEventTracker, useProjectInbox, useWorkspace } from "@/hooks/store"; type TInboxIssueCreateRoot = { workspaceSlug: string; projectId: string; handleModalClose: () => void; }; export const defaultIssueData: Partial = { id: undefined, name: "", description_html: "", priority: "none", state_id: "", label_ids: [], assignee_ids: [], start_date: renderFormattedPayloadDate(new Date()), target_date: "", }; export const InboxIssueCreateRoot: FC = observer((props) => { const { workspaceSlug, projectId, handleModalClose } = props; const router = useRouter(); // refs const descriptionEditorRef = useRef(null); // hooks const { captureIssueEvent } = useEventTracker(); const { createInboxIssue } = useProjectInbox(); const { getWorkspaceBySlug } = useWorkspace(); const workspaceId = getWorkspaceBySlug(workspaceSlug)?.id; // states const [createMore, setCreateMore] = useState(false); const [formSubmitting, setFormSubmitting] = useState(false); const [formData, setFormData] = useState>(defaultIssueData); const handleFormData = useCallback( >(issueKey: T, issueValue: Partial[T]) => { setFormData({ ...formData, [issueKey]: issueValue, }); }, [formData] ); const handleFormSubmit = async (event: FormEvent) => { event.preventDefault(); const payload: Partial = { name: formData.name || "", description_html: formData.description_html || "

", priority: formData.priority || "none", state_id: formData.state_id || "", label_ids: formData.label_ids || [], assignee_ids: formData.assignee_ids || [], target_date: formData.target_date || null, }; setFormSubmitting(true); await createInboxIssue(workspaceSlug, projectId, payload) .then((res) => { if (!createMore) { router.push(`/${workspaceSlug}/projects/${projectId}/inbox/?currentTab=open&inboxIssueId=${res?.issue?.id}`); handleModalClose(); } else { descriptionEditorRef?.current?.clearEditor(); setFormData(defaultIssueData); } captureIssueEvent({ eventName: ISSUE_CREATED, payload: { ...formData, state: "SUCCESS", element: "Inbox page", }, path: router.pathname, }); setToast({ type: TOAST_TYPE.SUCCESS, title: `${TOAST_TYPE.SUCCESS}!`, message: "Issue created successfully.", }); }) .catch((error) => { console.error(error); captureIssueEvent({ eventName: ISSUE_CREATED, payload: { ...formData, state: "FAILED", element: "Inbox page", }, path: router.pathname, }); setToast({ type: TOAST_TYPE.ERROR, title: `${TOAST_TYPE.ERROR}!`, message: "Some error occurred. Please try again.", }); }); setFormSubmitting(false); }; const isTitleLengthMoreThan255Character = formData?.name ? formData.name.length > 255 : false; if (!workspaceSlug || !projectId || !workspaceId) return <>; return (
setCreateMore((prevData) => !prevData)} > {}} size="sm" /> Create more
); });