diff --git a/shared/i18n/langs/en-US/translation.json b/shared/i18n/langs/en-US/translation.json index e31f5244..3417adc8 100644 --- a/shared/i18n/langs/en-US/translation.json +++ b/shared/i18n/langs/en-US/translation.json @@ -22,7 +22,6 @@ "k35abe359": "Lobby", "k35f486ba": "Nickname", "k35f990b0": "View Detail", - "k36722a78": "Conversation with <1>", "k3b4b656d": "About", "k3bbf3bbd": "Register Account", "k3c502edb": "E-mail can not be empty", @@ -68,7 +67,6 @@ "k7fc7e508": "Dark Mode", "k821ff85a": "Common", "k8582af3f": "Refuse", - "k8849b674": "Multiplayer conversations with <1> and <4>", "k89df1d1e": "The network is abnormal", "k8abdba5c": "Has been sent", "k8acbe00": "Current service available", @@ -79,6 +77,7 @@ "k979fc780": "Unable to join the room, you will not be able to get the latest information, please refresh the page and try again", "k9bb01902": "Show Detail", "k9d901c20": "Meeting room", + "k9fa72780": "Conversation with {{name}}", "ka01a00eb": "System language", "ka0451c97": "Cancel", "ka14986f0": "Plugin install successed, need to be restarted to take effect", @@ -125,7 +124,6 @@ "kdd6c18f8": "Service exception", "ke17b2c87": "Do not upload pictures that violate local laws and regulations", "ke187440d": "Panel type cannot be empty", - "kea50b8e9": "Multi-person conversation with <1>{{membersEl}} and others", "kecbd7449": "Delete", "ked2baf28": "Loading...", "ked5385d5": "Create Panel", diff --git a/shared/i18n/langs/zh-CN/translation.json b/shared/i18n/langs/zh-CN/translation.json index 3ba8c041..e19c6b13 100644 --- a/shared/i18n/langs/zh-CN/translation.json +++ b/shared/i18n/langs/zh-CN/translation.json @@ -22,7 +22,6 @@ "k35abe359": "大厅", "k35f486ba": "用户昵称", "k35f990b0": "查看详情", - "k36722a78": "与 <1> 的会话", "k3b4b656d": "关于", "k3bbf3bbd": "注册账号", "k3c502edb": "邮箱不能为空", @@ -68,7 +67,6 @@ "k7fc7e508": "暗黑模式", "k821ff85a": "通用", "k8582af3f": "拒绝", - "k8849b674": "与 <1> 和 <4> 的多人会话", "k89df1d1e": "网络出现异常", "k8abdba5c": "已发送", "k8acbe00": "当前服务可用", @@ -79,6 +77,7 @@ "k979fc780": "无法加入房间, 您将无法获取到最新的信息, 请刷新页面后重试", "k9bb01902": "显示详情", "k9d901c20": "会议室", + "k9fa72780": "与 {{name}} 的会话", "ka01a00eb": "系统语言", "ka0451c97": "取消", "ka14986f0": "插件安装成功, 需要重启后生效", @@ -125,7 +124,6 @@ "kdd6c18f8": "服务异常", "ke17b2c87": "请勿上传违反当地法律法规的图片", "ke187440d": "面板类型不能为空", - "kea50b8e9": "与 <1>{{membersEl}} 等人的多人会话", "kecbd7449": "删除", "ked2baf28": "加载中...", "ked5385d5": "创建面板", diff --git a/shared/index.tsx b/shared/index.tsx index c9bef224..17956266 100644 --- a/shared/index.tsx +++ b/shared/index.tsx @@ -111,6 +111,7 @@ export { export { useAppSelector, useAppDispatch } from './redux/hooks/useAppSelector'; export { useDMConverseList } from './redux/hooks/useConverse'; export { useConverseMessage } from './redux/hooks/useConverseMessage'; +export { useDMConverseName } from './redux/hooks/useDMConverseName'; export { useGroupInfo, useGroupPanel, diff --git a/shared/redux/hooks/useDMConverseName.ts b/shared/redux/hooks/useDMConverseName.ts new file mode 100644 index 00000000..e3f5ae1e --- /dev/null +++ b/shared/redux/hooks/useDMConverseName.ts @@ -0,0 +1,26 @@ +import { getCachedUserInfo, isValidStr, useAsync } from '../../index'; +import type { ChatConverseState } from '../slices/chat'; +import { useUserId } from './useUserInfo'; + +export function useDMConverseName(converse: ChatConverseState) { + const userId = useUserId(); + const otherConverseMembers = converse.members.filter((m) => m !== userId); // 成员Id + const len = otherConverseMembers.length; + const { value: otherMembersInfo = [] } = useAsync(() => { + return Promise.all( + otherConverseMembers.map((userId) => getCachedUserInfo(userId)) + ); + }, [otherConverseMembers.join(',')]); + + if (isValidStr(converse.name)) { + return converse.name; + } + + if (len === 1) { + return otherMembersInfo[0]?.nickname ?? ''; + } else if (len === 2) { + return `${otherMembersInfo[0]?.nickname}, ${otherMembersInfo[1]?.nickname}`; + } else { + return `${otherMembersInfo[0]?.nickname}, ${otherMembersInfo[1]?.nickname} ...`; + } +} diff --git a/web/src/components/Panel/personal/ConversePanel.tsx b/web/src/components/Panel/personal/ConversePanel.tsx index a4543d34..621f119f 100644 --- a/web/src/components/Panel/personal/ConversePanel.tsx +++ b/web/src/components/Panel/personal/ConversePanel.tsx @@ -1,55 +1,43 @@ import { ChatBox } from '@/components/ChatBox'; import React from 'react'; -import { joinArray, Trans, useAppSelector, useUserId } from 'tailchat-shared'; +import { + ChatConverseState, + t, + useAppSelector, + useDMConverseName, +} from 'tailchat-shared'; import { PanelCommonHeader } from '../common/Header'; -import _without from 'lodash/without'; -import _take from 'lodash/take'; -import { UserName } from '@/components/UserName'; +import _isNil from 'lodash/isNil'; +import { LoadingSpinner } from '@/components/LoadingSpinner'; -function useConverseTitle(converseId: string): React.ReactNode { - const members = useAppSelector( - (state) => state.chat.converses[converseId]?.members ?? [] - ); - const userId = useUserId(); - const otherMembers = _without(members, userId ?? ''); - const len = otherMembers.length; +const ConversePanelHeader: React.FC<{ converse: ChatConverseState }> = + React.memo(({ converse }) => { + const name = useDMConverseName(converse); - if (len === 1) { return ( - - 与 的会话 - + + {t('与 {{name}} 的会话', { name })} + ); - } else if (len === 2) { - return ( - - 与 和{' '} - 的多人会话 - - ); - } else { - const membersEl = joinArray( - _take(otherMembers, 2).map((uid) => ), - - ); - return ( - - 与 {{ membersEl }} 等人的多人会话 - - ); - } -} + }); +ConversePanelHeader.displayName = 'ConversePanelHeader'; interface ConversePanelProps { converseId: string; } export const ConversePanel: React.FC = React.memo( ({ converseId }) => { - const title = useConverseTitle(converseId); + const converse = useAppSelector( + (state) => state.chat.converses[converseId] + ); + + if (_isNil(converse)) { + return ; + } return (
- {title} +
diff --git a/web/src/routes/Main/Content/Personal/SidebarDMItem.tsx b/web/src/routes/Main/Content/Personal/SidebarDMItem.tsx index 833c46a1..2d145adf 100644 --- a/web/src/routes/Main/Content/Personal/SidebarDMItem.tsx +++ b/web/src/routes/Main/Content/Personal/SidebarDMItem.tsx @@ -1,10 +1,5 @@ -import { - ChatConverseState, - useCachedUserInfo, - useUserId, -} from 'tailchat-shared'; -import { isValidStr } from 'tailchat-shared/utils/string-helper'; -import React, { useMemo } from 'react'; +import { ChatConverseState, useDMConverseName } from 'tailchat-shared'; +import React from 'react'; import { SidebarItem } from '../SidebarItem'; interface SidebarDMItemProps { @@ -13,23 +8,7 @@ interface SidebarDMItemProps { export const SidebarDMItem: React.FC = 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]); + const name = useDMConverseName(converse); return (