From 1f4c5ba6df6e065457f6cebe2edf97edb660bbdd Mon Sep 17 00:00:00 2001 From: wangyifeng <812766448@qq.com> Date: Wed, 26 Mar 2025 14:30:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86@=E6=98=BE=E7=A4=BA=E3=80=81?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E8=B7=B3=E8=BD=AC=E3=80=81=E5=85=8D=E6=89=93?= =?UTF-8?q?=E6=89=B0=E6=95=B0=E9=87=8F=E7=BB=9F=E8=AE=A1=E7=AD=89=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/chat/index.js | 26 +++++---- src/components/talk/message/TextMessage.vue | 2 +- src/event/talk.js | 13 +++++ src/pages/dialog/components/filePanel.vue | 3 ++ src/pages/dialog/index.vue | 58 ++++++++++++++++++--- src/store/modules/dialogue.js | 2 +- 6 files changed, 85 insertions(+), 19 deletions(-) diff --git a/src/api/chat/index.js b/src/api/chat/index.js index d140293..791858f 100644 --- a/src/api/chat/index.js +++ b/src/api/chat/index.js @@ -1,5 +1,9 @@ import request from '@/service/index.js' import qs from 'qs' +import { + useTalkStore, + useDialogueStore +} from '@/store' // 获取聊天列表服务接口 export const ServeGetTalkList = (data) => { @@ -40,22 +44,24 @@ export const ServeTopTalkList = (data) => { // 清除聊天消息未读数服务接口 export const ServeClearTalkUnreadNum = (data, unReadNum) => { console.log('=======chatApp==UnreadNum', unReadNum) - if (typeof plus !== 'undefined') { - let OAWebView = plus.webview.all() - OAWebView.forEach((webview) => { - if (webview.id === 'webviewId1') { - webview.evalJS(`updateUnreadMsgNumReduce('${unReadNum}')`) - } - }) - } else { - document.addEventListener('plusready', () => { + if(!useTalkStore().items[useTalkStore().findTalkIndex(useDialogueStore().index_name)].is_disturb){ + if (typeof plus !== 'undefined') { let OAWebView = plus.webview.all() OAWebView.forEach((webview) => { if (webview.id === 'webviewId1') { webview.evalJS(`updateUnreadMsgNumReduce('${unReadNum}')`) } }) - }) + } else { + document.addEventListener('plusready', () => { + let OAWebView = plus.webview.all() + OAWebView.forEach((webview) => { + if (webview.id === 'webviewId1') { + webview.evalJS(`updateUnreadMsgNumReduce('${unReadNum}')`) + } + }) + }) + } } return request({ url: '/api/v1/talk/unread/clear', diff --git a/src/components/talk/message/TextMessage.vue b/src/components/talk/message/TextMessage.vue index 0afb544..bd278db 100644 --- a/src/components/talk/message/TextMessage.vue +++ b/src/components/talk/message/TextMessage.vue @@ -15,7 +15,7 @@ const float = props.data.float const textContent = computed(() => { let text = props.extra?.content || '' - text = textReplaceLink(text) + // text = textReplaceLink(text) if (props.data.talk_type == 2) { text = textReplaceMention(text, '#1890ff') } diff --git a/src/event/talk.js b/src/event/talk.js index 4a9579b..1a0879f 100644 --- a/src/event/talk.js +++ b/src/event/talk.js @@ -307,6 +307,19 @@ class Talk extends Base { msg_text: this.getTalkText(), updated_at: parseTime(new Date()), }) + //收到新消息时,同时判断是否有人@我 + if ( + this.resource.msg_type === 1 && + this.resource?.extra?.mentions?.length > 0 + ) { + const findMention = this.resource?.extra?.mentions?.find( + (mention) => mention === this.getAccountId(), + ) + //有人@我,则更新会话列表 + if (findMention) { + useTalkStore().loadTalkList() + } + } if (this.resource.msg_type == 1116) { // 更新会话列表中的会话信息 const dialogue = useDialogueListStore().getDialogueList( diff --git a/src/pages/dialog/components/filePanel.vue b/src/pages/dialog/components/filePanel.vue index 22553d9..efb0d75 100644 --- a/src/pages/dialog/components/filePanel.vue +++ b/src/pages/dialog/components/filePanel.vue @@ -139,6 +139,9 @@ const photoActionsSelect = (index) => { filter: 'image', maximum: 9, multiple: true, + onmaxed: () => { + plus.nativeUI.toast('最多只能选择9张图片') + }, }, ) } diff --git a/src/pages/dialog/index.vue b/src/pages/dialog/index.vue index 8a01036..78dfce0 100644 --- a/src/pages/dialog/index.vue +++ b/src/pages/dialog/index.vue @@ -568,6 +568,10 @@ const state = ref({ lastCursorIndex: undefined, //在失焦前保存光标位置 mentionUserIds: [], //存储所有被@的用户ID isInsertingMention: false, //是否正在插入mention + showMentionSelectTimer: null, //显示提醒选择框的定时器 + lastMentionText: '', // 记录上一次触发@时的完整文本内容 + lastMentionTriggered: false, // 记录当前@是否已经触发过 + lastMentionPosition: -1, // 添加新的状态来记录上一次@的位置 }) uniOnload(async (options) => { @@ -595,10 +599,13 @@ uniOnload(async (options) => { }) uniOnUnload(() => { console.log('onUnload') - ServeClearTalkUnreadNum({ - talk_type: Number(talkParams.type), - receiver_id: Number(talkParams.receiver_id), - },talkParams.unReadNum).then(() => { + ServeClearTalkUnreadNum( + { + talk_type: Number(talkParams.type), + receiver_id: Number(talkParams.receiver_id), + }, + talkParams.unReadNum, + ).then(() => { talkStore.updateItem({ index_name: talkParams.index_name, unread_num: 0, @@ -624,6 +631,8 @@ const handleHidePanel = () => { //点击编辑区聚焦输入框 const onEditorClick = () => { handleHidePanel() + const quill = getQuill() + quill.focus() } const onSendMessage = (data = {}, callBack) => { @@ -889,9 +898,9 @@ const editorOption = { if (range) { state.value.lastCursorIndex = range.index } - state.value.isShowMentionSelect = true - // 失去焦点 - quill.blur() + + // 使用防抖函数 + showMentionSelectDebounced(quill) }, mentionContainerClass: '', }, @@ -1600,7 +1609,42 @@ onUnmounted(() => { if (avatarPressTimer) { clearTimeout(avatarPressTimer) } + // 清理防抖定时器 + if (state.value.showMentionSelectTimer) { + clearTimeout(state.value.showMentionSelectTimer) + } }) + +// 修改防抖函数的实现 +const showMentionSelectDebounced = (quill) => { + const text = quill.getText() + // 如果文本内容与上次不同,重置触发状态 + console.log( + 'lastMentionText', + state.value.lastMentionText, + state.value.lastMentionText.length, + ) + console.log('text', text, text.length) + console.log(state.value.lastMentionTriggered) + if (text !== state.value.lastMentionText) { + state.value.lastMentionTriggered = false + } + if (text.length === 2) { + state.value.lastMentionText = text + state.value.lastMentionTriggered = true + state.value.isShowMentionSelect = true + } + // 如果已经触发过,则不再触发 + if (state.value.lastMentionTriggered) { + return + } + + // 记录当前文本内容和触发状态 + state.value.lastMentionText = text + state.value.lastMentionTriggered = true + state.value.isShowMentionSelect = true + quill.blur() +}