diff options
| author | Fuwn <[email protected]> | 2023-09-03 17:58:56 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-09-03 17:58:56 -0700 |
| commit | 00a37d80baff59b57fec2bd475ab7de531580199 (patch) | |
| tree | 4c487e8d02859924c1e0abbf45fcf979c0f45489 /src/stores/settings.ts | |
| parent | fix(manga): manga collection refresh (diff) | |
| download | due.moe-00a37d80baff59b57fec2bd475ab7de531580199.tar.xz due.moe-00a37d80baff59b57fec2bd475ab7de531580199.zip | |
feat(stores): settings store for all settings
Diffstat (limited to 'src/stores/settings.ts')
| -rw-r--r-- | src/stores/settings.ts | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/stores/settings.ts b/src/stores/settings.ts new file mode 100644 index 00000000..30f1c34d --- /dev/null +++ b/src/stores/settings.ts @@ -0,0 +1,68 @@ +import { browser } from '$app/environment'; +import { writable } from 'svelte/store'; + +interface Settings { + // cacheMangaMinutes: number; + // cacheMinutes: number; + closeAnimeByDefault: boolean; + closeMangaByDefault: boolean; + displayNotStarted: boolean; + displayUnresolved: boolean; + roundDownChapters: boolean; + sortByDifference: boolean; +} + +const defaultSettings: Settings = { + // cacheMangaMinutes: 60, + // cacheMinutes: 30, + closeAnimeByDefault: false, + closeMangaByDefault: false, + displayNotStarted: false, + displayUnresolved: false, + roundDownChapters: true, + sortByDifference: false +}; + +const createStore = () => { + const { subscribe, set, update } = writable<Settings>(defaultSettings); + + return { + subscribe, + set, + update, + reset: () => set(defaultSettings), + get: () => { + const settings = JSON.parse( + browser + ? localStorage.getItem('settings') ?? JSON.stringify(defaultSettings) + : JSON.stringify(defaultSettings) + ); + const keys = Object.keys(defaultSettings); + const settingsKeys = Object.keys(settings); + + if (keys.length !== settingsKeys.length) { + return defaultSettings; + } + + for (const key of keys) { + if (!settingsKeys.includes(key)) { + return defaultSettings; + } + } + + return settings; + }, + setKey: (key: keyof Settings, value: any) => + update((settings) => ({ ...settings, [key]: value })) + }; +}; + +const settings = createStore(); + +settings.subscribe((value) => { + if (browser) { + localStorage.setItem('settings', JSON.stringify(value)); + } +}); + +export default settings; |