Fix missing tile bug

The 'connecting' tile change meant that we could have tiles right
at the start of the call where we wouldn't have before, and in fact
could have tiles for other users before we even had a tile for ourself.
This threw off the logic for ordering tiles which had a special case
for 1:1 calling which assumed that one of the tiles in a 1:1 call was
the local user. In this case, this assumption wasn't true at the very
start of the call, so the tile orders got assigned incorrectly and then
persisted for the rest of the call.

Fixes https://github.com/vector-im/element-call/issues/694
This commit is contained in:
David Baker 2022-11-01 18:10:11 +00:00
parent e42a83bbc4
commit feeb9c4e7c
2 changed files with 8 additions and 1 deletions

View file

@ -51,7 +51,7 @@ export interface UseGroupCallReturnType {
requestingScreenshare: boolean;
isScreensharing: boolean;
screenshareFeeds: CallFeed[];
localDesktopCapturerSourceId: string;
localDesktopCapturerSourceId: string; // XXX: This looks unused?
participants: RoomMember[];
hasLocalParticipant: boolean;
unencryptedEventsFromUsers: Set<string>;

View file

@ -654,9 +654,16 @@ function getSubGridPositions(
// Sets the 'order' property on tiles based on the layout param and
// other properties of the tiles, eg. 'focused' and 'presenter'
function reorderTiles(tiles: Tile[], layout: Layout) {
// We use a special layout for 1:1 to always put the local tile first.
// We only do this if there are two tiles (obviously) and exactly one
// of them is local: during startup we can have tiles from other users
// but not our own, due to the order they're added, so without this we
// can assign multiple remote tiles order '1' and this persists through
// subsequent reorders because we preserve the order of the tiles.
if (
layout === "freedom" &&
tiles.length === 2 &&
tiles.filter((t) => t.item.isLocal).length === 1 &&
!tiles.some((t) => t.presenter || t.focused)
) {
// 1:1 layout