"use client"; import { RefreshCwIcon, SearchIcon, XIcon } from "lucide-react"; import { useTranslations } from "next-intl"; import { ReactNode, useEffect, useState } from "react"; import { Command, CommandItem, CommandList, Input, Popover, PopoverContent, PopoverTrigger, } from "../../../../shadcnui"; import { useUserSearch } from "../../hooks"; import { UserAvatar } from "./UserAvatar"; type UserSearchPopoverProps = { children: ReactNode; onSelect: (userId: string) => void; align?: "start" | "center" | "end"; className?: string; }; export const UserSearchPopover = ({ children, onSelect, align = "start", className }: UserSearchPopoverProps) => { const t = useTranslations(); const [isOpen, setIsOpen] = useState(false); const { users, searchQuery, setSearchQuery, isLoading, loadUsers, clearSearch } = useUserSearch(); useEffect(() => { if (isOpen && users.length === 0 && !searchQuery) { loadUsers(""); } }, [isOpen, users.length, searchQuery, loadUsers]); const handleSelectUser = (userId: string) => { onSelect(userId); setIsOpen(false); clearSearch(); }; return ( {children} e.stopPropagation()} className={className ?? "w-80"}>
setSearchQuery(e.target.value)} value={searchQuery} onClick={(e) => e.stopPropagation()} /> {isLoading ? ( ) : searchQuery ? ( { e.stopPropagation(); clearSearch(); }} /> ) : null}
{users.length > 0 ? ( users.map((user) => ( handleSelectUser(user.id)} > {user.name} )) ) : (
{isLoading ? t(`ui.buttons.loading`) : t(`ui.search.no_results`, { type: t(`entities.users`, { count: 1 }) })}
)}
); };