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