From fe8504ba14cd02d420ad48ae148bea59e50a9e05 Mon Sep 17 00:00:00 2001 From: sivertlv Date: Tue, 15 Sep 2026 19:19:09 +0200 Subject: [PATCH] Add storage.ts useStorage.ts, ask me for doc --- "v\303\246r/.gitignore" | 24 -------------- "v\303\246r/src/hooks/useStorage.ts" | 40 +++++++++++++++++++++++ "v\303\246r/src/services/storage.ts" | 48 ++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 24 deletions(-) delete mode 100644 "v\303\246r/.gitignore" create mode 100644 "v\303\246r/src/hooks/useStorage.ts" create mode 100644 "v\303\246r/src/services/storage.ts" diff --git "a/v\303\246r/.gitignore" "b/v\303\246r/.gitignore" deleted file mode 100644 index a547bf3..0000000 --- "a/v\303\246r/.gitignore" +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git "a/v\303\246r/src/hooks/useStorage.ts" "b/v\303\246r/src/hooks/useStorage.ts" new file mode 100644 index 0000000..7ff75a1 --- /dev/null +++ "b/v\303\246r/src/hooks/useStorage.ts" @@ -0,0 +1,40 @@ +import { useState, useEffect, useCallback } from "react"; +import { getData, saveData } from "../services/storage"; +import type {AppStorage} from "../services/storage"; + +export function useAppStorage() { + + const [storage, setStorage] = useState(getData); + + const updateStorage = useCallback((updater: Partial | ((prev: AppStorage) => AppStorage)) => { + setStorage((prev) => { + const nextState = typeof updater === "function" ? updater(prev) : { ...prev, ...updater }; + saveData(nextState); + return nextState; + }); + }, []); + + // Star / unstar a location easily + const toggleStarredLocation = useCallback((locationId: string) => { + updateStorage((prev) => { + const exists = prev.starredLocations.includes(locationId); + const starredLocations = exists + ? prev.starredLocations.filter((id) => id !== locationId) + : [...prev.starredLocations, locationId]; + + return { ...prev, starredLocations }; + }); + }, [updateStorage]); + + // Update last visited page + const setLastPage = useCallback((lastPage: string) => { + updateStorage({ lastPage }); + }, [updateStorage]); + + return { + storage, + updateStorage, + toggleStarredLocation, + setLastPage, + }; +} \ No newline at end of file diff --git "a/v\303\246r/src/services/storage.ts" "b/v\303\246r/src/services/storage.ts" new file mode 100644 index 0000000..2a8f0b9 --- /dev/null +++ "b/v\303\246r/src/services/storage.ts" @@ -0,0 +1,48 @@ +const STORAGE_KEY = "vær:storage_key" +const STORAGE_VERSION = 1; + +//Type for tilstand +export interface AppStorage{ + version: number; + starredLocations: string[] + lastPage: string; +} + +const DEFAULT_STATE: AppStorage = { + version: STORAGE_VERSION, + starredLocations: [], + lastPage: "home", +}; + +export function getData(): AppStorage{ + try{ + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return DEFAULT_STATE; + + const parsed = JSON.parse(raw) as AppStorage; + + if (parsed.version !== STORAGE_VERSION) return DEFAULT_STATE; + + return {...DEFAULT_STATE, ...parsed}; + } + catch (err){ + console.error("Failed to load store data"); + return DEFAULT_STATE; + } +} + +export function saveData(state: AppStorage): void{ + try{ + localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); + + }catch(err){ + console.error("Failed saving", err); + } +} + +// export function updateAppStorage(patch: Partial): AppStorage { +// const current = getData(); +// const updated = { ...current, ...patch }; +// saveData(updated); +// return updated; +// } \ No newline at end of file