"use client"; import { CircleX, RefreshCwIcon, SearchIcon, XIcon } from "lucide-react"; import { useTranslations } from "next-intl"; import { useCallback, useEffect, useRef, useState } from "react"; import { FormFieldWrapper } from "../../../../components/forms"; import { Modules } from "../../../../core"; import { DataListRetriever, useDataListRetriever, useDebounce } from "../../../../hooks"; import { Avatar, AvatarFallback, AvatarImage, Command, CommandItem, CommandList, Input, Popover, PopoverContent, PopoverTrigger, } from "../../../../shadcnui"; import { UserInterface } from "../../data"; import { UserService } from "../../data/user.service"; import { UserAvatar } from "../widgets"; type UserSelectorProps = { id: string; form: any; label?: string; placeholder?: string; onChange?: (user?: UserInterface) => void; isRequired?: boolean; }; export function UserSelector({ id, form, label, placeholder, onChange, isRequired = false }: UserSelectorProps) { 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 UserService.findMany(params); }, retrieverParams: {}, module: Modules.User, }); 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 setUser = (user?: UserInterface) => { if (onChange) onChange(user); if (!user) { form.setValue(id, undefined); setOpen(false); return; } form.setValue(id, { id: user.id, name: user.name, avatar: user.avatar }); setOpen(false); setTimeout(() => { setOpen(false); }, 0); }; return (
{(field) => (
{field.value ? (
{field.value?.name ? field.value?.name.split(" ").map((name: string) => name.charAt(0).toUpperCase()) : "X"}
{field.value?.name ?? ""}
) : (
{placeholder ?? t(`ui.search.placeholder`, { type: t(`entities.users`, { count: 1 }) })}
)}
{field.value && ( setUser()} /> )}
setSearchTerm(e.target.value)} value={searchTerm} /> {isSearching ? ( ) : searchTermRef.current ? ( { setSearchTerm(""); search(""); }} /> ) : ( <> )}
{data.data && data.data.length > 0 && (data.data as UserInterface[]).map((user: UserInterface) => ( setUser(user)} > {user.name} ))}
)}
); }