local-weather/components/WeatherNow.tsx
ChrQR b8d543e1c1
Some checks failed
Docker Build & Publish / Build Docker (push) Failing after 1m10s
moved context to separate file and imported
2024-05-11 01:21:34 +02:00

60 lines
1.8 KiB
TypeScript

"use client";
import { getHourlyForecast } from "@/app/actions";
import Temperature from "./Temperature";
import { HourlyCardPropType, HourlyForecast, WeatherContextType } from "@/types/types";
import { createContext, useContext, useEffect, useState } from "react";
import { defaultHourlyForecast } from "@/app/defaultState";
import { LocationContext } from "@/context/LocationContext";
import WeatherHero from "./WeatherHero";
import HourlyCard from "./HourlyCard/HourlyCard";
export const WeatherContext = createContext<WeatherContextType>({
weather: defaultHourlyForecast,
setWeather: () => {}, // Default function, does nothing
});
export default function WeatherNow() {
const { geoLocation } = useContext(LocationContext);
const [weather, setWeather] = useState<HourlyForecast>(defaultHourlyForecast);
const contextValue: WeatherContextType = {
weather,
setWeather,
};
useEffect(() => {
let mounted = true;
getHourlyForecast(geoLocation).then((data) => {
if (mounted) {
setWeather(data);
}
});
return () => {
mounted = false;
};
}, [geoLocation]);
return (
<div className="text-center">
<h1 className="my-4 text-2xl">
Here is the current weather in {geoLocation.name}
</h1>
<WeatherContext.Provider value={contextValue}>
<WeatherHero />
<Temperature />
<div className="flex flex-wrap h-full">
{weather.hourly && weather.hourly.apparent_temperature.map((temp, index) => (
index < 12 && // Ensure we only render the first 12 hours
<HourlyCard
key={index}
temperature={temp}
weatherCode={weather.hourly.weather_code[index]}
time={weather.hourly.time[index]}
/>
))}
</div>
</WeatherContext.Provider>
</div>
);
}