updates to handle more than one weather widget

pull/34/head
Ben Phelps 2 years ago
parent dc6b172df9
commit 7b6cbb4ee1

@ -1,9 +1,10 @@
import Weather from "components/widgets/weather/weather"; import WeatherApi from "components/widgets/weather/weather";
import OpenWeatherMap from "components/widgets/openweathermap/weather"; import OpenWeatherMap from "components/widgets/openweathermap/weather";
import Resources from "components/widgets/resources/resources"; import Resources from "components/widgets/resources/resources";
const widgetMappings = { const widgetMappings = {
weather: Weather, weather: WeatherApi, // This key will be deprecated in the future
weatherapi: WeatherApi,
openweathermap: OpenWeatherMap, openweathermap: OpenWeatherMap,
resources: Resources, resources: Resources,
}; };

@ -8,33 +8,48 @@ export default function OpenWeatherMap({ options }) {
`/api/widgets/openweathermap?lat=${options.latitude}&lon=${options.longitude}&apiKey=${options.apiKey}&duration=${options.cache}&units=${options.units}` `/api/widgets/openweathermap?lat=${options.latitude}&lon=${options.longitude}&apiKey=${options.apiKey}&duration=${options.cache}&units=${options.units}`
); );
if (error) { if (error || data?.cod == 401) {
return ( return (
<div className="order-last grow flex-none flex flex-row items-center justify-end"> <div className="flex flex-col">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" /> <div className="flex flex-row items-center justify-end">
<div className="flex flex-col ml-3 text-left"> <div className="flex flex-col items-center">
<span className="text-theme-800 dark:text-theme-200 text-sm">API</span> <BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<span className="text-theme-800 dark:text-theme-200 text-xs">Error</span> <div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">API</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">Error</span>
</div>
</div>
</div> </div>
</div> </div>
); );
} }
if (!data) { if (!data) {
return <div className="order-last grow flex-none flex flex-row items-center justify-end"></div>; return <div className="flex flex-row items-center"></div>;
} }
if (data.error) { if (data.error) {
return <div className="order-last grow flex-none flex flex-row items-center justify-end"></div>; return <div className="flex flex-row items-center"></div>;
} }
return ( return (
<div className="order-last grow flex-none flex flex-row items-center justify-end"> <div className="flex flex-col">
<Icon condition={data.weather[0].id} timeOfDay={(data.dt > data.sys.sunrise) && (data.dt < data.sys.sundown) ? "day" : "night"} /> <div className="flex flex-row items-center justify-end">
<div className="flex flex-col ml-3 text-left"> <div className="flex flex-col items-center">
<span className="text-theme-800 dark:text-theme-200 text-sm"> <Icon
{data.main.temp.toFixed(1)}&deg; condition={data.weather[0].id}
</span> timeOfDay={data.dt > data.sys.sunrise && data.dt < data.sys.sundown ? "day" : "night"}
<span className="text-theme-800 dark:text-theme-200 text-xs">{data.weather[0].description.charAt(0).toUpperCase() + data.weather[0].description.slice(1)}</span> />
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">
{options.label && `${options.label}, `}
{data.main.temp.toFixed(1)}&deg;
</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">
{data.weather[0].description.charAt(0).toUpperCase() + data.weather[0].description.slice(1)}
</span>
</div>
</div> </div>
</div> </div>
); );

@ -3,33 +3,37 @@ import { BiError } from "react-icons/bi";
import Icon from "./icon"; import Icon from "./icon";
export default function Weather({ options }) { export default function WeatherApi({ options }) {
const { data, error } = useSWR( const { data, error } = useSWR(
`/api/widgets/weather?lat=${options.latitude}&lon=${options.longitude}&apiKey=${options.apiKey}&duration=${options.cache}` `/api/widgets/weather?lat=${options.latitude}&lon=${options.longitude}&apiKey=${options.apiKey}&duration=${options.cache}`
); );
if (error) { if (error) {
return ( return (
<div className="flex flex-row items-center"> <div className="flex flex-col">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" /> <div className="flex flex-row items-center justify-end">
<div className="flex flex-col ml-3 text-left"> <div className="flex flex-col items-center">
<span className="text-theme-800 dark:text-theme-200 text-sm">API</span> <BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<span className="text-theme-800 dark:text-theme-200 text-xs">Error</span> <div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">API</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">Error</span>
</div>
</div>
</div> </div>
</div> </div>
); );
} }
if (!data) { if (!data) {
return <div className="flex flex-row items-center"></div>; return <div className="flex flex-row items-center justify-end"></div>;
} }
if (data.error) { if (data.error) {
return <div className="flex flex-row items-center"></div>; return <div className="flex flex-row items-center justify-end"></div>;
} }
return ( return (
<div className=" flex flex-col"> <div className="flex flex-col">
<div className="flex flex-row items-center justify-end"> <div className="flex flex-row items-center justify-end">
<div className="flex flex-col items-center"> <div className="flex flex-col items-center">
<Icon condition={data.current.condition.code} timeOfDay={data.current.is_day ? "day" : "night"} /> <Icon condition={data.current.condition.code} timeOfDay={data.current.is_day ? "day" : "night"} />

@ -17,6 +17,8 @@ const ColorToggle = dynamic(() => import("components/color-toggle"), {
ssr: false, ssr: false,
}); });
const rightAlignedWidgets = ["weatherapi", "openweathermap", "weather"];
export default function Home() { export default function Home() {
const { data: services, error: servicesError } = useSWR("/api/services"); const { data: services, error: servicesError } = useSWR("/api/services");
const { data: bookmarks, error: bookmarksError } = useSWR("/api/bookmarks"); const { data: bookmarks, error: bookmarksError } = useSWR("/api/bookmarks");
@ -33,13 +35,13 @@ export default function Home() {
{widgets && ( {widgets && (
<> <>
{widgets {widgets
.filter((widget) => widget.type !== "weather") .filter((widget) => !rightAlignedWidgets.includes(widget.type))
.map((widget, i) => ( .map((widget, i) => (
<Widget key={i} widget={widget} /> <Widget key={i} widget={widget} />
))} ))}
<div className="grow"></div> <div className="grow"></div>
{widgets {widgets
.filter((widget) => widget.type === "weather") .filter((widget) => rightAlignedWidgets.includes(widget.type))
.map((widget, i) => ( .map((widget, i) => (
<Widget key={i} widget={widget} /> <Widget key={i} widget={widget} />
))} ))}

Loading…
Cancel
Save