import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/comps/ui/form"; import { useLocal } from "@/utils/use-local"; import autosize from "autosize"; import { FC, useEffect, useRef } from "react"; import { UseFormReturn } from "react-hook-form"; import { Button } from "../ui/button"; import { Input } from "../ui/input"; import { Textarea } from "../ui/textarea"; import { ButtonOptions } from "./ButtonOptions"; import { Date } from "./Date"; import { Datetime } from "./Datetime"; import { InputMoney } from "./InputMoney"; import { PopUpDropdown } from "./PopUpDropdown"; import { SliderOptions } from "./Slider/types"; export const Field: FC<{ name: string; label: string; desc?: string; form?: { hook: UseFormReturn; render: () => void }; type: | "text" | "textarea" | "dropdown" | "password" | "button-options" | "date" | "datetime" | "money" | "slider" | "master-link"; required: "y" | "n"; options: () => Promise<{ value: string; label: string }[]>; slider: () => Promise; on_change: (arg: { value: any }) => void | Promise; }> = ({ name, form, desc, label, type, required, options, slider, on_change, }) => { const value = form?.hook.getValues()[name]; const local = useLocal({ dropdown: { popup: false, }, date: { // label: "", popup: false, }, slider: { value: 0, opt: { step: 1, min: { value: 0, label: "Start" }, max: { value: 100, label: "End" }, } as SliderOptions, status: "init" as "init" | "loading" | "ready", }, }); const textAreaRef = useRef(); useEffect(() => { autosize(textAreaRef.current); return () => { autosize.destroy(textAreaRef.current); }; }, []); useEffect(() => { if (type === "slider") { local.slider.value = parseSliderValue(value, local.slider.opt); if (typeof slider === "function") { if (local.slider.status === "init") { local.slider.status = "ready"; local.render(); (async () => { const res = await slider(); local.slider.opt = res; local.render(); })(); } } else { local.slider.status = "ready"; local.render(); } } }, [value]); return ( <> {local.dropdown.popup && ( { local.dropdown.popup = false; local.render(); }} on_select={(value: any) => { form?.hook.setValue(name, value); }} title={label} options={options} /> )} ( {label} {required === "y" &&

*

}
<> {type === "slider" && (
{local.slider.opt.min.value}
{local.slider.opt.min.label}
{ const value = e.currentTarget.value; local.slider.value = parseSliderValue( value, local.slider.opt ); form?.hook.setValue(name, value); local.render(); }} value={local.slider.value} min={local.slider.opt.min.value} max={local.slider.opt.max.value} />
{local.slider.value}
{local.slider.opt.max.value}
{local.slider.opt.max.label}
)} {["text", "password"].includes(type) && ( { on_change({ value: e.currentTarget.value }); } : undefined } /> )} {type === "textarea" && (