import { Cloud, Sun, CloudRain, CloudSnow, Wind } from 'lucide-react'; import { useEffect, useState } from 'react'; const WeatherWidget = () => { const [data, setData] = useState({ temperature: 0, condition: '', location: '', humidity: 0, windSpeed: 0, icon: '', temperatureUnit: 'C', windSpeedUnit: 'm/s', }); const [loading, setLoading] = useState(true); useEffect(() => { const getApproxLocation = async () => { const res = await fetch('https://ipwhois.app/json/'); const data = await res.json(); return { latitude: data.latitude, longitude: data.longitude, city: data.city, }; }; const getLocation = async ( callback: (location: { latitude: number; longitude: number; city: string; }) => void, ) => { if (navigator.geolocation) { const result = await navigator.permissions.query({ name: 'geolocation', }); if (result.state === 'granted') { navigator.geolocation.getCurrentPosition(async (position) => { const res = await fetch( `https://api-bdc.io/data/reverse-geocode-client?latitude=${position.coords.latitude}&longitude=${position.coords.longitude}&localityLanguage=en`, { method: 'GET', headers: { 'Content-Type': 'application/json', }, }, ); const data = await res.json(); callback({ latitude: position.coords.latitude, longitude: position.coords.longitude, city: data.locality, }); }); } else if (result.state === 'prompt') { callback(await getApproxLocation()); navigator.geolocation.getCurrentPosition((position) => {}); } else if (result.state === 'denied') { callback(await getApproxLocation()); } } else { callback(await getApproxLocation()); } }; getLocation(async (location) => { const res = await fetch(`/api/weather`, { method: 'POST', body: JSON.stringify({ lat: location.latitude, lng: location.longitude, measureUnit: localStorage.getItem('measureUnit') ?? 'Metric', }), }); const data = await res.json(); if (res.status !== 200) { console.error('Error fetching weather data'); setLoading(false); return; } setData({ temperature: data.temperature, condition: data.condition, location: location.city, humidity: data.humidity, windSpeed: data.windSpeed, icon: data.icon, temperatureUnit: data.temperatureUnit, windSpeedUnit: data.windSpeedUnit, }); setLoading(false); }); }, []); return (