From 91c82965b2d987452ca276e3a03b48c8dcda2ae9 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 19 八月 2026 11:47:26 +0800
Subject: [PATCH] config(env): 更新生产环境配置和公司名称

---
 src/views/im/home/components/friend/friend-item.vue |   79 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 79 insertions(+), 0 deletions(-)

diff --git a/src/views/im/home/components/friend/friend-item.vue b/src/views/im/home/components/friend/friend-item.vue
new file mode 100644
index 0000000..9feebab
--- /dev/null
+++ b/src/views/im/home/components/friend/friend-item.vue
@@ -0,0 +1,79 @@
+<script lang="ts" setup>
+import type { FriendLite } from '../../types'
+
+import { useImUiStore } from '../../store/uiStore'
+import { UserAvatar } from '../user'
+
+defineOptions({ name: 'ImFriendItem' })
+
+const props = withDefaults(
+  defineProps<{
+    active?: boolean
+    friend: FriendLite
+    menu?: boolean // 鏄惁鍚敤鍙抽敭鑿滃崟锛涘湪閫夋嫨鍣ㄥ脊绐楅噷涓�鑸叧闂�
+  }>(),
+  {
+    active: false,
+    menu: true
+  }
+)
+
+const emit = defineEmits<{
+  chat: [friend: FriendLite]
+  click: [friend: FriendLite]
+  delete: [friend: FriendLite]
+}>()
+
+const uiStore = useImUiStore()
+
+/** 鍙抽敭鑿滃崟锛氬彂閫佹秷鎭� / 鍒犻櫎濂藉弸 */
+function handleContextMenu(event: MouseEvent) {
+  if (!props.menu) {
+    return
+  }
+  uiStore.openContextMenu(
+    { x: event.clientX, y: event.clientY },
+    [
+      { key: 'chat', name: '鍙戦�佹秷鎭�' },
+      { key: 'delete', name: '鍒犻櫎濂藉弸' }
+    ],
+    (item) => {
+      if (item.key === 'chat') emit('chat', props.friend)
+      else if (item.key === 'delete') emit('delete', props.friend)
+    }
+  )
+}
+</script>
+
+<template>
+  <!--
+    濂藉弸鍗曡椤�
+    - 澶村儚 + 鏄电О
+    - 閫変腑鎬� active
+    - 鍙抽敭鑿滃崟锛堝彂娑堟伅 / 鍒犻櫎濂藉弸锛夌敱鍏ㄥ眬 ContextMenu 鎵挎帴
+  -->
+  <div
+    class="relative flex items-center gap-2.5 px-4 py-3 cursor-pointer transition-colors hover:bg-[var(--ant-color-fill)]"
+    :class="{ '!bg-[#d9ecff] dark:!bg-[var(--ant-color-primary-bg-hover)]': active }"
+    @click="$emit('click', friend)"
+    @contextmenu.prevent="handleContextMenu"
+  >
+    <!-- prefix slot锛氭斁鍦ㄥご鍍忓墠锛岀粰閫夋嫨绫诲脊绐楃殑 checkbox / 鍦嗙偣鐢紝涓嶄紶鍒欎笉娓叉煋 -->
+    <slot name="prefix"></slot>
+    <!-- 澶村儚 -->
+    <UserAvatar
+      :id="friend.id"
+      :url="friend.avatar"
+      :name="friend.nickname"
+      :size="42"
+      :clickable="false"
+    />
+    <!-- 鍗曡灞曠ず displayName 浼樺厛锛涙樀绉颁粎鍦ㄥソ鍙嬭鎯呴潰鏉垮睍绀猴紝鍒楄〃閲屼笉閲嶅 -->
+    <div class="flex flex-1 min-w-0">
+      <div class="overflow-hidden text-sm truncate text-[var(--ant-color-text)]">
+        {{ friend.displayName || friend.nickname }}
+      </div>
+    </div>
+    <slot></slot>
+  </div>
+</template>

--
Gitblit v1.9.3