import { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { useForm } from "react-hook-form"; import { observer } from "mobx-react-lite"; // hooks import { useProject, useWorkspace } from "hooks/store"; import useToast from "hooks/use-toast"; import useKeypress from "hooks/use-keypress"; import useOutsideClickDetector from "hooks/use-outside-click-detector"; // helpers import { createIssuePayload } from "helpers/issue.helper"; // icons import { PlusIcon } from "lucide-react"; // types import { TIssue } from "@plane/types"; type Props = { formKey: keyof TIssue; groupId?: string; subGroupId?: string | null; prePopulatedData?: Partial; quickAddCallback?: ( workspaceSlug: string, projectId: string, data: TIssue, viewId?: string ) => Promise; viewId?: string; onOpen?: () => void; }; const defaultValues: Partial = { name: "", }; const Inputs = (props: any) => { const { register, setFocus, projectDetails } = props; useEffect(() => { setFocus("name"); }, [setFocus]); return ( <>

{projectDetails?.identifier ?? "..."}

); }; export const CalendarQuickAddIssueForm: React.FC = observer((props) => { const { formKey, groupId, prePopulatedData, quickAddCallback, viewId, onOpen } = props; // router const router = useRouter(); const { workspaceSlug, projectId } = router.query; // store hooks const { getProjectById } = useProject(); const { getWorkspaceBySlug } = useWorkspace(); // refs const ref = useRef(null); // states const [isOpen, setIsOpen] = useState(false); // toast alert const { setToastAlert } = useToast(); // derived values const workspaceDetail = (workspaceSlug && getWorkspaceBySlug(workspaceSlug.toString())) || null; const projectDetail = projectId ? getProjectById(projectId.toString()) : null; const { reset, handleSubmit, register, setFocus, formState: { errors, isSubmitting }, } = useForm({ defaultValues }); const handleClose = () => { setIsOpen(false); }; useKeypress("Escape", handleClose); useOutsideClickDetector(ref, handleClose); useEffect(() => { if (!isOpen) reset({ ...defaultValues }); }, [isOpen, reset]); useEffect(() => { if (!errors) return; Object.keys(errors).forEach((key) => { const error = errors[key as keyof TIssue]; setToastAlert({ type: "error", title: "Error!", message: error?.message?.toString() || "Some error occurred. Please try again.", }); }); }, [errors, setToastAlert]); const onSubmitHandler = async (formData: TIssue) => { if (isSubmitting || !workspaceSlug || !projectId) return; reset({ ...defaultValues }); const payload = createIssuePayload(projectId.toString(), { ...(prePopulatedData ?? {}), ...formData, }); try { quickAddCallback && (await quickAddCallback( workspaceSlug.toString(), projectId.toString(), { ...payload, }, viewId )); setToastAlert({ type: "success", title: "Success!", message: "Issue created successfully.", }); } catch (err: any) { console.error(err); setToastAlert({ type: "error", title: "Error!", message: err?.message || "Some error occurred. Please try again.", }); } }; const handleOpen = () => { setIsOpen(true); if (onOpen) onOpen(); }; return ( <> {isOpen && (
)} {!isOpen && (
)} ); });