From cb9cd49627b65a4c0e137e08063271a8cefe1826 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 23 七月 2026 17:48:49 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0

---
 src/views/im/home/pages/conversation/components/message/group-request-pending.vue |   88 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/src/views/im/home/pages/conversation/components/message/group-request-pending.vue b/src/views/im/home/pages/conversation/components/message/group-request-pending.vue
new file mode 100644
index 0000000..9a6edd4
--- /dev/null
+++ b/src/views/im/home/pages/conversation/components/message/group-request-pending.vue
@@ -0,0 +1,88 @@
+<script lang="ts" setup>
+import { computed, ref } from 'vue'
+
+import { IconifyIcon as Icon } from '#/packages/icons/src'
+
+import { getCurrentUserId } from '#/views/im/utils/auth'
+import { ImGroupMemberRole } from '#/views/im/utils/constants'
+
+import { GroupRequestListDialog } from '../../../../components/group'
+import { useGroupRequestStore } from '../../../../store/groupRequestStore'
+import { useGroupStore } from '../../../../store/groupStore'
+
+defineOptions({ name: 'ImGroupRequestPending' })
+
+const props = defineProps<{
+  groupId: number
+}>()
+
+const groupStore = useGroupStore()
+const groupRequestStore = useGroupRequestStore()
+
+const requestListDialogRef = ref<InstanceType<typeof GroupRequestListDialog>>() // 鐢宠鍒楄〃寮圭獥 ref锛歨andleOpen 璋� open({ groupId }) 瑙﹀彂
+
+/** 鎵撳紑褰撳墠缇ょ殑杩涚兢鐢宠鍒楄〃 */
+function handleOpen() {
+  requestListDialogRef.value?.open({ groupId: props.groupId })
+}
+
+/** 褰撳墠缇わ紙鍚� ownerUserId / members锛� */
+const group = computed(() => groupStore.getGroup(props.groupId))
+
+/** 褰撳墠鐢ㄦ埛鍦ㄧ兢閲岀殑瑙掕壊锛涗紭鍏堢敤 group.members锛屾噿鍔犺浇鏈埌鏃跺洖閫�鍒� ownerUserId 鐩村垽 */
+const myRole = computed(() => {
+  const myId = getCurrentUserId()
+  if (group.value?.ownerUserId === myId) {
+    return ImGroupMemberRole.OWNER
+  }
+  return group.value?.members?.find((m) => m.userId === myId)?.role
+})
+
+/** 浠呯兢涓� / 绠$悊鍛樺彲瑙� */
+const canManage = computed(
+  () => myRole.value === ImGroupMemberRole.OWNER || myRole.value === ImGroupMemberRole.ADMIN
+)
+
+/** 褰撳墠缇ゆ湭澶勭悊鐢宠鏁帮紱浠� store 娲剧敓 */
+const pendingCount = computed(() => groupRequestStore.getUnhandledGroupRequestCount(props.groupId))
+</script>
+
+<template>
+  <!--
+    缇ら《閮ㄣ�屽緟澶勭悊鍔犵兢鐢宠銆嶆í骞�
+    - 浠呭綋鐧诲綍鐢ㄦ埛鏄缇� owner / admin 涓旇缇や笅鏈鐞嗙敵璇锋暟 > 0 鏃舵樉绀�
+    - count 浠� groupRequestStore 娲剧敓锛堝叏灞�瀛橈級锛涙湰绔鐞� / WS 閫氱煡鍒拌揪鍚� store 鑷姩鏇存柊
+    - 鐐瑰嚮妯箙鎵撳紑 GroupRequestListDialog锛堝惈鍘嗗彶宸插鐞嗚褰曪級锛屼笉鍐嶅氨鍦板睍寮�
+  -->
+  <div
+    v-if="canManage && pendingCount > 0"
+    class="flex flex-shrink-0 flex-col items-start px-4 pt-1.5 pb-2 bg-[var(--ant-color-fill-secondary)]"
+  >
+    <div
+      class="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-[10px] text-13px text-[var(--ant-color-text)] bg-[var(--ant-color-bg-container)] cursor-pointer shadow-[0_1px_2px_rgba(0,0,0,0.04)] transition-colors hover:bg-[var(--ant-color-fill-tertiary)]"
+      @click="handleOpen"
+    >
+      <Icon
+        icon="ant-design:user-add-outlined"
+        :size="14"
+        class="im-group-request-pending__icon flex-shrink-0 text-[var(--ant-color-success)]"
+      />
+      <span class="flex-1 min-w-0 truncate"> 鏂拌繘缇ょ敵璇凤紙{{ pendingCount }}锛� </span>
+      <Icon
+        icon="ant-design:right-outlined"
+        :size="11"
+        class="flex-shrink-0 text-[var(--ant-color-text-placeholder)]"
+      />
+    </div>
+
+    <!-- 鐢宠鍒楄〃 dialog锛氬鐢ㄥ悓涓�缁勪欢锛岄伩鍏嶇兢绠$悊闈㈡澘涓庝細璇濋《閮ㄥ悇鍐欎竴浠� -->
+    <GroupRequestListDialog ref="requestListDialogRef" />
+  </div>
+</template>
+
+<style scoped>
+/* :deep 绌块�� Icon 瀛愮粍浠� DOM锛涘己鍒� svg 璧� currentColor 搴斿鏆楄壊妯″紡 el-icon 鍏ㄥ眬鑹茶鐩� */
+.im-group-request-pending__icon :deep(svg) {
+  fill: currentColor !important;
+}
+</style>

--
Gitblit v1.9.3