import { useEffect, useState } from "react"; // react-hook-form import { useForm } from "react-hook-form"; // ui import { Input, PrimaryButton, SecondaryButton } from "components/ui"; const defaultValues = { palette: "", }; export const ThemeForm: React.FC<any> = ({ handleFormSubmit, handleClose, status, data }) => { const { register, formState: { errors, isSubmitting }, handleSubmit, reset, } = useForm<any>({ defaultValues, }); const [darkPalette, setDarkPalette] = useState(false); const handleUpdateTheme = async (formData: any) => { await handleFormSubmit({ ...formData, darkPalette }); reset({ ...defaultValues, }); }; useEffect(() => { reset({ ...defaultValues, ...data, }); }, [data, reset]); // --color-bg-base: 25, 27, 27; // --color-bg-surface-1: 31, 32, 35; // --color-bg-surface-2: 39, 42, 45; // --color-border: 46, 50, 52; // --color-bg-sidebar: 19, 20, 22; // --color-accent: 60, 133, 217; // --color-text-base: 255, 255, 255; // --color-text-secondary: 142, 148, 146; return ( <form onSubmit={handleSubmit(handleUpdateTheme)}> <div className="space-y-5"> <h3 className="text-lg font-medium leading-6 text-brand-base">Customize your theme</h3> <div className="space-y-4"> <div className="mt-6 grid grid-cols-1 gap-x-6 gap-y-4 sm:grid-cols-6"> <div className="sm:col-span-2"> <Input id="bgBase" label="Background" name="bgBase" type="name" placeholder="#FFFFFF" autoComplete="off" error={errors.bgBase} register={register} validations={{ required: "Background color is required", pattern: { value: /^#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Background color should be hex format", }, }} /> </div> <div className="sm:col-span-2"> <Input id="bgSurface1" label="Background surface 1" name="bgSurface1" type="name" placeholder="#FFFFFF" autoComplete="off" error={errors.bgSurface1} register={register} validations={{ required: "Background surface 1 color is required", pattern: { value: /^#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Background surface 1 color should be hex format", }, }} /> </div> <div className="sm:col-span-2"> <Input id="bgSurface2" label="Background surface 2" name="bgSurface1" type="name" placeholder="#FFFFFF" autoComplete="off" error={errors.bgSurface1} register={register} validations={{ required: "Background surface 2 color is required", pattern: { value: /^#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Background surface 2 color should be hex format", }, }} /> </div> <div className="sm:col-span-2"> <Input id="border" label="Border" name="border" type="name" placeholder="#FFFFFF" autoComplete="off" error={errors.border} register={register} validations={{ required: "Border color is required", pattern: { value: /^#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Border color should be hex format", }, }} /> </div> <div className="sm:col-span-2"> <Input id="sidebar" label="Sidebar" name="sidebar" type="name" placeholder="#FFFFFF" autoComplete="off" error={errors.sidebar} register={register} validations={{ required: "Sidebar color is required", pattern: { value: /^#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Sidebar color should be hex format", }, }} /> </div> <div className="sm:col-span-2"> <Input id="accent" label="Accent" name="accent" type="name" placeholder="#FFFFFF" autoComplete="off" error={errors.accent} register={register} validations={{ required: "Accent color is required", pattern: { value: /^#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Accent color should be hex format", }, }} /> </div> <div className="sm:col-span-3"> <Input id="textBase" label="Text primary" name="textBase" type="name" placeholder="#FFFFFF" autoComplete="off" error={errors.textBase} register={register} validations={{ required: "Text primary color is required", pattern: { value: /^#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Text primary color should be hex format", }, }} /> </div> <div className="sm:col-span-3"> <Input id="textSecondary" label="Text secondary" name="textSecondary" type="name" placeholder="#FFFFFF" autoComplete="off" error={errors.textSecondary} register={register} validations={{ required: "Text secondary color is required", pattern: { value: /^#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Text secondary color should be hex format", }, }} /> </div> </div> <div> <Input id="palette" label="All colors" name="palette" type="name" placeholder="Enter comma separated hex colors" autoComplete="off" error={errors.palette} register={register} validations={{ required: "Color values is required", pattern: { value: /^(#(?:[0-9a-fA-F]{3}){1,2},){7}#(?:[0-9a-fA-F]{3}){1,2}$/g, message: "Color values should be hex format, separated by commas", }, }} /> </div> <div className="flex cursor-pointer items-center gap-1" onClick={() => setDarkPalette((prevData) => !prevData)} > <span className="text-xs">Dark palette</span> <button type="button" className={`pointer-events-none relative inline-flex h-4 w-7 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent ${ darkPalette ? "bg-brand-accent" : "bg-gray-300" } transition-colors duration-300 ease-in-out focus:outline-none`} role="switch" aria-checked="false" > <span className="sr-only">Dark palette</span> <span aria-hidden="true" className={`pointer-events-none inline-block h-3 w-3 ${ darkPalette ? "translate-x-3" : "translate-x-0" } transform rounded-full bg-brand-surface-2 shadow ring-0 transition duration-300 ease-in-out`} /> </button> </div> </div> </div> <div className="mt-5 flex justify-end gap-2"> <SecondaryButton onClick={handleClose}>Cancel</SecondaryButton> <PrimaryButton type="submit" loading={isSubmitting}> {status ? isSubmitting ? "Updating Theme..." : "Update Theme" : isSubmitting ? "Creating Theme..." : "Set Theme"} </PrimaryButton> </div> </form> ); };