import { browser } from '$app/environment'; import { writable } from 'svelte/store'; export interface Settings { cacheMangaMinutes: number; cacheMinutes: number; displayUpcomingAnimeCollapsed: boolean; displayAnimeCollapsed: boolean; displayMangaCollapsed: boolean; displayNotStarted: boolean; displayUnresolved: boolean; calculateChaptersRoundedDown: boolean; displaySortedByDifference: boolean; displayOutboundLinksTo: 'anilist' | 'livechartme' | 'animeschedule' | 'myanimelist'; displayPausedMedia: boolean; displayLimitListHeight: boolean; displaySocialButton: boolean; calculateGuessingDisabled: boolean; displayHoverNavigation: boolean; displayTitleFormat: 'english' | 'romaji' | 'native'; calculateGuessMethod: 'median' | 'iqr_median' | 'iqr_mode' | 'mode'; calculateDisableOutOfDateVolumeWarning: boolean; displayPlannedAnime: boolean; displayFurigana: boolean; displayAoButa: 'mai' | 'nodoka' | 'kaede' | 'none'; disableManga: boolean; disableAnime: boolean; disableUpcomingAnime: boolean; display24HourTime: boolean; displayCountdownRightAligned: boolean; displayNativeCountdown: boolean; displayHoverCover: boolean; } const defaultSettings: Settings = { // Display displayOutboundLinksTo: 'anilist', displayPausedMedia: true, displayPlannedAnime: true, displayLimitListHeight: false, displaySocialButton: false, displayUnresolved: false, displayTitleFormat: 'english', displayFurigana: false, displayHoverNavigation: false, displayNotStarted: false, displayUpcomingAnimeCollapsed: false, displayAnimeCollapsed: false, displayMangaCollapsed: false, displaySortedByDifference: false, displayAoButa: 'mai', disableManga: false, disableAnime: false, disableUpcomingAnime: false, display24HourTime: false, displayCountdownRightAligned: false, displayNativeCountdown: false, displayHoverCover: false, // Calculation calculateChaptersRoundedDown: true, calculateDisableOutOfDateVolumeWarning: false, calculateGuessingDisabled: true, calculateGuessMethod: 'iqr_mode', // Cache cacheMangaMinutes: 120, cacheMinutes: 30 }; const createStore = () => { const { subscribe, set, update } = writable( JSON.parse( browser ? localStorage.getItem('settings') ?? JSON.stringify(defaultSettings) : JSON.stringify(defaultSettings) ) ); let state: Settings; subscribe((value) => (state = value)); return { subscribe, set, update, reset: () => set(defaultSettings), get: () => { const keys = Object.keys(defaultSettings); const settingsKeys = Object.keys(state); const updatedSettings = { ...state }; for (const key of keys) if (!settingsKeys.includes(key)) (updatedSettings[key as keyof Settings] as unknown) = defaultSettings[key as keyof Settings]; if (browser) localStorage.setItem('settings', JSON.stringify(updatedSettings)); return updatedSettings; }, setKey: (key: keyof Settings, value: unknown) => update((settings) => ({ ...settings, [key]: value })) }; }; const settings = createStore(); settings.subscribe((value) => { if (browser) localStorage.setItem('settings', JSON.stringify(value)); }); export default settings;