// react import React, { useEffect } from "react"; // next import { useRouter } from "next/router"; // swr import { mutate } from "swr"; // react hooks form import { useForm } from "react-hook-form"; // services import issuesService from "services/issues.service"; // fetch keys import { ISSUE_DETAILS } from "constants/fetch-keys"; // hooks import useToast from "hooks/use-toast"; // ui import { PrimaryButton, Input } from "components/ui"; // types import type { linkDetails, IIssueLink } from "types"; type Props = { isOpen: boolean; data?: linkDetails; links?: linkDetails[]; onSuccess: () => void; }; export const CreateUpdateLinkForm: React.FC = (props) => { const { isOpen, data, links, onSuccess } = props; const router = useRouter(); const { workspaceSlug, projectId, issueId } = router.query; const { setToastAlert } = useToast(); const { register, handleSubmit, reset, formState: { errors, isSubmitting }, } = useForm({ defaultValues: { title: "", url: "", }, }); useEffect(() => { if (!data) return; reset({ title: data.title, url: data.url, }); }, [data, reset]); useEffect(() => { if (!isOpen) reset({ title: "", url: "", }); }, [isOpen, reset]); const onSubmit = async (formData: IIssueLink) => { if (!workspaceSlug || !projectId || !issueId) return; const payload = { metadata: {}, ...formData }; if (!data) await issuesService .createIssueLink( workspaceSlug.toString(), projectId.toString(), issueId.toString(), payload ) .then(() => { onSuccess(); mutate(ISSUE_DETAILS(issueId.toString())); }) .catch((err) => { if (err?.status === 400) setToastAlert({ type: "error", title: "Error!", message: "This URL already exists for this issue.", }); else setToastAlert({ type: "error", title: "Error!", message: "Something went wrong. Please try again.", }); }); else { const updatedLinks = links?.map((l) => l.id === data.id ? { ...l, title: formData.title, url: formData.url, } : l ); mutate( ISSUE_DETAILS(issueId.toString()), (prevData) => ({ ...prevData, issue_link: updatedLinks }), false ); await issuesService .updateIssueLink( workspaceSlug.toString(), projectId.toString(), issueId.toString(), data!.id, payload ) .then(() => { onSuccess(); mutate(ISSUE_DETAILS(issueId.toString())); }); } }; return (
{data ? isSubmitting ? "Updating Link..." : "Update Link" : isSubmitting ? "Adding Link..." : "Add Link"}
); };