feat: 多人会话的成员列表

pull/13/head
moonrailgun 4 years ago
parent 8c1cd74355
commit 254326d58a

@ -14,7 +14,7 @@ interface RightPanelType {
*/ */
interface CommonPanelWrapperProps { interface CommonPanelWrapperProps {
header: React.ReactNode; header: React.ReactNode;
actions: ( actions?: (
setRightPanel: (info: RightPanelType) => void setRightPanel: (info: RightPanelType) => void
) => React.ReactElement[]; ) => React.ReactElement[];
} }
@ -26,7 +26,9 @@ export const CommonPanelWrapper: React.FC<CommonPanelWrapperProps> = React.memo(
<div className="w-full h-full flex"> <div className="w-full h-full flex">
{/* 主面板 */} {/* 主面板 */}
<div className="flex flex-col overflow-hidden flex-1"> <div className="flex flex-col overflow-hidden flex-1">
<PanelCommonHeader actions={props.actions(setRightPanel)}> <PanelCommonHeader
actions={props.actions && props.actions(setRightPanel)}
>
{props.header} {props.header}
</PanelCommonHeader> </PanelCommonHeader>
<div className="flex-1 overflow-hidden">{props.children}</div> <div className="flex-1 overflow-hidden">{props.children}</div>

@ -1,4 +1,8 @@
import { ChatBox } from '@/components/ChatBox'; import { ChatBox } from '@/components/ChatBox';
import { LoadingSpinner } from '@/components/LoadingSpinner';
import { UserListItem } from '@/components/UserListItem';
import { Icon } from '@iconify/react';
import { Button } from 'antd';
import React from 'react'; import React from 'react';
import { import {
ChatConverseState, ChatConverseState,
@ -6,20 +10,30 @@ import {
useAppSelector, useAppSelector,
useDMConverseName, useDMConverseName,
} from 'tailchat-shared'; } from 'tailchat-shared';
import { PanelCommonHeader } from '../common/Header'; import { CommonPanelWrapper } from '../common/Wrapper';
import _compact from 'lodash/compact';
const ConversePanelHeader: React.FC<{ converse: ChatConverseState }> = const ConversePanelHeader: React.FC<{ converse: ChatConverseState }> =
React.memo(({ converse }) => { React.memo(({ converse }) => {
const name = useDMConverseName(converse); const name = useDMConverseName(converse);
return ( return t('与 {{name}} 的会话', { name });
<PanelCommonHeader actions={[]}>
{t('与 {{name}} 的会话', { name })}
</PanelCommonHeader>
);
}); });
ConversePanelHeader.displayName = 'ConversePanelHeader'; ConversePanelHeader.displayName = 'ConversePanelHeader';
const ConversePanelMembers: React.FC<{ members: string[] }> = React.memo(
({ members }) => {
return (
<div>
{members.map((member) => (
<UserListItem key={member} userId={member} />
))}
</div>
);
}
);
ConversePanelMembers.displayName = 'ConversePanelMembers';
interface ConversePanelProps { interface ConversePanelProps {
converseId: string; converseId: string;
} }
@ -30,13 +44,37 @@ export const ConversePanel: React.FC<ConversePanelProps> = React.memo(
); );
return ( return (
<div className="flex flex-col overflow-hidden flex-1"> <CommonPanelWrapper
{converse && <ConversePanelHeader converse={converse} />} header={converse && <ConversePanelHeader converse={converse} />}
actions={(setRightPanel) => {
if (!converse) {
return [];
}
<div className="flex-1 overflow-hidden"> return _compact([
// 当成员数大于2时显示成员列表按钮
converse.members.length > 2 && (
<Button
key="members"
icon={
<Icon
className="anticon text-2xl"
icon="mdi:account-supervisor-outline"
/>
}
onClick={() =>
setRightPanel({
name: t('成员'),
panel: <ConversePanelMembers members={converse.members} />,
})
}
/>
),
]);
}}
>
<ChatBox converseId={converseId} isGroup={false} /> <ChatBox converseId={converseId} isGroup={false} />
</div> </CommonPanelWrapper>
</div>
); );
} }
); );

Loading…
Cancel
Save