import { Server } from '@/types/server'; 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 ServerSelect({ value, onValueChange }: { value: string; onValueChange: (selectedServer: Server) => void }) { const [query, setQuery] = useState(''); const [open, setOpen] = useState(false); const [selected, setSelected] = useState(value); useEffect(() => { setSelected(value); }, [value]); const { data: servers = [], isFetching, refetch, } = useQuery({ queryKey: ['servers', query], queryFn: async () => { const response = await axios.get(route('servers.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 selectedServer = servers.find((server) => server.id === parseInt(selected)); return ( {isFetching ? 'Searching...' : query === '' ? 'Start typing to search servers' : 'No servers found.'} {servers.map((server) => ( { const newSelected = currentValue === selected ? '' : currentValue; setSelected(newSelected); setOpen(false); if (newSelected) { const server = servers.find((s) => s.id.toString() === newSelected); if (server) { onValueChange(server); } } }} className="truncate" > {server.name} ({server.ip}) ))} ); }