Files
Toju/toju-app/src/app/infrastructure/persistence/app-resume.storage.ts
Myx bc2fa7de22 fix: multiple bug fixes
isolated users, db backup, weird disconnect issues for long voice sessions,
2026-04-26 22:54:13 +02:00

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
};
}