2023-06-12 21:15:23 +10:00
|
|
|
import { atom } from 'jotai';
|
|
|
|
|
|
|
|
|
|
const STORAGE_KEY = 'settings';
|
2023-10-06 13:44:06 +11:00
|
|
|
export type MessageSpacing = '0' | '100' | '200' | '300' | '400' | '500';
|
2025-02-10 16:49:47 +11:00
|
|
|
export enum MessageLayout {
|
|
|
|
|
Modern = 0,
|
|
|
|
|
Compact = 1,
|
|
|
|
|
Bubble = 2,
|
|
|
|
|
}
|
2023-10-19 17:43:16 +11:00
|
|
|
|
2023-06-12 21:15:23 +10:00
|
|
|
export interface Settings {
|
2025-02-10 16:49:47 +11:00
|
|
|
themeId?: string;
|
2023-06-12 21:15:23 +10:00
|
|
|
useSystemTheme: boolean;
|
2025-02-10 16:49:47 +11:00
|
|
|
lightThemeId?: string;
|
|
|
|
|
darkThemeId?: string;
|
2023-06-12 21:15:23 +10:00
|
|
|
isMarkdown: boolean;
|
|
|
|
|
editorToolbar: boolean;
|
2023-10-26 09:09:27 +11:00
|
|
|
twitterEmoji: boolean;
|
2024-07-23 19:22:53 +05:30
|
|
|
pageZoom: number;
|
2025-02-26 21:44:53 +11:00
|
|
|
hideActivity: boolean;
|
2023-06-12 21:15:23 +10:00
|
|
|
|
2023-10-19 17:43:16 +11:00
|
|
|
isPeopleDrawer: boolean;
|
|
|
|
|
memberSortFilterIndex: number;
|
2023-10-18 13:15:30 +11:00
|
|
|
enterForNewline: boolean;
|
2023-10-06 13:44:06 +11:00
|
|
|
messageLayout: MessageLayout;
|
|
|
|
|
messageSpacing: MessageSpacing;
|
2023-06-12 21:15:23 +10:00
|
|
|
hideMembershipEvents: boolean;
|
|
|
|
|
hideNickAvatarEvents: boolean;
|
2023-10-06 13:44:06 +11:00
|
|
|
mediaAutoLoad: boolean;
|
2023-10-30 07:14:58 +11:00
|
|
|
urlPreview: boolean;
|
|
|
|
|
encUrlPreview: boolean;
|
2023-10-06 13:44:06 +11:00
|
|
|
showHiddenEvents: boolean;
|
2023-06-12 21:15:23 +10:00
|
|
|
|
|
|
|
|
showNotifications: boolean;
|
|
|
|
|
isNotificationSounds: boolean;
|
2025-02-10 16:49:47 +11:00
|
|
|
|
|
|
|
|
developerTools: boolean;
|
2023-06-12 21:15:23 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const defaultSettings: Settings = {
|
2025-02-10 16:49:47 +11:00
|
|
|
themeId: undefined,
|
2023-06-12 21:15:23 +10:00
|
|
|
useSystemTheme: true,
|
2025-02-10 16:49:47 +11:00
|
|
|
lightThemeId: undefined,
|
|
|
|
|
darkThemeId: undefined,
|
2023-10-27 21:27:22 +11:00
|
|
|
isMarkdown: true,
|
2023-06-12 21:15:23 +10:00
|
|
|
editorToolbar: false,
|
2023-10-26 09:09:27 +11:00
|
|
|
twitterEmoji: false,
|
2024-07-23 19:22:53 +05:30
|
|
|
pageZoom: 100,
|
2025-02-26 21:44:53 +11:00
|
|
|
hideActivity: false,
|
2023-06-12 21:15:23 +10:00
|
|
|
|
2023-10-19 17:43:16 +11:00
|
|
|
isPeopleDrawer: true,
|
|
|
|
|
memberSortFilterIndex: 0,
|
2023-10-18 13:15:30 +11:00
|
|
|
enterForNewline: false,
|
2023-10-06 13:44:06 +11:00
|
|
|
messageLayout: 0,
|
|
|
|
|
messageSpacing: '400',
|
2023-06-12 21:15:23 +10:00
|
|
|
hideMembershipEvents: false,
|
|
|
|
|
hideNickAvatarEvents: true,
|
2023-10-06 13:44:06 +11:00
|
|
|
mediaAutoLoad: true,
|
2023-10-30 07:14:58 +11:00
|
|
|
urlPreview: true,
|
|
|
|
|
encUrlPreview: false,
|
2023-10-06 13:44:06 +11:00
|
|
|
showHiddenEvents: false,
|
2023-06-12 21:15:23 +10:00
|
|
|
|
|
|
|
|
showNotifications: true,
|
|
|
|
|
isNotificationSounds: true,
|
2025-02-10 16:49:47 +11:00
|
|
|
|
|
|
|
|
developerTools: false,
|
2023-06-12 21:15:23 +10:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const getSettings = () => {
|
|
|
|
|
const settings = localStorage.getItem(STORAGE_KEY);
|
|
|
|
|
if (settings === null) return defaultSettings;
|
2023-10-06 13:44:06 +11:00
|
|
|
return {
|
|
|
|
|
...defaultSettings,
|
|
|
|
|
...(JSON.parse(settings) as Settings),
|
|
|
|
|
};
|
2023-06-12 21:15:23 +10:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const setSettings = (settings: Settings) => {
|
|
|
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const baseSettings = atom<Settings>(getSettings());
|
2024-01-21 23:50:56 +11:00
|
|
|
export const settingsAtom = atom<Settings, [Settings], undefined>(
|
2023-06-12 21:15:23 +10:00
|
|
|
(get) => get(baseSettings),
|
|
|
|
|
(get, set, update) => {
|
|
|
|
|
set(baseSettings, update);
|
|
|
|
|
setSettings(update);
|
|
|
|
|
}
|
|
|
|
|
);
|