diff --git a/src/autocomplete/PeopleAutocomplete.js b/src/autocomplete/PeopleAutocomplete.js index 0e387d54992..3f92013c62c 100644 --- a/src/autocomplete/PeopleAutocomplete.js +++ b/src/autocomplete/PeopleAutocomplete.js @@ -3,9 +3,9 @@ import React, { PureComponent } from 'react'; import { SectionList } from 'react-native'; -import type { User, UserId, UserGroup, Dispatch } from '../types'; +import type { MutedUsersState, User, UserId, UserGroup, Dispatch } from '../types'; import { connect } from '../react-redux'; -import { getSortedUsers, getUserGroups } from '../selectors'; +import { getMutedUsers, getSortedUsers, getUserGroups } from '../selectors'; import { type AutocompleteOption, getAutocompleteSuggestion, @@ -20,6 +20,7 @@ type Props = $ReadOnly<{| dispatch: Dispatch, filter: string, onAutocomplete: (name: string) => void, + mutedUsers: MutedUsersState, ownUserId: UserId, users: User[], userGroups: UserGroup[], @@ -44,9 +45,9 @@ class PeopleAutocomplete extends PureComponent { }; render() { - const { filter, ownUserId, users, userGroups } = this.props; + const { filter, mutedUsers, ownUserId, users, userGroups } = this.props; const filteredUserGroups = getAutocompleteUserGroupSuggestions(userGroups, filter); - const filteredUsers = getAutocompleteSuggestion(users, filter, ownUserId); + const filteredUsers = getAutocompleteSuggestion(users, filter, ownUserId, mutedUsers); if (filteredUserGroups.length + filteredUsers.length === 0) { return null; @@ -105,6 +106,7 @@ class PeopleAutocomplete extends PureComponent { } export default connect(state => ({ + mutedUsers: getMutedUsers(state), ownUserId: getOwnUserId(state), users: getSortedUsers(state), userGroups: getUserGroups(state), diff --git a/src/pm-conversations/PmConversationList.js b/src/pm-conversations/PmConversationList.js index 093f185f422..8dee78d4f05 100644 --- a/src/pm-conversations/PmConversationList.js +++ b/src/pm-conversations/PmConversationList.js @@ -1,14 +1,16 @@ /* @flow strict-local */ -import React, { PureComponent } from 'react'; +import React, { useCallback } from 'react'; import { FlatList } from 'react-native'; +import { useDispatch, useSelector } from '../react-redux'; -import type { Dispatch, PmConversationData, UserOrBot } from '../types'; +import type { PmConversationData, UserOrBot } from '../types'; import { createStyleSheet } from '../styles'; import { type PmKeyUsers } from '../utils/recipient'; import { pm1to1NarrowFromUser, pmNarrowFromUsers } from '../utils/narrow'; import UserItem from '../users/UserItem'; import GroupPmConversationItem from './GroupPmConversationItem'; import { doNarrow } from '../actions'; +import { getMutedUsers } from '../selectors'; const styles = createStyleSheet({ list: { @@ -18,52 +20,59 @@ const styles = createStyleSheet({ }); type Props = $ReadOnly<{| - dispatch: Dispatch, conversations: PmConversationData[], |}>; /** * A list describing all PM conversations. * */ -export default class PmConversationList extends PureComponent { - handleUserNarrow = (user: UserOrBot) => { - this.props.dispatch(doNarrow(pm1to1NarrowFromUser(user))); - }; +export default function PmConversationList(props: Props) { + const dispatch = useDispatch(); - handleGroupNarrow = (users: PmKeyUsers) => { - this.props.dispatch(doNarrow(pmNarrowFromUsers(users))); - }; + const handleUserNarrow = useCallback( + (user: UserOrBot) => { + dispatch(doNarrow(pm1to1NarrowFromUser(user))); + }, + [dispatch], + ); - render() { - const { conversations } = this.props; + const handleGroupNarrow = useCallback( + (users: PmKeyUsers) => { + dispatch(doNarrow(pmNarrowFromUsers(users))); + }, + [dispatch], + ); - return ( - item.key} - renderItem={({ item }) => { - const users = item.keyRecipients; - if (users.length === 1) { - return ( - - ); + const { conversations } = props; + const mutedUsers = useSelector(getMutedUsers); + + return ( + item.key} + renderItem={({ item }) => { + const users = item.keyRecipients; + if (users.length === 1) { + const user_id = users[0].user_id; + if (mutedUsers.has(user_id)) { + return null; } else { return ( - + ); } - }} - /> - ); - } + } else { + return ( + + ); + } + }} + /> + ); } diff --git a/src/pm-conversations/PmConversationsScreen.js b/src/pm-conversations/PmConversationsScreen.js index 71374382e77..b31e3f1fd5d 100644 --- a/src/pm-conversations/PmConversationsScreen.js +++ b/src/pm-conversations/PmConversationsScreen.js @@ -7,7 +7,7 @@ import type { RouteProp } from '../react-navigation'; import type { MainTabsNavigationProp } from '../main/MainTabsScreen'; import * as NavigationService from '../nav/NavigationService'; import { ThemeContext, createStyleSheet } from '../styles'; -import { useSelector, useDispatch } from '../react-redux'; +import { useSelector } from '../react-redux'; import { Label, ZulipButton, LoadingBanner } from '../common'; import { IconPeople, IconSearch } from '../common/Icons'; import PmConversationList from './PmConversationList'; @@ -43,7 +43,6 @@ type Props = $ReadOnly<{| * */ export default function PmConversationsScreen(props: Props) { const conversations = useSelector(getRecentConversations); - const dispatch = useDispatch(); const context = useContext(ThemeContext); return ( @@ -72,7 +71,7 @@ export default function PmConversationsScreen(props: Props) { {conversations.length === 0 ? (