Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F32167730
D10231.1765053712.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
12 KB
Referenced Files
None
Subscribers
None
D10231.1765053712.diff
View Options
diff --git a/lib/selectors/nav-selectors.js b/lib/selectors/nav-selectors.js
--- a/lib/selectors/nav-selectors.js
+++ b/lib/selectors/nav-selectors.js
@@ -14,7 +14,11 @@
import type { CalendarFilter } from '../types/filter-types.js';
import type { BaseNavInfo } from '../types/nav-types.js';
import type { BaseAppState } from '../types/redux-types.js';
-import type { RawThreadInfo, ThreadInfo } from '../types/thread-types.js';
+import type {
+ RelativeMemberInfo,
+ RawThreadInfo,
+ ThreadInfo,
+} from '../types/thread-types';
import type { UserInfo } from '../types/user-types.js';
import { getConfig } from '../utils/config.js';
import { values } from '../utils/objects.js';
@@ -72,12 +76,49 @@
},
);
-// Without allAtOnce, useThreadSearchIndex is very expensive. useENSNames would
-// trigger its recalculation for each ENS name as it streams in, but we would
-// prefer to trigger its recaculation just once for every update of the
-// underlying Redux data.
+// Without allAtOnce, useThreadSearchIndex and useUserSearchIndex is very
+// expensive. useENSNames would trigger their recalculation for each ENS name
+// as it streams in, but we would prefer to trigger their recaculation just
+// once for every update of the underlying Redux data.
const useENSNamesOptions = { allAtOnce: true };
+function useUserSearchIndex(
+ userInfos: $ReadOnlyArray<UserInfo | RelativeMemberInfo>,
+): SearchIndex {
+ const membersWithENSNames = useENSNames(userInfos, useENSNamesOptions);
+
+ const memberMap = React.useMemo(() => {
+ const result = new Map<string, UserInfo | RelativeMemberInfo>();
+ for (const userInfo of membersWithENSNames) {
+ result.set(userInfo.id, userInfo);
+ }
+ return result;
+ }, [membersWithENSNames]);
+
+ return React.useMemo(() => {
+ const searchIndex = new SearchIndex();
+
+ for (const userInfo of userInfos) {
+ const searchTextArray = [];
+
+ const rawUsername = userInfo.username;
+ if (rawUsername) {
+ searchTextArray.push(rawUsername);
+ }
+
+ const resolvedUserInfo = memberMap.get(userInfo.id);
+ const resolvedUsername = resolvedUserInfo?.username;
+ if (resolvedUsername && resolvedUsername !== rawUsername) {
+ searchTextArray.push(resolvedUsername);
+ }
+
+ searchIndex.addEntry(userInfo.id, searchTextArray.join(' '));
+ }
+
+ return searchIndex;
+ }, [userInfos, memberMap]);
+}
+
function useThreadSearchIndex(
threadInfos: $ReadOnlyArray<RawThreadInfo | ThreadInfo>,
): SearchIndex {
@@ -167,6 +208,7 @@
export {
timeUntilCalendarRangeExpiration,
currentCalendarQuery,
+ useUserSearchIndex,
useThreadSearchIndex,
useGlobalThreadSearchIndex,
};
diff --git a/lib/shared/search-utils.js b/lib/shared/search-utils.js
--- a/lib/shared/search-utils.js
+++ b/lib/shared/search-utils.js
@@ -23,6 +23,7 @@
ChatMessageInfoItem,
MessageListData,
} from '../selectors/chat-selectors.js';
+import { useUserSearchIndex } from '../selectors/nav-selectors.js';
import { relationshipBlockedInEitherDirection } from '../shared/relationship-utils.js';
import type { MessageInfo, RawMessageInfo } from '../types/message-types.js';
import { userRelationshipStatus } from '../types/relationship-types.js';
@@ -47,7 +48,6 @@
function usePotentialMemberItems({
text,
userInfos,
- searchIndex,
excludeUserIDs,
includeServerSearchUsers,
inputParentThreadInfo,
@@ -56,13 +56,14 @@
}: {
+text: string,
+userInfos: { +[id: string]: AccountUserInfo },
- +searchIndex: SearchIndex,
+excludeUserIDs: $ReadOnlyArray<string>,
+includeServerSearchUsers?: $ReadOnlyArray<GlobalAccountUserInfo>,
+inputParentThreadInfo?: ?ThreadInfo,
+inputCommunityThreadInfo?: ?ThreadInfo,
+threadType?: ?ThreadType,
}): UserListItem[] {
+ const searchIndex: SearchIndex = useUserSearchIndex(values(userInfos));
+
const communityThreadInfo = React.useMemo(
() =>
inputCommunityThreadInfo && inputCommunityThreadInfo.id !== genesis.id
diff --git a/native/chat/compose-subchannel.react.js b/native/chat/compose-subchannel.react.js
--- a/native/chat/compose-subchannel.react.js
+++ b/native/chat/compose-subchannel.react.js
@@ -13,10 +13,7 @@
} from 'lib/actions/thread-actions.js';
import { useENSNames } from 'lib/hooks/ens-cache.js';
import { threadInfoSelector } from 'lib/selectors/thread-selectors.js';
-import {
- userInfoSelectorForPotentialMembers,
- userSearchIndexForPotentialMembers,
-} from 'lib/selectors/user-selectors.js';
+import { userInfoSelectorForPotentialMembers } from 'lib/selectors/user-selectors.js';
import { usePotentialMemberItems } from 'lib/shared/search-utils.js';
import { threadInFilterList, userIsMember } from 'lib/shared/thread-utils.js';
import { type ThreadType, threadTypes } from 'lib/types/thread-types-enum.js';
@@ -195,7 +192,6 @@
}, [newlyCreatedThreadInfo, pushNewThread]);
const otherUserInfos = useSelector(userInfoSelectorForPotentialMembers);
- const userSearchIndex = useSelector(userSearchIndexForPotentialMembers);
const { community } = parentThreadInfo;
const communityThreadInfo = useSelector(state =>
community ? threadInfoSelector(state)[community] : null,
@@ -203,7 +199,6 @@
const userSearchResults = usePotentialMemberItems({
text: usernameInputText,
userInfos: otherUserInfos,
- searchIndex: userSearchIndex,
excludeUserIDs: userInfoInputIDs,
inputParentThreadInfo: parentThreadInfo,
inputCommunityThreadInfo: communityThreadInfo,
diff --git a/native/chat/message-list-container.react.js b/native/chat/message-list-container.react.js
--- a/native/chat/message-list-container.react.js
+++ b/native/chat/message-list-container.react.js
@@ -8,10 +8,7 @@
import genesis from 'lib/facts/genesis.js';
import { threadInfoSelector } from 'lib/selectors/thread-selectors.js';
-import {
- userInfoSelectorForPotentialMembers,
- userSearchIndexForPotentialMembers,
-} from 'lib/selectors/user-selectors.js';
+import { userInfoSelectorForPotentialMembers } from 'lib/selectors/user-selectors.js';
import {
usePotentialMemberItems,
useSearchUsers,
@@ -249,14 +246,12 @@
>([]);
const otherUserInfos = useSelector(userInfoSelectorForPotentialMembers);
- const userSearchIndex = useSelector(userSearchIndexForPotentialMembers);
const serverSearchResults = useSearchUsers(usernameInputText);
const userSearchResults = usePotentialMemberItems({
text: usernameInputText,
userInfos: otherUserInfos,
- searchIndex: userSearchIndex,
excludeUserIDs: userInfoInputArray.map(userInfo => userInfo.id),
includeServerSearchUsers: serverSearchResults,
});
diff --git a/native/chat/settings/add-users-modal.react.js b/native/chat/settings/add-users-modal.react.js
--- a/native/chat/settings/add-users-modal.react.js
+++ b/native/chat/settings/add-users-modal.react.js
@@ -10,10 +10,7 @@
import { useENSNames } from 'lib/hooks/ens-cache.js';
import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js';
import { threadInfoSelector } from 'lib/selectors/thread-selectors.js';
-import {
- userInfoSelectorForPotentialMembers,
- userSearchIndexForPotentialMembers,
-} from 'lib/selectors/user-selectors.js';
+import { userInfoSelectorForPotentialMembers } from 'lib/selectors/user-selectors.js';
import { usePotentialMemberItems } from 'lib/shared/search-utils.js';
import { threadActualMembers } from 'lib/shared/thread-utils.js';
import type { ThreadInfo } from 'lib/types/thread-types.js';
@@ -165,7 +162,6 @@
);
const otherUserInfos = useSelector(userInfoSelectorForPotentialMembers);
- const userSearchIndex = useSelector(userSearchIndexForPotentialMembers);
const { parentThreadID, community } = props.route.params.threadInfo;
const parentThreadInfo = useSelector(state =>
parentThreadID ? threadInfoSelector(state)[parentThreadID] : null,
@@ -176,7 +172,6 @@
const userSearchResults = usePotentialMemberItems({
text: usernameInputText,
userInfos: otherUserInfos,
- searchIndex: userSearchIndex,
excludeUserIDs,
inputParentThreadInfo: parentThreadInfo,
inputCommunityThreadInfo: communityThreadInfo,
diff --git a/native/community-creation/community-creation-members.react.js b/native/community-creation/community-creation-members.react.js
--- a/native/community-creation/community-creation-members.react.js
+++ b/native/community-creation/community-creation-members.react.js
@@ -9,10 +9,7 @@
} from 'lib/actions/thread-actions.js';
import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js';
import { threadInfoSelector } from 'lib/selectors/thread-selectors.js';
-import {
- userInfoSelectorForPotentialMembers,
- userSearchIndexForPotentialMembers,
-} from 'lib/selectors/user-selectors.js';
+import { userInfoSelectorForPotentialMembers } from 'lib/selectors/user-selectors.js';
import { usePotentialMemberItems } from 'lib/shared/search-utils.js';
import type { LoadingStatus } from 'lib/types/loading-types.js';
import { threadTypes } from 'lib/types/thread-types-enum.js';
@@ -68,7 +65,6 @@
const { setOptions } = navigation;
const otherUserInfos = useSelector(userInfoSelectorForPotentialMembers);
- const userSearchIndex = useSelector(userSearchIndexForPotentialMembers);
const [usernameInputText, setUsernameInputText] = React.useState<string>('');
const [selectedUsers, setSelectedUsers] = React.useState<
@@ -147,7 +143,6 @@
const userSearchResults = usePotentialMemberItems({
text: usernameInputText,
userInfos: otherUserInfos,
- searchIndex: userSearchIndex,
excludeUserIDs: selectedUserIDs,
threadType: announcement
? threadTypes.COMMUNITY_ANNOUNCEMENT_ROOT
diff --git a/web/chat/chat-thread-composer.react.js b/web/chat/chat-thread-composer.react.js
--- a/web/chat/chat-thread-composer.react.js
+++ b/web/chat/chat-thread-composer.react.js
@@ -9,7 +9,6 @@
import SWMansionIcon from 'lib/components/SWMansionIcon.react.js';
import { useLoggedInUserInfo } from 'lib/hooks/account-hooks.js';
import { useENSNames } from 'lib/hooks/ens-cache.js';
-import { userSearchIndexForPotentialMembers } from 'lib/selectors/user-selectors.js';
import {
usePotentialMemberItems,
useSearchUsers,
@@ -32,7 +31,6 @@
import type { InputState } from '../input/input-state.js';
import Alert from '../modals/alert.react.js';
import { updateNavInfoActionType } from '../redux/action-types.js';
-import { useSelector } from '../redux/redux-utils.js';
type Props = {
+userInfoInputArray: $ReadOnlyArray<AccountUserInfo>,
@@ -51,7 +49,6 @@
const [usernameInputText, setUsernameInputText] = React.useState('');
const dispatch = useDispatch();
- const userSearchIndex = useSelector(userSearchIndexForPotentialMembers);
const userInfoInputIDs = React.useMemo(
() => userInfoInputArray.map(userInfo => userInfo.id),
@@ -63,7 +60,6 @@
const userListItems = usePotentialMemberItems({
text: usernameInputText,
userInfos: otherUserInfos,
- searchIndex: userSearchIndex,
excludeUserIDs: userInfoInputIDs,
includeServerSearchUsers: serverSearchResults,
});
diff --git a/web/modals/threads/members/add-members-modal.react.js b/web/modals/threads/members/add-members-modal.react.js
--- a/web/modals/threads/members/add-members-modal.react.js
+++ b/web/modals/threads/members/add-members-modal.react.js
@@ -8,10 +8,7 @@
} from 'lib/actions/thread-actions.js';
import { useENSNames } from 'lib/hooks/ens-cache.js';
import { threadInfoSelector } from 'lib/selectors/thread-selectors.js';
-import {
- userSearchIndexForPotentialMembers,
- userInfoSelectorForPotentialMembers,
-} from 'lib/selectors/user-selectors.js';
+import { userInfoSelectorForPotentialMembers } from 'lib/selectors/user-selectors.js';
import { usePotentialMemberItems } from 'lib/shared/search-utils.js';
import { threadActualMembers } from 'lib/shared/thread-utils.js';
import { useDispatchActionPromise } from 'lib/utils/action-utils.js';
@@ -45,7 +42,6 @@
community ? threadInfoSelector(state)[community] : null,
);
const otherUserInfos = useSelector(userInfoSelectorForPotentialMembers);
- const userSearchIndex = useSelector(userSearchIndexForPotentialMembers);
const excludeUserIDs = React.useMemo(
() =>
threadActualMembers(threadInfo.members).concat(
@@ -57,7 +53,6 @@
const userSearchResults = usePotentialMemberItems({
text: searchText,
userInfos: otherUserInfos,
- searchIndex: userSearchIndex,
excludeUserIDs,
inputParentThreadInfo: parentThreadInfo,
inputCommunityThreadInfo: communityThreadInfo,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Dec 6, 8:41 PM (22 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5840714
Default Alt Text
D10231.1765053712.diff (12 KB)
Attached To
Mode
D10231: [lib/web/native] Introduce hook that constructs a resolved user search index and update usePotentialMemberItems
Attached
Detach File
Event Timeline
Log In to Comment