"use client"; import React, { forwardRef, useEffect } from "react"; import { observer } from "mobx-react"; import { TwitterPicker } from "react-color"; import type { SubmitHandler } from "react-hook-form"; import { Controller, useForm } from "react-hook-form"; import { Popover, Transition } from "@headlessui/react"; // plane imports import { getRandomLabelColor, LABEL_COLOR_OPTIONS, PROJECT_SETTINGS_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Button } from "@plane/propel/button"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { IIssueLabel } from "@plane/types"; import { Input } from "@plane/ui"; import { captureError, captureSuccess } from "@/helpers/event-tracker.helper"; export type TLabelOperationsCallbacks = { createLabel: (data: Partial) => Promise; updateLabel: (labelId: string, data: Partial) => Promise; }; type TCreateUpdateLabelInlineProps = { labelForm: boolean; setLabelForm: React.Dispatch>; isUpdating: boolean; labelOperationsCallbacks: TLabelOperationsCallbacks; labelToUpdate?: IIssueLabel; onClose?: () => void; }; const defaultValues: Partial = { name: "", color: "rgb(var(--color-text-200))", }; export const CreateUpdateLabelInline = observer( forwardRef(function CreateUpdateLabelInline(props, ref) { const { labelForm, setLabelForm, isUpdating, labelOperationsCallbacks, labelToUpdate, onClose } = props; // form info const { handleSubmit, control, reset, formState: { errors, isSubmitting }, watch, setValue, setFocus, } = useForm({ defaultValues, }); const { t } = useTranslation(); const handleClose = () => { setLabelForm(false); reset(defaultValues); if (onClose) onClose(); }; const handleLabelCreate: SubmitHandler = async (formData) => { if (isSubmitting) return; await labelOperationsCallbacks .createLabel(formData) .then((res) => { captureSuccess({ eventName: PROJECT_SETTINGS_TRACKER_EVENTS.label_created, payload: { name: res.name, id: res.id, }, }); handleClose(); reset(defaultValues); }) .catch((error) => { captureError({ eventName: PROJECT_SETTINGS_TRACKER_EVENTS.label_created, payload: { name: formData.name, }, error, }); setToast({ title: "Error!", type: TOAST_TYPE.ERROR, message: error?.detail ?? error.error ?? t("common.something_went_wrong"), }); reset(formData); }); }; const handleLabelUpdate: SubmitHandler = async (formData) => { if (!labelToUpdate?.id || isSubmitting) return; await labelOperationsCallbacks .updateLabel(labelToUpdate.id, formData) .then((res) => { captureSuccess({ eventName: PROJECT_SETTINGS_TRACKER_EVENTS.label_updated, payload: { name: res.name, id: res.id, }, }); reset(defaultValues); handleClose(); }) .catch((error) => { captureError({ eventName: PROJECT_SETTINGS_TRACKER_EVENTS.label_updated, payload: { name: formData.name, id: labelToUpdate.id, }, error, }); setToast({ title: "Oops!", type: TOAST_TYPE.ERROR, message: error?.error ?? t("project_settings.labels.toast.error"), }); reset(formData); }); }; const handleFormSubmit = (formData: IIssueLabel) => { if (isUpdating) { handleLabelUpdate(formData); } else { handleLabelCreate(formData); } }; /** * For settings focus on name input */ useEffect(() => { setFocus("name"); }, [setFocus, labelForm]); useEffect(() => { if (!labelToUpdate) return; setValue("name", labelToUpdate.name); setValue("color", labelToUpdate.color && labelToUpdate.color !== "" ? labelToUpdate.color : "#000"); }, [labelToUpdate, setValue]); useEffect(() => { if (labelToUpdate) { setValue("color", labelToUpdate.color && labelToUpdate.color !== "" ? labelToUpdate.color : "#000"); return; } setValue("color", getRandomLabelColor()); }, [labelToUpdate, setValue]); return ( <>
{({ open }) => ( <> ( onChange(value.hex)} /> )} /> )}
( )} />
{errors.name?.message &&

{errors.name?.message}

} ); }) );