From 5c528e8d03ee76d2a51555fd90cdbd1f69b8d6d9 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Thu, 6 Jun 2024 13:09:07 -1000 Subject: [PATCH] feat: :sparkles: Introduce groundwork for settings page --- settings.ts | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 settings.ts diff --git a/settings.ts b/settings.ts new file mode 100644 index 0000000..11ad320 --- /dev/null +++ b/settings.ts @@ -0,0 +1,128 @@ +export enum SettingType { + String = "string", + Boolean = "boolean", + Enum = "enum", + Float = "float", + Integer = "integer", + Code = "code", +} + +export type Setting = { + id: string; + title: string; + description: string; + type: T; + value: T extends SettingType.String | SettingType.Code + ? string + : T extends SettingType.Boolean + ? boolean + : T extends SettingType.Float | SettingType.Integer + ? number + : T extends SettingType.Enum + ? string + : never; + min?: T extends SettingType.Float | SettingType.Integer ? number : never; + max?: T extends SettingType.Float | SettingType.Integer ? number : never; + step?: T extends SettingType.Float | SettingType.Integer ? number : never; + options?: T extends SettingType.Enum ? string[] : never; + language?: T extends SettingType.Code ? string : never; + path: SettingPages; +}; + +export type Settings = Setting[]; +export enum SettingPages { + Behaviour = "behaviour", + Appearance = "appearance", + Advanced = "advanced", +} + +export const getSettingsForPath = (settings: Settings, path: string) => + settings.filter((setting) => setting.path === path); + +export const getSettingById = (settings: Settings, id: string) => + settings.find((setting) => setting.id === id); + +export const settings: Settings = [ + { + id: "mfm", + title: "Render MFM", + description: "Render Misskey-Flavoured Markdown", + type: SettingType.Boolean, + value: false, + path: SettingPages.Behaviour, + } as Setting, + { + id: "custom-css", + title: "Custom CSS", + description: "Custom CSS for the UI", + type: SettingType.Code, + value: "", + language: "css", + path: SettingPages.Appearance, + } as Setting, + { + id: "theme", + title: "Theme", + description: "UI theme", + type: SettingType.Enum, + value: "dark", + options: ["light", "dark"], + path: SettingPages.Appearance, + } as Setting, + { + id: "custom-emojis", + title: "Render Custom Emojis", + description: "Render custom emojis", + type: SettingType.Boolean, + value: true, + path: SettingPages.Behaviour, + } as Setting, + { + id: "show-content-warning", + title: "Show Content Warning", + description: "Show content warnings on notes marked sensitive/spoiler", + type: SettingType.Boolean, + value: true, + path: SettingPages.Behaviour, + } as Setting, + { + id: "popup-avatar-hover", + title: "Popup Profile Hover", + description: "Show profile popup when hovering over a user's avatar", + type: SettingType.Boolean, + value: true, + path: SettingPages.Behaviour, + } as Setting, + { + id: "confirm-delete", + title: "Confirm Delete", + description: "Confirm before deleting a note", + type: SettingType.Boolean, + value: false, + path: SettingPages.Behaviour, + } as Setting, + { + id: "confirm-follow", + title: "Confirm Follow", + description: "Confirm before following/unfollowing a user", + type: SettingType.Boolean, + value: false, + path: SettingPages.Behaviour, + } as Setting, + { + id: "confirm-reblog", + title: "Confirm Reblog", + description: "Confirm before reblogging a note", + type: SettingType.Boolean, + value: false, + path: SettingPages.Behaviour, + } as Setting, + { + id: "confirm-favourite", + title: "Confirm Favourite", + description: "Confirm before favouriting a note", + type: SettingType.Boolean, + value: false, + path: SettingPages.Behaviour, + } as Setting, +];