import { useEffect, useState, useRef } from "react"; import { observer } from "mobx-react"; import { useRouter } from "next/router"; import { useForm } from "react-hook-form"; import { PlusIcon } from "lucide-react"; import { TIssue } from "@plane/types"; // hooks import { setPromiseToast } from "@plane/ui"; import { ISSUE_CREATED } from "@/constants/event-tracker"; import { createIssuePayload } from "@/helpers/issue.helper"; import { useEventTracker, useProject } from "@/hooks/store"; import useKeypress from "@/hooks/use-keypress"; import useOutsideClickDetector from "@/hooks/use-outside-click-detector"; // helpers // ui // types // constants const Inputs = (props: any) => { const { register, setFocus, projectDetail } = props; useEffect(() => { setFocus("name"); }, [setFocus]); return (

{projectDetail?.identifier ?? "..."}

); }; interface IKanBanQuickAddIssueForm { formKey: keyof TIssue; groupId?: string; subGroupId?: string | null; prePopulatedData?: Partial; quickAddCallback?: ( workspaceSlug: string, projectId: string, data: TIssue, viewId?: string ) => Promise; viewId?: string; } const defaultValues: Partial = { name: "", }; export const KanBanQuickAddIssueForm: React.FC = observer((props) => { const { formKey, prePopulatedData, quickAddCallback, viewId } = props; // router const router = useRouter(); const { workspaceSlug, projectId } = router.query; // store hooks const { getProjectById } = useProject(); const { captureIssueEvent } = useEventTracker(); const projectDetail = projectId ? getProjectById(projectId.toString()) : null; const ref = useRef(null); const [isOpen, setIsOpen] = useState(false); const handleClose = () => setIsOpen(false); useKeypress("Escape", handleClose); useOutsideClickDetector(ref, handleClose); const { reset, handleSubmit, setFocus, register, formState: { isSubmitting }, } = useForm({ defaultValues }); useEffect(() => { if (!isOpen) reset({ ...defaultValues }); }, [isOpen, reset]); const onSubmitHandler = async (formData: TIssue) => { if (isSubmitting || !workspaceSlug || !projectId) return; reset({ ...defaultValues }); const payload = createIssuePayload(projectId.toString(), { ...(prePopulatedData ?? {}), ...formData, }); if (quickAddCallback) { const quickAddPromise = quickAddCallback( workspaceSlug.toString(), projectId.toString(), { ...payload, }, viewId ); setPromiseToast(quickAddPromise, { loading: "Adding issue...", success: { title: "Success!", message: () => "Issue created successfully.", }, error: { title: "Error!", message: (err) => err?.message || "Some error occurred. Please try again.", }, }); await quickAddPromise .then((res) => { captureIssueEvent({ eventName: ISSUE_CREATED, payload: { ...res, state: "SUCCESS", element: "Kanban quick add" }, path: router.asPath, }); }) .catch(() => { captureIssueEvent({ eventName: ISSUE_CREATED, payload: { ...payload, state: "FAILED", element: "Kanban quick add" }, path: router.asPath, }); }); } }; return ( <> {isOpen ? (
{`Press 'Enter' to add another issue`}
) : (
setIsOpen(true)} > New Issue
)} ); });