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 @@