Make room switches instant and cut redundant client work.

Keep-alive room cache with CSS-only warm switches, nav loading feedback, and per-context members drawer prefs. Share hierarchy/call/sub-room subscriptions, demux state events, and lazy lobby power-level loading to avoid duplicate scans and listener storms.
This commit is contained in:
2026-07-22 18:00:54 +10:00
parent 821724b594
commit 30edd62d96
62 changed files with 2020 additions and 802 deletions

View File

@@ -36,7 +36,10 @@ export interface Settings {
pageZoom: number;
hideActivity: boolean;
isPeopleDrawer: boolean;
/** Last open/closed state of the members panel in non-DM rooms. */
peopleDrawerInRooms: boolean;
/** Last open/closed state of the members panel in DMs. */
peopleDrawerInDirects: boolean;
isCallPanelDocked: boolean;
callPanelDockPosition: CallPanelDockPosition;
memberSortFilterIndex: number;
@@ -79,7 +82,8 @@ const defaultSettings: Settings = {
pageZoom: 100,
hideActivity: false,
isPeopleDrawer: true,
peopleDrawerInRooms: true,
peopleDrawerInDirects: false,
isCallPanelDocked: false,
callPanelDockPosition: 'right',
memberSortFilterIndex: 0,
@@ -112,15 +116,29 @@ const defaultSettings: Settings = {
export const getSettings = () => {
const settings = localStorage.getItem(STORAGE_KEY);
if (settings === null) return defaultSettings;
const parsed = JSON.parse(settings) as Settings & { twitterEmoji?: boolean };
const parsed = JSON.parse(settings) as Settings & {
twitterEmoji?: boolean;
isPeopleDrawer?: boolean;
};
// Migrate old twitterEmoji boolean to new emojiStyle enum
if ('twitterEmoji' in parsed && parsed.emojiStyle === undefined) {
parsed.emojiStyle = parsed.twitterEmoji ? EmojiStyle.Twemoji : EmojiStyle.Apple;
delete parsed.twitterEmoji;
}
// Migrate single people-drawer flag into room/DM prefs.
if (
typeof parsed.isPeopleDrawer === 'boolean' &&
parsed.peopleDrawerInRooms === undefined &&
parsed.peopleDrawerInDirects === undefined
) {
parsed.peopleDrawerInRooms = parsed.isPeopleDrawer;
parsed.peopleDrawerInDirects = parsed.isPeopleDrawer;
}
delete parsed.isPeopleDrawer;
return {
...defaultSettings,
...parsed,