Files
ThreadNet-Web/apps/web/src/viewmodels/structures/auto-collapse/AutoCollapse.ts
T
R Midhun SureshandGitHub 67206624a0 Auto Collapse Behaviour - Collapse left panel during calls (#33771)
* Add call resize behaviour

* Export behaviour from behaviours.ts

* Fix e2e tests

* Fix lint

* Move test to vitest

* Pass call-store instead of global access

* Fix broken collapse behaviour on strict mode

* Remove unused variable from test
2026-07-24 12:45:34 +00:00

75 lines
2.4 KiB
TypeScript

/*
* Copyright 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/
import { type CallStore } from "../../../stores/CallStore";
import { CollapseHandler } from "./CollapseHandler";
import type { BaseCollapseBehaviour } from "./behaviours/BaseCollapseBehaviour";
import { Behaviours } from "./behaviours/behaviours";
/**
* This class orchestrates all the auto-collapse behaviours.
*/
export class AutoCollapse {
private readonly behaviours: BaseCollapseBehaviour[] = [];
private readonly collapseHandler: CollapseHandler;
/**
* @param expandPanel Callback that should expand the left panel
* @param collapsePanel Callback that should collapse the left panel
* @param callStore Instance of the call store.
*/
public constructor(expandPanel: () => void, collapsePanel: () => void, callStore: CallStore) {
// Calculate the initial value for autoCollapsedCount
const initialAutoCollapsedCount = Behaviours.reduce(
(count, B) => (B.shouldStartCollapsed() ? count + 1 : count),
0,
);
this.collapseHandler = new CollapseHandler(expandPanel, collapsePanel, initialAutoCollapsedCount);
for (const Behaviour of Behaviours) {
this.behaviours.push(new Behaviour(this.collapseHandler, callStore));
}
}
/**
* When this returns true, any left panel resized events should be ignored.
*/
public get shouldIgnoreResize(): boolean {
return this.behaviours.some((b) => b.shouldIgnoreResize);
}
/**
* Whether the panel is currently auto-collapsed.
*/
public get isAutoCollapsed(): boolean {
return this.collapseHandler.isAutoCollapsed;
}
/**
* Returns boolean indicating whether the left panel should be collapsed at app start.
*/
public static shouldStartCollapsed(): boolean {
return Behaviours.some((B) => B.shouldStartCollapsed());
}
/**
* Dispose the behaviours in sequence.
*/
public dispose = (): void => {
for (const behaviour of this.behaviours) {
behaviour.dispose();
}
};
/**
* Should be called when the left panel is resized.
*/
public onLeftPanelResized = (): void => {
this.collapseHandler.onLeftPanelResized();
};
}