import settings, { type Settings } from "$stores/settings"; import locale from "$stores/locale"; import { get } from "svelte/store"; import type { CommandPaletteAction } from "./actions"; const TITLE_FORMATS: Settings["displayTitleFormat"][] = [ "english", "romaji", "native", ]; const OUTBOUND_TARGETS: Settings["displayOutboundLinksTo"][] = [ "anilist", "livechartme", "animeschedule", "myanimelist", ]; const OUTBOUND_LABELS: Record = { anilist: "AniList", livechartme: "LiveChart", animeschedule: "AnimeSchedule", myanimelist: "MyAnimeList", }; type BooleanKey = NonNullable< { [K in keyof Settings]: Settings[K] extends boolean ? K : never; }[keyof Settings] >; const boolToggle = ( current: boolean, key: BooleanKey, enableLabel: string, disableLabel: string, tags: string[], ): CommandPaletteAction => ({ name: current ? disableLabel : enableLabel, url: "#", preventDefault: true, tags, onClick: () => settings.setKey(key, !current), }); export const toggleActions = (current: Settings): CommandPaletteAction[] => { const titleIndex = TITLE_FORMATS.indexOf(current.displayTitleFormat); const nextTitle = TITLE_FORMATS[(titleIndex + 1) % TITLE_FORMATS.length]; const outboundIndex = OUTBOUND_TARGETS.indexOf( current.displayOutboundLinksTo, ); const nextOutbound = OUTBOUND_TARGETS[(outboundIndex + 1) % OUTBOUND_TARGETS.length]; const t = get(locale)().commandPalette?.toggles; return [ boolToggle( current.display24HourTime, "display24HourTime", t?.time24On ?? "Switch to 24-hour time", t?.time24Off ?? "Switch to 12-hour time", ["time", "clock", "24h", "12h", "format"], ), boolToggle( current.displayDisableAnimations, "displayDisableAnimations", t?.animationsOff ?? "Disable animations", t?.animationsOn ?? "Enable animations", ["motion", "animation", "accessibility"], ), boolToggle( current.displayBlurAdultContent, "displayBlurAdultContent", t?.blurAdultOn ?? "Blur adult content", t?.blurAdultOff ?? "Show adult content unblurred", ["nsfw", "adult", "blur", "censor"], ), boolToggle( current.displayCoverModeAnime, "displayCoverModeAnime", t?.showAnimeCovers ?? "Show anime covers", t?.hideAnimeCovers ?? "Hide anime covers", ["cover", "image", "anime", "display"], ), boolToggle( current.displayCoverModeManga, "displayCoverModeManga", t?.showMangaCovers ?? "Show manga covers", t?.hideMangaCovers ?? "Hide manga covers", ["cover", "image", "manga", "novels", "display"], ), boolToggle( current.displayHoverCover, "displayHoverCover", t?.hoverCoverOn ?? "Enable hover cover preview", t?.hoverCoverOff ?? "Disable hover cover preview", ["cover", "hover", "preview"], ), boolToggle( current.displayScheduleListMode, "displayScheduleListMode", t?.scheduleListMode ?? "Schedule: list mode", t?.scheduleGridMode ?? "Schedule: grid mode", ["schedule", "list", "grid", "view"], ), boolToggle( current.displayReverseSort, "displayReverseSort", t?.reverseSort ?? "Reverse sort order", t?.restoreSort ?? "Restore default sort order", ["sort", "reverse", "order"], ), boolToggle( current.displayDataSaver, "displayDataSaver", t?.dataSaverOn ?? "Enable data saver", t?.dataSaverOff ?? "Disable data saver", ["data", "bandwidth", "saver", "performance"], ), boolToggle( current.displayDisableNotifications, "displayDisableNotifications", t?.notificationsOff ?? "Disable in-app notifications", t?.notificationsOn ?? "Enable in-app notifications", ["notifications", "alerts", "toast"], ), { name: current.displayLanguage === "en" ? (t?.switchLanguageJa ?? "Switch language to 日本語") : (t?.switchLanguageEn ?? "Switch language to English"), url: "#", preventDefault: true, tags: ["language", "locale", "translate", "japanese", "english"], onClick: () => settings.setKey( "displayLanguage", current.displayLanguage === "en" ? "ja" : "en", ), }, { name: (t?.titleFormat ?? "Title format: {from} → {to}") .replace("{from}", current.displayTitleFormat) .replace("{to}", nextTitle), url: "#", preventDefault: true, tags: ["title", "format", "english", "romaji", "native"], onClick: () => settings.setKey("displayTitleFormat", nextTitle), }, { name: (t?.outboundLinks ?? "Outbound links: {from} → {to}") .replace("{from}", OUTBOUND_LABELS[current.displayOutboundLinksTo]) .replace("{to}", OUTBOUND_LABELS[nextOutbound]), url: "#", preventDefault: true, tags: [ "outbound", "links", "anilist", "livechart", "animeschedule", "myanimelist", "mal", ], onClick: () => settings.setKey("displayOutboundLinksTo", nextOutbound), }, ]; };