Don't keep someone in the spotlight if they've left the call
This commit is contained in:
@@ -424,21 +424,25 @@ export class CallViewModel extends ViewModel {
|
||||
),
|
||||
scan<(readonly [UserMedia, boolean])[], UserMedia, null>(
|
||||
(prev, mediaItems) => {
|
||||
const stickyPrev = prev === null || prev.vm.local ? null : prev;
|
||||
// Only remote users that are still in the call should be sticky
|
||||
const stickyPrev =
|
||||
prev === null || prev.vm.local
|
||||
? null
|
||||
: mediaItems.find(([m]) => m === prev);
|
||||
const stillSpeaking = stickyPrev?.[1];
|
||||
// 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
|
||||
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]
|
||||
);
|
||||
// If the previous speaker is still speaking, stick with them rather
|
||||
// than switching eagerly to someone else
|
||||
return stillSpeaking
|
||||
? stickyPrev[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?.[0] ??
|
||||
// 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,
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user