From dfd1d77674a4a40acea397e50f4fa5355aeaebe2 Mon Sep 17 00:00:00 2001 From: Hugo Costa Date: Tue, 21 Jun 2022 12:26:00 -0300 Subject: [PATCH] [FIX] VOIP CallContext snapshot infinite loop (#25947) ## Proposed changes (including videos or screenshots) The application was crashing due to an error on the `useCallerInfo()` hook. The error was: ![image](https://user-images.githubusercontent.com/20212776/174823914-4832e5dd-c91a-4ae4-9d1f-1b960bcd372c.png) ![image](https://user-images.githubusercontent.com/20212776/174823982-cb543fe0-663f-4530-bb94-0720653ca897.png) To prevent this issue to happen it was added a cached and out-of-scope snapshot variable to the hook using `useSyncExternalStore` ## Issue(s) ## Steps to test or reproduce 1. Open rocket.chat server 2. Enable Omnichannel 3. Enable Voip 4. Refresh de page ## Further comments --- apps/meteor/client/contexts/CallContext.ts | 15 ++++++++++++--- apps/meteor/package.json | 2 +- packages/ui-contexts/package.json | 2 +- yarn.lock | 12 ++++++------ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/apps/meteor/client/contexts/CallContext.ts b/apps/meteor/client/contexts/CallContext.ts index 6c1845c58e1..b28a325e97c 100644 --- a/apps/meteor/client/contexts/CallContext.ts +++ b/apps/meteor/client/contexts/CallContext.ts @@ -62,10 +62,16 @@ export const useIsCallEnabled = (): boolean => { return enabled; }; +let callerInfo: VoIpCallerInfo; + export const useIsCallReady = (): boolean => { - const { ready } = useContext(CallContext); + const context = useContext(CallContext); + + if (isCallContextReady(context)) { + callerInfo = context.voipClient.callerInfo; + } - return Boolean(ready); + return !!context.ready; }; export const useIsCallError = (): boolean => { @@ -99,7 +105,10 @@ export const useCallerInfo = (): VoIpCallerInfo => { }, [voipClient], ); - return useSyncExternalStore(subscribe, (): VoIpCallerInfo => voipClient.callerInfo); + + const getSnapshot = (): VoIpCallerInfo => callerInfo; + + return useSyncExternalStore(subscribe, getSnapshot); }; export const useCallCreateRoom = (): CallContextReady['createRoom'] => { diff --git a/apps/meteor/package.json b/apps/meteor/package.json index a7c05b9cd97..7e3dc102e6c 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -197,7 +197,7 @@ "@rocket.chat/forked-matrix-appservice-bridge": "^4.0.1", "@rocket.chat/forked-matrix-bot-sdk": "^0.6.0-beta.2", "@rocket.chat/fuselage": "0.32.0-dev.49", - "@rocket.chat/fuselage-hooks": "~0.31.14-dev.7", + "@rocket.chat/fuselage-hooks": "~0.31.14-dev.9", "@rocket.chat/fuselage-polyfills": "~0.31.12", "@rocket.chat/fuselage-toastbar": "^0.32.0-dev.22", "@rocket.chat/fuselage-tokens": "~0.31.12", diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 4a4f7b70e61..6ad0d35404f 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -5,7 +5,7 @@ "devDependencies": { "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "^0.31.11", - "@rocket.chat/fuselage-hooks": "~0.31.14-dev.7", + "@rocket.chat/fuselage-hooks": "~0.31.14-dev.9", "@rocket.chat/rest-typings": "workspace:^", "@types/jest": "^27.4.1", "@types/mongodb": "~3.6.10", diff --git a/yarn.lock b/yarn.lock index c61e201e18b..228796e111e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3529,15 +3529,15 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-hooks@npm:~0.31.14-dev.7": - version: 0.31.14-dev.7 - resolution: "@rocket.chat/fuselage-hooks@npm:0.31.14-dev.7" +"@rocket.chat/fuselage-hooks@npm:~0.31.14-dev.9": + version: 0.31.14-dev.9 + resolution: "@rocket.chat/fuselage-hooks@npm:0.31.14-dev.9" dependencies: use-sync-external-store: ~1.2.0 peerDependencies: "@rocket.chat/fuselage-tokens": "*" react: ^17.0.2 - checksum: ad2a1a61189d694e5e70ab73dfc20a7bea7ad0686be97993b24c6053b5cfa027e6b70690b75b5e9c1e8712a2b41f7d031a416c5e6781e9c4b31b5c0a40529ea0 + checksum: fa79c8c8a5b56d0c5ccd2118735a6eef5aaf99f1392161d90e72da4dc0cd1dc9007387df71ab428545f72a3c5c8c1648c086078724cb4698ec05044a0462e0b6 languageName: node linkType: hard @@ -3819,7 +3819,7 @@ __metadata: "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.1 "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.2 "@rocket.chat/fuselage": 0.32.0-dev.49 - "@rocket.chat/fuselage-hooks": ~0.31.14-dev.7 + "@rocket.chat/fuselage-hooks": ~0.31.14-dev.9 "@rocket.chat/fuselage-polyfills": ~0.31.12 "@rocket.chat/fuselage-toastbar": ^0.32.0-dev.22 "@rocket.chat/fuselage-tokens": ~0.31.12 @@ -4239,7 +4239,7 @@ __metadata: dependencies: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": ^0.31.11 - "@rocket.chat/fuselage-hooks": ~0.31.14-dev.7 + "@rocket.chat/fuselage-hooks": ~0.31.14-dev.9 "@rocket.chat/rest-typings": "workspace:^" "@types/jest": ^27.4.1 "@types/mongodb": ~3.6.10