import { User } from '@/types/user'; import { useState, useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Button } from '@/components/ui/button'; import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; import { cn } from '@/lib/utils'; import axios from 'axios'; export default function UserSelect({ value, onValueChange }: { value: string; onValueChange: (selectedUser: User) => void }) { const [query, setQuery] = useState(''); const [open, setOpen] = useState(false); const [selected, setSelected] = useState(value); useEffect(() => { setSelected(value); }, [value]); const { data: users = [], isFetching, refetch, } = useQuery({ queryKey: ['users', query], queryFn: async () => { const response = await axios.get(route('users.json', { query: query })); return response.data; }, enabled: false, }); const onOpenChange = (open: boolean) => { setOpen(open); if (open) { refetch(); } }; useEffect(() => { if (open && query !== '') { const timeoutId = setTimeout(() => { refetch(); }, 300); // Debounce search return () => clearTimeout(timeoutId); } }, [query, open, refetch]); const selectedUser = users.find((user) => user.id === parseInt(selected)); return ( {isFetching ? 'Searching...' : query === '' ? 'Start typing to search users' : 'No users found.'} {users.map((user) => ( { const newSelected = currentValue === selected ? '' : currentValue; setSelected(newSelected); setOpen(false); if (newSelected) { const user = users.find((s) => s.id.toString() === newSelected); if (user) { onValueChange(user); } } }} className="truncate" > {user.name} ({user.email}) ))} ); }