diff --git a/lib/handlers/db-ops-handler.react.js b/lib/handlers/db-ops-handler.react.js --- a/lib/handlers/db-ops-handler.react.js +++ b/lib/handlers/db-ops-handler.react.js @@ -3,23 +3,37 @@ import * as React from 'react'; import { opsProcessingFinishedActionType } from '../actions/db-ops-actions.js'; +import type { DBOpsEntry } from '../types/db-ops-types.js'; +import type { StoreOperations } from '../types/store-ops-types.js'; import { useDispatch, useSelector } from '../utils/redux-utils.js'; -function DBOpsHandler(): React.Node { +type Props = { + +processDBStoreOperations: StoreOperations => Promise, +}; + +function DBOpsHandler(props: Props): React.Node { + const { processDBStoreOperations } = props; const queueFront = useSelector(state => state.dbOpsStore.queuedOps[0]); + const prevQueueFront = React.useRef(null); const dispatch = useDispatch(); React.useEffect(() => { - if (!queueFront) { + if (!queueFront || prevQueueFront.current === queueFront) { return; } - if (!queueFront.ops) { + prevQueueFront.current = queueFront; + + const ops = queueFront.ops; + void (async () => { + if (ops) { + await processDBStoreOperations(ops); + } dispatch({ type: opsProcessingFinishedActionType, }); - } - }, [queueFront, dispatch]); + })(); + }, [queueFront, dispatch, processDBStoreOperations]); return null; } diff --git a/lib/types/db-ops-types.js b/lib/types/db-ops-types.js --- a/lib/types/db-ops-types.js +++ b/lib/types/db-ops-types.js @@ -4,7 +4,7 @@ export type MessageID = string; -type DBOpsEntry = +export type DBOpsEntry = | { +messageID: MessageID, +ops?: ?StoreOperations, diff --git a/native/root.react.js b/native/root.react.js --- a/native/root.react.js +++ b/native/root.react.js @@ -76,7 +76,7 @@ import { DimensionsUpdater } from './redux/dimensions-updater.react.js'; import { getPersistor } from './redux/persist.js'; import { store } from './redux/redux-setup.js'; -import { useSelector } from './redux/redux-utils.js'; +import { processDBStoreOperations, useSelector } from './redux/redux-utils.js'; import { RootContext } from './root-context.js'; import { MessageSearchProvider } from './search/search-provider.react.js'; import Socket from './socket.react.js'; @@ -277,7 +277,7 @@ - + ); let navigation; diff --git a/web/components/db-ops-handler.react.js b/web/components/db-ops-handler.react.js new file mode 100644 --- /dev/null +++ b/web/components/db-ops-handler.react.js @@ -0,0 +1,20 @@ +// @flow + +import * as React from 'react'; + +import { DBOpsHandler as BaseHandler } from 'lib/handlers/db-ops-handler.react.js'; +import type { StoreOperations } from 'lib/types/store-ops-types.js'; + +import { useSelector } from '../redux/redux-utils.js'; +import { processDBStoreOperations } from '../shared-worker/utils/store.js'; + +function DBOpsHandler(): React.Node { + const currentUserID = useSelector(state => state.currentUserInfo?.id ?? null); + const processOperations = React.useCallback( + (ops: StoreOperations) => processDBStoreOperations(ops, currentUserID), + [currentUserID], + ); + return ; +} + +export { DBOpsHandler }; diff --git a/web/root.js b/web/root.js --- a/web/root.js +++ b/web/root.js @@ -13,11 +13,11 @@ import KeyserverConnectionsHandler from 'lib/components/keyserver-connections-handler.js'; import PrekeysHandler from 'lib/components/prekeys-handler.react.js'; import ReportHandler from 'lib/components/report-handler.react.js'; -import { DBOpsHandler } from 'lib/handlers/db-ops-handler.react.js'; import { CallKeyserverEndpointProvider } from 'lib/keyserver-conn/call-keyserver-endpoint-provider.react.js'; import { reduxLoggerMiddleware } from 'lib/utils/action-logger.js'; import App from './app.react.js'; +import { DBOpsHandler } from './components/db-ops-handler.react.js'; import ErrorBoundary from './error-boundary.react.js'; import IdentityServiceContextProvider from './grpc/identity-service-context-provider.react.js'; import { defaultWebState } from './redux/default-state.js';