diff --git a/lib/reducers/enabled-apps-reducer.js b/lib/reducers/enabled-apps-reducer.js --- a/lib/reducers/enabled-apps-reducer.js +++ b/lib/reducers/enabled-apps-reducer.js @@ -1,36 +1,80 @@ // @flow +import { setClientDBStoreActionType } from '../actions/client-db-store-actions.js'; import { setNewSessionActionType } from '../keyserver-conn/keyserver-conn-types.js'; +import type { SyncedMetadataStoreOperation } from '../ops/synced-metadata-store-ops.js'; import type { EnabledApps } from '../types/enabled-apps.js'; import { defaultEnabledApps, defaultWebEnabledApps, } from '../types/enabled-apps.js'; import type { BaseAction } from '../types/redux-types.js'; +import { syncedMetadataNames } from '../types/synced-metadata-types.js'; import { authoritativeKeyserverID } from '../utils/authoritative-keyserver.js'; import { relyingOnAuthoritativeKeyserver } from '../utils/services-utils.js'; export const enableAppActionType = 'ENABLE_APP'; export const disableAppActionType = 'DISABLE_APP'; +type ReduceEnabledAppsResult = { + +enabledApps: EnabledApps, + +syncedMetadataStoreOperations: $ReadOnlyArray, +}; + +function getUpdatedEnabledAppsResult( + enabledApps: EnabledApps, +): ReduceEnabledAppsResult { + return { + enabledApps, + syncedMetadataStoreOperations: [ + { + type: 'replace_synced_metadata_entry', + payload: { + name: syncedMetadataNames.ENABLED_APPS, + data: JSON.stringify(enabledApps), + }, + }, + ], + }; +} + export default function reduceEnabledApps( state: EnabledApps, action: BaseAction, -): EnabledApps { +): ReduceEnabledAppsResult { if (action.type === enableAppActionType && action.payload === 'calendar') { - return { ...state, calendar: true }; + return getUpdatedEnabledAppsResult({ ...state, calendar: true }); } else if ( action.type === disableAppActionType && action.payload === 'calendar' ) { - return { ...state, calendar: false }; + return getUpdatedEnabledAppsResult({ ...state, calendar: false }); + } else if (action.type === setClientDBStoreActionType) { + let enabledApps = { ...state }; + const enabledAppsString = + action.payload.syncedMetadata?.[syncedMetadataNames.ENABLED_APPS]; + if (enabledAppsString) { + enabledApps = { + ...enabledApps, + ...JSON.parse(enabledAppsString), + }; + } + return { + enabledApps, + syncedMetadataStoreOperations: [], + }; } else if ( action.type === setNewSessionActionType && action.payload.sessionChange.cookieInvalidated && action.payload.keyserverID === authoritativeKeyserverID() && relyingOnAuthoritativeKeyserver ) { - return process.env.BROWSER ? defaultWebEnabledApps : defaultEnabledApps; + return getUpdatedEnabledAppsResult( + process.env.BROWSER ? defaultWebEnabledApps : defaultEnabledApps, + ); } - return state; + return { + enabledApps: state, + syncedMetadataStoreOperations: [], + }; } 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 @@ -180,6 +180,8 @@ threadStoreOperations, ); + const { enabledApps } = reduceEnabledApps(state.enabledApps, action); + const { syncedMetadataStore, syncedMetadataStoreOperations } = reduceSyncedMetadataStore(state.syncedMetadataStore, action); @@ -243,7 +245,7 @@ ), alertStore: reduceAlertStore(state.alertStore, action), lifecycleState: reduceLifecycleState(state.lifecycleState, action), - enabledApps: reduceEnabledApps(state.enabledApps, action), + enabledApps, reportStore, dataLoaded: reduceDataLoaded(state.dataLoaded, action), userPolicies: policiesReducer(state.userPolicies, action), diff --git a/lib/types/synced-metadata-types.js b/lib/types/synced-metadata-types.js --- a/lib/types/synced-metadata-types.js +++ b/lib/types/synced-metadata-types.js @@ -9,6 +9,7 @@ const syncedMetadataNames = Object.freeze({ CURRENT_USER_FID: 'current_user_fid', STORE_VERSION: 'store_version', + ENABLED_APPS: 'enabled_apps', }); type SyncedMetadataName = $Values;