diff --git a/components/settings/index/settingsCatalog.ts b/components/settings/index/settingsCatalog.ts new file mode 100644 index 000000000..e7d0e2bcc --- /dev/null +++ b/components/settings/index/settingsCatalog.ts @@ -0,0 +1,125 @@ +import type { Ionicons } from "@expo/vector-icons"; + +export type SettingsTarget = + | { type: "route"; route: string } + | { type: "action"; action: "quickConnect" }; + +export interface SettingsEntry { + id: string; + titleKey: string; + icon: keyof typeof Ionicons.glyphMap; + target: SettingsTarget; + /** extra search terms (English); the title is always searched too */ + keywords?: string[]; + /** when set, entry only shows on these platforms */ + platforms?: ("ios" | "android")[]; +} + +export interface SettingsSectionDef { + id: string; + titleKey: string; + entries: SettingsEntry[]; +} + +/** + * Single source of truth for the Settings index: drives both rendering and search. + * + * EXTENSIBLE SHELL — to add a setting that lands from an in-flight PR, append one + * entry to the right section (and, if it lives inside a sub-page, an entry in + * settingsSearchIndex.ts). No screen rewrite needed. Reserved slots (add when the + * PR merges): sleep timer #922, sync-play #1612, wake-on-LAN #1539 (advanced); + * download location #1486/#1193, clear image cache #1589 (storage/downloads); + * double-tap seek #1219/#1289, subtitle background #1543 (playback). + */ +export const SETTINGS_CATALOG: SettingsSectionDef[] = [ + { + id: "playback", + titleKey: "home.settings.categories.playback", + entries: [ + { + id: "playback-controls", + titleKey: "home.settings.playback_controls.title", + icon: "play", + target: { type: "route", route: "/settings/playback-controls/page" }, + keywords: ["speed", "skip", "autoplay", "orientation"], + }, + { + id: "audio-subtitles", + titleKey: "home.settings.audio_subtitles.title", + icon: "chatbox-ellipses", + target: { type: "route", route: "/settings/audio-subtitles/page" }, + keywords: ["subtitle", "audio", "language"], + }, + { + id: "music", + titleKey: "home.settings.music.title", + icon: "musical-notes", + target: { type: "route", route: "/settings/music/page" }, + }, + ], + }, + { + id: "personalization", + titleKey: "home.settings.categories.personalization", + entries: [ + { + id: "appearance", + titleKey: "home.settings.appearance.title", + icon: "color-palette", + target: { type: "route", route: "/settings/appearance/page" }, + }, + { + id: "notifications", + titleKey: "home.settings.notifications.title", + icon: "notifications", + target: { type: "route", route: "/settings/notifications/page" }, + }, + ], + }, + { + id: "advanced", + titleKey: "home.settings.categories.advanced", + entries: [ + { + id: "quick-connect", + titleKey: "home.settings.quick_connect.quick_connect_title", + icon: "key", + target: { type: "action", action: "quickConnect" }, + }, + { + id: "pair", + titleKey: "pairing.pair_with_phone", + icon: "phone-portrait", + target: { + type: "route", + route: "/(auth)/(tabs)/(home)/companion-login", + }, + platforms: ["android"], + }, + { + id: "plugins", + titleKey: "home.settings.plugins.plugins_title", + icon: "extension-puzzle", + target: { type: "route", route: "/settings/plugins/page" }, + }, + { + id: "network", + titleKey: "home.settings.network.title", + icon: "wifi", + target: { type: "route", route: "/settings/network/page" }, + }, + { + id: "logs", + titleKey: "home.settings.logs.logs_title", + icon: "document-text", + target: { type: "route", route: "/settings/logs/page" }, + }, + { + id: "intro", + titleKey: "home.settings.intro.title", + icon: "information-circle", + target: { type: "route", route: "/settings/intro/page" }, + }, + ], + }, +];