diff --git a/plugins/love-resources/src/components/RoomPopup.svelte b/plugins/love-resources/src/components/RoomPopup.svelte index df32a6e3d7b..ff1d3c7ae8d 100644 --- a/plugins/love-resources/src/components/RoomPopup.svelte +++ b/plugins/love-resources/src/components/RoomPopup.svelte @@ -32,7 +32,7 @@ import ShareScreenButton from './meeting/controls/ShareScreenButton.svelte' import LeaveRoomButton from './meeting/controls/LeaveRoomButton.svelte' import MeetingHeader from './meeting/MeetingHeader.svelte' - import { joinMeeting } from '../meetings' + import { joinMeeting, reconnectMeeting } from '../meetings' export let room: Room @@ -53,8 +53,14 @@ const dispatch = createEventDispatcher() + // A stale record (still "in" the room, but no LiveKit session - e.g. after + // a reload mid-call) must re-establish the media, not knock again. async function connect (): Promise { - await joinMeeting(room) + if (joined) { + await reconnectMeeting(room) + } else { + await joinMeeting(room) + } dispatch('close') } @@ -121,7 +127,8 @@ {/if} {#if joined} dispatch('close')} /> - {:else} + {/if} + {#if !joined || !$lkSessionConnected} { await connectToMeeting(room) } +/** + * Re-establish the call for a room this client is already recorded in. + * + * After a reload mid-call the ParticipantInfo still points at the room while + * no LiveKit session exists, so `joinMeeting` (which would knock again) is + * the wrong entry point: the person is already in, only the media is gone. + */ +export async function reconnectMeeting (room: Room): Promise { + if (get(myInfo)?.room !== room._id) { + await joinMeeting(room) + return + } + await connectToMeeting(room) +} + export async function joinOrCreateMeetingByInvite (roomId: Ref): Promise { if (currentMeetingRoom === roomId) return