diff --git a/apps/web/src/components/structures/LoggedInView.tsx b/apps/web/src/components/structures/LoggedInView.tsx index 1a736ae696..24631ea617 100644 --- a/apps/web/src/components/structures/LoggedInView.tsx +++ b/apps/web/src/components/structures/LoggedInView.tsx @@ -202,8 +202,18 @@ class LoggedInView extends React.Component { OwnProfileStore.instance.on(UPDATE_EVENT, this.refreshBackgroundImage); this.refreshBackgroundImage(); + } - this.resizerViewModel = new ResizerViewModel(); + private getResizerViewModel(): ResizerViewModel { + if (!this.resizerViewModel) { + this.resizerViewModel = new ResizerViewModel(); + } + return this.resizerViewModel; + } + + private disposeResizerViewModel(): void { + this.resizerViewModel?.dispose(); + this.resizerViewModel = undefined; } /** @@ -739,6 +749,8 @@ class LoggedInView extends React.Component { break; default: { if (moduleRenderer) { + // Since the view will be removed, remove the vm as well + this.disposeResizerViewModel(); pageElement = moduleRenderer(); } else { console.warn(`Couldn't render page type "${this.props.page_type}"`); @@ -797,14 +809,15 @@ class LoggedInView extends React.Component { const roomView =
{pageElement}
; let content: React.ReactNode; - if (useNewRoomList && this.resizerViewModel && !moduleRenderer) { + const resizerViewModel = !moduleRenderer ? this.getResizerViewModel() : undefined; + if (useNewRoomList && resizerViewModel && !moduleRenderer) { // New room list owned by element-web: resizable layout with a draggable separator. // The SpacePanel lives inside GroupView (leftPanel omits it when the new room list is enabled). content = ( - + { > {leftPanel} - + {roomView} );