MM-52944: Fix profile popover view issue on RHS when searching channel member (#23930)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
1f235ba064
Коммит
e1aa7b21ac
@@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||||
// See LICENSE.txt for license information.
|
// See LICENSE.txt for license information.
|
||||||
|
|
||||||
import React, {useEffect} from 'react';
|
import React, {useCallback, useEffect} from 'react';
|
||||||
import {useDispatch, useSelector} from 'react-redux';
|
import {useDispatch, useSelector} from 'react-redux';
|
||||||
import {useIntl} from 'react-intl';
|
import {useIntl} from 'react-intl';
|
||||||
import {useHistory} from 'react-router-dom';
|
import {useHistory} from 'react-router-dom';
|
||||||
@@ -91,13 +91,13 @@ function NotificationFromMembersModal(props: Props) {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
const openDirectMessage = async (user: UserProfile) => {
|
const openDirectMessage = useCallback(async (user: UserProfile) => {
|
||||||
// we first prepare the DM channel...
|
// we first prepare the DM channel...
|
||||||
await dispatch(openDirectChannelToUserId(user.id));
|
await dispatch(openDirectChannelToUserId(user.id));
|
||||||
|
|
||||||
// ... and then redirect to it
|
// ... and then redirect to it
|
||||||
history.push(teamUrl + '/messages/@' + user.username);
|
history.push(teamUrl + '/messages/@' + user.username);
|
||||||
};
|
}, [openDirectChannelToUserId, history, teamUrl]);
|
||||||
|
|
||||||
const handleOnClose = () => {
|
const handleOnClose = () => {
|
||||||
dispatch(closeModal(ModalIdentifiers.SUM_OF_MEMBERS_MODAL));
|
dispatch(closeModal(ModalIdentifiers.SUM_OF_MEMBERS_MODAL));
|
||||||
@@ -131,7 +131,8 @@ function NotificationFromMembersModal(props: Props) {
|
|||||||
members={members}
|
members={members}
|
||||||
searchTerms={''}
|
searchTerms={''}
|
||||||
editing={false}
|
editing={false}
|
||||||
actions={{openDirectMessage, loadMore}}
|
openDirectMessage={openDirectMessage}
|
||||||
|
loadMore={loadMore}
|
||||||
hasNextPage={false}
|
hasNextPage={false}
|
||||||
isNextPageLoading={false}
|
isNextPageLoading={false}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export interface Props {
|
|||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
openModal: <P>(modalData: ModalData<P>) => void;
|
openModal: <P>(modalData: ModalData<P>) => void;
|
||||||
openDirectChannelToUserId: (userId: string) => Promise<{ data: Channel }>;
|
openDirectChannelToUserId: (userId: string) => Promise<{data: Channel}>;
|
||||||
closeRightHandSide: () => void;
|
closeRightHandSide: () => void;
|
||||||
goBack: () => void;
|
goBack: () => void;
|
||||||
setChannelMembersRhsSearchTerm: (terms: string) => void;
|
setChannelMembersRhsSearchTerm: (terms: string) => void;
|
||||||
@@ -150,7 +150,9 @@ export default function ChannelMembersRHS({
|
|||||||
|
|
||||||
listcp.push({type: ListItemType.Member, data: member});
|
listcp.push({type: ListItemType.Member, data: member});
|
||||||
}
|
}
|
||||||
|
if (JSON.stringify(list) !== JSON.stringify(listcp)) {
|
||||||
setList(listcp);
|
setList(listcp);
|
||||||
|
}
|
||||||
}, [channelMembers]);
|
}, [channelMembers]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -200,7 +202,7 @@ export default function ChannelMembersRHS({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const openDirectMessage = async (user: UserProfile) => {
|
const openDirectMessage = useCallback(async (user: UserProfile) => {
|
||||||
// we first prepare the DM channel...
|
// we first prepare the DM channel...
|
||||||
await actions.openDirectChannelToUserId(user.id);
|
await actions.openDirectChannelToUserId(user.id);
|
||||||
|
|
||||||
@@ -208,16 +210,17 @@ export default function ChannelMembersRHS({
|
|||||||
history.push(teamUrl + '/messages/@' + user.username);
|
history.push(teamUrl + '/messages/@' + user.username);
|
||||||
|
|
||||||
await actions.closeRightHandSide();
|
await actions.closeRightHandSide();
|
||||||
};
|
}, [actions.openDirectChannelToUserId, history, teamUrl, actions.closeRightHandSide]);
|
||||||
|
|
||||||
const loadMore = async () => {
|
const loadMore = useCallback(async () => {
|
||||||
setIsNextPageLoading(true);
|
setIsNextPageLoading(true);
|
||||||
|
|
||||||
await actions.loadProfilesAndReloadChannelMembers(page + 1, USERS_PER_PAGE, channel.id, ProfilesInChannelSortBy.Admin);
|
await actions.loadProfilesAndReloadChannelMembers(page + 1, USERS_PER_PAGE, channel.id, ProfilesInChannelSortBy.Admin);
|
||||||
setPage(page + 1);
|
setPage(page + 1);
|
||||||
|
|
||||||
setIsNextPageLoading(false);
|
setIsNextPageLoading(false);
|
||||||
};
|
}, [actions.loadProfilesAndReloadChannelMembers, page, channel.id],
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@@ -281,7 +284,8 @@ export default function ChannelMembersRHS({
|
|||||||
members={list}
|
members={list}
|
||||||
editing={editing}
|
editing={editing}
|
||||||
channel={channel}
|
channel={channel}
|
||||||
actions={{openDirectMessage, loadMore}}
|
openDirectMessage={openDirectMessage}
|
||||||
|
loadMore={loadMore}
|
||||||
hasNextPage={channelMembers.length < membersCount}
|
hasNextPage={channelMembers.length < membersCount}
|
||||||
isNextPageLoading={isNextPageLoading}
|
isNextPageLoading={isNextPageLoading}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||||
// See LICENSE.txt for license information.
|
// See LICENSE.txt for license information.
|
||||||
|
|
||||||
import React, {useEffect, useRef, useState} from 'react';
|
import React, {memo, useEffect, useRef, useState} from 'react';
|
||||||
import AutoSizer from 'react-virtualized-auto-sizer';
|
import AutoSizer from 'react-virtualized-auto-sizer';
|
||||||
import {VariableSizeList, ListChildComponentProps} from 'react-window';
|
import {VariableSizeList, ListChildComponentProps} from 'react-window';
|
||||||
import InfiniteLoader from 'react-window-infinite-loader';
|
import InfiniteLoader from 'react-window-infinite-loader';
|
||||||
@@ -19,11 +19,8 @@ export interface Props {
|
|||||||
hasNextPage: boolean;
|
hasNextPage: boolean;
|
||||||
isNextPageLoading: boolean;
|
isNextPageLoading: boolean;
|
||||||
searchTerms: string;
|
searchTerms: string;
|
||||||
|
|
||||||
actions: {
|
|
||||||
openDirectMessage: (user: UserProfile) => void;
|
openDirectMessage: (user: UserProfile) => void;
|
||||||
loadMore: () => void;
|
loadMore: () => void;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const MemberList = ({
|
const MemberList = ({
|
||||||
@@ -33,7 +30,8 @@ const MemberList = ({
|
|||||||
members,
|
members,
|
||||||
searchTerms,
|
searchTerms,
|
||||||
editing,
|
editing,
|
||||||
actions,
|
openDirectMessage,
|
||||||
|
loadMore,
|
||||||
}: Props) => {
|
}: Props) => {
|
||||||
const infiniteLoaderRef = useRef<InfiniteLoader | null>(null);
|
const infiniteLoaderRef = useRef<InfiniteLoader | null>(null);
|
||||||
const variableSizeListRef = useRef<VariableSizeList | null>(null);
|
const variableSizeListRef = useRef<VariableSizeList | null>(null);
|
||||||
@@ -53,7 +51,7 @@ const MemberList = ({
|
|||||||
|
|
||||||
const itemCount = hasNextPage ? members.length + 1 : members.length;
|
const itemCount = hasNextPage ? members.length + 1 : members.length;
|
||||||
|
|
||||||
const loadMoreItems = isNextPageLoading ? () => {} : actions.loadMore;
|
const loadMoreItems = isNextPageLoading ? () => {} : loadMore;
|
||||||
|
|
||||||
const isItemLoaded = (index: number) => {
|
const isItemLoaded = (index: number) => {
|
||||||
return !hasNextPage || index < members.length;
|
return !hasNextPage || index < members.length;
|
||||||
@@ -91,7 +89,7 @@ const MemberList = ({
|
|||||||
totalUsers={members.length}
|
totalUsers={members.length}
|
||||||
member={member}
|
member={member}
|
||||||
editing={editing}
|
editing={editing}
|
||||||
actions={{openDirectMessage: actions.openDirectMessage}}
|
actions={{openDirectMessage}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -149,4 +147,4 @@ const MemberList = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default MemberList;
|
export default memo(MemberList);
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user