diff --git a/src/components/structures/UserMenuButton.tsx b/src/components/structures/UserMenuButton.tsx index d8f96d4a91..5fbab796a6 100644 --- a/src/components/structures/UserMenuButton.tsx +++ b/src/components/structures/UserMenuButton.tsx @@ -80,7 +80,7 @@ export default class UserMenuButton extends React.Component { private isUserOnDarkTheme(): boolean { const theme = SettingsStore.getValue("theme"); if (theme.startsWith("custom-")) { - return getCustomTheme(theme.substring(0, 7)).is_dark; + return getCustomTheme(theme.substring("custom-".length)).is_dark; } return theme === "dark"; } diff --git a/src/stores/room-list/RoomListStoreTempProxy.ts b/src/stores/room-list/RoomListStoreTempProxy.ts index 0268cf0a46..0a173d53a9 100644 --- a/src/stores/room-list/RoomListStoreTempProxy.ts +++ b/src/stores/room-list/RoomListStoreTempProxy.ts @@ -31,11 +31,14 @@ export class RoomListStoreTempProxy { return SettingsStore.isFeatureEnabled("feature_new_room_list"); } - public static addListener(handler: () => void) { + public static addListener(handler: () => void): RoomListStoreTempToken { if (RoomListStoreTempProxy.isUsingNewStore()) { - return RoomListStore.instance.on(UPDATE_EVENT, handler); + const offFn = () => RoomListStore.instance.off(UPDATE_EVENT, handler); + RoomListStore.instance.on(UPDATE_EVENT, handler); + return new RoomListStoreTempToken(offFn); } else { - return OldRoomListStore.addListener(handler); + const token = OldRoomListStore.addListener(handler); + return new RoomListStoreTempToken(() => token.remove()); } } @@ -47,3 +50,12 @@ export class RoomListStoreTempProxy { } } } + +export class RoomListStoreTempToken { + constructor(private offFn: () => void) { + } + + public remove(): void { + this.offFn(); + } +} diff --git a/src/stores/room-list/TagWatcher.ts b/src/stores/room-list/TagWatcher.ts index 1fb5223e00..22302b695d 100644 --- a/src/stores/room-list/TagWatcher.ts +++ b/src/stores/room-list/TagWatcher.ts @@ -74,6 +74,11 @@ export class TagWatcher { this.store.removeFilter(filter); } + // Destroy any and all old filter conditions to prevent resource leaks + for (const filter of this.filters.values()) { + filter.destroy(); + } + this.filters = newFilters; } };