diff --git a/lib/reducers/master-reducer.js b/lib/reducers/master-reducer.js --- a/lib/reducers/master-reducer.js +++ b/lib/reducers/master-reducer.js @@ -29,6 +29,8 @@ keyserverRegisterActionTypes, logInActionTypes, } from '../actions/user-actions.js'; +import type { ReplaceKeyserverOperation } from '../ops/keyserver-store-ops.js'; +import { keyserverStoreOpsHandlers } from '../ops/keyserver-store-ops.js'; import { isStaff } from '../shared/staff-utils.js'; import type { BaseNavInfo } from '../types/nav-types.js'; import type { BaseAppState, BaseAction } from '../types/redux-types.js'; @@ -77,8 +79,12 @@ reduceMessageStore(state.messageStore, action, threadInfos); let messageStore = reducedMessageStore; - let { keyserverStore } = reduceKeyserverStore(state.keyserverStore, action); + let { keyserverStore, keyserverStoreOperations } = reduceKeyserverStore( + state.keyserverStore, + action, + ); + const replaceOperations: ReplaceKeyserverOperation[] = []; if ( action.type !== incrementalStateSyncActionType && action.type !== fullStateSyncActionType && @@ -111,16 +117,32 @@ keyserverStore.keyserverInfos[keyserverID].updatesCurrentAsOf !== state.keyserverStore.keyserverInfos[keyserverID].updatesCurrentAsOf ) { - const keyserverInfos = { ...keyserverStore.keyserverInfos }; - keyserverInfos[keyserverID] = { - ...keyserverInfos[keyserverID], - updatesCurrentAsOf: - state.keyserverStore.keyserverInfos[keyserverID].updatesCurrentAsOf, - }; - keyserverStore = { ...keyserverStore, keyserverInfos }; + replaceOperations.push({ + type: 'replace_keyserver', + payload: { + id: keyserverID, + keyserverInfo: { + ...keyserverStore.keyserverInfos[keyserverID], + updatesCurrentAsOf: + state.keyserverStore.keyserverInfos[keyserverID] + .updatesCurrentAsOf, + }, + }, + }); } } } + keyserverStore = { + ...keyserverStore, + keyserverInfos: keyserverStoreOpsHandlers.processStoreOperations( + keyserverStore.keyserverInfos, + replaceOperations, + ), + }; + keyserverStoreOperations = [ + ...keyserverStoreOperations, + ...replaceOperations, + ]; const { draftStore, draftStoreOperations } = reduceDraftStore( state.draftStore, @@ -188,6 +210,7 @@ messageStoreOperations, reportStoreOperations, userStoreOperations, + keyserverStoreOperations, }, }; } diff --git a/lib/types/store-ops-types.js b/lib/types/store-ops-types.js --- a/lib/types/store-ops-types.js +++ b/lib/types/store-ops-types.js @@ -15,6 +15,7 @@ import type { ClientDBKeyserverInfo, ClientDBKeyserverStoreOperation, + KeyserverStoreOperation, } from '../ops/keyserver-store-ops.js'; import type { ClientDBMessageStoreOperation, @@ -40,6 +41,7 @@ +messageStoreOperations: $ReadOnlyArray, +reportStoreOperations: $ReadOnlyArray, +userStoreOperations: $ReadOnlyArray, + +keyserverStoreOperations: $ReadOnlyArray, }; export type ClientDBStoreOperations = { diff --git a/native/redux/redux-setup.js b/native/redux/redux-setup.js --- a/native/redux/redux-setup.js +++ b/native/redux/redux-setup.js @@ -263,6 +263,7 @@ messageStoreOperations, reportStoreOperations, userStoreOperations, + keyserverStoreOperations, } = storeOperations; const fixUnreadActiveThreadResult = fixUnreadActiveThread(state, action); @@ -279,6 +280,7 @@ threadStoreOperations: threadStoreOperationsWithUnreadFix, reportStoreOperations, userStoreOperations, + keyserverStoreOperations, }); return state; diff --git a/native/redux/redux-utils.js b/native/redux/redux-utils.js --- a/native/redux/redux-utils.js +++ b/native/redux/redux-utils.js @@ -2,6 +2,7 @@ import { useSelector as reactReduxUseSelector } from 'react-redux'; +import { keyserverStoreOpsHandlers } from 'lib/ops/keyserver-store-ops.js'; import { messageStoreOpsHandlers } from 'lib/ops/message-store-ops.js'; import { reportStoreOpsHandlers } from 'lib/ops/report-store-ops.js'; import { threadStoreOpsHandlers } from 'lib/ops/thread-store-ops.js'; @@ -28,6 +29,7 @@ messageStoreOperations, reportStoreOperations, userStoreOperations, + keyserverStoreOperations, } = storeOperations; const convertedThreadStoreOperations = @@ -38,6 +40,8 @@ reportStoreOpsHandlers.convertOpsToClientDBOps(reportStoreOperations); const convertedUserStoreOperations = userStoreOpsHandlers.convertOpsToClientDBOps(userStoreOperations); + const convertedKeyserverStoreOperations = + keyserverStoreOpsHandlers.convertOpsToClientDBOps(keyserverStoreOperations); try { const promises = []; @@ -72,6 +76,13 @@ commCoreModule.processUserStoreOperations(convertedUserStoreOperations), ); } + if (convertedKeyserverStoreOperations.length > 0) { + promises.push( + commCoreModule.processKeyserverStoreOperations( + convertedKeyserverStoreOperations, + ), + ); + } await Promise.all(promises); } catch (e) { if (isTaskCancelledError(e)) { diff --git a/web/database/utils/store.js b/web/database/utils/store.js --- a/web/database/utils/store.js +++ b/web/database/utils/store.js @@ -1,5 +1,6 @@ // @flow +import { keyserverStoreOpsHandlers } from 'lib/ops/keyserver-store-ops.js'; import { reportStoreOpsHandlers } from 'lib/ops/report-store-ops.js'; import { threadStoreOpsHandlers } from 'lib/ops/thread-store-ops.js'; import { canUseDatabaseOnWeb } from 'lib/shared/web-database.js'; @@ -54,8 +55,12 @@ storeOperations: StoreOperations, userID: null | string, ): Promise { - const { draftStoreOperations, threadStoreOperations, reportStoreOperations } = - storeOperations; + const { + draftStoreOperations, + threadStoreOperations, + reportStoreOperations, + keyserverStoreOperations, + } = storeOperations; const canUseDatabase = canUseDatabaseOnWeb(userID); @@ -64,11 +69,14 @@ : []; const convertedReportStoreOperations = reportStoreOpsHandlers.convertOpsToClientDBOps(reportStoreOperations); + const convertedKeyserverStoreOperations = + keyserverStoreOpsHandlers.convertOpsToClientDBOps(keyserverStoreOperations); if ( convertedThreadStoreOperations.length === 0 && convertedReportStoreOperations.length === 0 && - draftStoreOperations.length === 0 + draftStoreOperations.length === 0 && + convertedKeyserverStoreOperations.length === 0 ) { return; } @@ -85,6 +93,7 @@ draftStoreOperations, reportStoreOperations: convertedReportStoreOperations, threadStoreOperations: convertedThreadStoreOperations, + keyserverStoreOperations: convertedKeyserverStoreOperations, }, }); } catch (e) { diff --git a/web/redux/initial-state-gate.js b/web/redux/initial-state-gate.js --- a/web/redux/initial-state-gate.js +++ b/web/redux/initial-state-gate.js @@ -117,6 +117,7 @@ messageStoreOperations: [], reportStoreOperations: [], userStoreOperations: [], + keyserverStoreOperations: [], }, currentLoggedInUserID, ); diff --git a/web/redux/redux-setup.js b/web/redux/redux-setup.js --- a/web/redux/redux-setup.js +++ b/web/redux/redux-setup.js @@ -141,6 +141,7 @@ messageStoreOperations: [], reportStoreOperations: [], userStoreOperations: [], + keyserverStoreOperations: [], }; if (action.type === setInitialReduxState) { @@ -173,7 +174,13 @@ }, initialStateLoaded: true, }, - storeOperations, + { + ...storeOperations, + keyserverStoreOperations: [ + ...storeOperations.keyserverStoreOperations, + ...replaceOperations, + ], + }, ); } else if (action.type === updateWindowDimensionsActionType) { return validateStateAndProcessDBOperations( @@ -239,6 +246,13 @@ ), }, }; + storeOperations = { + ...storeOperations, + keyserverStoreOperations: [ + ...storeOperations.keyserverStoreOperations, + replaceOperation, + ], + }; } else if ( action.type === deleteKeyserverAccountActionTypes.success && invalidSessionDowngrade( @@ -289,7 +303,13 @@ ) { const baseReducerResult = baseReducer(state, action, onStateDifference); state = baseReducerResult.state; - storeOperations = baseReducerResult.storeOperations; + storeOperations = { + ...baseReducerResult.storeOperations, + keyserverStoreOperations: [ + ...storeOperations.keyserverStoreOperations, + ...baseReducerResult.storeOperations.keyserverStoreOperations, + ], + }; } const communityPickerStore = reduceCommunityPickerStore(