diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index dd8b2435c65d5563542d4187a929cb48acff8081..99859205e61025feebe4416837a3bb88cd3fd65b 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -43,6 +43,7 @@ "@vben/styles": "workspace:*", "@vben/types": "workspace:*", "@vben/utils": "workspace:*", + "@vueuse/components": "^14.0.0", "@vueuse/core": "catalog:", "@vueuse/integrations": "catalog:", "ant-design-vue": "catalog:", diff --git a/apps/web-antd/src/components/card-title/CardTitle.vue b/apps/web-antd/src/components/card-title/CardTitle.vue new file mode 100644 index 0000000000000000000000000000000000000000..b08074119d4aaf176179663a3b5f62ab186fbb23 --- /dev/null +++ b/apps/web-antd/src/components/card-title/CardTitle.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/apps/web-antd/src/components/card-title/index.ts b/apps/web-antd/src/components/card-title/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4ebdb4494b922abcfb1e74db7bef94b3871331b5 --- /dev/null +++ b/apps/web-antd/src/components/card-title/index.ts @@ -0,0 +1 @@ +export { default as CardTitle } from './CardTitle.vue'; diff --git a/apps/web-antd/src/store/mall/kefu.ts b/apps/web-antd/src/store/mall/kefu.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c07cf2623b656e70c700608d0f2418eb987c0f4 --- /dev/null +++ b/apps/web-antd/src/store/mall/kefu.ts @@ -0,0 +1,100 @@ +import type { MallKefuConversationApi } from '#/api/mall/promotion/kefu/conversation'; +import type { MallKefuMessageApi } from '#/api/mall/promotion/kefu/message'; + +import { isEmpty } from '@vben/utils'; + +import { acceptHMRUpdate, defineStore } from 'pinia'; + +import * as KeFuConversationApi from '#/api/mall/promotion/kefu/conversation'; + +interface MallKefuInfoVO { + conversationList: MallKefuConversationApi.Conversation[]; // 会话列表 + conversationMessageList: Map; // 会话消息 +} + +export const useMallKefuStore = defineStore('mall-kefu', { + state: (): MallKefuInfoVO => ({ + conversationList: [], + conversationMessageList: new Map(), // key 会话,value 会话消息列表 + }), + getters: { + getConversationList(): MallKefuConversationApi.Conversation[] { + return this.conversationList; + }, + getConversationMessageList(): ( + conversationId: number, + ) => MallKefuMessageApi.Message[] | undefined { + return (conversationId: number) => + this.conversationMessageList.get(conversationId); + }, + }, + actions: { + // ======================= 会话消息相关 ======================= + /** 缓存历史消息 */ + saveMessageList( + conversationId: number, + messageList: MallKefuMessageApi.Message[], + ) { + this.conversationMessageList.set(conversationId, messageList); + }, + + // ======================= 会话相关 ======================= + /** 加载会话缓存列表 */ + async setConversationList() { + this.conversationList = await KeFuConversationApi.getConversationList(); + this.conversationSort(); + }, + /** 更新会话缓存已读 */ + async updateConversationStatus(conversationId: number) { + if (isEmpty(this.conversationList)) { + return; + } + const conversation = this.conversationList.find( + (item) => item.id === conversationId, + ); + conversation && (conversation.adminUnreadMessageCount = 0); + }, + /** 更新会话缓存 */ + async updateConversation(conversationId: number) { + if (isEmpty(this.conversationList)) { + return; + } + + const conversation = + await KeFuConversationApi.getConversation(conversationId); + this.deleteConversation(conversationId); + conversation && this.conversationList.push(conversation); + this.conversationSort(); + }, + /** 删除会话缓存 */ + deleteConversation(conversationId: number) { + const index = this.conversationList.findIndex( + (item) => item.id === conversationId, + ); + // 存在则删除 + if (index !== -1) { + this.conversationList.splice(index, 1); + } + }, + conversationSort() { + // 按置顶属性和最后消息时间排序 + this.conversationList.sort((a, b) => { + // 按照置顶排序,置顶的会在前面 + if (a.adminPinned !== b.adminPinned) { + return a.adminPinned ? -1 : 1; + } + // 按照最后消息时间排序,最近的会在前面 + return ( + (b.lastMessageTime as unknown as number) - + (a.lastMessageTime as unknown as number) + ); + }); + }, + }, +}); + +// 解决热更新问题 +const hot = import.meta.hot; +if (hot) { + hot.accept(acceptHMRUpdate(useMallKefuStore, hot)); +} diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/a.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/a.png new file mode 100644 index 0000000000000000000000000000000000000000..32939004d69bf26555bebe6ca040a82d3fe84c3b Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/a.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/aini.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/aini.png new file mode 100644 index 0000000000000000000000000000000000000000..02cf5c49830e1002b481e6a21bfb3947eaf24549 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/aini.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/aixin.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/aixin.png new file mode 100644 index 0000000000000000000000000000000000000000..25e64223495ba2e55aaffd690f1cd4a553b77afd Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/aixin.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/baiyan.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/baiyan.png new file mode 100644 index 0000000000000000000000000000000000000000..d16260afd6443e2bb7a257d0b425f18c4c2c7ccd Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/baiyan.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/bizui.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/bizui.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b18002e882336b0ffdd6c508a98bb5178a0205 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/bizui.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/buhaoyisi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/buhaoyisi.png new file mode 100644 index 0000000000000000000000000000000000000000..54c4b3f71376f0e33d67e7ee74c31b75059d44dd Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/buhaoyisi.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/bukesiyi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/bukesiyi.png new file mode 100644 index 0000000000000000000000000000000000000000..5f272e3e4e59e92cd88c63f2579cc8f46563d3da Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/bukesiyi.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/dajing.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/dajing.png new file mode 100644 index 0000000000000000000000000000000000000000..8649727ecd4219f16fa5440a53774274ebccd3a0 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/dajing.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/danao.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/danao.png new file mode 100644 index 0000000000000000000000000000000000000000..aa85a294752cf73cbc8885dfdfe5b3d7e8036d84 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/danao.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/daxiao.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/daxiao.png new file mode 100644 index 0000000000000000000000000000000000000000..26206bc0578f0817dacd62de9fae05b7f7d315d3 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/daxiao.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/dianzan.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/dianzan.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7f00eba9e1335ee20298e4fd764ebc88961226 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/dianzan.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/emo.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/emo.png new file mode 100644 index 0000000000000000000000000000000000000000..9c84551659150372083909ea21a5136b89d03fa3 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/emo.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/esi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/esi.png new file mode 100644 index 0000000000000000000000000000000000000000..84e9726f13e6015cbf2c0bbf62f6386a2d020516 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/esi.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/fadai.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fadai.png new file mode 100644 index 0000000000000000000000000000000000000000..0772de262339066ceab006ab81731eeeeaeb7fca Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fadai.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/fankun.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fankun.png new file mode 100644 index 0000000000000000000000000000000000000000..6e18dac3ecd9a88a74a3a7f8db6ca5ed4d437201 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fankun.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/feiwen.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/feiwen.png new file mode 100644 index 0000000000000000000000000000000000000000..be9761658d3424b01c713908c7c4fedce8e4567f Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/feiwen.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/fennu.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fennu.png new file mode 100644 index 0000000000000000000000000000000000000000..20c57338cc5103321e3056f170521a59d70b1ccc Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/fennu.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganga.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganga.png new file mode 100644 index 0000000000000000000000000000000000000000..30ec329d2f1093af1643194b8b72140e8cb4a12a Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganga.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganmao.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganmao.png new file mode 100644 index 0000000000000000000000000000000000000000..35bbb89f33806ddaecaf947dff4b6c4559a49c02 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ganmao.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/hanyan.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/hanyan.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bc838b1ce04c4faf8627307a02435afccf58cb Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/hanyan.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/haochi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/haochi.png new file mode 100644 index 0000000000000000000000000000000000000000..2e52b6bee69cc436f8fae3d4dbefb85fe76864a3 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/haochi.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/hongxin.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/hongxin.png new file mode 100644 index 0000000000000000000000000000000000000000..65b5de8f0922e148c84ed8cd44863fb2f0bcd6a4 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/hongxin.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/huaixiao.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/huaixiao.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0e76c4c9bd004e8855656bb7ceadc287eac388 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/huaixiao.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingkong.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingkong.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa65845ffaac2909d98ddc03524ff1c5ec933f3 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingkong.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingshu.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingshu.png new file mode 100644 index 0000000000000000000000000000000000000000..0e984d68dfed93934adf0803e29b916cf801abe2 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingshu.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingya.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingya.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba6bab326a0a9541d831d5d7281b80ec0e04196 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/jingya.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/kaixin.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/kaixin.png new file mode 100644 index 0000000000000000000000000000000000000000..29c9f5ddb6567052bca2075325de3f95485ae7ea Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/kaixin.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/keai.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/keai.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b582c6945b4c1aa04f1b58f54c0ee1d9e3e8fa Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/keai.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/keshui.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/keshui.png new file mode 100644 index 0000000000000000000000000000000000000000..cef489ea4d60ec713bf0cc8802a5500ffd5479b1 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/keshui.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/kun.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/kun.png new file mode 100644 index 0000000000000000000000000000000000000000..1ddc388a684febead030fe56064ef039146519fe Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/kun.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/lengku.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/lengku.png new file mode 100644 index 0000000000000000000000000000000000000000..c5c6feebbeb152d829d312a00891b1c933066147 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/lengku.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/liuhan.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liuhan.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ddc6f4d706eab7c3ccf816520b26e9f7aef959 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liuhan.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/liukoushui.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liukoushui.png new file mode 100644 index 0000000000000000000000000000000000000000..3e2fba6560d9e095c73b223f5cee681ef9aa62f0 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liukoushui.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/liulei.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liulei.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf820404f26c4dab085fd7811406bb3d52275c8 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/liulei.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/mengbi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/mengbi.png new file mode 100644 index 0000000000000000000000000000000000000000..a4206eefb4017743ae56a3527c97a035bcbe281a Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/mengbi.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/mianwubiaoqing.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/mianwubiaoqing.png new file mode 100644 index 0000000000000000000000000000000000000000..6f315b98e12117b67874afc5b1368fa083a96f8c Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/mianwubiaoqing.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/nanguo.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/nanguo.png new file mode 100644 index 0000000000000000000000000000000000000000..19b9fb94aef26aa8cbfcb40fe6e3f4bd06b82c8a Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/nanguo.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/outu.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/outu.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9a06d63ebc6fd1ce5c0906517f51dc5cec3b08 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/outu.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/picture.svg b/apps/web-antd/src/views/mall/promotion/kefu/asserts/picture.svg new file mode 100644 index 0000000000000000000000000000000000000000..8811d495712b42e73329faeb58b6bd430b77d6da --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/asserts/picture.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/shengqi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/shengqi.png new file mode 100644 index 0000000000000000000000000000000000000000..7dce41dc993a0de9004f396df71d955646adef8e Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/shengqi.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/shuizhuo.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/shuizhuo.png new file mode 100644 index 0000000000000000000000000000000000000000..97d0f0a67982cea1d265f76d0b8a31c9212217cb Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/shuizhuo.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/tianshi.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/tianshi.png new file mode 100644 index 0000000000000000000000000000000000000000..eb922dd7ac765707287c2434fb6b2bed2b3f8f4d Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/tianshi.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaodiaoya.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaodiaoya.png new file mode 100644 index 0000000000000000000000000000000000000000..29fbc0e19391a43886eabbfa1cdea17647ab01d6 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaodiaoya.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaoku.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaoku.png new file mode 100644 index 0000000000000000000000000000000000000000..88a169d4f92de79f254ce763df4c7091a09684d0 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiaoku.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/xinsui.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xinsui.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f572a11277a77eb7058344a7512785f8bf1874 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xinsui.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiong.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiong.png new file mode 100644 index 0000000000000000000000000000000000000000..43dfd70908d1ada6aae6166bbd26db3e773471d7 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/xiong.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/yiwen.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/yiwen.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0da7095c9682d09b99228d50c6de0607c2b5b2 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/yiwen.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/yun.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/yun.png new file mode 100644 index 0000000000000000000000000000000000000000..56e5d02189878cc2c197fa90c405d6ed1070e13b Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/yun.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/asserts/ziya.png b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ziya.png new file mode 100644 index 0000000000000000000000000000000000000000..593ef5e68f3933d19284eb3dd348a4fdfeec40c1 Binary files /dev/null and b/apps/web-antd/src/views/mall/promotion/kefu/asserts/ziya.png differ diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue new file mode 100644 index 0000000000000000000000000000000000000000..48843f36dda1480264c5f1957e7bee41fa53df4b --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue @@ -0,0 +1,286 @@ + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue new file mode 100644 index 0000000000000000000000000000000000000000..d6204202211ac14b22aead43058a6fa9d70d0866 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue @@ -0,0 +1,565 @@ + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts b/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..95d6def99c126648505cee37ad294374324d1660 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts @@ -0,0 +1,3 @@ +export { default as KeFuConversationList } from './KeFuConversationList.vue'; +export { default as KeFuMessageList } from './KeFuMessageList.vue'; +export { default as MemberInfo } from './member/MemberInfo.vue'; diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue new file mode 100644 index 0000000000000000000000000000000000000000..0d395a830acbb899b83563f73eb5c04ea76d3627 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue @@ -0,0 +1,288 @@ + + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue new file mode 100644 index 0000000000000000000000000000000000000000..bb94ad3b2972ce7fc3a2e643cffa2f83116dd773 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue @@ -0,0 +1,55 @@ + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue new file mode 100644 index 0000000000000000000000000000000000000000..e1a25aa4c9639e591df04e5daa087608e678cf13 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..22464b1344ac88a5e9491bcfce251a4db862b0d6 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue @@ -0,0 +1,25 @@ + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..74b7b4eceb5a3176a34e91c5807fbb3a3f56be45 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..9766318c84aae51df53659f56849feade51d42f7 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue new file mode 100644 index 0000000000000000000000000000000000000000..46ac6bd1059006ba64c0ccce4ff54e687a53139c --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue @@ -0,0 +1,55 @@ + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/PictureSelectUpload.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/PictureSelectUpload.vue new file mode 100644 index 0000000000000000000000000000000000000000..111fb5529420ce851ef38c619b3369a9b3f872d8 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/PictureSelectUpload.vue @@ -0,0 +1,96 @@ + + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/constants.ts b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..a4d747edef8bb54c3f27052058bb6a86258d5833 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/constants.ts @@ -0,0 +1,17 @@ +// 客服消息类型枚举类 +export const KeFuMessageContentTypeEnum = { + TEXT: 1, // 文本消息 + IMAGE: 2, // 图片消息 + VOICE: 3, // 语音消息 + VIDEO: 4, // 视频消息 + SYSTEM: 5, // 系统消息 + // ========== 商城特殊消息 ========== + PRODUCT: 10, // 商品消息 + ORDER: 11, // 订单消息" +}; + +// Promotion 的 WebSocket 消息类型枚举类 +export const WebSocketMessageTypeConstants = { + KEFU_MESSAGE_TYPE: 'kefu_message_type', // 客服消息类型 + KEFU_MESSAGE_ADMIN_READ: 'kefu_message_read_status_change', // 客服消息管理员已读 +}; diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/emoji.ts b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/emoji.ts new file mode 100644 index 0000000000000000000000000000000000000000..5481ce0659363b6a9608b9bc29b35a9d573a3495 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/components/tools/emoji.ts @@ -0,0 +1,130 @@ +import { onMounted, ref } from 'vue'; + +import { isEmpty } from '@vben/utils'; + +const emojiList = [ + { name: '[笑掉牙]', file: 'xiaodiaoya.png' }, + { name: '[可爱]', file: 'keai.png' }, + { name: '[冷酷]', file: 'lengku.png' }, + { name: '[闭嘴]', file: 'bizui.png' }, + { name: '[生气]', file: 'shengqi.png' }, + { name: '[惊恐]', file: 'jingkong.png' }, + { name: '[瞌睡]', file: 'keshui.png' }, + { name: '[大笑]', file: 'daxiao.png' }, + { name: '[爱心]', file: 'aixin.png' }, + { name: '[坏笑]', file: 'huaixiao.png' }, + { name: '[飞吻]', file: 'feiwen.png' }, + { name: '[疑问]', file: 'yiwen.png' }, + { name: '[开心]', file: 'kaixin.png' }, + { name: '[发呆]', file: 'fadai.png' }, + { name: '[流泪]', file: 'liulei.png' }, + { name: '[汗颜]', file: 'hanyan.png' }, + { name: '[惊悚]', file: 'jingshu.png' }, + { name: '[困~]', file: 'kun.png' }, + { name: '[心碎]', file: 'xinsui.png' }, + { name: '[天使]', file: 'tianshi.png' }, + { name: '[晕]', file: 'yun.png' }, + { name: '[啊]', file: 'a.png' }, + { name: '[愤怒]', file: 'fennu.png' }, + { name: '[睡着]', file: 'shuizhuo.png' }, + { name: '[面无表情]', file: 'mianwubiaoqing.png' }, + { name: '[难过]', file: 'nanguo.png' }, + { name: '[犯困]', file: 'fankun.png' }, + { name: '[好吃]', file: 'haochi.png' }, + { name: '[呕吐]', file: 'outu.png' }, + { name: '[龇牙]', file: 'ziya.png' }, + { name: '[懵比]', file: 'mengbi.png' }, + { name: '[白眼]', file: 'baiyan.png' }, + { name: '[饿死]', file: 'esi.png' }, + { name: '[凶]', file: 'xiong.png' }, + { name: '[感冒]', file: 'ganmao.png' }, + { name: '[流汗]', file: 'liuhan.png' }, + { name: '[笑哭]', file: 'xiaoku.png' }, + { name: '[流口水]', file: 'liukoushui.png' }, + { name: '[尴尬]', file: 'ganga.png' }, + { name: '[惊讶]', file: 'jingya.png' }, + { name: '[大惊]', file: 'dajing.png' }, + { name: '[不好意思]', file: 'buhaoyisi.png' }, + { name: '[大闹]', file: 'danao.png' }, + { name: '[不可思议]', file: 'bukesiyi.png' }, + { name: '[爱你]', file: 'aini.png' }, + { name: '[红心]', file: 'hongxin.png' }, + { name: '[点赞]', file: 'dianzan.png' }, + { name: '[恶魔]', file: 'emo.png' }, +]; + +export interface Emoji { + name: string; + url: string; +} + +export const useEmoji = () => { + const emojiPathList = ref([]); + + /** 加载本地图片 */ + const initStaticEmoji = async () => { + const pathList = import.meta.glob('../../asserts/*.{png,jpg,jpeg,svg}'); + for (const path in pathList) { + const imageModule: any = await pathList[path](); + emojiPathList.value.push({ path, src: imageModule.default }); + } + }; + + /** 初始化 */ + onMounted(async () => { + if (isEmpty(emojiPathList.value)) { + await initStaticEmoji(); + } + }); + + /** + * 将文本中的表情替换成图片 + * + * @return 替换后的文本 + * @param content 消息内容 + */ + const replaceEmoji = (content: string) => { + let newData = content; + if (typeof newData !== 'object') { + const reg = /\[(.+?)\]/g; // [] 中括号 + const zhEmojiName = newData.match(reg); + if (zhEmojiName) { + zhEmojiName.forEach((item) => { + const emojiFile = getEmojiFileByName(item); + newData = newData.replace( + item, + ``, + ); + }); + } + } + return newData; + }; + + /** + * 获得所有表情 + * + * @return 表情列表 + */ + function getEmojiList(): Emoji[] { + return emojiList.map((item) => ({ + url: getEmojiFileByName(item.name), + name: item.name, + })) as Emoji[]; + } + + function getEmojiFileByName(name: string) { + for (const emoji of emojiList) { + if (emoji.name === name) { + const emojiPath = emojiPathList.value.find( + (item: { path: string; src: string }) => + item.path.includes(emoji.file), + ); + return emojiPath ? emojiPath.src : undefined; + } + } + return false; + } + + return { replaceEmoji, getEmojiList }; +}; diff --git a/apps/web-antd/src/views/mall/promotion/kefu/index.vue b/apps/web-antd/src/views/mall/promotion/kefu/index.vue index 59a7d21791a388e3ec209d9dc33f04b503d8da6f..4197d7fde892dd0a2d22f042e70415b99eed2c30 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/index.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/index.vue @@ -1,28 +1,132 @@ + + diff --git a/packages/@core/base/shared/src/utils/util.ts b/packages/@core/base/shared/src/utils/util.ts index 5e2316a89b00a72883a86695cb6de5b3c0efe51b..4fbae5c7d607cee990edd9973c22a32af9c63a73 100644 --- a/packages/@core/base/shared/src/utils/util.ts +++ b/packages/@core/base/shared/src/utils/util.ts @@ -99,4 +99,18 @@ export function groupBy(array: any[], key: string) { result[groupKey].push(item); } return result; -} \ No newline at end of file +} + +/** + * 解析 JSON 字符串 + * + * @param str + */ +export function jsonParse(str: string) { + try { + return JSON.parse(str); + } catch { + console.warn(`str[${str}] 不是一个 JSON 字符串`); + return str; + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8a91aa6e9247568c740f4a5b544764e5d7a6a13..204d6a872cb39a027a127b5171ea2056271ac108 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -669,10 +669,10 @@ importers: version: link:scripts/vsh '@vitejs/plugin-vue': specifier: 'catalog:' - version: 6.0.1(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + version: 6.0.1(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': specifier: 'catalog:' - version: 5.1.1(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + version: 5.1.1(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vue/test-utils': specifier: 'catalog:' version: 2.4.6 @@ -714,10 +714,10 @@ importers: version: 3.6.1(sass@1.93.2)(typescript@5.9.3)(vue-tsc@2.2.10(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)) vite: specifier: 'catalog:' - version: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + version: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) vitest: specifier: 'catalog:' - version: 3.2.4(@types/node@22.18.12)(happy-dom@17.6.3)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/node@22.18.12)(happy-dom@17.6.3)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) vue: specifier: ^3.5.17 version: 3.5.22(typescript@5.9.3) @@ -797,6 +797,9 @@ importers: '@vben/utils': specifier: workspace:* version: link:../../packages/utils + '@vueuse/components': + specifier: ^14.0.0 + version: 14.0.0(vue@3.5.22(typescript@5.9.3)) '@vueuse/core': specifier: 'catalog:' version: 13.9.0(vue@3.5.22(typescript@5.9.3)) @@ -5307,6 +5310,11 @@ packages: '@vue/test-utils@2.4.6': resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + '@vueuse/components@14.0.0': + resolution: {integrity: sha512-0PFAbAzKo+Ipt45R0OVHvZwjTj9oDZJQ/lc77d020fKl9GrxEIRvVIzMW1CZVn1vwmGhXEZPIF3erjixW2yqpg==} + peerDependencies: + vue: ^3.5.17 + '@vueuse/core@10.11.1': resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} @@ -5318,6 +5326,11 @@ packages: peerDependencies: vue: ^3.5.17 + '@vueuse/core@14.0.0': + resolution: {integrity: sha512-d6tKRWkZE8IQElX2aHBxXOMD478fHIYV+Dzm2y9Ag122ICBpNKtGICiXKOhWU3L1kKdttDD9dCMS4bGP3jhCTQ==} + peerDependencies: + vue: ^3.5.17 + '@vueuse/core@9.13.0': resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} @@ -5413,6 +5426,9 @@ packages: '@vueuse/metadata@13.9.0': resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} + '@vueuse/metadata@14.0.0': + resolution: {integrity: sha512-6yoGqbJcMldVCevkFiHDBTB1V5Hq+G/haPlGIuaFZHpXC0HADB0EN1ryQAAceiW+ryS3niUwvdFbGiqHqBrfVA==} + '@vueuse/metadata@9.13.0': resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} @@ -5432,6 +5448,11 @@ packages: peerDependencies: vue: ^3.5.17 + '@vueuse/shared@14.0.0': + resolution: {integrity: sha512-mTCA0uczBgurRlwVaQHfG0Ja7UdGe4g9mwffiJmvLiTtp1G4AQyIjej6si/k8c8pUwTfVpNufck+23gXptPAkw==} + peerDependencies: + vue: ^3.5.17 + '@vueuse/shared@9.13.0': resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} @@ -15112,14 +15133,14 @@ snapshots: dependencies: vite-plugin-pwa: 1.1.0(vite@5.4.21(@types/node@24.9.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(workbox-build@7.3.0)(workbox-window@7.3.0) - '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) '@rolldown/pluginutils': 1.0.0-beta.44 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4) - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - supports-color @@ -15141,10 +15162,10 @@ snapshots: vite: 5.4.21(@types/node@24.9.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) vue: 3.5.22(typescript@5.9.3) - '@vitejs/plugin-vue@6.0.1(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) vue: 3.5.22(typescript@5.9.3) '@vitejs/plugin-vue@6.0.1(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': @@ -15161,13 +15182,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -15358,6 +15379,12 @@ snapshots: js-beautify: 1.15.4 vue-component-type-helpers: 2.2.12 + '@vueuse/components@14.0.0(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@vueuse/core': 14.0.0(vue@3.5.22(typescript@5.9.3)) + '@vueuse/shared': 14.0.0(vue@3.5.22(typescript@5.9.3)) + vue: 3.5.22(typescript@5.9.3) + '@vueuse/core@10.11.1(vue@3.5.22(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.20 @@ -15384,6 +15411,13 @@ snapshots: '@vueuse/shared': 13.9.0(vue@3.5.22(typescript@5.9.3)) vue: 3.5.22(typescript@5.9.3) + '@vueuse/core@14.0.0(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.0.0 + '@vueuse/shared': 14.0.0(vue@3.5.22(typescript@5.9.3)) + vue: 3.5.22(typescript@5.9.3) + '@vueuse/core@9.13.0(vue@3.5.22(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.16 @@ -15428,6 +15462,8 @@ snapshots: '@vueuse/metadata@13.9.0': {} + '@vueuse/metadata@14.0.0': {} + '@vueuse/metadata@9.13.0': {} '@vueuse/motion@3.0.3(magicast@0.3.5)(vue@3.5.22(typescript@5.9.3))': @@ -15461,6 +15497,10 @@ snapshots: dependencies: vue: 3.5.22(typescript@5.9.3) + '@vueuse/shared@14.0.0(vue@3.5.22(typescript@5.9.3))': + dependencies: + vue: 3.5.22(typescript@5.9.3) + '@vueuse/shared@9.13.0(vue@3.5.22(typescript@5.9.3))': dependencies: vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.3)) @@ -21587,13 +21627,13 @@ snapshots: dependencies: vite: 7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) - vite-node@3.2.4(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -21762,7 +21802,7 @@ snapshots: sass: 1.93.2 terser: 5.44.0 - vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): + vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.3 fdir: 6.5.0(picomatch@4.0.3) @@ -21773,7 +21813,7 @@ snapshots: optionalDependencies: '@types/node': 22.18.12 fsevents: 2.3.3 - jiti: 2.6.1 + jiti: 1.21.7 less: 4.4.2 sass: 1.93.2 terser: 5.44.0 @@ -21855,11 +21895,11 @@ snapshots: - typescript - universal-cookie - vitest@3.2.4(@types/node@22.18.12)(happy-dom@17.6.3)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): + vitest@3.2.4(@types/node@22.18.12)(happy-dom@17.6.3)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -21877,8 +21917,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.18.12 @@ -21901,7 +21941,7 @@ snapshots: dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4