Changeset View
Changeset View
Standalone View
Standalone View
native/chat/message-list-thread-search.react.js
Show All 13 Lines | |||||
const TagInput = createTagInput<AccountUserInfo>(); | const TagInput = createTagInput<AccountUserInfo>(); | ||||
type Props = { | type Props = { | ||||
+usernameInputText: string, | +usernameInputText: string, | ||||
+updateUsernameInput: (text: string) => void, | +updateUsernameInput: (text: string) => void, | ||||
+userInfoInputArray: $ReadOnlyArray<AccountUserInfo>, | +userInfoInputArray: $ReadOnlyArray<AccountUserInfo>, | ||||
+updateTagInput: (items: $ReadOnlyArray<AccountUserInfo>) => void, | +updateTagInput: (items: $ReadOnlyArray<AccountUserInfo>) => void, | ||||
+resolveToUser: (user: AccountUserInfo) => void, | +resolveToUser: (user: AccountUserInfo) => void, | ||||
+otherUserInfos: { [id: string]: AccountUserInfo }, | |||||
+userSearchResults: $ReadOnlyArray<UserListItem>, | +userSearchResults: $ReadOnlyArray<UserListItem>, | ||||
}; | }; | ||||
const inputProps = { | const inputProps = { | ||||
placeholder: 'username', | placeholder: 'username', | ||||
autoFocus: true, | autoFocus: true, | ||||
returnKeyType: 'go', | returnKeyType: 'go', | ||||
}; | }; | ||||
const MessageListThreadSearch: React.ComponentType<Props> = React.memo<Props>( | const MessageListThreadSearch: React.ComponentType<Props> = React.memo<Props>( | ||||
function MessageListThreadSearch({ | function MessageListThreadSearch({ | ||||
usernameInputText, | usernameInputText, | ||||
updateUsernameInput, | updateUsernameInput, | ||||
userInfoInputArray, | userInfoInputArray, | ||||
updateTagInput, | updateTagInput, | ||||
resolveToUser, | resolveToUser, | ||||
otherUserInfos, | |||||
userSearchResults, | userSearchResults, | ||||
}) { | }) { | ||||
const styles = useStyles(unboundStyles); | const styles = useStyles(unboundStyles); | ||||
const [userListItems, nonFriends] = React.useMemo(() => { | const [userListItems, nonFriends] = React.useMemo(() => { | ||||
const nonFriendsSet = new Set(); | const nonFriendsSet = new Set(); | ||||
if (userInfoInputArray.length > 0) { | if (userInfoInputArray.length > 0) { | ||||
return [userSearchResults, nonFriendsSet]; | return [userSearchResults, nonFriendsSet]; | ||||
} | } | ||||
const userListItemsArr = []; | const userListItemsArr = []; | ||||
for (const searchResult of userSearchResults) { | for (const searchResult of userSearchResults) { | ||||
if (searchResult.notice !== notFriendNotice) { | if (searchResult.notice !== notFriendNotice) { | ||||
userListItemsArr.push(searchResult); | userListItemsArr.push(searchResult); | ||||
continue; | continue; | ||||
} | } | ||||
nonFriendsSet.add(searchResult.id); | nonFriendsSet.add(searchResult.id); | ||||
const { alertText, alertTitle, ...rest } = searchResult; | const { alertText, alertTitle, ...rest } = searchResult; | ||||
userListItemsArr.push(rest); | userListItemsArr.push(rest); | ||||
} | } | ||||
return [userListItemsArr, nonFriendsSet]; | return [userListItemsArr, nonFriendsSet]; | ||||
}, [userSearchResults, userInfoInputArray]); | }, [userSearchResults, userInfoInputArray]); | ||||
const onUserSelect = React.useCallback( | const onUserSelect = React.useCallback( | ||||
(userID: string) => { | (userInfo: AccountUserInfo) => { | ||||
for (const existingUserInfo of userInfoInputArray) { | for (const existingUserInfo of userInfoInputArray) { | ||||
if (userID === existingUserInfo.id) { | if (userInfo.id === existingUserInfo.id) { | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
const userInfo = otherUserInfos[userID]; | if (nonFriends.has(userInfo.id)) { | ||||
if (nonFriends.has(userID)) { | |||||
resolveToUser(userInfo); | resolveToUser(userInfo); | ||||
return; | return; | ||||
} | } | ||||
const newUserInfoInputArray = [...userInfoInputArray, userInfo]; | const newUserInfoInputArray = [...userInfoInputArray, userInfo]; | ||||
updateUsernameInput(''); | updateUsernameInput(''); | ||||
updateTagInput(newUserInfoInputArray); | updateTagInput(newUserInfoInputArray); | ||||
}, | }, | ||||
[ | [ | ||||
userInfoInputArray, | userInfoInputArray, | ||||
nonFriends, | nonFriends, | ||||
otherUserInfos, | |||||
updateTagInput, | updateTagInput, | ||||
resolveToUser, | resolveToUser, | ||||
updateUsernameInput, | updateUsernameInput, | ||||
], | ], | ||||
); | ); | ||||
const tagDataLabelExtractor = React.useCallback( | const tagDataLabelExtractor = React.useCallback( | ||||
(userInfo: AccountUserInfo) => userInfo.username, | (userInfo: AccountUserInfo) => userInfo.username, | ||||
▲ Show 20 Lines • Show All 86 Lines • Show Last 20 Lines |