"use client"; import { useState, useRef } from "react"; import { Input } from "~/components/ui/input"; import { Card } from "~/components/ui/card"; interface AddressAutocompleteProps { value: string; onChange: (value: string) => void; onSelect: (value: string) => void; placeholder?: string; } export function AddressAutocomplete({ value, onChange, onSelect, placeholder }: AddressAutocompleteProps) { const [suggestions, setSuggestions] = useState([]); const [showSuggestions, setShowSuggestions] = useState(false); const timeoutRef = useRef(null); const fetchSuggestions = async (query: string) => { if (!query) { setSuggestions([]); return; } const res = await fetch(`https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(query)}`); const data = await res.json(); setSuggestions(data); }; const handleInputChange = (e: React.ChangeEvent) => { const val = e.target.value; onChange(val); setShowSuggestions(true); if (timeoutRef.current) clearTimeout(timeoutRef.current); timeoutRef.current = setTimeout(() => fetchSuggestions(val), 300); }; const handleSelect = (address: string) => { onSelect(address); setShowSuggestions(false); setSuggestions([]); }; return (
value && setShowSuggestions(true)} onBlur={() => setTimeout(() => setShowSuggestions(false), 150)} /> {showSuggestions && suggestions.length > 0 && (
    {suggestions.map((s, i) => (
  • handleSelect(s.display_name)} > {s.display_name}
  • ))}
)}
); }