diff --git a/lib/selectors/keyserver-selectors.js b/lib/selectors/keyserver-selectors.js --- a/lib/selectors/keyserver-selectors.js +++ b/lib/selectors/keyserver-selectors.js @@ -39,8 +39,14 @@ state.keyserverStore.keyserverInfos[ashoatKeyserverID]?.updatesCurrentAsOf ?? 0; -const currentAsOfSelector: (state: AppState) => number = (state: AppState) => - state.messageStore.currentAsOf[ashoatKeyserverID] ?? 0; +const baseCurrentAsOfSelector: ( + keyserverID: string, +) => (state: AppState) => number = keyserverID => (state: AppState) => + state.messageStore.currentAsOf[keyserverID] ?? 0; + +const currentAsOfSelector: ( + keyserverID: string, +) => (state: AppState) => number = _memoize(baseCurrentAsOfSelector); const baseUrlPrefixSelector: ( keyserverID: string, diff --git a/lib/selectors/socket-selectors.js b/lib/selectors/socket-selectors.js --- a/lib/selectors/socket-selectors.js +++ b/lib/selectors/socket-selectors.js @@ -1,5 +1,6 @@ // @flow +import _memoize from 'lodash/memoize.js'; import { createSelector } from 'reselect'; import { @@ -193,23 +194,32 @@ }, ); -const sessionStateFuncSelector: ( +const baseSessionStateFuncSelector: ( + keyserverID: string, +) => ( state: AppState, -) => (calendarActive: boolean) => SessionState = createSelector( - currentAsOfSelector, - updatesCurrentAsOfSelector, - currentCalendarQuery, - ( - messagesCurrentAsOf: number, - updatesCurrentAsOf: number, - calendarQuery: (calendarActive: boolean) => CalendarQuery, - ) => - (calendarActive: boolean): SessionState => ({ - calendarQuery: calendarQuery(calendarActive), - messagesCurrentAsOf, - updatesCurrentAsOf, - watchedIDs: threadWatcher.getWatchedIDs(), - }), +) => (calendarActive: boolean) => SessionState = keyserverID => + createSelector( + currentAsOfSelector(keyserverID), + updatesCurrentAsOfSelector, + currentCalendarQuery, + ( + messagesCurrentAsOf: number, + updatesCurrentAsOf: number, + calendarQuery: (calendarActive: boolean) => CalendarQuery, + ) => + (calendarActive: boolean): SessionState => ({ + calendarQuery: calendarQuery(calendarActive), + messagesCurrentAsOf, + updatesCurrentAsOf, + watchedIDs: threadWatcher.getWatchedIDs(), + }), + ); + +const sessionStateFuncSelector: ( + keyserverID: string, +) => (state: AppState) => (calendarActive: boolean) => SessionState = _memoize( + baseSessionStateFuncSelector, ); export { queuedReports, getClientResponsesSelector, sessionStateFuncSelector }; diff --git a/native/selectors/account-selectors.js b/native/selectors/account-selectors.js --- a/native/selectors/account-selectors.js +++ b/native/selectors/account-selectors.js @@ -1,5 +1,6 @@ // @flow +import _memoize from 'lodash/memoize.js'; import { createSelector } from 'reselect'; import { logInExtraInfoSelector } from 'lib/selectors/account-selectors.js'; @@ -41,10 +42,12 @@ }, ); -const noDataAfterPolicyAcknowledgmentSelector: (state: AppState) => boolean = +const baseNoDataAfterPolicyAcknowledgmentSelector: ( + keyserverID: string, +) => (state: AppState) => boolean = keyserverID => createSelector( (state: AppState) => state.connectivity, - currentAsOfSelector, + currentAsOfSelector(keyserverID), (state: AppState) => state.userPolicies, ( connectivity: ConnectivityInfo, @@ -56,6 +59,12 @@ values(userPolicies).every(policy => policy.isAcknowledged), ); +const noDataAfterPolicyAcknowledgmentSelector: ( + keyserverID: string, +) => (state: AppState) => boolean = _memoize( + baseNoDataAfterPolicyAcknowledgmentSelector, +); + export { nativeLogInExtraInfoSelector, noDataAfterPolicyAcknowledgmentSelector, diff --git a/native/selectors/socket-selectors.js b/native/selectors/socket-selectors.js --- a/native/selectors/socket-selectors.js +++ b/native/selectors/socket-selectors.js @@ -116,17 +116,24 @@ ), ); +const baseNativeSessionStateFuncSelector: ( + keyserverID: string, +) => (input: NavPlusRedux) => () => SessionState = keyserverID => + createSelector( + (input: NavPlusRedux) => sessionStateFuncSelector(keyserverID)(input.redux), + (input: NavPlusRedux) => calendarActiveSelector(input.navContext), + ( + sessionStateFunc: (calendarActive: boolean) => SessionState, + calendarActive: boolean, + ) => + () => + sessionStateFunc(calendarActive), + ); + const nativeSessionStateFuncSelector: ( - input: NavPlusRedux, -) => () => SessionState = createSelector( - (input: NavPlusRedux) => sessionStateFuncSelector(input.redux), - (input: NavPlusRedux) => calendarActiveSelector(input.navContext), - ( - sessionStateFunc: (calendarActive: boolean) => SessionState, - calendarActive: boolean, - ) => - () => - sessionStateFunc(calendarActive), + keyserverID: string, +) => (input: NavPlusRedux) => () => SessionState = _memoize( + baseNativeSessionStateFuncSelector, ); export { diff --git a/native/socket.react.js b/native/socket.react.js --- a/native/socket.react.js +++ b/native/socket.react.js @@ -55,7 +55,7 @@ state => isLoggedIn(state) && state.lifecycleState !== 'background', ); const noDataAfterPolicyAcknowledgment = useSelector( - noDataAfterPolicyAcknowledgmentSelector, + noDataAfterPolicyAcknowledgmentSelector(ashoatKeyserverID), ); const currentUserInfo = useSelector(state => state.currentUserInfo); @@ -75,7 +75,7 @@ }), ); const sessionStateFunc = useSelector(state => - nativeSessionStateFuncSelector({ + nativeSessionStateFuncSelector(ashoatKeyserverID)({ redux: state, navContext, }), diff --git a/web/selectors/socket-selectors.js b/web/selectors/socket-selectors.js --- a/web/selectors/socket-selectors.js +++ b/web/selectors/socket-selectors.js @@ -126,9 +126,11 @@ ), ); -const webSessionStateFuncSelector: (state: AppState) => () => SessionState = +const baseWebSessionStateFuncSelector: ( + keyserverID: string, +) => (state: AppState) => () => SessionState = keyserverID => createSelector( - sessionStateFuncSelector, + sessionStateFuncSelector(keyserverID), (state: AppState) => state.navInfo.tab === 'calendar', ( sessionStateFunc: (calendarActive: boolean) => SessionState, @@ -138,6 +140,12 @@ sessionStateFunc(calendarActive), ); +const webSessionStateFuncSelector: ( + keyserverID: string, +) => (state: AppState) => () => SessionState = _memoize( + baseWebSessionStateFuncSelector, +); + export { openSocketSelector, sessionIdentificationSelector, diff --git a/web/socket.react.js b/web/socket.react.js --- a/web/socket.react.js +++ b/web/socket.react.js @@ -48,7 +48,9 @@ const sessionIdentification = useSelector(sessionIdentificationSelector); const preRequestUserState = useSelector(preRequestUserStateSelector); const getClientResponses = useSelector(webGetClientResponsesSelector); - const sessionStateFunc = useSelector(webSessionStateFuncSelector); + const sessionStateFunc = useSelector( + webSessionStateFuncSelector(ashoatKeyserverID), + ); const currentCalendarQuery = useSelector(webCalendarQuery); const reduxActiveThread = useSelector(activeThreadSelector);