import { browser } from '$app/environment'; import { Theme } from '$lib/constants'; import { persisted } from 'svelte-local-storage-store'; import { get } from 'svelte/store'; export interface ThemeSetting { value: Theme; system: boolean; } export const handleToggleTheme = () => { const theme = get(colorTheme); theme.value = theme.value === Theme.DARK ? Theme.LIGHT : Theme.DARK; colorTheme.set(theme); }; const initTheme = (): ThemeSetting => { if (browser && !window.matchMedia('(prefers-color-scheme: dark)').matches) { return { value: Theme.LIGHT, system: false }; } return { value: Theme.DARK, system: false }; }; const initialTheme = initTheme(); // The 'color-theme' key is also used by app.html to prevent FOUC on page load. export const colorTheme = persisted('color-theme', initialTheme, { serializer: { parse: (text: string): ThemeSetting => { const parsedText: ThemeSetting = JSON.parse(text); return Object.values(Theme).includes(parsedText.value) ? parsedText : initTheme(); }, stringify: (object) => JSON.stringify(object), }, }); // Locale to use for formatting dates, numbers, etc. export const locale = persisted('locale', undefined, { serializer: { parse: (text) => text, stringify: (object) => object ?? '', }, }); export interface MapSettings { allowDarkMode: boolean; includeArchived: boolean; onlyFavorites: boolean; withPartners: boolean; relativeDate: string; dateAfter: string; dateBefore: string; } export const mapSettings = persisted('map-settings', { allowDarkMode: true, includeArchived: false, onlyFavorites: false, withPartners: false, relativeDate: '', dateAfter: '', dateBefore: '', }); export const videoViewerVolume = persisted('video-viewer-volume', 1, {}); export const isShowDetail = persisted('info-opened', false, {}); export interface AlbumViewSettings { sortBy: string; sortDesc: boolean; view: string; filter: string; } export interface SidebarSettings { people: boolean; sharing: boolean; } export const sidebarSettings = persisted('sidebar-settings-1', { people: false, sharing: true, }); export enum AlbumViewMode { Cover = 'Cover', List = 'List', } export enum AlbumFilter { All = 'All', Owned = 'Owned', Shared = 'Shared', } export const albumViewSettings = persisted('album-view-settings', { sortBy: 'Most recent photo', sortDesc: true, view: AlbumViewMode.Cover, filter: AlbumFilter.All, }); export const showDeleteModal = persisted('delete-confirm-dialog', true, {}); export const alwaysLoadOriginalFile = persisted('always-load-original-file', false, {}); export const playVideoThumbnailOnHover = persisted('play-video-thumbnail-on-hover', true, {});