Minor: Refactor the code-base for better organization and compartmentalization. (#934)
* 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>
This commit is contained in:
@@ -1,64 +1,51 @@
|
||||
import { Weather, WeatherIconTitle } from 'src/lib/types/weather.types';
|
||||
import { isValidWeatherIconTitle } from 'src/shared/weather';
|
||||
import { Weather, WeatherIcon, WeatherStatus } from 'src/services/weather/types';
|
||||
|
||||
/**
|
||||
* Retrieves the next epoch time for weather data.
|
||||
* Calculates the target hour for weather data lookup
|
||||
*
|
||||
* This function calculates the next epoch time based on the current weather data and the specified number of hours from now.
|
||||
* It ensures that the prediction remains within the current day by rewinding the time if necessary.
|
||||
*
|
||||
* @param wthr The current weather data.
|
||||
* @param hoursFromNow The number of hours from now to calculate the next epoch time.
|
||||
*
|
||||
* @returns The next epoch time as a number.
|
||||
* @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 getNextEpoch = (wthr: Weather, hoursFromNow: number): number => {
|
||||
const currentEpoch = wthr.location.localtime_epoch;
|
||||
const epochAtHourStart = currentEpoch - (currentEpoch % 3600);
|
||||
let nextEpoch = 3600 * hoursFromNow + epochAtHourStart;
|
||||
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 curHour = new Date(currentEpoch * 1000).getHours();
|
||||
|
||||
/*
|
||||
* NOTE: Since the API is only capable of showing the current day; if
|
||||
* the hours left in the day are less than 4 (aka spilling into the next day),
|
||||
* then rewind to contain the prediction within the current day.
|
||||
*/
|
||||
if (curHour > 19) {
|
||||
const hoursToRewind = curHour - 19;
|
||||
nextEpoch = 3600 * hoursFromNow + epochAtHourStart - hoursToRewind * 3600;
|
||||
const currentHour = baseTime.getHours();
|
||||
if (currentHour > 19) {
|
||||
const hoursToRewind = currentHour - 19;
|
||||
targetTime.setHours(targetTime.getHours() - hoursToRewind);
|
||||
}
|
||||
return nextEpoch;
|
||||
|
||||
return targetTime;
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves the weather icon query for a specific time in the future.
|
||||
* Retrieves the weather icon for a specific hour in the future
|
||||
*
|
||||
* This function calculates the next epoch time and retrieves the corresponding weather data.
|
||||
* It then generates a weather icon query based on the weather condition and time of day.
|
||||
*
|
||||
* @param weather The current weather data.
|
||||
* @param hoursFromNow The number of hours from now to calculate the weather icon query.
|
||||
*
|
||||
* @returns The weather icon query as a string.
|
||||
* @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 getIconQuery = (weather: Weather, hoursFromNow: number): WeatherIconTitle => {
|
||||
const nextEpoch = getNextEpoch(weather, hoursFromNow);
|
||||
const weatherAtEpoch = weather.forecast.forecastday[0].hour.find((h) => h.time_epoch === nextEpoch);
|
||||
|
||||
if (weatherAtEpoch === undefined) {
|
||||
return 'warning';
|
||||
export const getHourlyWeatherIcon = (weather: Weather, hoursFromNow: number): WeatherIcon => {
|
||||
if (!weather?.forecast?.[0]?.hourly) {
|
||||
return WeatherIcon.WARNING;
|
||||
}
|
||||
|
||||
let iconQuery = weatherAtEpoch.condition.text.trim().toLowerCase().replaceAll(' ', '_');
|
||||
const targetHour = getTargetHour(weather.lastUpdated, hoursFromNow);
|
||||
const targetTime = targetHour.getTime();
|
||||
|
||||
if (!weatherAtEpoch?.is_day && iconQuery === 'partly_cloudy') {
|
||||
iconQuery = 'partly_cloudy_night';
|
||||
const weatherAtHour = weather.forecast[0].hourly.find((hour) => {
|
||||
const hourTime = hour.time.getTime();
|
||||
return hourTime === targetTime;
|
||||
});
|
||||
|
||||
if (!weatherAtHour) {
|
||||
return WeatherIcon.WARNING;
|
||||
}
|
||||
|
||||
if (isValidWeatherIconTitle(iconQuery)) {
|
||||
return iconQuery;
|
||||
} else {
|
||||
return 'warning';
|
||||
}
|
||||
const iconQuery: WeatherStatus = weatherAtHour.condition?.text ?? 'WARNING';
|
||||
return WeatherIcon[iconQuery];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user