'use client'; import { useState } from 'react'; import { Check, ChevronsUpDown } from 'lucide-react'; import { useQuery } from '@tanstack/react-query'; import { Button } from '@/components/ui/button'; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from '@/components/ui/command'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { useDebounce } from '@/hooks/use-debounce'; import { apiFetch } from '@/lib/api/client'; import { cn } from '@/lib/utils'; interface ClientOption { id: string; fullName: string; companyName?: string | null; } interface ClientPickerProps { value: string | null; onChange: (clientId: string | null) => void; placeholder?: string; disabled?: boolean; } export function ClientPicker({ value, onChange, placeholder = 'Select client...', disabled, }: ClientPickerProps) { const [open, setOpen] = useState(false); const [search, setSearch] = useState(''); const debounced = useDebounce(search, 300); const { data } = useQuery<{ data: ClientOption[] }>({ queryKey: ['client-picker', debounced], queryFn: () => apiFetch( `/api/v1/clients?search=${encodeURIComponent(debounced)}&page=1&limit=10&order=desc&includeArchived=false`, ), enabled: open, }); const options = data?.data ?? []; const selectedLabel = (() => { if (!value) return placeholder; const match = options.find((o) => o.id === value); return match?.fullName ?? `Client ${value.slice(0, 8)}`; })(); return ( No clients found. {options.map((c) => ( { onChange(c.id); setOpen(false); }} > {c.fullName} {c.companyName ? ( {c.companyName} ) : null} ))} ); }