'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 { stageLabelFor } from '@/lib/constants'; import { cn } from '@/lib/utils'; interface InterestOption { id: string; clientId: string; clientName?: string; pipelineStage?: string; // Some list endpoints surface the linked client inline; we display whatever's // available with a fallback to a short id. } interface InterestPickerProps { value: string | null; onChange: (interestId: string | null) => void; placeholder?: string; disabled?: boolean; } export function InterestPicker({ value, onChange, placeholder = 'Select interest...', disabled, }: InterestPickerProps) { const [open, setOpen] = useState(false); const [search, setSearch] = useState(''); const debounced = useDebounce(search, 300); const { data } = useQuery<{ data: InterestOption[] }>({ queryKey: ['interest-picker', debounced], queryFn: () => apiFetch( `/api/v1/interests?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); if (!match) return `Interest ${value.slice(0, 8)}`; if (match.clientName) return `${match.clientName} - ${stageLabelFor(match.pipelineStage)}`; return `Interest ${match.id.slice(0, 8)}`; })(); return ( No interests found. {options.map((i) => ( { onChange(i.id); setOpen(false); }} > {i.clientName ?? `Interest ${i.id.slice(0, 8)}`} {i.pipelineStage ? ( {i.pipelineStage} ) : null} ))} ); }