/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import type { FormEvent } from "react"; import { useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; import type { EditorRefApi } from "@plane/editor"; import { useTranslation } from "@plane/i18n"; import { Button } from "@plane/propel/button"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { TIssue } from "@plane/types"; import { ToggleSwitch } from "@plane/ui"; import { useProject } from "@/hooks/store/use-project"; import { useProjectExternalContoursBoard } from "@/hooks/store/use-project-external-contours-board"; import { useProjectExternalContours } from "@/hooks/store/use-project-external-contours"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useAppRouter } from "@/hooks/use-app-router"; import { InboxIssueDescription } from "@/components/inbox/modals/create-modal/issue-description"; import { InboxIssueTitle } from "@/components/inbox/modals/create-modal/issue-title"; import { ExternalContoursCreateProperties } from "./create-properties"; const defaultIssueData: Partial & { target_project_id?: string | null } = { id: undefined, name: "", description_html: "", priority: "none", target_project_id: null, label_ids: [], assignee_ids: [], target_date: "", }; type Props = { workspaceSlug: string; projectId: string; handleModalClose: () => void; }; export const ExternalContoursCreateRoot = observer(function ExternalContoursCreateRoot(props: Props) { const { workspaceSlug, projectId, handleModalClose } = props; const { t } = useTranslation(); const router = useAppRouter(); const { getWorkspaceBySlug } = useWorkspace(); const workspaceId = getWorkspaceBySlug(workspaceSlug)?.id; const { currentProjectDetails } = useProject(); const { createRequest, fetchTargetOptions, fetchTargetProjects } = useProjectExternalContours(); const { fetchBoard } = useProjectExternalContoursBoard(); const descriptionEditorRef = useRef(null); const [createMore, setCreateMore] = useState(false); const [formSubmitting, setFormSubmitting] = useState(false); const [formData, setFormData] = useState & { target_project_id?: string | null }>(defaultIssueData); const handleFormData = (issueKey: T, issueValue: (typeof formData)[T]) => { setFormData((current) => ({ ...current, [issueKey]: issueValue })); }; const isTitleLengthMoreThan255Character = formData?.name ? formData.name.length > 255 : false; const canSubmit = !!formData.name?.trim() && !!formData.target_project_id; useEffect(() => { if (!workspaceSlug || !projectId) return; fetchTargetProjects(workspaceSlug, projectId).catch(() => { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: t("external_contours_page.modal.error_message"), }); }); }, [fetchTargetProjects, projectId, t, workspaceSlug]); useEffect(() => { if (!workspaceSlug || !projectId || !formData.target_project_id) return; fetchTargetOptions(workspaceSlug, projectId, formData.target_project_id).catch(() => { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: t("external_contours_page.modal.error_message"), }); }); }, [fetchTargetOptions, formData.target_project_id, projectId, t, workspaceSlug]); const handleFormSubmit = async (event: FormEvent) => { event.preventDefault(); if (!descriptionEditorRef.current?.isEditorReadyToDiscard()) { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: t("editor_is_not_ready_to_discard_changes"), }); return; } setFormSubmitting(true); try { const createdRequest = await createRequest(workspaceSlug, projectId, formData); await fetchBoard(workspaceSlug, projectId); setToast({ type: TOAST_TYPE.SUCCESS, title: t("success"), message: t("external_contours_page.modal.success_message"), }); if (createMore) { setFormData(defaultIssueData); } else { handleModalClose(); } if (createdRequest?.id) { router.push(`/${workspaceSlug}/projects/${projectId}/external-contours?inboxIssueId=${createdRequest.id}`); } } catch (error: any) { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: error?.error || t("external_contours_page.modal.error_message"), }); } finally { setFormSubmitting(false); } }; if (!workspaceSlug || !projectId || !workspaceId) return <>; return (

{t("external_contours_page.modal.title")}

{}} />
setCreateMore((prevData) => !prevData)} role="button" tabIndex={0} > {}} size="sm" /> {t("create_more")}
); });