import { FC, useCallback, useEffect, useMemo } from "react"; import dynamic from "next/dynamic"; // react-hook-form import { useForm } from "react-hook-form"; // lodash import debounce from "lodash.debounce"; // components import { Loader, TextArea } from "components/ui"; const RemirrorRichTextEditor = dynamic(() => import("components/rich-text-editor"), { ssr: false, loading: () => ( ), }); // types import { IIssue, UserAuth } from "types"; import useToast from "hooks/use-toast"; export interface IssueDescriptionFormValues { name: string; description: any; description_html: string; } export interface IssueDetailsProps { issue: IIssue; handleFormSubmit: (value: IssueDescriptionFormValues) => void; userAuth: UserAuth; } export const IssueDescriptionForm: FC = ({ issue, handleFormSubmit, userAuth, }) => { const { setToastAlert } = useToast(); const { handleSubmit, watch, setValue, reset, formState: { errors }, setError, } = useForm({ defaultValues: { name: "", description: "", description_html: "", }, }); const handleDescriptionFormSubmit = useCallback( (formData: Partial) => { if (!formData.name || formData.name === "") { setToastAlert({ type: "error", title: "Error in saving!", message: "Title is required.", }); return; } if (formData.name.length > 255) { setToastAlert({ type: "error", title: "Error in saving!", message: "Title cannot have more than 255 characters.", }); return; } handleFormSubmit({ name: formData.name ?? "", description: formData.description, description_html: formData.description_html, }); }, [handleFormSubmit, setToastAlert] ); const debounceHandler = useMemo( () => debounce(handleSubmit(handleDescriptionFormSubmit), 2000), [handleSubmit, handleDescriptionFormSubmit] ); useEffect( () => () => { debounceHandler.cancel(); }, [debounceHandler] ); // reset form values useEffect(() => { if (!issue) return; reset(issue); }, [issue, reset]); const isNotAllowed = userAuth.isGuest || userAuth.isViewer; return (