diff --git a/src/state/CallViewModel.ts b/src/state/CallViewModel.ts index c701519b..8e080fdc 100644 --- a/src/state/CallViewModel.ts +++ b/src/state/CallViewModel.ts @@ -83,6 +83,7 @@ import { oneOnOneLayout } from "./OneOnOneLayout"; import { pipLayout } from "./PipLayout"; import { type EncryptionSystem } from "../e2ee/sharedKeyManagement"; import { observeSpeaker } from "./observeSpeaker"; +import { shallowEquals } from "../utils/array"; // How long we wait after a focus switch before showing the real participant // list again @@ -705,6 +706,8 @@ export class CallViewModel extends ViewModel { bins.sort(([, bin1], [, bin2]) => bin1 - bin2).map(([m]) => m.vm), ); }), + distinctUntilChanged(shallowEquals), + this.scope.state(), ); private readonly spotlight: Observable = @@ -718,6 +721,7 @@ export class CallViewModel extends ViewModel { map((speaker) => (speaker ? [speaker] : [])), ); }), + distinctUntilChanged(shallowEquals), this.scope.state(), ); diff --git a/src/utils/array.ts b/src/utils/array.ts new file mode 100644 index 00000000..70ecbd89 --- /dev/null +++ b/src/utils/array.ts @@ -0,0 +1,16 @@ +/* +Copyright 2024 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only +Please see LICENSE in the repository root for full details. +*/ + +/** + * Determine whether two arrays are equal by shallow comparison. + */ +export function shallowEquals(first: A[], second: A[]): boolean { + if (first.length !== second.length) return false; + for (let i = 0; i < first.length; i++) + if (first[i] !== second[i]) return false; + return true; +}