feat: add app section visibility settings
All checks were successful
CI / Lint, typecheck and build (push) Successful in 9m54s

This commit is contained in:
zv
2026-06-14 17:38:54 +02:00
parent 9087e1215c
commit 8bbd9397a1
6 changed files with 114 additions and 7 deletions

View File

@@ -5,6 +5,7 @@ import { persist } from "zustand/middleware";
import type { SelectedLocation } from "@/types/location";
import type { Province } from "@/types/province";
import type { TemperatureUnit, WindSpeedUnit } from "@/types/units";
import { DEFAULT_APP_SECTION_VISIBILITY, normalizeAppSectionVisibility, type AppSectionId, type AppSectionVisibility } from "@/lib/app-sections";
import { DEFAULT_DASHBOARD_SECTION_VISIBILITY, normalizeDashboardSectionVisibility, type DashboardSectionId, type DashboardSectionVisibility } from "@/lib/dashboard-sections";
import { DEFAULT_TEMPERATURE_UNIT, DEFAULT_WIND_SPEED_UNIT } from "@/lib/weather-utils";
import type { WeatherRegion } from "@/types/weather-region";
@@ -24,6 +25,7 @@ interface WeatherStore {
temperatureUnit: TemperatureUnit;
windSpeedUnit: WindSpeedUnit;
dashboardSections: DashboardSectionVisibility;
appSections: AppSectionVisibility;
toggleFavorite: (id: string) => void;
selectStation: (id: string) => void;
selectLocation: (location: SelectedLocation) => void;
@@ -35,6 +37,7 @@ interface WeatherStore {
setTemperatureUnit: (unit: TemperatureUnit) => void;
setWindSpeedUnit: (unit: WindSpeedUnit) => void;
setDashboardSectionVisible: (section: DashboardSectionId, visible: boolean) => void;
setAppSectionVisible: (section: AppSectionId, visible: boolean) => void;
}
export const useWeatherStore = create<WeatherStore>()(
@@ -51,6 +54,7 @@ export const useWeatherStore = create<WeatherStore>()(
temperatureUnit: DEFAULT_TEMPERATURE_UNIT,
windSpeedUnit: DEFAULT_WIND_SPEED_UNIT,
dashboardSections: DEFAULT_DASHBOARD_SECTION_VISIBILITY,
appSections: DEFAULT_APP_SECTION_VISIBILITY,
toggleFavorite: (id) =>
set((state) => ({
favorites: state.favorites.includes(id)
@@ -69,6 +73,9 @@ export const useWeatherStore = create<WeatherStore>()(
setDashboardSectionVisible: (section, visible) => set((state) => ({
dashboardSections: { ...state.dashboardSections, [section]: visible },
})),
setAppSectionVisible: (section, visible) => set((state) => ({
appSections: { ...state.appSections, [section]: visible },
})),
}),
{
name: "wtr:preferences",
@@ -77,12 +84,14 @@ export const useWeatherStore = create<WeatherStore>()(
const location = state?.selectedLocation as (Partial<SelectedLocation> & { region?: WeatherRegion }) | null | undefined;
if (!state) return persisted;
const dashboardSections = normalizeDashboardSectionVisibility(state.dashboardSections);
if (!location) return { ...state, dashboardSections };
const appSections = normalizeAppSectionVisibility(state.appSections);
if (!location) return { ...state, dashboardSections, appSections };
const countryCode = location.countryCode ?? (location.province ? "PL" : null);
const region = location.region ?? getWeatherRegionForCountryCode(countryCode);
return {
...state,
dashboardSections,
appSections,
selectedLocation: {
...location,
country: location.country ?? (countryCode === "PL" ? "Polska" : null),