From e94f3422dfdc2045d76a8481ada485f56cd0a6e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 29 May 2020 11:44:08 +0200 Subject: [PATCH] Searching: Add support to paginate Seshat search results. --- src/Searching.js | 44 ++++++++++++++++++++++++++- src/components/structures/RoomView.js | 5 ++- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/Searching.js b/src/Searching.js index 663328fe41..c16906ade7 100644 --- a/src/Searching.js +++ b/src/Searching.js @@ -88,6 +88,7 @@ async function localSearch(searchTerm, roomId = undefined) { } const emptyResult = { + seshatQuery: searchArgs, results: [], highlights: [], }; @@ -97,6 +98,7 @@ async function localSearch(searchTerm, roomId = undefined) { const eventIndex = EventIndexPeg.get(); const localResult = await eventIndex.search(searchArgs); + emptyResult.seshatQuery.next_batch = localResult.next_batch; const response = { search_categories: { @@ -104,8 +106,25 @@ async function localSearch(searchTerm, roomId = undefined) { }, }; - const result = MatrixClientPeg.get()._processRoomEventsSearch( + return MatrixClientPeg.get()._processRoomEventsSearch( emptyResult, response); +} + +async function paginatedLocalSearch(searchResult) { + const eventIndex = EventIndexPeg.get(); + + let searchArgs = searchResult.seshatQuery; + + const localResult = await eventIndex.search(searchArgs); + + const response = { + search_categories: { + room_events: localResult, + }, + }; + + const result = MatrixClientPeg.get()._processRoomEventsSearch(searchResult, response); + searchResult.pendingRequest = null; return result; } @@ -132,6 +151,29 @@ function eventIndexSearch(term, roomId = undefined) { return searchPromise; } +function eventIndexSearchPagination(searchResult) { + const client = MatrixClientPeg.get(); + const query = searchResult.seshatQuery; + + if (!query) { + return client.backPaginateRoomEventsSearch(searchResult); + } else { + const promise = paginatedLocalSearch(searchResult); + searchResult.pendingRequest = promise; + return promise; + } +} + +export function searchPagination(searchResult) { + const eventIndex = EventIndexPeg.get(); + const client = MatrixClientPeg.get(); + + if (searchResult.pendingRequest) return searchResult.pendingRequest; + + if (eventIndex === null) return client.backPaginateRoomEventsSearch(searchResult); + else return eventIndexSearchPagination(searchResult); +} + export default function eventSearch(term, roomId = undefined) { const eventIndex = EventIndexPeg.get(); diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 49d7e3c238..6796984037 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -39,7 +39,7 @@ import Tinter from '../../Tinter'; import rate_limited_func from '../../ratelimitedfunc'; import * as ObjectUtils from '../../ObjectUtils'; import * as Rooms from '../../Rooms'; -import eventSearch from '../../Searching'; +import eventSearch, {searchPagination} from '../../Searching'; import {isOnlyCtrlOrCmdIgnoreShiftKeyEvent, isOnlyCtrlOrCmdKeyEvent, Key} from '../../Keyboard'; @@ -1035,8 +1035,7 @@ export default createReactClass({ if (this.state.searchResults.next_batch) { debuglog("requesting more search results"); - const searchPromise = this.context.backPaginateRoomEventsSearch( - this.state.searchResults); + const searchPromise = searchPagination(this.state.searchResults); return this._handleSearchResult(searchPromise); } else { debuglog("no more search results");