137 lines
4.3 KiB
TypeScript
137 lines
4.3 KiB
TypeScript
import React, { useState, useRef, ChangeEvent, useEffect } from 'react';
|
|
|
|
interface AddressSuggestionsProps {
|
|
address: string;
|
|
setAddress: (address: string) => void;
|
|
postcode: string;
|
|
setPostcode: (postcode: string) => void;
|
|
setCity: (city: string) => void;
|
|
}
|
|
|
|
const fetchAddressSuggestions = async (query: string): Promise<any[]> => {
|
|
try {
|
|
const response = await fetch(
|
|
`https://api.dataforsyningen.dk/adgangsadresser/autocomplete?q=${encodeURIComponent(query)}&fuzzy=true`
|
|
);
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (error) {
|
|
console.error('Error fetching address suggestions:', error);
|
|
return [];
|
|
}
|
|
};
|
|
|
|
const fetchCity = async (postcode: string): Promise<string | null> => {
|
|
try {
|
|
const response = await fetch(`https://api.dataforsyningen.dk/postnumre?nr=${postcode}`);
|
|
const data = await response.json();
|
|
if (data.length > 0) {
|
|
return data[0].navn; // Return the city name
|
|
}
|
|
return null;
|
|
} catch (error) {
|
|
console.error('Error fetching city:', error);
|
|
return null;
|
|
}
|
|
};
|
|
|
|
const AddressSuggestions: React.FC<AddressSuggestionsProps> = ({ address, setAddress, postcode, setPostcode, setCity }) => {
|
|
const [addressSuggestions, setAddressSuggestions] = useState<any[]>([]);
|
|
const [showSuggestions, setShowSuggestions] = useState(false);
|
|
const suggestionListRef = useRef<HTMLUListElement | null>(null);
|
|
|
|
const handleAddressChange = async (e: ChangeEvent<HTMLInputElement>) => {
|
|
const newValue = e.target.value;
|
|
setAddress(newValue);
|
|
|
|
if (newValue) {
|
|
const suggestions = await fetchAddressSuggestions(newValue);
|
|
setAddressSuggestions(suggestions);
|
|
setShowSuggestions(true);
|
|
} else {
|
|
setAddressSuggestions([]);
|
|
setShowSuggestions(false);
|
|
}
|
|
};
|
|
|
|
const handleAddressSelect = async (selectedAddress: any) => {
|
|
const adgangsadresse = selectedAddress.adgangsadresse;
|
|
if (adgangsadresse) {
|
|
const street = [adgangsadresse.vejnavn, adgangsadresse.husnr].filter(Boolean).join(' ');
|
|
const postcode = adgangsadresse.postnr || '';
|
|
setAddress(street);
|
|
setPostcode(postcode);
|
|
setAddressSuggestions([]);
|
|
setShowSuggestions(false);
|
|
|
|
// Fetch and set the city based on the selected postcode
|
|
const cityName = await fetchCity(postcode);
|
|
if (cityName) {
|
|
setCity(cityName);
|
|
}
|
|
}
|
|
};
|
|
|
|
const handleClickOutside = (event: MouseEvent) => {
|
|
if (suggestionListRef.current && !suggestionListRef.current.contains(event.target as Node)) {
|
|
setShowSuggestions(false);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
document.addEventListener('click', handleClickOutside);
|
|
return () => {
|
|
document.removeEventListener('click', handleClickOutside);
|
|
};
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
const fetchAndSetCity = async () => {
|
|
if (postcode) {
|
|
const cityName = await fetchCity(postcode);
|
|
if (cityName) {
|
|
setCity(cityName);
|
|
}
|
|
}
|
|
};
|
|
fetchAndSetCity();
|
|
}, [postcode, setCity]);
|
|
|
|
return (
|
|
<div className="relative mb-4">
|
|
<label htmlFor="address" className="block text-sm font-medium text-gray-700">Address</label>
|
|
<input
|
|
id="address"
|
|
type="text"
|
|
value={address}
|
|
onChange={handleAddressChange}
|
|
className="mt-1 p-2 block w-full border border-gray-300 rounded-md shadow-sm"
|
|
required
|
|
/>
|
|
{showSuggestions && addressSuggestions.length > 0 && (
|
|
<ul ref={suggestionListRef} className="absolute z-50 w-full bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-y-auto">
|
|
{addressSuggestions.map((suggestion, index) => {
|
|
const adgangsadresse = suggestion.adgangsadresse;
|
|
if (!adgangsadresse) return null;
|
|
|
|
const vejnavn = adgangsadresse.vejnavn || '';
|
|
const husnr = adgangsadresse.husnr || '';
|
|
const postnr = adgangsadresse.postnr || '';
|
|
|
|
return (
|
|
<li
|
|
key={index}
|
|
onMouseDown={() => handleAddressSelect(suggestion)}
|
|
className="p-2 hover:bg-gray-100 cursor-pointer"
|
|
>
|
|
{vejnavn} {husnr}, {postnr}
|
|
</li>
|
|
);
|
|
})}
|
|
</ul>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default AddressSuggestions; |