diff --git a/src/views/im/home/components/friend/FriendAddDialog.vue b/src/views/im/home/components/friend/FriendAddDialog.vue index 8aa6c3256..388387238 100644 --- a/src/views/im/home/components/friend/FriendAddDialog.vue +++ b/src/views/im/home/components/friend/FriendAddDialog.vue @@ -261,20 +261,20 @@ function backToSearch() { targetUser.value = null } -/** 提交好友申请 */ +/** 提交好友申请:返回 requestId 走「等待验证」;返回 null 表示后端命中「单向好友静默重启」分支,已直接成为好友 */ async function handleSubmitApply() { if (!targetUser.value) { return } submitting.value = true try { - await friendStore.applyFriend({ + const requestId = await friendStore.applyFriend({ toUserId: targetUser.value.id, applyContent: applyContent.value.trim() || undefined, displayName: displayName.value.trim() || undefined, addSource: props.addSource }) - message.success('申请已发送,等待对方验证') + message.success(requestId ? '申请已发送,等待对方验证' : '已添加为好友') visible.value = false } finally { submitting.value = false diff --git a/src/views/im/home/components/user/UserInfo.vue b/src/views/im/home/components/user/UserInfo.vue index fd4125c62..b4daa23af 100644 --- a/src/views/im/home/components/user/UserInfo.vue +++ b/src/views/im/home/components/user/UserInfo.vue @@ -70,7 +70,7 @@ " @click="handleRowClick" > - 备注 + 备注 + + + @@ -161,6 +178,8 @@ import FriendAddDialog from '../friend/FriendAddDialog.vue' import { getSimpleUser, type UserVO } from '@/api/system/user' import { useFriendStore } from '../../store/friendStore' import { getGenderColor, getGenderIcon } from '../../../utils/user' +import { DICT_TYPE, getDictLabel } from '@/utils/dict' +import { formatDate } from '@/utils/formatTime' import type { User } from '../../types' defineOptions({ name: 'ImUserInfo' }) @@ -218,6 +237,11 @@ const deptText = computed(() => full.value?.deptName || '-') const genderIcon = computed(() => getGenderIcon(full.value?.sex)) const genderColor = computed(() => getGenderColor(full.value?.sex)) +/** 好友关系记录:来源 / 添加时间从这里取(仅 friend 态下才有意义) */ +const friendInfo = computed(() => + props.user?.id ? friendStore.getFriend(props.user.id) : undefined +) + /** 备注内联编辑:editingRemark 控制输入态;user 切换时由下面的 watch 复位避免脏态泄漏 */ const editingRemark = ref(false) const remarkInput = ref('') diff --git a/src/views/im/home/pages/contact/FriendRequestDetail.vue b/src/views/im/home/pages/contact/FriendRequestDetail.vue index d36d4239d..df1dffce4 100644 --- a/src/views/im/home/pages/contact/FriendRequestDetail.vue +++ b/src/views/im/home/pages/contact/FriendRequestDetail.vue @@ -1,12 +1,21 @@ - - - 发消息 - - - 已拒绝 - + 已拒绝 @@ -85,11 +84,12 @@ import { useMessage } from '@/hooks/web/useMessage' import { ElMessageBox } from 'element-plus' import UserAvatar from '../../components/user/UserAvatar.vue' +import UserInfo from '../../components/user/UserInfo.vue' import { useFriendStore } from '../../store/friendStore' import { getCurrentUserId } from '../../../utils/storage' import { ImFriendRequestHandleResult } from '../../../utils/constants' import { DICT_TYPE, getDictLabel } from '@/utils/dict' -import type { FriendRequest } from '../../types' +import type { FriendRequest, User } from '../../types' defineOptions({ name: 'ImContactFriendRequestDetail' }) @@ -109,6 +109,16 @@ const currentUserId = Number(getCurrentUserId() || 0) /** 是不是我发起的(fromUserId === me) */ const iSentIt = computed(() => props.request.fromUserId === currentUserId) +/** 是否「已拒绝」态:模板里多处用到,computed 一次省得到处写枚举比对 */ +const refused = computed( + () => props.request.handleResult === ImFriendRequestHandleResult.REFUSED +) + +/** 是否「已通过」态:转走 UserInfo 好友详情入口 */ +const agreed = computed( + () => props.request.handleResult === ImFriendRequestHandleResult.AGREED +) + /** 对端的用户编号 / 昵称 / 头像 */ const peerUserId = computed(() => iSentIt.value ? props.request.toUserId : props.request.fromUserId @@ -122,13 +132,12 @@ const peerAvatar = computed(() => iSentIt.value ? props.request.toAvatar : props.request.fromAvatar ) -/** 添加来源文案:走字典,对齐后端 ImFriendAddSourceEnum */ -// TODO @AI:通过 html 里处理掉。不用抽个方法; -const addSourceLabel = computed(() => - props.request.addSource - ? getDictLabel(DICT_TYPE.IM_FRIEND_ADD_SOURCE, props.request.addSource) - : '' -) +/** 透给 UserInfo 的最小用户信息;UserInfo 内部会按 id 调 getSimpleUser 补齐性别 / 部门 */ +const peerUser = computed(() => ({ + id: peerUserId.value, + nickname: peerNickname.value, + avatar: peerAvatar.value +})) const agreeing = ref(false) const refusing = ref(false) diff --git a/src/views/im/home/pages/contact/FriendRequestList.vue b/src/views/im/home/pages/contact/FriendRequestList.vue index 0a3400f2e..0917b02f0 100644 --- a/src/views/im/home/pages/contact/FriendRequestList.vue +++ b/src/views/im/home/pages/contact/FriendRequestList.vue @@ -40,7 +40,7 @@ {{ getPeerNickname(request) }} - {{ statusLabel(request) }} + {{ getDictLabel(DICT_TYPE.IM_FRIEND_REQUEST_HANDLE_RESULT, request.handleResult) }}
diff --git a/src/views/im/home/store/friendStore.ts b/src/views/im/home/store/friendStore.ts index a4c8132a6..6ed0fab6f 100644 --- a/src/views/im/home/store/friendStore.ts +++ b/src/views/im/home/store/friendStore.ts @@ -177,6 +177,7 @@ export const useFriendStore = defineStore('imFriendStore', { request.handleTime = Date.now() } else { // 列表过期场景兜底重拉 + // TODO @AI:是不是只拉这个人?避免拉所有? await this.fetchFriendRequests() } }, @@ -202,6 +203,7 @@ export const useFriendStore = defineStore('imFriendStore', { /** 按 id 查申请记录 */ findFriendRequest(requestId: number): FriendRequest | undefined { + // TODO @AI:request return this.friendRequests.find((r) => r.id === requestId) },