From 5a0b81b57f33c677da33266ccaceb186261e363c Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 1 Aug 2024 12:48:47 -0400 Subject: [PATCH] More strongly prefer putting a remote speaker in the spotlight If no one had spoken yet, we were still showing the local user in the spotlight. We should instead eagerly switch to showing an arbitrary remote participant in this case. --- src/state/CallViewModel.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/state/CallViewModel.ts b/src/state/CallViewModel.ts index 226f711f..c5d7af81 100644 --- a/src/state/CallViewModel.ts +++ b/src/state/CallViewModel.ts @@ -414,19 +414,23 @@ export class CallViewModel extends ViewModel { ), ), scan<(readonly [UserMedia, boolean])[], UserMedia, null>( - (prev, mediaItems) => + (prev, mediaItems) => { + const stickyPrev = prev === null || prev.vm.local ? null : prev; // Decide who to spotlight: // If the previous speaker (not the local user) is still speaking, // stick with them rather than switching eagerly to someone else - (prev === null || prev.vm.local - ? null - : mediaItems.find(([m, s]) => m === prev && s)?.[0]) ?? - // Otherwise, select any remote user who is speaking - mediaItems.find(([m, s]) => !m.vm.local && s)?.[0] ?? - // Otherwise, stick with the person who was last speaking - prev ?? - // Otherwise, spotlight the local user - mediaItems.find(([m]) => m.vm.local)![0], + return ( + mediaItems.find(([m, s]) => m === stickyPrev && s)?.[0] ?? + // Otherwise, select any remote user who is speaking + mediaItems.find(([m, s]) => !m.vm.local && s)?.[0] ?? + // Otherwise, stick with the person who was last speaking + stickyPrev ?? + // Otherwise, spotlight an arbitrary remote user + mediaItems.find(([m]) => !m.vm.local)?.[0] ?? + // Otherwise, spotlight the local user + mediaItems.find(([m]) => m.vm.local)![0] + ); + }, null, ), distinctUntilChanged(),