diff --git a/src/utils/dict.ts b/src/utils/dict.ts
index 7cb356818..c0cd1afda 100644
--- a/src/utils/dict.ts
+++ b/src/utils/dict.ts
@@ -333,6 +333,8 @@ export enum DICT_TYPE {
IM_GROUP_MESSAGE_STATUS = 'im_group_message_status', // IM 群聊消息状态:0=正常 / 2=已撤回
IM_GROUP_MESSAGE_RECEIPT_STATUS = 'im_group_message_receipt_status', // IM 群消息回执状态
IM_FRIEND_STATUS = 'im_friend_status', // IM 好友状态
+ IM_FRIEND_ADD_SOURCE = 'im_friend_add_source', // IM 好友添加来源
+ IM_FRIEND_REQUEST_HANDLE_RESULT = 'im_friend_request_handle_result', // IM 好友申请处理结果
IM_GROUP_STATUS = 'im_group_status', // IM 群状态
IM_GROUP_MEMBER_ROLE = 'im_group_member_role' // IM 群成员角色
}
diff --git a/src/views/im/home/components/ToolBar.vue b/src/views/im/home/components/ToolBar.vue
index ee715d5b9..66d5b8b58 100644
--- a/src/views/im/home/components/ToolBar.vue
+++ b/src/views/im/home/components/ToolBar.vue
@@ -30,6 +30,14 @@
>
+
+
+
@@ -55,6 +63,7 @@ import { useRoute, useRouter } from 'vue-router'
import Icon from '@/components/Icon/src/Icon.vue'
import { useUserStore } from '@/store/modules/user'
import { useConversationStore } from '../store/conversationStore'
+import { useFriendStore } from '../store/friendStore'
import UserAvatar from './user/UserAvatar.vue'
defineOptions({ name: 'ImToolBar' })
@@ -63,15 +72,15 @@ const route = useRoute()
const router = useRouter()
const userStore = useUserStore()
const conversationStore = useConversationStore()
+const friendStore = useFriendStore()
-/** 消息 Tab 的红点:所有非免打扰会话的未读总和 */
-const totalUnread = computed(() => conversationStore.getTotalUnread)
+const totalUnread = computed(() => conversationStore.getTotalUnread) // 消息 Tab 的红点:所有非免打扰会话的未读总和
+const unhandledRequestCount = computed(() => friendStore.getUnhandledRequestCount) // 通讯录 Tab 的红点:未处理好友申请数(接收方=我)
-/** 两个主 Tab;用路由 name 而非 path,避免前缀 / 嵌套调整后失效 */
const tabs = [
{ name: 'ImHomeConversation', label: '消息', icon: 'ep:chat-round' },
{ name: 'ImHomeContact', label: '通讯录', icon: 'mingcute:contacts-line' }
-]
+] // 两个主 Tab;用路由 name 而非 path,避免前缀 / 嵌套调整后失效
/** 当前路由是否命中 Tab:直接比对 route.name */
const isActive = (name: string) => route.name === name
diff --git a/src/views/im/home/components/friend/FriendAddDialog.vue b/src/views/im/home/components/friend/FriendAddDialog.vue
index 23a50b99e..8aa6c3256 100644
--- a/src/views/im/home/components/friend/FriendAddDialog.vue
+++ b/src/views/im/home/components/friend/FriendAddDialog.vue
@@ -136,6 +136,7 @@ import { useUserStore } from '@/store/modules/user'
import UserAvatar from '../user/UserAvatar.vue'
import { useFriendStore } from '../../store/friendStore'
import { getCurrentUserId } from '../../../utils/storage'
+import { ImFriendAddSource } from '../../../utils/constants'
import { getGenderColor, getGenderIcon } from '../../../utils/user'
import { getSimpleUserListByNickname, type UserVO } from '@/api/system/user'
@@ -153,7 +154,7 @@ const props = withDefaults(
}>(),
{
presetUser: null,
- addSource: 1
+ addSource: ImFriendAddSource.SEARCH
}
)
@@ -226,8 +227,7 @@ function buildPresetApplyContent(): string {
return ''
}
// 群聊场景拼带群名的话术;其它场景默认「我是 YY」
- // TODO @AI:使用 addSource 的枚举;
- const groupExtra = props.addSource === 2 ? props.addSourceExtra : ''
+ const groupExtra = props.addSource === ImFriendAddSource.GROUP ? props.addSourceExtra : ''
return groupExtra ? `我是"${groupExtra}"的${myNickname}` : `我是${myNickname}`
}
diff --git a/src/views/im/home/components/group/GroupMember.vue b/src/views/im/home/components/group/GroupMember.vue
index 363c48917..874786b2b 100644
--- a/src/views/im/home/components/group/GroupMember.vue
+++ b/src/views/im/home/components/group/GroupMember.vue
@@ -14,7 +14,7 @@
:url="member.avatar"
:clickable="clickable"
:id="member.userId"
- :add-source="2"
+ :add-source="ImFriendAddSource.GROUP"
:add-source-extra="groupName"
/>
-
import UserAvatar from '../user/UserAvatar.vue'
+import { ImFriendAddSource } from '../../../utils/constants'
import type { GroupMemberLite } from './GroupMember.vue'
defineOptions({ name: 'ImGroupMemberGrid' })
diff --git a/src/views/im/home/components/user/UserAvatar.vue b/src/views/im/home/components/user/UserAvatar.vue
index 4be0aed77..a08db53f8 100644
--- a/src/views/im/home/components/user/UserAvatar.vue
+++ b/src/views/im/home/components/user/UserAvatar.vue
@@ -45,6 +45,7 @@
import { computed } from 'vue'
import { useImUiStore } from '../../store/uiStore'
+import { ImFriendAddSource } from '../../../utils/constants'
import type { User } from '../../types'
defineOptions({ name: 'ImUserAvatar', inheritAttrs: false })
@@ -69,7 +70,7 @@ const props = withDefaults(
clickable: true,
previewable: false,
previewZIndex: 2000,
- addSource: 1 // @AI:是不是枚举下;
+ addSource: ImFriendAddSource.SEARCH
}
)
diff --git a/src/views/im/home/components/user/UserInfo.vue b/src/views/im/home/components/user/UserInfo.vue
index 237b176e1..fd4125c62 100644
--- a/src/views/im/home/components/user/UserInfo.vue
+++ b/src/views/im/home/components/user/UserInfo.vue
@@ -295,7 +295,12 @@ function handleChat() {
emit('chat', props.user)
}
-// TODO @AI:添加好友、删除好友,作为一个 ==== 栏目,这样好理解点;
+/** 占位提示:语音 / 视频聊天能力尚未接入,先以"开发中"友好提示 */
+function handleComingSoon(featureName: string) {
+ message.info(`${featureName} 功能开发中`)
+}
+
+// ==================== 添加好友 / 删除好友 ====================
// 加好友弹窗显隐 + 预填用户(点「加为好友」时把 props.user 传给 FriendAddDialog 跳过搜索)
const addFriendVisible = ref(false)
@@ -330,11 +335,6 @@ async function handleDeleteFriend() {
message.success('已删除好友')
emit('deleted', target)
}
-
-/** 占位提示:语音 / 视频聊天能力尚未接入,先以"开发中"友好提示 */
-function handleComingSoon(featureName: string) {
- message.info(`${featureName} 功能开发中`)
-}