mirror of
				https://github.com/gethomepage/homepage.git
				synced 2025-11-04 03:27:02 -05:00 
			
		
		
		
	updates to handle more than one weather widget
This commit is contained in:
		
							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)}°
 | 
					            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)}°
 | 
				
			||||||
 | 
					          </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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user