* Clean up unused code * Fix media player formatting issue for labels with new line characteres. * Refactor the media player handlers into a class. * More code cleanup and organize shared weather utils into distinct classes. * Flatten some nesting. * Move weather manager in dedicated class and build HTTP Utility class for Rest API calling. * Remove logs * Rebase master merge * Reorg code (WIP) * More reorg * Delete utility scripts * Reorg options * Finish moving all options over * Fix typescript issues * Update options imports to default * missed update * Screw barrel files honestly, work of the devil. * Only initialize power profiles if power-profiles-daemon is running. * Fix window positioning and weather service naming * style dir * More organization * Restructure types to be closer to their source * Remove lib types and constants * Update basic weather object to be saner with extensibility. * Service updates * Fix initialization strategy for services. * Fix Config Manager to only emit changed objects and added missing temp converters. * Update storage service to handle unit changes. * Added cpu temp sensor auto-discovery * Added missing JSDocs to services * remove unused * Migrate to network service. * Fix network password issue. * Move out password input into helper * Rename password mask constant to be less double-negativey. * Dropdown menu rename * Added a component to edit JSON in the settings dialog (rough/WIP) * Align settings * Add and style JSON Editor. * Adjust padding * perf(shortcuts): ⚡ avoid unnecessary polling when shortcuts are disabled Stops the recording poller when shortcuts are disabled, preventing redundant polling and reducing resource usage. * Fix types and return value if shortcut not enabled. * Move the swww daemon checking process outside of the wallpaper service into a dedicated deamon lifecyle processor. * Add more string formatters and use title case for weather status (as it was). * Fix startup errors. * Rgba fix * Remove zod from dependencies --------- Co-authored-by: KernelDiego <gonzalezdiego.contact@gmail.com>
52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import { Weather, WeatherIcon, WeatherStatus } from 'src/services/weather/types';
|
|
|
|
/**
|
|
* Calculates the target hour for weather data lookup
|
|
*
|
|
* @param baseTime - The base time to calculate from
|
|
* @param hoursFromNow - Number of hours to add
|
|
* @returns A Date object set to the start of the target hour
|
|
*/
|
|
export const getTargetHour = (baseTime: Date, hoursFromNow: number): Date => {
|
|
const targetTime = new Date(baseTime);
|
|
const newHour = targetTime.getHours() + hoursFromNow;
|
|
targetTime.setHours(newHour);
|
|
targetTime.setMinutes(0, 0, 0);
|
|
|
|
const currentHour = baseTime.getHours();
|
|
if (currentHour > 19) {
|
|
const hoursToRewind = currentHour - 19;
|
|
targetTime.setHours(targetTime.getHours() - hoursToRewind);
|
|
}
|
|
|
|
return targetTime;
|
|
};
|
|
|
|
/**
|
|
* Retrieves the weather icon for a specific hour in the future
|
|
*
|
|
* @param weather - The current weather data
|
|
* @param hoursFromNow - Number of hours from now to get the icon for
|
|
* @returns The appropriate weather icon
|
|
*/
|
|
export const getHourlyWeatherIcon = (weather: Weather, hoursFromNow: number): WeatherIcon => {
|
|
if (!weather?.forecast?.[0]?.hourly) {
|
|
return WeatherIcon.WARNING;
|
|
}
|
|
|
|
const targetHour = getTargetHour(weather.lastUpdated, hoursFromNow);
|
|
const targetTime = targetHour.getTime();
|
|
|
|
const weatherAtHour = weather.forecast[0].hourly.find((hour) => {
|
|
const hourTime = hour.time.getTime();
|
|
return hourTime === targetTime;
|
|
});
|
|
|
|
if (!weatherAtHour) {
|
|
return WeatherIcon.WARNING;
|
|
}
|
|
|
|
const iconQuery: WeatherStatus = weatherAtHour.condition?.text ?? 'WARNING';
|
|
return WeatherIcon[iconQuery];
|
|
};
|