diff --git a/package.json b/package.json index 9c234c0f..16bbf776 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,9 @@ }, "pnpm": { "peerDependencyRules": { - "ignoreMissing": ["acorn"] + "ignoreMissing": [ + "acorn" + ] } }, "lint-staged": { @@ -57,5 +59,9 @@ "prettier": "^2.3.2", "typescript": "^4.5.2", "vinyl-fs": "^3.0.3" + }, + "dependencies": { + "crc": "^3.8.0", + "lodash": "^4.17.21" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d63e4019..378c041a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,7 @@ importers: '@typescript-eslint/eslint-plugin': ^4.28.1 '@typescript-eslint/parser': ^4.28.1 commitlint: ^12.1.4 + crc: ^3.8.0 dayjs: ^1.10.6 esbuild: ^0.12.25 eslint: ^7.30.0 @@ -23,9 +24,13 @@ importers: i18next-scanner: ^3.0.0 identity-obj-proxy: ^3.0.0 lint-staged: ^11.0.0 + lodash: ^4.17.21 prettier: ^2.3.2 typescript: ^4.5.2 vinyl-fs: ^3.0.3 + dependencies: + crc: 3.8.0 + lodash: 4.17.21 devDependencies: '@commitlint/cli': 12.1.4 '@commitlint/config-conventional': 12.1.4 @@ -5379,6 +5384,9 @@ packages: engines: {node: '>=4.8.2'} peerDependencies: acorn: ^6 || ^7 || ^8 + peerDependenciesMeta: + acorn: + optional: true dependencies: acorn: 8.7.1 acorn-private-class-elements: 0.2.7_acorn@8.7.1 @@ -5388,6 +5396,9 @@ packages: resolution: {integrity: sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==} peerDependencies: acorn: ^6.0.0 + peerDependenciesMeta: + acorn: + optional: true dependencies: acorn: 8.7.1 dev: true @@ -5411,6 +5422,9 @@ packages: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + acorn: + optional: true dependencies: acorn: 7.4.1 dev: true @@ -5419,6 +5433,9 @@ packages: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + acorn: + optional: true dependencies: acorn: 8.7.1 dev: true @@ -5436,6 +5453,9 @@ packages: engines: {node: '>=4.8.2'} peerDependencies: acorn: ^6.1.0 || ^7 || ^8 + peerDependenciesMeta: + acorn: + optional: true dependencies: acorn: 8.7.1 dev: true @@ -5445,6 +5465,9 @@ packages: engines: {node: '>=4.8.2'} peerDependencies: acorn: ^6 || ^7 || ^8 + peerDependenciesMeta: + acorn: + optional: true dependencies: acorn: 8.7.1 acorn-private-class-elements: 0.2.7_acorn@8.7.1 @@ -5455,6 +5478,9 @@ packages: engines: {node: '>=4.8.2'} peerDependencies: acorn: ^7.4 || ^8 + peerDependenciesMeta: + acorn: + optional: true dependencies: acorn: 8.7.1 acorn-class-fields: 0.3.7_acorn@8.7.1 @@ -5467,6 +5493,9 @@ packages: engines: {node: '>=4.8.2'} peerDependencies: acorn: ^6.1.0 || ^7 || ^8 + peerDependenciesMeta: + acorn: + optional: true dependencies: acorn: 8.7.1 acorn-private-class-elements: 0.2.7_acorn@8.7.1 diff --git a/shared/helper/converse-helper.ts b/shared/helper/converse-helper.ts index 6e40ef52..5c07037b 100644 --- a/shared/helper/converse-helper.ts +++ b/shared/helper/converse-helper.ts @@ -8,13 +8,19 @@ import { appendUserDMConverse } from '../model/user'; * 确保私信会话存在 */ export async function ensureDMConverse( - converseId: string + converseId: string, + currentUserId: string ): Promise { const converse = await getCachedConverseInfo(converseId); if (converse === null) { // TODO throw new Error(t('找不到私信会话')); } + + if (!converse.members.includes(currentUserId)) { + throw new Error(t('会话没有权限')); + } + await appendUserDMConverse(converseId); // 添加到私人会话列表 return converse; diff --git a/shared/i18n/langs/en-US/translation.json b/shared/i18n/langs/en-US/translation.json index 3beece94..ffed396d 100644 --- a/shared/i18n/langs/en-US/translation.json +++ b/shared/i18n/langs/en-US/translation.json @@ -206,6 +206,7 @@ "kdd4c838c": "Jump to Group", "kdd6c18f8": "Service exception", "kdef84ee6": "Plugin", + "kdf6e53ca": "Converse does not have permission", "ke17b2c87": "Do not upload pictures that violate local laws and regulations", "ke187440d": "Panel type cannot be empty", "kecb51e2c": "Old password", diff --git a/shared/i18n/langs/zh-CN/translation.json b/shared/i18n/langs/zh-CN/translation.json index ca476cd3..bcab2f9f 100644 --- a/shared/i18n/langs/zh-CN/translation.json +++ b/shared/i18n/langs/zh-CN/translation.json @@ -206,6 +206,7 @@ "kdd4c838c": "跳转到群组", "kdd6c18f8": "服务异常", "kdef84ee6": "插件", + "kdf6e53ca": "会话没有权限", "ke17b2c87": "请勿上传违反当地法律法规的图片", "ke187440d": "面板类型不能为空", "kecb51e2c": "旧密码", diff --git a/shared/redux/hooks/useConverseMessage.ts b/shared/redux/hooks/useConverseMessage.ts index a382112c..1df64a3d 100644 --- a/shared/redux/hooks/useConverseMessage.ts +++ b/shared/redux/hooks/useConverseMessage.ts @@ -89,6 +89,7 @@ export function useConverseMessage(context: ConverseContext) { const hasMoreMessage = converse?.hasMoreMessage ?? true; const dispatch = useAppDispatch(); const messages = converse?.messages ?? []; + const currentUserId = useAppSelector((state) => state.user.info?._id); useEffect(() => { dispatch(chatActions.updateCurrentConverseId(converseId)); @@ -105,7 +106,7 @@ export function useConverseMessage(context: ConverseContext) { if (!isGroup) { // 如果是私信会话 // Step 1. 创建会话 并确保私信列表中存在该会话 - const converse = await ensureDMConverse(converseId); + const converse = await ensureDMConverse(converseId, currentUserId); dispatch(chatActions.setConverseInfo(converse)); } else { // 如果是群组会话(文本频道) @@ -145,7 +146,7 @@ export function useConverseMessage(context: ConverseContext) { ); } } - }, [converseId, reconnectNum]); + }, [converseId, reconnectNum, currentUserId]); // 加载更多消息 const [{ loading: isLoadingMore }, handleFetchMoreMessage] = diff --git a/web/src/components/AlertErrorView.tsx b/web/src/components/AlertErrorView.tsx index 28fb8548..1d7f68f3 100644 --- a/web/src/components/AlertErrorView.tsx +++ b/web/src/components/AlertErrorView.tsx @@ -5,6 +5,7 @@ import { t } from 'tailchat-shared'; /** * 用于接口错误显示的组件 + * @deprecated 请使用 ErrorView */ export const AlertErrorView: React.FC<{ error: Error; diff --git a/web/src/components/ChatBox/index.tsx b/web/src/components/ChatBox/index.tsx index 6e6c7841..c7622097 100644 --- a/web/src/components/ChatBox/index.tsx +++ b/web/src/components/ChatBox/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { ChatBoxContextProvider, useConverseMessage } from 'tailchat-shared'; -import { AlertErrorView } from '../AlertErrorView'; +import { ErrorView } from '../ErrorView'; import { ChatBoxPlaceholder } from './ChatBoxPlaceholder'; import { ChatInputBox } from './ChatInputBox'; import { ChatMessageList } from './ChatMessageList'; @@ -40,7 +40,7 @@ const ChatBoxInner: React.FC = React.memo((props) => { } if (error) { - return ; + return ; } return ( diff --git a/web/src/components/ErrorView.tsx b/web/src/components/ErrorView.tsx new file mode 100644 index 00000000..c5e744cd --- /dev/null +++ b/web/src/components/ErrorView.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Problem } from './Problem'; + +/** + * 用于接口错误显示的组件 + */ +export const ErrorView: React.FC<{ + error: Error; +}> = React.memo(({ error }) => { + return ; +}); +ErrorView.displayName = 'ErrorView';