diff --git a/src/app/components/CallEmbedProvider.tsx b/src/app/components/CallEmbedProvider.tsx index 9bf7ad5fa..3a10e853f 100644 --- a/src/app/components/CallEmbedProvider.tsx +++ b/src/app/components/CallEmbedProvider.tsx @@ -631,6 +631,22 @@ function CallUtils({ embed, joined }: { embed: CallEmbed; joined: boolean }) { }, [setCallEmbed]), ); + // [Gitea #58] Warn before an accidental tab close/reload drops the user out + // of a live call. Only armed while actually joined, and torn down on + // hangup/dispose since this effect re-runs when `joined` flips back to false. + useEffect(() => { + if (!joined) return undefined; + const onBeforeUnload = (event: BeforeUnloadEvent) => { + event.preventDefault(); + // Legacy browsers require returnValue to be set to show the prompt. + event.returnValue = ''; + }; + window.addEventListener('beforeunload', onBeforeUnload); + return () => { + window.removeEventListener('beforeunload', onBeforeUnload); + }; + }, [joined]); + return null; } @@ -735,12 +751,6 @@ export function CallEmbedProvider({ children }: CallEmbedProviderProps) { }; }, []); - // Sync pip mode into CallControl so it can adjust behavior accordingly - useEffect(() => { - if (!callEmbed) return; - callEmbed.control.setPipMode(!!pipMode); - }, [pipMode, callEmbed]); - // When entering pip with screenshare active (or screenshare starts while in pip), // enable spotlight so the screenshare fills the pip window. // When screenshare ends, release the spotlight we auto-enabled.