diff --git a/src/api/im/face/index.ts b/src/api/im/face/index.ts index eba55fdbb..67913f900 100644 --- a/src/api/im/face/index.ts +++ b/src/api/im/face/index.ts @@ -1,70 +1,3 @@ -import request from '@/config/axios' - -// TODO @AI:分拆下文件! -/** 用户端表情包项(精简版) */ -export interface ImFacePackUserItemVO { - id: number - url: string - name?: string - width: number - height: number -} - -/** 用户端表情包 + 嵌套 items */ -export interface ImFacePackUserVO { - id: number - name: string - iconUrl?: string - items: ImFacePackUserItemVO[] -} - -/** 个人表情 */ -export interface ImFaceUserItemVO { - id: number - url: string - name?: string - width: number - height: number -} - -/** 添加个人表情请求 */ -export interface ImFaceUserItemSaveReqVO { - url: string - name?: string - width: number - height: number - /** 来源消息编号(从消息「添加到表情」时传,自己上传不传) */ - sourceMessageId?: number -} - -// ==================== 系统表情包 ==================== - -/** 拉取所有启用的系统表情包(含表情列表) */ -export const getFacePackList = () => { - return request.get({ url: '/im/face-pack/list' }) -} - -// ==================== 个人表情 ==================== - -/** 获取我的个人表情列表 */ -export const getMyFaceUserItemList = () => { - return request.get({ url: '/im/face-user-item/list' }) -} - -/** 添加个人表情;服务端对同 URL 幂等(直接返回旧 id) */ -export const createFaceUserItem = (data: ImFaceUserItemSaveReqVO) => { - return request.post({ url: '/im/face-user-item/create', data }) -} - -/** 删除个人表情 */ -export const deleteFaceUserItem = (id: number) => { - return request.delete({ url: '/im/face-user-item/delete?id=' + id }) -} - -/** 批量删除个人表情 */ -export const deleteFaceUserItemList = (ids: number[]) => { - return request.delete({ - url: '/im/face-user-item/delete-list', - params: { ids: ids.join(',') } - }) -} +// 用户端 IM 表情 API barrel 出口;按子目录(pack / userItem)二次拆分,调用方可用 `from '@/api/im/face'` 一次拿全 +export * from './pack' +export * from './userItem' diff --git a/src/api/im/face/pack/index.ts b/src/api/im/face/pack/index.ts new file mode 100644 index 000000000..9df77ed3d --- /dev/null +++ b/src/api/im/face/pack/index.ts @@ -0,0 +1,23 @@ +import request from '@/config/axios' + +/** 用户端表情包项(精简版) */ +export interface ImFacePackUserItemVO { + id: number + url: string + name?: string + width: number + height: number +} + +/** 用户端表情包 + 嵌套 items */ +export interface ImFacePackUserVO { + id: number + name: string + iconUrl?: string + items: ImFacePackUserItemVO[] +} + +/** 拉取所有启用的系统表情包(含表情列表) */ +export const getFacePackList = () => { + return request.get({ url: '/im/face-pack/list' }) +} diff --git a/src/api/im/face/userItem/index.ts b/src/api/im/face/userItem/index.ts new file mode 100644 index 000000000..48aeb18b9 --- /dev/null +++ b/src/api/im/face/userItem/index.ts @@ -0,0 +1,34 @@ +import request from '@/config/axios' + +/** 个人表情 */ +export interface ImFaceUserItemVO { + id: number + url: string + name?: string + width: number + height: number +} + +/** 添加个人表情请求 */ +export interface ImFaceUserItemSaveReqVO { + url: string + name?: string + width: number + height: number + sourceMessageId?: number // 来源消息编号(从消息「添加到表情」时传,自己上传不传) +} + +/** 获取我的个人表情列表 */ +export const getFaceUserItemList = () => { + return request.get({ url: '/im/face-user-item/list' }) +} + +/** 添加个人表情;同 URL 重复添加服务端抛 FACE_USER_ITEM_DUPLICATED,调用方按 catch 提示「已添加过」 */ +export const createFaceUserItem = (data: ImFaceUserItemSaveReqVO) => { + return request.post({ url: '/im/face-user-item/create', data }) +} + +/** 删除个人表情 */ +export const deleteFaceUserItem = (id: number) => { + return request.delete({ url: '/im/face-user-item/delete?id=' + id }) +} diff --git a/src/api/im/manager/face/item.ts b/src/api/im/manager/face/item/index.ts similarity index 97% rename from src/api/im/manager/face/item.ts rename to src/api/im/manager/face/item/index.ts index 0ca5f2a0c..70ebecbc0 100644 --- a/src/api/im/manager/face/item.ts +++ b/src/api/im/manager/face/item/index.ts @@ -1,6 +1,5 @@ import request from '@/config/axios' -// TODO @AI:face/item/index.ts export interface ImManagerFacePackItemVO { id: number packId: number diff --git a/src/api/im/manager/face/pack.ts b/src/api/im/manager/face/pack/index.ts similarity index 97% rename from src/api/im/manager/face/pack.ts rename to src/api/im/manager/face/pack/index.ts index a240027c0..96a8013ea 100644 --- a/src/api/im/manager/face/pack.ts +++ b/src/api/im/manager/face/pack/index.ts @@ -1,6 +1,5 @@ import request from '@/config/axios' -// TODO @AI:face/pack/index.ts export interface ImManagerFacePackVO { id: number name: string diff --git a/src/views/im/home/index.vue b/src/views/im/home/index.vue index 3a90dd190..dea50961d 100644 --- a/src/views/im/home/index.vue +++ b/src/views/im/home/index.vue @@ -33,6 +33,7 @@ import { useFriendStore } from './store/friendStore' import { useGroupStore } from './store/groupStore' import { useGroupRequestStore } from './store/groupRequestStore' import { useDraftStore } from './store/draftStore' +import { useFaceStore } from './store/faceStore' import { useMessagePuller } from './composables/useMessagePuller' import { useMessageSender } from './composables/useMessageSender' import { ImConversationType } from '../utils/constants' @@ -50,6 +51,7 @@ const friendStore = useFriendStore() const groupStore = useGroupStore() const groupRequestStore = useGroupRequestStore() const draftStore = useDraftStore() +const faceStore = useFaceStore() const { pullOnce } = useMessagePuller() const { readActive, syncPrivateReadStatus } = useMessageSender() @@ -92,6 +94,9 @@ onMounted(async () => { void groupRequestStore.fetchUnhandledList().catch((e) => console.warn('[IM] 拉取未处理加群申请失败', e) ) + // 3.2 系统表情包后台预拉,消除表情面板首次展开的白屏;个人表情保持「点开 tab 才拉」 + // TODO @AI:同上; + void faceStore.ensureFacePacks().catch((e) => console.warn('[IM] 后台预拉表情包失败', e)) // 4. 默认选中第一个会话;若置顶分组处于折叠态,需跳过被折叠隐藏的置顶项,避免自动展开折叠 const sorted = conversationStore.getSortedConversations @@ -129,10 +134,11 @@ function onBeforeUnload() { } window.addEventListener('beforeunload', onBeforeUnload) -/** 离开 IM 主壳:主动断 WebSocket(disconnect 内部已清掉 onclose 防自动重连)+ flush 草稿 + 解绑 unload */ +/** 离开 IM 主壳:主动断 WebSocket(disconnect 内部已清掉 onclose 防自动重连)+ flush 草稿 + 表情缓存 reset + 解绑 unload */ onUnmounted(() => { webSocketStore.disconnect() draftStore.flushPersist() + faceStore.reset() window.removeEventListener('beforeunload', onBeforeUnload) }) diff --git a/src/views/im/home/pages/conversation/components/input/EmojiPicker.vue b/src/views/im/home/pages/conversation/components/input/EmojiPicker.vue deleted file mode 100644 index 4943129b6..000000000 --- a/src/views/im/home/pages/conversation/components/input/EmojiPicker.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - diff --git a/src/views/im/home/pages/conversation/components/input/FacePicker.vue b/src/views/im/home/pages/conversation/components/input/FacePicker.vue index 94a795172..a38c6f7ab 100644 --- a/src/views/im/home/pages/conversation/components/input/FacePicker.vue +++ b/src/views/im/home/pages/conversation/components/input/FacePicker.vue @@ -2,7 +2,8 @@
- +
@@ -125,9 +129,9 @@ @@ -141,9 +145,9 @@ >