From 8554184beb110f37a757f0713306e7d5f384c461 Mon Sep 17 00:00:00 2001
From: Robert Long <robert@robertlong.me>
Date: Mon, 9 Aug 2021 17:44:26 -0700
Subject: [PATCH] Handle pagehide and visibilitychange events in safari

---
 src/ConferenceCallManagerHooks.js | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/ConferenceCallManagerHooks.js b/src/ConferenceCallManagerHooks.js
index 154fa35..6aa5a0c 100644
--- a/src/ConferenceCallManagerHooks.js
+++ b/src/ConferenceCallManagerHooks.js
@@ -161,9 +161,12 @@ export function useVideoRoom(manager, roomId, timeout = 5000) {
     }
 
     // iOS doesn't fire beforeunload event, so leave the call when you hide the page.
-    const unloadEvent = isIOS() ? "visibilitychange" : "beforeunload";
+    if (isIOS()) {
+      window.addEventListener("pagehide", onBeforeUnload);
+      document.addEventListener("visibilitychange", onBeforeUnload);
+    }
 
-    window.addEventListener(unloadEvent, onBeforeUnload);
+    window.addEventListener("beforeunload", onBeforeUnload);
 
     const onParticipantsChanged = () => {
       setState((prevState) => ({
@@ -219,7 +222,9 @@ export function useVideoRoom(manager, roomId, timeout = 5000) {
     return () => {
       manager.client.removeListener("Room", roomCallback);
       manager.removeListener("participants_changed", onParticipantsChanged);
-      window.removeEventListener(unloadEvent, onBeforeUnload);
+      window.removeEventListener("pagehide", onBeforeUnload);
+      document.removeEventListener("visibilitychange", onBeforeUnload);
+      window.removeEventListener("beforeunload", onBeforeUnload);
       clearTimeout(timeoutId);
       manager.leaveCall();
     };