'use client'; 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()); } }; const fetchWeatherForCoords = async ( lat: number, lng: number, city?: string, ) => { try { const res = await fetch(`/api/weather`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ lat, lng, 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: city ?? data.location ?? '', humidity: data.humidity, windSpeed: data.windSpeed, icon: data.icon, temperatureUnit: data.temperatureUnit, windSpeedUnit: data.windSpeedUnit, }); } catch (err) { console.error('Error fetching weather data', err); } finally { setLoading(false); } }; (async () => { // Check automatic setting from localStorage (default true) const automatic = localStorage.getItem('automaticWeatherLocation') === null ? true : localStorage.getItem('automaticWeatherLocation') === 'true'; if (!automatic) { const latStr = localStorage.getItem('weatherLatitude') ?? ''; const lngStr = localStorage.getItem('weatherLongitude') ?? ''; const name = localStorage.getItem('weatherLocationName') ?? ''; const lat = parseFloat(latStr); const lng = parseFloat(lngStr); if (!isNaN(lat) && !isNaN(lng)) { // Use provided coordinates; prefer user-provided name if available const locName = name !== '' ? name : `${lat}, ${lng}`; await fetchWeatherForCoords(lat, lng, locName); return; } // If invalid or missing, fall through to normal location lookup } // Normal behavior: use geolocation or IP-based approximate location await getLocation(async (location) => { await fetchWeatherForCoords( location.latitude, location.longitude, location.city, ); }); })(); }, []); return (