import { FC, useEffect, useState, useRef } from "react"; import { useRouter } from "next/router"; import { useForm } from "react-hook-form"; import { PlusIcon } from "lucide-react"; import { observer } from "mobx-react-lite"; // hooks import useToast from "hooks/use-toast"; import useKeypress from "hooks/use-keypress"; import useOutsideClickDetector from "hooks/use-outside-click-detector"; // store import { useMobxStore } from "lib/mobx/store-provider"; // constants import { IIssue, IProject } from "types"; // types import { createIssuePayload } from "helpers/issue.helper"; interface IInputProps { formKey: string; register: any; setFocus: any; projectDetail: IProject | null; } const Inputs: FC = (props) => { const { formKey, register, setFocus, projectDetail } = props; useEffect(() => { setFocus(formKey); }, [formKey, setFocus]); return (
{projectDetail?.identifier ?? "..."}
); }; interface IListQuickAddIssueForm { prePopulatedData?: Partial; quickAddCallback?: ( workspaceSlug: string, projectId: string, data: IIssue, viewId?: string ) => Promise; viewId?: string; } const defaultValues: Partial = { name: "", }; export const ListQuickAddIssueForm: FC = observer((props) => { const { prePopulatedData, quickAddCallback, viewId } = props; const router = useRouter(); const { workspaceSlug, projectId } = router.query as { workspaceSlug: string; projectId: string }; const { workspace: workspaceStore, project: projectStore } = useMobxStore(); const workspaceDetail = (workspaceSlug && workspaceStore.getWorkspaceBySlug(workspaceSlug)) || null; const projectDetail: IProject | null = (workspaceSlug && projectId && projectStore.getProjectById(workspaceSlug, projectId)) || null; const ref = useRef(null); const [isOpen, setIsOpen] = useState(false); const handleClose = () => setIsOpen(false); useKeypress("Escape", handleClose); useOutsideClickDetector(ref, handleClose); const { setToastAlert } = useToast(); const { reset, handleSubmit, setFocus, register, formState: { errors, isSubmitting }, } = useForm({ defaultValues }); useEffect(() => { if (!isOpen) reset({ ...defaultValues }); }, [isOpen, reset]); const onSubmitHandler = async (formData: IIssue) => { if (isSubmitting || !workspaceDetail || !projectDetail) return; reset({ ...defaultValues }); const payload = createIssuePayload(workspaceDetail, projectDetail, { ...(prePopulatedData ?? {}), ...formData, }); try { quickAddCallback && (await quickAddCallback(workspaceSlug, projectId, { ...payload }, viewId)); setToastAlert({ type: "success", title: "Success!", message: "Issue created successfully.", }); } catch (err: any) { setToastAlert({ type: "error", title: "Error!", message: err?.message || "Some error occurred. Please try again.", }); } }; return (
{isOpen ? (
{`Press 'Enter' to add another issue`}
) : (
setIsOpen(true)} > New Issue
)}
); });