import { JSX } from "react"; import RefreshButton from "./RefreshButton"; // 1. Define explicit TypeScript interfaces for the Open-Meteo response interface OpenMeteoResponse { current: { time: string; temperature_2m: number; relative_humidity_2m: number; wind_speed_10m: number; weather_code: number; }; current_units: { temperature_2m: string; relative_humidity_2m: string; wind_speed_10m: string; }; } // Map WMO Weather Interpretation Codes to friendly labels & badge styles // https://emojipedia.org/ copy and paste! function getWeatherInfo(code: number): { label: string; badgeClass: string } { if (code === 0) return { label: "Clear Sky ☀️", badgeClass: "badge-warning" }; if (code >= 1 && code <= 3) return { label: "Partly Cloudy ⛅", badgeClass: "badge-info" }; if (code >= 45 && code <= 48) return { label: "Foggy 🌫️", badgeClass: "badge-ghost" }; if (code >= 51 && code <= 67) return { label: "Rain / Drizzle 🌧️", badgeClass: "badge-primary" }; if (code >= 71 && code <= 77) return { label: "Snow ❄️", badgeClass: "badge-secondary" }; return { label: "Stormy ⛈️", badgeClass: "badge-error" }; } // 2. Async Server Component - direct data fetching on the server export default async function WeatherPage(): Promise { // Fetching London forecast from Open-Meteo (No API key needed) const res = await fetch( "https://api.open-meteo.com/v1/forecast?latitude=51.5074&longitude=-0.1278¤t=temperature_2m,relative_humidity_2m,wind_speed_10m,weather_code", { // Revalidate every 10 minutes (ISR - Incremental Static Regeneration) next: { revalidate: 600 } // next: { // tags: ["weather-data"] // <--- Label this request with a tag // } } ); // ------------------------------------------------------------- // ⏳ SIMULATION DELAY // Slows down the revalidation so the STALE window stays open. // await new Promise((resolve) => setTimeout(resolve, 3000)); // ------------------------------------------------------------- if (!res.ok) { throw new Error("Failed to fetch weather data from Open-Meteo."); } const data: OpenMeteoResponse = await res.json(); const weather = getWeatherInfo(data.current.weather_code); return (
{/* daisyUI Card Container */}
{/* Header section with Location & Condition Badge */}

London Weather

{weather.label}

Last updated: {new Date(data.current.time).toLocaleTimeString()}

{/* daisyUI Stats Grid */}
{/* Temperature Stat */}
Temperature
{data.current.temperature_2m} {data.current_units.temperature_2m}
Real-time server reading
{/* Humidity Stat */}
Humidity
{data.current.relative_humidity_2m} {data.current_units.relative_humidity_2m}
Relative humidity
{/* Wind Speed Stat */}
Wind Speed
{data.current.wind_speed_10m} {data.current_units.wind_speed_10m}
10m surface level
); }