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,13 +3,18 @@ import * as React from 'react'; import { opsProcessingFinishedActionType } from '../actions/db-ops-actions.js'; +import type { StoreOperations } from '../types/store-ops-types.js'; import { useDispatch, useSelector } from '../utils/redux-utils.js'; -function DBOpsHandler(): React.Node { - const noOpsActions = useSelector(state => state.dbOpsStore.noOpsActions); +type Props = { + +processDBStoreOperations: StoreOperations => Promise, +}; +function DBOpsHandler(props: Props): React.Node { + const { processDBStoreOperations } = props; const dispatch = useDispatch(); + const noOpsActions = useSelector(state => state.dbOpsStore.noOpsActions); React.useEffect(() => { if (noOpsActions.length === 0) { return; @@ -20,6 +25,25 @@ }); }, [noOpsActions, dispatch]); + const queuedOps = useSelector(state => state.dbOpsStore.queuedOps); + const opsInProgress = React.useRef>(new Set()); + React.useEffect(() => { + for (const item of queuedOps) { + if (opsInProgress.current.has(item.opsID)) { + continue; + } + opsInProgress.current.add(item.opsID); + void (async () => { + await processDBStoreOperations(item.ops); + dispatch({ + type: opsProcessingFinishedActionType, + payload: { opsID: item.opsID }, + }); + opsInProgress.current.delete(item.opsID); + })(); + } + }, [dispatch, processDBStoreOperations, queuedOps]); + return null; } diff --git a/native/root.react.js b/native/root.react.js --- a/native/root.react.js +++ b/native/root.react.js @@ -74,7 +74,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,7 +13,6 @@ 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'; @@ -22,6 +21,7 @@ OlmSessionCreatorProvider, } from './account/account-hooks.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';