aboutsummaryrefslogtreecommitdiff
path: root/src/stores/settings.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/stores/settings.ts')
-rw-r--r--src/stores/settings.ts419
1 files changed, 216 insertions, 203 deletions
diff --git a/src/stores/settings.ts b/src/stores/settings.ts
index ec470524..e960eff6 100644
--- a/src/stores/settings.ts
+++ b/src/stores/settings.ts
@@ -1,220 +1,233 @@
-import { browser } from '$app/environment';
-import root from '$lib/Utility/root';
-import { get, writable } from 'svelte/store';
-import settingsSyncPulled from './settingsSyncPulled';
-import settingsSyncTimes from './settingsSyncTimes';
-import identity from './identity';
+import { browser } from "$app/environment";
+import root from "$lib/Utility/root";
+import { get, writable } from "svelte/store";
+import settingsSyncPulled from "./settingsSyncPulled";
+import settingsSyncTimes from "./settingsSyncTimes";
+import identity from "./identity";
-const VERSION = '1.0.1';
+const VERSION = "1.0.1";
export interface Settings {
- cacheMangaMinutes: number;
- cacheMinutes: number;
- displayUpcomingAnimeCollapsed: boolean;
- displayAnimeCollapsed: boolean;
- displayMangaCollapsed: boolean;
- displayNotStarted: boolean;
- displayUnresolved: boolean;
- calculateChaptersRoundedDown: 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;
- calculatePreferNativeChapterCount: boolean;
- displayPlannedAnime: boolean;
- displayFurigana: boolean;
- displayAoButa:
- | 'kaede'
- | 'mai'
- | 'mai_2'
- | 'nodoka'
- | 'rio'
- | 'sakuta'
- | 'shouko'
- | 'tomoe'
- | 'random'
- | 'none';
- disableManga: boolean;
- disableAnime: boolean;
- disableUpcomingAnime: boolean;
- display24HourTime: boolean;
- displayCountdownRightAligned: boolean;
- displayNativeCountdown: boolean;
- displayHoverCover: boolean;
- displayDisableAnimations: boolean;
- displayDisableNotifications: boolean;
- displayCoverModeAnime: boolean;
- displayCoverModeManga: boolean;
- displayCoverWidth: number;
- displayShortCountdown: boolean;
- displayScheduleListMode: boolean;
- displayLanguage: 'en' | 'ja';
- displayDisableLastActivityWarning: boolean;
- settingsSync: boolean;
- settingsVersion?: string;
- displayBlurAdultContent: boolean;
- displayCopyMediaTitleNotLink: boolean;
- displayTotalDueEpisodes: boolean;
- displayTotalEpisodes: boolean;
- displayAniListNotifications: boolean;
- displayFiltersIncludeCompleted: boolean;
- displayDataSaver: boolean;
- debugDummyLists: boolean;
- displayScheduleFilterList: boolean;
- displayReverseSort: boolean;
- displayAnimeSort: 'difference' | 'start_date' | 'end_date' | 'time_remaining';
- displayMediaListFilter: boolean;
- displayCustomCSS: string;
- displayMediaRoulette: boolean;
+ cacheMangaMinutes: number;
+ cacheMinutes: number;
+ displayUpcomingAnimeCollapsed: boolean;
+ displayAnimeCollapsed: boolean;
+ displayMangaCollapsed: boolean;
+ displayNotStarted: boolean;
+ displayUnresolved: boolean;
+ calculateChaptersRoundedDown: 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;
+ calculatePreferNativeChapterCount: boolean;
+ displayPlannedAnime: boolean;
+ displayFurigana: boolean;
+ displayAoButa:
+ | "kaede"
+ | "mai"
+ | "mai_2"
+ | "nodoka"
+ | "rio"
+ | "sakuta"
+ | "shouko"
+ | "tomoe"
+ | "random"
+ | "none";
+ disableManga: boolean;
+ disableAnime: boolean;
+ disableUpcomingAnime: boolean;
+ display24HourTime: boolean;
+ displayCountdownRightAligned: boolean;
+ displayNativeCountdown: boolean;
+ displayHoverCover: boolean;
+ displayDisableAnimations: boolean;
+ displayDisableNotifications: boolean;
+ displayCoverModeAnime: boolean;
+ displayCoverModeManga: boolean;
+ displayCoverWidth: number;
+ displayShortCountdown: boolean;
+ displayScheduleListMode: boolean;
+ displayLanguage: "en" | "ja";
+ displayDisableLastActivityWarning: boolean;
+ settingsSync: boolean;
+ settingsVersion?: string;
+ displayBlurAdultContent: boolean;
+ displayCopyMediaTitleNotLink: boolean;
+ displayTotalDueEpisodes: boolean;
+ displayTotalEpisodes: boolean;
+ displayAniListNotifications: boolean;
+ displayFiltersIncludeCompleted: boolean;
+ displayDataSaver: boolean;
+ debugDummyLists: boolean;
+ displayScheduleFilterList: boolean;
+ displayReverseSort: boolean;
+ displayAnimeSort: "difference" | "start_date" | "end_date" | "time_remaining";
+ displayMediaListFilter: boolean;
+ displayCustomCSS: string;
+ displayMediaRoulette: 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,
- displayAoButa: 'none',
- disableManga: false,
- disableAnime: false,
- disableUpcomingAnime: false,
- display24HourTime: false,
- displayCountdownRightAligned: false,
- displayNativeCountdown: false,
- displayHoverCover: false,
- displayDisableAnimations: false,
- displayDisableNotifications: false,
- displayCoverModeAnime: true,
- displayCoverModeManga: true,
- displayCoverWidth: 100, // 116.609
- displayShortCountdown: false,
- displayScheduleListMode: false,
- displayLanguage: 'en',
- displayDisableLastActivityWarning: false,
- displayBlurAdultContent: true,
- displayCopyMediaTitleNotLink: false,
- displayTotalDueEpisodes: false,
- displayTotalEpisodes: false,
- displayAniListNotifications: false,
- displayFiltersIncludeCompleted: false,
- displayDataSaver: false,
- displayScheduleFilterList: false,
- displayReverseSort: false,
- displayAnimeSort: 'time_remaining',
- displayMediaListFilter: false,
- displayCustomCSS: '',
- displayMediaRoulette: false,
-
- // Debug
- debugDummyLists: false,
-
- // Calculation
- calculateChaptersRoundedDown: true,
- calculateDisableOutOfDateVolumeWarning: false,
- calculateGuessingDisabled: true,
- calculateGuessMethod: 'iqr_mode',
- calculatePreferNativeChapterCount: false,
-
- // Cache
- cacheMangaMinutes: 120,
- cacheMinutes: 30,
-
- // Sync
- settingsSync: false,
- settingsVersion: VERSION
+ // 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,
+ displayAoButa: "none",
+ disableManga: false,
+ disableAnime: false,
+ disableUpcomingAnime: false,
+ display24HourTime: false,
+ displayCountdownRightAligned: false,
+ displayNativeCountdown: false,
+ displayHoverCover: false,
+ displayDisableAnimations: false,
+ displayDisableNotifications: false,
+ displayCoverModeAnime: true,
+ displayCoverModeManga: true,
+ displayCoverWidth: 100, // 116.609
+ displayShortCountdown: false,
+ displayScheduleListMode: false,
+ displayLanguage: "en",
+ displayDisableLastActivityWarning: false,
+ displayBlurAdultContent: true,
+ displayCopyMediaTitleNotLink: false,
+ displayTotalDueEpisodes: false,
+ displayTotalEpisodes: false,
+ displayAniListNotifications: false,
+ displayFiltersIncludeCompleted: false,
+ displayDataSaver: false,
+ displayScheduleFilterList: false,
+ displayReverseSort: false,
+ displayAnimeSort: "time_remaining",
+ displayMediaListFilter: false,
+ displayCustomCSS: "",
+ displayMediaRoulette: false,
+
+ // Debug
+ debugDummyLists: false,
+
+ // Calculation
+ calculateChaptersRoundedDown: true,
+ calculateDisableOutOfDateVolumeWarning: false,
+ calculateGuessingDisabled: true,
+ calculateGuessMethod: "iqr_mode",
+ calculatePreferNativeChapterCount: false,
+
+ // Cache
+ cacheMangaMinutes: 120,
+ cacheMinutes: 30,
+
+ // Sync
+ settingsSync: false,
+ settingsVersion: VERSION,
};
const createStore = () => {
- const initialValue = browser
- ? JSON.parse(localStorage.getItem('settings') || JSON.stringify(defaultSettings))
- : defaultSettings;
- const store = writable<Settings>(initialValue);
- let state: Settings = initialValue;
-
- store.subscribe((value) => {
- state = value;
-
- if (browser) localStorage.setItem('settings', JSON.stringify(value));
- });
-
- return {
- subscribe: store.subscribe,
- set: store.set,
- update: store.update,
- reset: () => store.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 as unknown as Record<string, unknown>)[key] = (
- defaultSettings as unknown as Record<string, unknown>
- )[key];
-
- if (browser) localStorage.setItem('settings', JSON.stringify(updatedSettings));
-
- return updatedSettings;
- },
-
- setKey: (key: keyof Settings, value: unknown) =>
- store.update((settings) => ({ ...settings, [key]: value }))
- };
+ const initialValue = browser
+ ? JSON.parse(
+ localStorage.getItem("settings") || JSON.stringify(defaultSettings),
+ )
+ : defaultSettings;
+ const store = writable<Settings>(initialValue);
+ let state: Settings = initialValue;
+
+ store.subscribe((value) => {
+ state = value;
+
+ if (browser) localStorage.setItem("settings", JSON.stringify(value));
+ });
+
+ return {
+ subscribe: store.subscribe,
+ set: store.set,
+ update: store.update,
+ reset: () => store.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 as unknown as Record<string, unknown>)[key] = (
+ defaultSettings as unknown as Record<string, unknown>
+ )[key];
+
+ if (browser)
+ localStorage.setItem("settings", JSON.stringify(updatedSettings));
+
+ return updatedSettings;
+ },
+
+ setKey: (key: keyof Settings, value: unknown) =>
+ store.update((settings) => ({ ...settings, [key]: value })),
+ };
};
const settings = createStore();
settings.subscribe((value) => {
- if (!browser) return;
-
- if (value.settingsSync && get(settingsSyncPulled) === true) {
- fetch(root(`/api/configuration?id=${get(identity).id}`)).then((response) => {
- if (response.ok)
- response.json().then((data) => {
- const isEqualsJson = (firstObject: Settings, secondObject: Settings) => {
- type AnyObject = { [key: string]: unknown };
-
- return (
- Object.keys(firstObject).length === Object.keys(secondObject).length &&
- Object.keys(firstObject).every(
- (key) =>
- (firstObject as unknown as AnyObject)[key] ===
- (secondObject as unknown as AnyObject)[key]
- )
- );
- };
-
- if (data?.configuration && !isEqualsJson(data.configuration, value))
- fetch(root(`/api/configuration`), {
- method: 'PUT',
- body: JSON.stringify(value)
- }).then((response) => {
- if (response.ok) console.log('Pushed local configuration');
-
- settingsSyncTimes.update((times) => ({
- ...times,
- lastPush: new Date()
- }));
- });
- });
- });
- }
+ if (!browser) return;
+
+ if (value.settingsSync && get(settingsSyncPulled) === true) {
+ fetch(root(`/api/configuration?id=${get(identity).id}`)).then(
+ (response) => {
+ if (response.ok)
+ response.json().then((data) => {
+ const isEqualsJson = (
+ firstObject: Settings,
+ secondObject: Settings,
+ ) => {
+ type AnyObject = { [key: string]: unknown };
+
+ return (
+ Object.keys(firstObject).length ===
+ Object.keys(secondObject).length &&
+ Object.keys(firstObject).every(
+ (key) =>
+ (firstObject as unknown as AnyObject)[key] ===
+ (secondObject as unknown as AnyObject)[key],
+ )
+ );
+ };
+
+ if (data?.configuration && !isEqualsJson(data.configuration, value))
+ fetch(root(`/api/configuration`), {
+ method: "PUT",
+ body: JSON.stringify(value),
+ }).then((response) => {
+ if (response.ok) console.log("Pushed local configuration");
+
+ settingsSyncTimes.update((times) => ({
+ ...times,
+ lastPush: new Date(),
+ }));
+ });
+ });
+ },
+ );
+ }
});
export default settings;