116 lines
3.1 KiB
TypeScript
116 lines
3.1 KiB
TypeScript
import { STORAGE_KEY_GENERAL_SETTINGS, STORAGE_KEY_LAST_VIEWED_CHAT } from '../../core/constants';
|
|
import { getUserScopedStorageKey } from '../../core/storage/current-user-storage';
|
|
|
|
export interface GeneralSettings {
|
|
reopenLastViewedChat: boolean;
|
|
}
|
|
|
|
export const DEFAULT_GENERAL_SETTINGS: GeneralSettings = {
|
|
reopenLastViewedChat: true
|
|
};
|
|
|
|
export interface LastViewedChatSnapshot {
|
|
userId: string;
|
|
roomId: string;
|
|
channelId: string | null;
|
|
}
|
|
|
|
export function loadGeneralSettingsFromStorage(): GeneralSettings {
|
|
try {
|
|
const raw = localStorage.getItem(getUserScopedStorageKey(STORAGE_KEY_GENERAL_SETTINGS))
|
|
?? localStorage.getItem(STORAGE_KEY_GENERAL_SETTINGS);
|
|
|
|
if (!raw) {
|
|
return { ...DEFAULT_GENERAL_SETTINGS };
|
|
}
|
|
|
|
return normaliseGeneralSettings(JSON.parse(raw) as Partial<GeneralSettings>);
|
|
} catch {
|
|
return { ...DEFAULT_GENERAL_SETTINGS };
|
|
}
|
|
}
|
|
|
|
export function saveGeneralSettingsToStorage(patch: Partial<GeneralSettings>): GeneralSettings {
|
|
const nextSettings = normaliseGeneralSettings({
|
|
...loadGeneralSettingsFromStorage(),
|
|
...patch
|
|
});
|
|
|
|
try {
|
|
localStorage.setItem(getUserScopedStorageKey(STORAGE_KEY_GENERAL_SETTINGS), JSON.stringify(nextSettings));
|
|
} catch {}
|
|
|
|
return nextSettings;
|
|
}
|
|
|
|
export function loadLastViewedChatFromStorage(userId?: string | null): LastViewedChatSnapshot | null {
|
|
try {
|
|
const raw = localStorage.getItem(getUserScopedStorageKey(STORAGE_KEY_LAST_VIEWED_CHAT, userId))
|
|
?? localStorage.getItem(STORAGE_KEY_LAST_VIEWED_CHAT);
|
|
|
|
if (!raw) {
|
|
return null;
|
|
}
|
|
|
|
const snapshot = normaliseLastViewedChatSnapshot(JSON.parse(raw) as Partial<LastViewedChatSnapshot>);
|
|
|
|
if (!snapshot) {
|
|
return null;
|
|
}
|
|
|
|
if (userId && snapshot.userId !== userId) {
|
|
return null;
|
|
}
|
|
|
|
return snapshot;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function saveLastViewedChatToStorage(snapshot: LastViewedChatSnapshot): void {
|
|
const normalised = normaliseLastViewedChatSnapshot(snapshot);
|
|
|
|
if (!normalised) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
localStorage.setItem(getUserScopedStorageKey(STORAGE_KEY_LAST_VIEWED_CHAT, normalised.userId), JSON.stringify(normalised));
|
|
} catch {}
|
|
}
|
|
|
|
export function clearLastViewedChatFromStorage(userId?: string | null): void {
|
|
try {
|
|
localStorage.removeItem(getUserScopedStorageKey(STORAGE_KEY_LAST_VIEWED_CHAT, userId));
|
|
localStorage.removeItem(STORAGE_KEY_LAST_VIEWED_CHAT);
|
|
} catch {}
|
|
}
|
|
|
|
function normaliseGeneralSettings(raw: Partial<GeneralSettings>): GeneralSettings {
|
|
return {
|
|
reopenLastViewedChat:
|
|
typeof raw.reopenLastViewedChat === 'boolean'
|
|
? raw.reopenLastViewedChat
|
|
: DEFAULT_GENERAL_SETTINGS.reopenLastViewedChat
|
|
};
|
|
}
|
|
|
|
function normaliseLastViewedChatSnapshot(raw: Partial<LastViewedChatSnapshot>): LastViewedChatSnapshot | null {
|
|
const userId = typeof raw.userId === 'string' ? raw.userId.trim() : '';
|
|
const roomId = typeof raw.roomId === 'string' ? raw.roomId.trim() : '';
|
|
const channelId = typeof raw.channelId === 'string'
|
|
? raw.channelId.trim() || null
|
|
: null;
|
|
|
|
if (!userId || !roomId) {
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
userId,
|
|
roomId,
|
|
channelId
|
|
};
|
|
}
|