import { Dispatch, SetStateAction, useCallback, useEffect } from "react"; import { RGBType } from "./colorPickerSection"; import { FormProvider, useForm } from "react-hook-form"; import { hexToRgb, isValidRGBValue, rgbToHex } from "../../util/colorUtil"; import Input from "../input/input"; import NumberInput from "../input/numberInput"; export default function ColorInput({ hex, rgb, setHex, setRGB, }: { hex: string; rgb?: RGBType; setHex: Dispatch>; setRGB: Dispatch>; }) { type ColorPickerFormModel = { hex: string; r: string; g: string; b: string; }; const getCurrentValues = useCallback(() => { return { hex: hex, r: rgb?.r.toString() ?? "", g: rgb?.g.toString() ?? "", b: rgb?.b.toString() ?? "", }; }, [hex, rgb]); const methods = useForm({ defaultValues: getCurrentValues(), }); const { watch, formState: { isDirty }, handleSubmit, } = methods; const updatedHex = watch("hex"); const updatedRValue = watch("r"); const updatedGValue = watch("g"); const updatedBValue = watch("b"); // resets Value after Submit useEffect(() => { methods.reset(getCurrentValues()); }, [hex, rgb]); // submit RGB value change const submitRGBChange = (formData: ColorPickerFormModel) => { const rValue = Number(formData.r); const gValue = Number(formData.g); const bValue = Number(formData.b); const newRGB = { r: rValue, g: gValue, b: bValue }; setRGB(newRGB); const newHex = rgbToHex(newRGB); setHex(newHex); }; // submit hex value change const submitHexChange = (formData: ColorPickerFormModel) => { const newHex = formData.hex; setHex(newHex); const newRGB = hexToRgb(newHex); setRGB(newRGB); }; // hex value gets updated useEffect(() => { if (hex === updatedHex || !isDirty) return; const isValidHex = /^#[0-9A-F]{6}[0-9a-f]{0,2}$/i.test(updatedHex) && updatedHex.length === 7; if (!isValidHex) return; handleSubmit(submitHexChange)(); }, [updatedHex]); // RGB value gets updated useEffect(() => { if (!isDirty) return; const rValue = Number(updatedRValue); const gValue = Number(updatedGValue); const bValue = Number(updatedBValue); const isValidRGB = isValidRGBValue(rValue) && isValidRGBValue(gValue) && isValidRGBValue(bValue); if (!isValidRGB) return; handleSubmit(submitRGBChange)(); }, [updatedRValue, updatedBValue, updatedGValue]); return (
); }