diff --git a/shared/helper/converse-helper.ts b/shared/helper/converse-helper.ts new file mode 100644 index 00000000..57db6145 --- /dev/null +++ b/shared/helper/converse-helper.ts @@ -0,0 +1,15 @@ +import { getCachedConverseInfo } from '../cache/cache'; +import type { ChatConverseInfo } from '../model/converse'; +import { appendUserDMConverse } from '../model/user'; + +/** + * 确保私信会话存在 + */ +export async function ensureDMConverse( + converseId: string +): Promise { + const converse = await getCachedConverseInfo(converseId); + await appendUserDMConverse(converseId); + + return converse; +} diff --git a/shared/model/user.ts b/shared/model/user.ts index cacd3ce5..b223eba0 100644 --- a/shared/model/user.ts +++ b/shared/model/user.ts @@ -13,6 +13,14 @@ export interface UserLoginInfo extends UserBaseInfo { createdAt: string; } +/** + * 用户私信列表 + */ +export interface UserDMList { + userId: string; + converseIds: string[]; +} + /** * 邮箱登录 * @param email 邮箱 @@ -104,3 +112,18 @@ export async function getUserOnlineStatus( return data; } + +/** + * 将会话添加到用户私信列表 + * 如果已添加则后端忽略 + */ +export async function appendUserDMConverse(converseId: string) { + const { data } = await request.post( + '/api/user/dmlist/addConverse', + { + converseId, + } + ); + + return data; +} diff --git a/shared/redux/hooks/useConverseMessage.ts b/shared/redux/hooks/useConverseMessage.ts index d4b89991..fe8874f3 100644 --- a/shared/redux/hooks/useConverseMessage.ts +++ b/shared/redux/hooks/useConverseMessage.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react'; -import { getCachedConverseInfo } from '../../cache/cache'; +import { ensureDMConverse } from '../../helper/converse-helper'; import { useAsync } from '../../hooks/useAsync'; import { showErrorToasts } from '../../manager/ui'; import { @@ -20,9 +20,13 @@ export function useConverseMessage(converseId: string) { const { loading, error } = useAsync(async () => { if (!converse) { - const converse = await getCachedConverseInfo(converseId); + // 如果是一个新会话(或者当前会话列表中没有) + + // Step 1. 创建会话 并确保私信列表中存在该会话 + const converse = await ensureDMConverse(converseId); dispatch(chatActions.setConverseInfo(converse)); + // Step 2. 拉取消息 const messages = await fetchConverseMessage(converseId); dispatch( chatActions.appendConverseMessage({ diff --git a/shared/redux/setup.ts b/shared/redux/setup.ts index 65261793..baf75165 100644 --- a/shared/redux/setup.ts +++ b/shared/redux/setup.ts @@ -1,7 +1,10 @@ import type { AppStore } from './store'; import type { AppSocket } from '../api/socket'; -import { userActions } from './slices'; +import { chatActions, userActions } from './slices'; import type { FriendRequest } from '../model/friend'; +import type { UserDMList } from '../model/user'; +import { fetchConverseInfo } from '../model/converse'; +import { getCachedConverseInfo } from '../cache/cache'; /** * 初始化Redux 上下文 @@ -19,6 +22,17 @@ export function setupRedux(socket: AppSocket, store: AppStore) { store.dispatch(userActions.setFriendRequests(data)); }); + socket.request('user.dmlist.getAllConverse').then((data) => { + data.converseIds.forEach(async (converseId) => { + // TODO: 待优化, 可以在后端一次性返回 + + const converse = await getCachedConverseInfo(converseId); + store.dispatch(chatActions.setConverseInfo(converse)); + }); + }); + + // ------------------ 通知 + socket.listen<{ userId: string }>('friend.add', ({ userId }) => { if (typeof userId !== 'string') { console.error('错误的信息', userId);