diff --git a/lib/handlers/sync-current-user-info-handler.react.js b/lib/handlers/sync-current-user-info-handler.react.js new file mode 100644 --- /dev/null +++ b/lib/handlers/sync-current-user-info-handler.react.js @@ -0,0 +1,54 @@ +// @flow + +import * as React from 'react'; + +import { setSyncedMetadataEntryActionType } from '../actions/synced-metadata-actions.js'; +import { usePersistedStateLoaded } from '../selectors/app-state-selectors.js'; +import { isLoggedIn } from '../selectors/user-selectors.js'; +import { syncedMetadataNames } from '../types/synced-metadata-types.js'; +import { useDispatch, useSelector } from '../utils/redux-utils.js'; + +function SyncCurrentUserInfoHandler(): React.Node { + const loggedIn = useSelector(isLoggedIn); + const stateLoaded = usePersistedStateLoaded(); + const dispatch = useDispatch(); + + const syncedMetadataCurrentUserInfo = useSelector( + state => + state.syncedMetadataStore.syncedMetadata[ + syncedMetadataNames.CURRENT_USER_INFO + ] ?? undefined, + ); + const currentUserInfo = useSelector(state => state.currentUserInfo); + + const currentUserInfoIsSynced = React.useMemo( + () => syncedMetadataCurrentUserInfo === JSON.stringify(currentUserInfo), + [currentUserInfo, syncedMetadataCurrentUserInfo], + ); + + React.useEffect(() => { + if (!loggedIn) { + return; + } + + if (!currentUserInfoIsSynced) { + dispatch({ + type: setSyncedMetadataEntryActionType, + payload: { + name: syncedMetadataNames.CURRENT_USER_INFO, + data: JSON.stringify(currentUserInfo), + }, + }); + } + }, [ + currentUserInfo, + currentUserInfoIsSynced, + dispatch, + loggedIn, + stateLoaded, + ]); + + return null; +} + +export { SyncCurrentUserInfoHandler }; 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 @@ -12,6 +12,7 @@ ENABLED_APPS: 'enabled_apps', GLOBAL_THEME_INFO: 'global_theme_info', ALERT_STORE: 'alert_store', + CURRENT_USER_INFO: 'current_user_info', }); type SyncedMetadataName = $Values; diff --git a/native/root.react.js b/native/root.react.js --- a/native/root.react.js +++ b/native/root.react.js @@ -42,6 +42,7 @@ import { DBOpsHandler } from 'lib/handlers/db-ops-handler.react.js'; import { HoldersHandler } from 'lib/handlers/holders-handler.react.js'; import { InitialStateSharingHandler } from 'lib/handlers/initial-state-sharing-handler.react.js'; +import { SyncCurrentUserInfoHandler } from 'lib/handlers/sync-current-user-info-handler.react.js'; import { SyncStoreVersionHandler } from 'lib/handlers/sync-store-version-handler.react.js'; import { TunnelbrokerDeviceTokenHandler } from 'lib/handlers/tunnelbroker-device-token-handler.react.js'; import { UserInfosHandler } from 'lib/handlers/user-infos-handler.react.js'; @@ -302,6 +303,7 @@ + ); diff --git a/web/app.react.js b/web/app.react.js --- a/web/app.react.js +++ b/web/app.react.js @@ -29,6 +29,7 @@ import SyncCommunityStoreHandler from 'lib/components/sync-community-store-handler.react.js'; import { DBOpsHandler } from 'lib/handlers/db-ops-handler.react.js'; import { HoldersHandler } from 'lib/handlers/holders-handler.react.js'; +import { SyncCurrentUserInfoHandler } from 'lib/handlers/sync-current-user-info-handler.react.js'; import { SyncStoreVersionHandler } from 'lib/handlers/sync-store-version-handler.react.js'; import { TunnelbrokerDeviceTokenHandler } from 'lib/handlers/tunnelbroker-device-token-handler.react.js'; import { UserInfosHandler } from 'lib/handlers/user-infos-handler.react.js'; @@ -263,6 +264,7 @@ +