import { useState, useEffect } from 'react'; import { Input } from '@/components/ui/input'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Search, Edit, MapPin, Loader2, X } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { cn } from '@/lib/utils'; import { handleNonCriticalError } from '@/lib/errorHandler'; interface LocationResult { place_id: number; display_name: string; address?: { city?: string; town?: string; village?: string; state?: string; country?: string; }; } interface HeadquartersLocationInputProps { value: string; onChange: (value: string) => void; disabled?: boolean; className?: string; } export function HeadquartersLocationInput({ value, onChange, disabled = false, className }: HeadquartersLocationInputProps): React.JSX.Element { const [mode, setMode] = useState<'search' | 'manual'>('search'); const [searchQuery, setSearchQuery] = useState(''); const [results, setResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const [showResults, setShowResults] = useState(false); // Debounced search effect useEffect(() => { if (!searchQuery || searchQuery.length < 2) { setResults([]); setShowResults(false); return; } const timeoutId = setTimeout(async (): Promise => { setIsSearching(true); try { const response = await fetch( `https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent( searchQuery )}&limit=5&addressdetails=1`, { headers: { 'User-Agent': 'ThemeParkArchive/1.0' } } ); if (response.ok) { const data = await response.json() as LocationResult[]; setResults(data); setShowResults(true); } } catch (error) { handleNonCriticalError(error, { action: 'Search headquarters locations', metadata: { query: searchQuery } }); } finally { setIsSearching(false); } }, 500); return () => clearTimeout(timeoutId); }, [searchQuery]); const formatLocation = (result: LocationResult): string => { const { city, town, village, state, country } = result.address || {}; const cityName = city || town || village; if (cityName && state && country) { return `${cityName}, ${state}, ${country}`; } else if (cityName && country) { return `${cityName}, ${country}`; } else if (country) { return country; } return result.display_name; }; const handleSelectLocation = (result: LocationResult): void => { const formatted = formatLocation(result); onChange(formatted); setSearchQuery(''); setShowResults(false); setResults([]); }; const handleClear = (): void => { onChange(''); setSearchQuery(''); setResults([]); setShowResults(false); }; return (
setMode(val as 'search' | 'manual')}> Search Location Manual Entry
setSearchQuery(e.target.value)} placeholder="Search for location (e.g., Munich, Germany)..." disabled={disabled} className="pr-10" /> {isSearching && ( )}
{showResults && results.length > 0 && (
{results.map((result) => ( ))}
)} {showResults && results.length === 0 && !isSearching && (

No locations found. Try a different search term.

)} {value && (
{value}
)}
onChange(e.target.value)} placeholder="Enter location manually..." disabled={disabled} />

Enter any location text. For better data quality, use Search mode.

); }