diff --git a/lib/reducers/message-reducer.test.js b/lib/reducers/message-reducer.test.js --- a/lib/reducers/message-reducer.test.js +++ b/lib/reducers/message-reducer.test.js @@ -288,6 +288,7 @@ threadStore: { threadInfos: {}, }, + messageStoreThreads: [], messages: clientDBMessages, }, }, diff --git a/lib/types/redux-types.js b/lib/types/redux-types.js --- a/lib/types/redux-types.js +++ b/lib/types/redux-types.js @@ -48,6 +48,7 @@ LocallyComposedMessageInfo, ClientDBMessageInfo, SimpleMessagesPayload, + ClientDBThreadMessageInfo, } from './message-types.js'; import type { RawReactionMessageInfo } from './messages/reaction.js'; import type { RawTextMessageInfo } from './messages/text.js'; @@ -595,6 +596,7 @@ +drafts: $ReadOnlyArray, +messages: $ReadOnlyArray, +threadStore: ThreadStore, + +messageStoreThreads: $ReadOnlyArray, }, } | { 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 @@ -9,6 +9,7 @@ ClientDBMessageInfo, ClientDBMessageStoreOperation, MessageStoreOperation, + ClientDBThreadMessageInfo, } from './message-types.js'; import type { ClientDBThreadInfo, @@ -32,4 +33,5 @@ +messages: $ReadOnlyArray, +drafts: $ReadOnlyArray, +threads: $ReadOnlyArray, + +messageStoreThreads: $ReadOnlyArray, }; diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h --- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h +++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h @@ -49,6 +49,7 @@ virtual void removeMessageStoreThreads(const std::vector &ids) const = 0; virtual void removeAllMessageStoreThreads() const = 0; + virtual std::vector getAllMessageStoreThreads() const = 0; virtual void removeMediaForMessages(const std::vector &msg_ids) const = 0; virtual void removeMediaForMessage(std::string msg_id) const = 0; diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h @@ -46,6 +46,7 @@ void removeMessageStoreThreads(const std::vector &ids) const override; void removeAllMessageStoreThreads() const override; + std::vector getAllMessageStoreThreads() const override; void removeAllMedia() const override; void removeMediaForMessages( const std::vector &msg_ids) const override; diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp @@ -1100,6 +1100,11 @@ where(in(&MessageStoreThread::id, ids))); } +std::vector +SQLiteQueryExecutor::getAllMessageStoreThreads() const { + return SQLiteQueryExecutor::getStorage().get_all(); +} + std::vector SQLiteQueryExecutor::getAllThreads() const { return SQLiteQueryExecutor::getStorage().get_all(); }; diff --git a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp --- a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp +++ b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp @@ -267,6 +267,28 @@ return jsiThreads; } +jsi::Array parseDBMessageStoreThreads( + jsi::Runtime &rt, + std::shared_ptr> threadsVectorPtr) { + size_t numThreads = threadsVectorPtr->size(); + jsi::Array jsiThreads = jsi::Array(rt, numThreads); + size_t writeIdx = 0; + + for (const MessageStoreThread &thread : *threadsVectorPtr) { + jsi::Object jsiThread = jsi::Object(rt); + jsiThread.setProperty(rt, "id", thread.id); + jsiThread.setProperty( + rt, "start_reached", std::to_string(thread.start_reached)); + jsiThread.setProperty( + rt, "last_navigated_to", std::to_string(thread.last_navigated_to)); + jsiThread.setProperty( + rt, "last_pruned", std::to_string(thread.last_pruned)); + + jsiThreads.setValueAtIndex(rt, writeIdx++, jsiThread); + } + return jsiThreads; +} + jsi::Value CommCoreModule::getClientDBStore(jsi::Runtime &rt) { return createPromiseAsJSIValue( rt, [=](jsi::Runtime &innerRt, std::shared_ptr promise) { @@ -275,11 +297,14 @@ std::vector draftsVector; std::vector threadsVector; std::vector>> messagesVector; + std::vector messageStoreThreadsVector; try { draftsVector = DatabaseManager::getQueryExecutor().getAllDrafts(); messagesVector = DatabaseManager::getQueryExecutor().getAllMessages(); threadsVector = DatabaseManager::getQueryExecutor().getAllThreads(); + messageStoreThreadsVector = + DatabaseManager::getQueryExecutor().getAllMessageStoreThreads(); } catch (std::system_error &e) { error = e.what(); } @@ -290,10 +315,14 @@ std::move(messagesVector)); auto threadsVectorPtr = std::make_shared>(std::move(threadsVector)); + auto messageStoreThreadsVectorPtr = + std::make_shared>( + std::move(messageStoreThreadsVector)); this->jsInvoker_->invokeAsync([&innerRt, draftsVectorPtr, messagesVectorPtr, threadsVectorPtr, + messageStoreThreadsVectorPtr, error, promise]() { if (error.size()) { @@ -304,11 +333,15 @@ jsi::Array jsiMessages = parseDBMessages(innerRt, messagesVectorPtr); jsi::Array jsiThreads = parseDBThreads(innerRt, threadsVectorPtr); + jsi::Array jsiMessageStoreThreads = parseDBMessageStoreThreads( + innerRt, messageStoreThreadsVectorPtr); auto jsiClientDBStore = jsi::Object(innerRt); jsiClientDBStore.setProperty(innerRt, "messages", jsiMessages); jsiClientDBStore.setProperty(innerRt, "threads", jsiThreads); jsiClientDBStore.setProperty(innerRt, "drafts", jsiDrafts); + jsiClientDBStore.setProperty( + innerRt, "messageStoreThreads", jsiMessageStoreThreads); promise->resolve(std::move(jsiClientDBStore)); }); diff --git a/web/database/worker/db-worker.js b/web/database/worker/db-worker.js --- a/web/database/worker/db-worker.js +++ b/web/database/worker/db-worker.js @@ -129,6 +129,7 @@ drafts: getAllDrafts(sqliteDb), messages: [], threads: [], + messageStoreThreads: [], }; }