mirror of https://github.com/msgbyte/tailchat
feat: 私信会话侧边栏项
parent
148b50274e
commit
0df3b4f033
@ -0,0 +1,19 @@
|
||||
import { useMemo } from 'react';
|
||||
import type { ChatConverseState } from '../slices/chat';
|
||||
import { useAppSelector } from './useAppSelector';
|
||||
|
||||
/**
|
||||
* 获取私信会话列表
|
||||
* 并补充一些信息
|
||||
*/
|
||||
export function useDMConverseList(): ChatConverseState[] {
|
||||
const converses = useAppSelector((state) => state.chat.converses);
|
||||
|
||||
return useMemo(
|
||||
() =>
|
||||
Object.entries(converses)
|
||||
.filter(([, info]) => info.type === 'DM')
|
||||
.map(([, info]) => info),
|
||||
[converses]
|
||||
);
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
import { useAppSelector } from './useAppSelector';
|
||||
|
||||
/**
|
||||
* 用户基本Id
|
||||
*/
|
||||
export function useUserId(): string | undefined {
|
||||
return useAppSelector((state) => state.user.info?._id);
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
import {
|
||||
ChatConverseState,
|
||||
useCachedUserInfo,
|
||||
useUserId,
|
||||
} from 'pawchat-shared';
|
||||
import { isValidStr } from 'pawchat-shared/utils/string-helper';
|
||||
import React, { useMemo } from 'react';
|
||||
import { SidebarItem } from '../SidebarItem';
|
||||
|
||||
interface SidebarDMItemProps {
|
||||
converse: ChatConverseState;
|
||||
}
|
||||
export const SidebarDMItem: React.FC<SidebarDMItemProps> = React.memo(
|
||||
(props) => {
|
||||
const converse = props.converse;
|
||||
const userId = useUserId();
|
||||
const otherMemberId = converse.members.find((m) => m !== userId);
|
||||
const memberInfo = useCachedUserInfo(otherMemberId ?? null);
|
||||
const memberSize = converse.members.length;
|
||||
|
||||
const name = useMemo(() => {
|
||||
if (isValidStr(converse.name)) {
|
||||
return converse.name;
|
||||
}
|
||||
|
||||
let name = memberInfo.nickname;
|
||||
if (memberSize >= 3) {
|
||||
name += ' 等人的会话';
|
||||
}
|
||||
|
||||
return name;
|
||||
}, [converse.name, memberInfo.nickname, memberSize]);
|
||||
|
||||
return (
|
||||
<SidebarItem
|
||||
key={converse._id}
|
||||
name={name}
|
||||
// TODO
|
||||
// action={<Icon icon="mdi-close" />}
|
||||
to={`/main/personal/converse/${converse._id}`}
|
||||
/>
|
||||
);
|
||||
}
|
||||
);
|
||||
SidebarDMItem.displayName = 'SidebarDMItem';
|
Loading…
Reference in New Issue