'use client' import { useState, useEffect, useRef } from 'react' import { ChevronDownIcon } from '@heroicons/react/24/outline' import axios from 'axios' export interface Station { id: string name: string } interface StationSelectorProps { selectedStation: Station | null onSelect: (station: Station) => void } export default function StationSelector({ selectedStation, onSelect }: StationSelectorProps) { const [search, setSearch] = useState('') const [stations, setStations] = useState([]) const [isOpen, setIsOpen] = useState(false) const [loading, setLoading] = useState(false) const dropdownRef = useRef(null) useEffect(() => { const fetchStations = async () => { setLoading(true) try { const params = search ? { search } : {} const response = await axios.get('/api/stations', { params }) setStations(response.data.stations || []) } catch (err) { console.error('Error fetching stations:', err) } finally { setLoading(false) } } const debounce = setTimeout(fetchStations, 300) return () => clearTimeout(debounce) }, [search]) useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false) } } document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) }, []) const handleSelect = (station: Station) => { onSelect(station) setSearch('') setIsOpen(false) } return (
setIsOpen(!isOpen)} > { setSearch(e.target.value) setIsOpen(true) }} onClick={(e) => { e.stopPropagation() setIsOpen(true) }} className="flex-1 bg-transparent text-white placeholder-gray-400 outline-none text-sm md:text-base" />
{isOpen && (
{loading ? (
Loading...
) : stations.length === 0 ? (
No stations found
) : ( stations.map((station) => (
handleSelect(station)} className={`px-3 py-2 cursor-pointer hover:bg-gray-700 transition-colors ${ selectedStation?.id === station.id ? 'bg-gray-700' : '' }`} > {station.name} ({station.id})
)) )}
)}
) }