import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/comps/ui/form"; import { useLocal } from "@/utils/use-local"; import autosize from "autosize"; import { FC, ReactNode, 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 { Radio } from "./Radio"; import { Date } from "./Date"; import { Datetime } from "./Datetime"; import { InputMoney } from "./InputMoney"; import { PopUpDropdown } from "./PopUpDropdown"; import { SliderOptions } from "./Slider/types"; import { FormHook, modify } from "./utils/utils"; export const Field: FC<{ name: string; label: string; desc?: string; form?: FormHook; type: | "text" | "textarea" | "dropdown" | "password" | "radio" | "date" | "datetime" | "money" | "slider" | "master-link"; required: "y" | "n"; options: () => Promise<{ value: string; label: string }[]>; slider: () => Promise; on_change: (arg: { value: any }) => void | Promise; PassProp: any; custom: "y" | "n"; child: any; selection: "single" | "multi"; label_alt: | ReactNode | FC<{ modify: typeof modify; data: any; current_name: string }>; }> = ({ name, form, desc, label, type, required, options, slider, on_change, PassProp, custom, selection, child, label_alt, }) => { 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", }, modify: null as any, }); 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" && (

*

)}
{typeof label_alt === "function" && form && label_alt({ modify: local.modify ? local.modify : modify.bind({ form, }), current_name: name, data: form.hook.getValues(), })} {typeof label_alt !== "function" && label_alt}
<> {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" && (