From 59aab8ecdc8400f78fd5a4605b8499c985f190b0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 6 May 2026 08:47:18 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(im):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=90=8D=E7=89=87=E6=B6=88=E6=81=AF=E7=B1=BB=E5=9E=8B=20v0.3?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0=E8=A1=A8=E6=83=85=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/user/RecommendCardDialog.vue | 44 +++++++++++----- .../im/home/components/user/UserAvatar.vue | 11 ++-- .../components/message/MessageItem.vue | 52 +++++++++++++------ .../im/home/pages/conversation/index.vue | 14 ++--- src/views/im/home/store/uiStore.ts | 11 ++++ src/views/im/utils/conversation.ts | 12 +++++ 6 files changed, 97 insertions(+), 47 deletions(-) diff --git a/src/views/im/home/components/user/RecommendCardDialog.vue b/src/views/im/home/components/user/RecommendCardDialog.vue index 4adbc7b86..bd091efda 100644 --- a/src/views/im/home/components/user/RecommendCardDialog.vue +++ b/src/views/im/home/components/user/RecommendCardDialog.vue @@ -148,8 +148,25 @@ - - + +
+ + + + + +
@@ -175,10 +192,11 @@ import Icon from '@/components/Icon/src/Icon.vue' import { useMessage } from '@/hooks/web/useMessage' import UserAvatar from './UserAvatar.vue' +import EmojiPicker from '../../pages/conversation/components/input/EmojiPicker.vue' import { useConversationStore } from '../../store/conversationStore' import { useMessageSender } from '../../composables/useMessageSender' import { ImConversationType, ImMessageType } from '../../../utils/constants' -import { getConversationKey } from '../../../utils/conversation' +import { filterConversationsByKeyword, getConversationKey } from '../../../utils/conversation' import { serializeMessage, type CardMessage } from '../../../utils/message' import type { Conversation, User } from '../../types' @@ -207,6 +225,8 @@ const visible = computed({ const keyword = ref('') const leaveMessage = ref('') const sending = ref(false) +/** 表情面板显隐:右侧 smile icon 切换 */ +const emojiVisible = ref(false) /** 已勾选的会话 key 列表(type:targetId 组合主键);selectedSet 派生用于 row 快查 */ const selectedKeys = ref([]) /** 已选 key 集合:handlerToggle 写数组,row isSelected 走 set 快查避免 O(N) 扫描 */ @@ -220,6 +240,12 @@ function resetForm() { keyword.value = '' leaveMessage.value = '' selectedKeys.value = [] + emojiVisible.value = false +} + +/** 选中 emoji:直接拼到留言末尾;EmojiPicker 自身 emit('update:visible', false) 关闭面板 */ +function handleEmojiSelect(emoji: string) { + leaveMessage.value = `${leaveMessage.value}${emoji}` } /** 候选会话:私聊「推荐给本人」过滤掉避免无意义自推 */ @@ -231,15 +257,9 @@ const candidateConversations = computed(() => { }) /** 按搜索关键字过滤展示列表(仅按 name 模糊匹配) */ -const shownConversations = computed(() => { - const keywordLower = keyword.value.trim().toLowerCase() - if (!keywordLower) { - return candidateConversations.value - } - return candidateConversations.value.filter((c) => - (c.name || '').toLowerCase().includes(keywordLower) - ) -}) +const shownConversations = computed(() => + filterConversationsByKeyword(candidateConversations.value, keyword.value) +) /** 已选会话:右栏预览渲染用,按 selectedKeys 顺序展示 */ const selectedConversations = computed(() => { diff --git a/src/views/im/home/components/user/UserAvatar.vue b/src/views/im/home/components/user/UserAvatar.vue index a08db53f8..905da49f9 100644 --- a/src/views/im/home/components/user/UserAvatar.vue +++ b/src/views/im/home/components/user/UserAvatar.vue @@ -130,12 +130,7 @@ function handleClick(e: MouseEvent) { } // 情况一:有预传 user 信息:就直接用,省一次接口 if (props.user) { - uiStore.openUserInfoCard( - props.user, - { x: e.clientX + 20, y: e.clientY }, - props.addSource, - props.addSourceExtra - ) + uiStore.openUserInfoCardAtEvent(props.user, e, props.addSource, props.addSourceExtra) return } // 情况二:无预传 user 信息:打开名片,传最小必要信息(id + 昵称 + 头像),位置在鼠标右侧 @@ -143,13 +138,13 @@ function handleClick(e: MouseEvent) { if (!numId || numId <= 0) { return } - uiStore.openUserInfoCard( + uiStore.openUserInfoCardAtEvent( { id: numId, nickname: props.name, avatar: props.url }, - { x: e.clientX + 20, y: e.clientY }, + e, props.addSource, props.addSourceExtra ) diff --git a/src/views/im/home/pages/conversation/components/message/MessageItem.vue b/src/views/im/home/pages/conversation/components/message/MessageItem.vue index 9e5bec785..fdce70f4d 100644 --- a/src/views/im/home/pages/conversation/components/message/MessageItem.vue +++ b/src/views/im/home/pages/conversation/components/message/MessageItem.vue @@ -60,12 +60,7 @@
{{ textContent }}
@@ -89,13 +84,7 @@
@@ -204,9 +193,10 @@