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,9 +3,13 @@ import * as React from 'react'; import { opsProcessingFinishedActionType } from '../actions/db-ops-actions.js'; +import { extractKeyserverIDFromIDOptional } from '../keyserver-conn/keyserver-call-utils.js'; +import type { MessageSearchStoreOperation } from '../message-search-types.js'; +import type { MessageStoreOperation } from '../ops/message-store-ops.js'; import { usePeerToPeerCommunication } from '../tunnelbroker/peer-to-peer-context.js'; import { useTunnelbroker } from '../tunnelbroker/tunnelbroker-context.js'; import type { DBOpsEntry } from '../types/db-ops-types.js'; +import { messageTypes } from '../types/message-types-enum.js'; import type { StoreOperations } from '../types/store-ops-types.js'; import { type MessageProcessed, @@ -16,6 +20,49 @@ import { getMessageForException } from '../utils/errors.js'; import { useDispatch, useSelector } from '../utils/redux-utils.js'; +function getMessageSearchStoreOps( + messageStoreOps: ?$ReadOnlyArray, +): $ReadOnlyArray { + if (!messageStoreOps) { + return []; + } + const messageSearchStoreOps: MessageSearchStoreOperation[] = []; + for (const messageOp of messageStoreOps) { + if (messageOp.type === 'replace') { + // We only create search index for thick threads, + // and for non-local messages + const { messageInfo } = messageOp.payload; + if ( + extractKeyserverIDFromIDOptional(messageInfo.threadID) || + !messageInfo.id + ) { + continue; + } + + if (messageInfo.type === messageTypes.TEXT) { + messageSearchStoreOps.push({ + type: 'update_search_messages', + payload: { + originalMessageID: messageInfo.id, + messageID: messageInfo.id, + content: messageInfo.text, + }, + }); + } else if (messageInfo.type === messageTypes.EDIT_MESSAGE) { + messageSearchStoreOps.push({ + type: 'update_search_messages', + payload: { + originalMessageID: messageInfo.targetMessageID, + messageID: messageInfo.id, + content: messageInfo.text, + }, + }); + } + } + } + return messageSearchStoreOps; +} + type Props = { +processDBStoreOperations: StoreOperations => Promise, }; @@ -39,7 +86,14 @@ const { ops, messageSourceMetadata } = queueFront; void (async () => { if (ops) { - await processDBStoreOperations(ops); + const { messageStoreOperations } = ops; + const messageSearchStoreOperations = getMessageSearchStoreOps( + messageStoreOperations, + ); + await processDBStoreOperations({ + ...ops, + messageSearchStoreOperations, + }); if (ops.outboundP2PMessages && ops.outboundP2PMessages.length > 0) { const messageIDs = ops.outboundP2PMessages.map( message => message.messageID, @@ -85,4 +139,4 @@ return null; } -export { DBOpsHandler }; +export { DBOpsHandler, getMessageSearchStoreOps }; 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 @@ -22,7 +22,10 @@ import type { ThreadActivityStore } from './thread-activity-types.js'; import type { ClientDBThreadInfo, ThreadStore } from './thread-types.js'; import type { UserInfos } from './user-types.js'; -import type { ClientDBMessageSearchStoreOperation } from '../message-search-types.js'; +import type { + ClientDBMessageSearchStoreOperation, + MessageSearchStoreOperation, +} from '../message-search-types.js'; import type { ClientDBAuxUserInfo, ClientDBAuxUserStoreOperation, @@ -90,6 +93,7 @@ +threadActivityStoreOperations?: $ReadOnlyArray, +outboundP2PMessages?: $ReadOnlyArray, +entryStoreOperations?: $ReadOnlyArray, + +messageSearchStoreOperations?: $ReadOnlyArray, }; export type ClientDBStoreOperations = { 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 @@ -47,6 +47,7 @@ threadActivityStoreOperations, outboundP2PMessages, entryStoreOperations, + messageSearchStoreOperations, } = storeOperations; const convertedThreadStoreOperations = @@ -102,6 +103,7 @@ threadActivityStoreOperations: convertedThreadActivityStoreOperations, outboundP2PMessages, entryStoreOperations: convertedEntryStoreOperations, + messageSearchStoreOperations, }; if (values(dbOps).some(ops => ops && ops.length > 0)) { promises.push(commCoreModule.processDBStoreOperations(dbOps)); 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 @@ -5,6 +5,7 @@ import type { Persistor } from 'redux-persist/es/types'; import { setClientDBStoreActionType } from 'lib/actions/client-db-store-actions.js'; +import { getMessageSearchStoreOps } from 'lib/handlers/db-ops-handler.react.js'; import type { EntryStoreOperation } from 'lib/ops/entries-store-ops.js'; import type { MessageStoreOperation } from 'lib/ops/message-store-ops.js'; import type { ThreadStoreOperation } from 'lib/ops/thread-store-ops.js'; @@ -158,6 +159,9 @@ messageStoreOperations.length > 0 || entryStoreOperations.length > 0 ) { + const messageSearchStoreOperations = getMessageSearchStoreOps( + messageStoreOperations, + ); await processDBStoreOperations( { threadStoreOperations, @@ -172,6 +176,7 @@ auxUserStoreOperations: [], threadActivityStoreOperations: [], entryStoreOperations, + messageSearchStoreOperations, }, currentLoggedInUserID, ); diff --git a/web/shared-worker/utils/store.js b/web/shared-worker/utils/store.js --- a/web/shared-worker/utils/store.js +++ b/web/shared-worker/utils/store.js @@ -179,6 +179,7 @@ threadActivityStoreOperations, outboundP2PMessages, entryStoreOperations, + messageSearchStoreOperations, } = storeOperations; const canUseDatabase = canUseDatabaseOnWeb(userID); @@ -250,6 +251,7 @@ threadActivityStoreOperations: convertedThreadActivityStoreOperations, outboundP2PMessages, entryStoreOperations: convertedEntryStoreOperations, + messageSearchStoreOperations, }, }); } catch (e) {