"use client"; import { CircleX, RefreshCwIcon, SearchIcon, XIcon } from "lucide-react"; import { useTranslations } from "next-intl"; import { useCallback, useEffect, useRef, useState } from "react"; import { Command, CommandItem, CommandList, Input, Popover, PopoverContent, PopoverTrigger, } from "../../../../shadcnui"; import { FormFieldWrapper } from "../../../../components"; import { Modules } from "../../../../core"; import { DataListRetriever, useDataListRetriever, useDebounce } from "../../../../hooks"; import { HowToInterface } from "../../data/HowToInterface"; import { HowToService } from "../../data/HowToService"; type HowToSelectorProps = { id: string; form: any; label?: string; placeholder?: string; onChange?: (howTo?: HowToInterface) => void; isRequired?: boolean; }; export default function HowToSelector({ id, form, label, placeholder, onChange, isRequired = false, }: HowToSelectorProps) { const t = useTranslations(); const [open, setOpen] = useState(false); const searchTermRef = useRef(""); const [searchTerm, setSearchTerm] = useState(""); const [isSearching, setIsSearching] = useState(false); const data: DataListRetriever = useDataListRetriever({ retriever: (params) => { return HowToService.findMany(params); }, retrieverParams: {}, module: Modules.HowTo, }); const search = useCallback( async (searchedTerm: string) => { try { if (searchedTerm === searchTermRef.current) return; setIsSearching(true); searchTermRef.current = searchedTerm; await data.search(searchedTerm); } finally { setIsSearching(false); } }, [searchTermRef, data], ); const updateSearchTerm = useDebounce(search, 500); useEffect(() => { setIsSearching(true); updateSearchTerm(searchTerm); }, [updateSearchTerm, searchTerm]); const setHowTo = (howTo?: HowToInterface) => { if (onChange) onChange(howTo); if (!howTo) { form.setValue(id, undefined, { shouldDirty: true }); setOpen(false); return; } form.setValue(id, { id: howTo.id, name: howTo.name }, { shouldDirty: true }); setOpen(false); setTimeout(() => { setOpen(false); }, 0); }; return (
{(field: any) => (
{field.value ? (
{field.value?.name ?? ""}
) : (
{placeholder ?? t(`generic.search.placeholder`, { type: t(`entities.howtos`, { count: 1 }) })}
)}
{field.value && ( setHowTo()} /> )}
) => setSearchTerm(e.target.value)} value={searchTerm} /> {isSearching ? ( ) : searchTermRef.current ? ( { setSearchTerm(""); search(""); }} /> ) : ( <> )}
{data.data && data.data.length > 0 && (data.data as HowToInterface[]).map((howTo: HowToInterface) => ( setHowTo(howTo)} > {howTo.name} ))}
)}
); }