sliding-sync: spider all rooms on the user's account for search (#9514)
* sliding-sync: spider all rooms on the user's account for search On startup, slowly accumulate room metadata for all rooms on the user's account. This is so we can populate the local search cache with enough data for it to function, obviating the need to have separate code paths for sliding sync searches. This will allow spotlight search to work with slow/no network connectivity, though clicking on the room will still require a round trip. This is an explicit request from @ara4n to improve the snapiness of room searches, despite the unbounded bandwidth costs requesting all N rooms on the user's account. * Comments and tweak defaults * Review comments; remove SS search code * bugfix: use setListRanges once the list has been set up If we don't, then we send needless extra data and can cause bugs because setList will wipe the index->room_id map, which trips up SlidingRoomListStore.
This commit is contained in:
parent
253129e6f2
commit
dcf497d013
4 changed files with 197 additions and 44 deletions
|
@ -91,7 +91,6 @@ import { RoomResultContextMenus } from "./RoomResultContextMenus";
|
|||
import { RoomContextDetails } from "../../rooms/RoomContextDetails";
|
||||
import { TooltipOption } from "./TooltipOption";
|
||||
import { isLocalRoom } from "../../../../utils/localRoom/isLocalRoom";
|
||||
import { useSlidingSyncRoomSearch } from "../../../../hooks/useSlidingSyncRoomSearch";
|
||||
import { shouldShowFeedback } from "../../../../utils/Feedback";
|
||||
import RoomAvatar from "../../avatars/RoomAvatar";
|
||||
|
||||
|
@ -342,43 +341,26 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
|
|||
searchProfileInfo,
|
||||
searchParams,
|
||||
);
|
||||
const isSlidingSyncEnabled = SettingsStore.getValue("feature_sliding_sync");
|
||||
let {
|
||||
loading: slidingSyncRoomSearchLoading,
|
||||
rooms: slidingSyncRooms,
|
||||
search: searchRoomsServerside,
|
||||
} = useSlidingSyncRoomSearch();
|
||||
useDebouncedCallback(isSlidingSyncEnabled, searchRoomsServerside, searchParams);
|
||||
if (!isSlidingSyncEnabled) {
|
||||
slidingSyncRoomSearchLoading = false;
|
||||
}
|
||||
|
||||
const possibleResults = useMemo<Result[]>(
|
||||
() => {
|
||||
const userResults: IMemberResult[] = [];
|
||||
let roomResults: IRoomResult[];
|
||||
let alreadyAddedUserIds: Set<string>;
|
||||
if (isSlidingSyncEnabled) {
|
||||
// use the rooms sliding sync returned as the server has already worked it out for us
|
||||
roomResults = slidingSyncRooms.map(toRoomResult);
|
||||
} else {
|
||||
roomResults = findVisibleRooms(cli).map(toRoomResult);
|
||||
// If we already have a DM with the user we're looking for, we will
|
||||
// show that DM instead of the user themselves
|
||||
alreadyAddedUserIds = roomResults.reduce((userIds, result) => {
|
||||
const userId = DMRoomMap.shared().getUserIdForRoomId(result.room.roomId);
|
||||
if (!userId) return userIds;
|
||||
if (result.room.getJoinedMemberCount() > 2) return userIds;
|
||||
userIds.add(userId);
|
||||
return userIds;
|
||||
}, new Set<string>());
|
||||
for (const user of [...findVisibleRoomMembers(cli), ...users]) {
|
||||
// Make sure we don't have any user more than once
|
||||
if (alreadyAddedUserIds.has(user.userId)) continue;
|
||||
alreadyAddedUserIds.add(user.userId);
|
||||
const roomResults = findVisibleRooms(cli).map(toRoomResult);
|
||||
// If we already have a DM with the user we're looking for, we will
|
||||
// show that DM instead of the user themselves
|
||||
const alreadyAddedUserIds = roomResults.reduce((userIds, result) => {
|
||||
const userId = DMRoomMap.shared().getUserIdForRoomId(result.room.roomId);
|
||||
if (!userId) return userIds;
|
||||
if (result.room.getJoinedMemberCount() > 2) return userIds;
|
||||
userIds.add(userId);
|
||||
return userIds;
|
||||
}, new Set<string>());
|
||||
for (const user of [...findVisibleRoomMembers(cli), ...users]) {
|
||||
// Make sure we don't have any user more than once
|
||||
if (alreadyAddedUserIds.has(user.userId)) continue;
|
||||
alreadyAddedUserIds.add(user.userId);
|
||||
|
||||
userResults.push(toMemberResult(user));
|
||||
}
|
||||
userResults.push(toMemberResult(user));
|
||||
}
|
||||
|
||||
return [
|
||||
|
@ -402,7 +384,7 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
|
|||
...publicRooms.map(toPublicRoomResult),
|
||||
].filter(result => filter === null || result.filter.includes(filter));
|
||||
},
|
||||
[cli, users, profile, publicRooms, slidingSyncRooms, isSlidingSyncEnabled, filter],
|
||||
[cli, users, profile, publicRooms, filter],
|
||||
);
|
||||
|
||||
const results = useMemo<Record<Section, Result[]>>(() => {
|
||||
|
@ -421,13 +403,10 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
|
|||
|
||||
possibleResults.forEach(entry => {
|
||||
if (isRoomResult(entry)) {
|
||||
// sliding sync gives the correct rooms in the list so we don't need to filter
|
||||
if (!isSlidingSyncEnabled) {
|
||||
if (!entry.room.normalizedName?.includes(normalizedQuery) &&
|
||||
!entry.room.getCanonicalAlias()?.toLowerCase().includes(lcQuery) &&
|
||||
!entry.query?.some(q => q.includes(lcQuery))
|
||||
) return; // bail, does not match query
|
||||
}
|
||||
if (!entry.room.normalizedName?.includes(normalizedQuery) &&
|
||||
!entry.room.getCanonicalAlias()?.toLowerCase().includes(lcQuery) &&
|
||||
!entry.query?.some(q => q.includes(lcQuery))
|
||||
) return; // bail, does not match query
|
||||
} else if (isMemberResult(entry)) {
|
||||
if (!entry.query?.some(q => q.includes(lcQuery))) return; // bail, does not match query
|
||||
} else if (isPublicRoomResult(entry)) {
|
||||
|
@ -478,7 +457,7 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
|
|||
}
|
||||
|
||||
return results;
|
||||
}, [trimmedQuery, filter, cli, possibleResults, isSlidingSyncEnabled, memberComparator]);
|
||||
}, [trimmedQuery, filter, cli, possibleResults, memberComparator]);
|
||||
|
||||
const numResults = sum(Object.values(results).map(it => it.length));
|
||||
useWebSearchMetrics(numResults, query.length, true);
|
||||
|
@ -1236,7 +1215,7 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
|
|||
aria-label={_t("Search")}
|
||||
aria-describedby="mx_SpotlightDialog_keyboardPrompt"
|
||||
/>
|
||||
{ (publicRoomsLoading || peopleLoading || profileLoading || slidingSyncRoomSearchLoading) && (
|
||||
{ (publicRoomsLoading || peopleLoading || profileLoading) && (
|
||||
<Spinner w={24} h={24} />
|
||||
) }
|
||||
</div>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue