diff --git a/lib/components/keyserver-connection-handler.js b/lib/components/keyserver-connection-handler.js --- a/lib/components/keyserver-connection-handler.js +++ b/lib/components/keyserver-connection-handler.js @@ -57,10 +57,33 @@ const dispatchActionPromise = useDispatchActionPromise(); const callLogOut = useLogOut(); + const { olmAPI } = getConfig(); + const hasConnectionIssue = useSelector( state => !!connectionSelector(keyserverID)(state)?.connectionIssue, ); const cookie = useSelector(cookieSelector(keyserverID)); + const prevCookieRef = React.useRef(cookie); + const notifsSessionReassignmentPromise = React.useRef>(null); + + React.useEffect(() => { + const prevCookie = prevCookieRef.current; + prevCookieRef.current = cookie; + + if (cookie === prevCookie || !cookie || !cookie.startsWith('user=')) { + return; + } + + notifsSessionReassignmentPromise.current = (async () => { + await notifsSessionReassignmentPromise.current; + await olmAPI.reassignNotificationsSession?.( + prevCookie, + cookie, + keyserverID, + ); + })(); + }, [cookie, keyserverID, olmAPI]); + const dataLoaded = useSelector(state => state.dataLoaded); const keyserverDeviceToken = useSelector(deviceTokenSelector(keyserverID)); @@ -101,8 +124,6 @@ invariant(identityContext, 'Identity context should be set'); const { identityClient, getAuthMetadata } = identityContext; - const { olmAPI } = getConfig(); - const preRequestUserInfo = useSelector(state => state.currentUserInfo); const innerPerformAuth = React.useCallback( ( diff --git a/web/shared-worker/worker/worker-crypto.js b/web/shared-worker/worker/worker-crypto.js --- a/web/shared-worker/worker/worker-crypto.js +++ b/web/shared-worker/worker/worker-crypto.js @@ -365,7 +365,10 @@ if (!value) { return; } - await localforage.setItem(destination, value); + const valueAtDestination = await localforage.getItem(destination); + if (!valueAtDestination) { + await localforage.setItem(destination, value); + } await localforage.removeItem(source); }