import { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { Transition } from "@headlessui/react"; import { useForm } from "react-hook-form"; // store import { observer } from "mobx-react-lite"; import { useMobxStore } from "lib/mobx/store-provider"; // hooks import useToast from "hooks/use-toast"; import useKeypress from "hooks/use-keypress"; import useProjectDetails from "hooks/use-project-details"; import useOutsideClickDetector from "hooks/use-outside-click-detector"; // constants import { createIssuePayload } from "constants/issue"; // icons import { PlusIcon } from "lucide-react"; // types import { IIssue } from "types"; type Props = { groupId?: string; dependencies?: any[]; prePopulatedData?: Partial; onSuccess?: (data: IIssue) => Promise | void; }; const useCheckIfThereIsSpaceOnRight = (ref: React.RefObject, deps: any[]) => { const [isThereSpaceOnRight, setIsThereSpaceOnRight] = useState(true); const router = useRouter(); const { moduleId, cycleId, viewId } = router.query; const container = document.getElementById(`calendar-view-${cycleId ?? moduleId ?? viewId}`); useEffect(() => { if (!ref.current) return; const { right } = ref.current.getBoundingClientRect(); const width = right; const innerWidth = container?.getBoundingClientRect().width ?? window.innerWidth; if (width > innerWidth) setIsThereSpaceOnRight(false); else setIsThereSpaceOnRight(true); }, [ref, deps, container]); return isThereSpaceOnRight; }; const defaultValues: Partial = { name: "", }; const Inputs = (props: any) => { const { register, setFocus, projectDetails } = props; useEffect(() => { setFocus("name"); }, [setFocus]); return ( <>

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

); }; export const CalendarInlineCreateIssueForm: React.FC = observer((props) => { const { prePopulatedData, dependencies = [], groupId } = props; // router const router = useRouter(); const { workspaceSlug, projectId } = router.query; // store const { workspace: workspaceStore, quickAddIssue: quickAddStore } = useMobxStore(); // ref const ref = useRef(null); // states const [isOpen, setIsOpen] = useState(false); const { setToastAlert } = useToast(); const { projectDetails } = useProjectDetails(); const { reset, handleSubmit, register, setFocus, formState: { errors, isSubmitting }, } = useForm({ defaultValues }); const handleClose = () => { setIsOpen(false); }; useKeypress("Escape", handleClose); useOutsideClickDetector(ref, handleClose); // derived values const workspaceDetail = workspaceStore.getWorkspaceBySlug(workspaceSlug?.toString()!); useEffect(() => { if (!isOpen) reset({ ...defaultValues }); }, [isOpen, reset]); useEffect(() => { if (!errors) return; Object.keys(errors).forEach((key) => { const error = errors[key as keyof IIssue]; setToastAlert({ type: "error", title: "Error!", message: error?.message?.toString() || "Some error occurred. Please try again.", }); }); }, [errors, setToastAlert]); const isSpaceOnRight = useCheckIfThereIsSpaceOnRight(ref, dependencies); const onSubmitHandler = async (formData: IIssue) => { if (isSubmitting || !workspaceSlug || !projectId) return; // resetting the form so that user can add another issue quickly reset({ ...defaultValues, ...(prePopulatedData ?? {}) }); const payload = createIssuePayload(workspaceDetail!, projectDetails!, { ...(prePopulatedData ?? {}), ...formData, labels_list: formData.labels_list?.length !== 0 ? formData.labels_list : prePopulatedData?.labels && prePopulatedData?.labels.toString() !== "none" ? [prePopulatedData.labels as any] : [], assignees_list: formData.assignees_list?.length !== 0 ? formData.assignees_list : prePopulatedData?.assignees && prePopulatedData?.assignees.toString() !== "none" ? [prePopulatedData.assignees as any] : [], }); try { quickAddStore.createIssue( workspaceSlug.toString(), projectId.toString(), { group_id: groupId ?? null, sub_group_id: null, }, payload ); setToastAlert({ type: "success", title: "Success!", message: "Issue created successfully.", }); } catch (err: any) { Object.keys(err || {}).forEach((key) => { const error = err?.[key]; const errorTitle = error ? (Array.isArray(error) ? error.join(", ") : error) : null; setToastAlert({ type: "error", title: "Error!", message: errorTitle || "Some error occurred. Please try again.", }); }); } }; return ( <>
{!isOpen && (
)} ); });