import { Popover } from "@/comps/custom/Popover"; import { Input } from "@/comps/ui/input"; import { Skeleton } from "@/comps/ui/skeleton"; import { useLocal } from "@/utils/use-local"; import { ChevronDown } from "lucide-react"; import { FC, useEffect } from "react"; import { FieldListItem, FieldOptions } from "../type"; import { FormHook } from "../utils/utils"; type DropdownProps = { value: string; options: FieldOptions; form?: FormHook; name: string; }; export const Dropdown: FC = ({ value, options, form, name }) => { const local = useLocal({ status: "loading" as "loading" | "ready", open: false, ref: { input: null as null | HTMLInputElement }, list: [] as FieldListItem[], input: "", label: "", filter: "", }); useEffect(() => { if (form) { local.status = "loading"; local.render(); const callback = (result: any[]) => { local.list = result.map((e) => { if (typeof e === "string") { return { value: e, label: e, }; } return e; }); const found = local.list.find((e) => e.value === value); if (found) { local.label = found.label; } local.status = "ready"; local.render(); }; const res = options({ data: form.hook.getValues(), current_name: name }); if (res instanceof Promise) { res.then(callback); } else { callback(res); } } }, [options]); let filtered = local.list; if (local.filter) { filtered = local.list.filter((e) => { if (e.label.toLowerCase().includes(local.filter)) return true; return false; }); } return ( { local.open = false; local.render(); }} arrow={false} className={cx("c-rounded-sm c-bg-white")} content={
{local.status === "loading" && ( <>
)} {local.status === "ready" && ( <> {filtered.map((item, idx) => { return (
0 && "c-border-t", idx === 0 && "c-rounded-t-sm", idx === local.list.length - 1 && "c-rounded-b-sm" )} onClick={() => { if (form) { local.open = false; form.hook.setValue(name, item.value); form.render(); } }} > {item.label}
); })} )}
} >
{ local.open = true; local.input = local.label; local.filter = ""; local.render(); setTimeout(() => { local.ref.input?.focus(); }); }} >
{ local.input = e.currentTarget.value; local.filter = local.input.toLowerCase(); local.render(); }} ref={(el) => { local.ref.input = el; }} type="text" /> {!local.open && (
{local.label}
)}
); };