admin-vue3/src/views/im/home/components/group/GroupMember.vue

65 lines
2.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<!--
群成员单行
跨子域复用@候选 (MentionPicker) / 已读列表 (MessageReadStatus) / 群成员宫格 (ConversationGroupSide)
-->
<div
class="relative flex items-center px-[5px] box-border whitespace-nowrap"
:class="{ 'bg-[#e1eaf7] dark:bg-[var(--el-color-primary-light-9)]': active }"
:style="{ height: height + 'px' }"
>
<UserAvatar
:size="avatarSize"
:name="member.nickname"
:url="member.avatar"
:clickable="clickable"
:id="member.userId"
:add-source="ImFriendAddSource.GROUP"
:add-source-extra="groupName"
/>
<div
class="flex-1 h-full pl-2.5 overflow-hidden text-sm text-left truncate text-[var(--el-text-color-regular)]"
:style="{ lineHeight: height + 'px' }"
>
{{ member.showName }}
</div>
</div>
</template>
<script lang="ts" setup>
import { computed } from 'vue'
import UserAvatar from '../user/UserAvatar.vue'
import { ImFriendAddSource } from '../../../utils/constants'
defineOptions({ name: 'ImGroupMember' })
/** 群成员结构(跨多处使用,放这里做窄接口;独立于 types/index.ts */
export interface GroupMemberLite {
userId: number // 用户编号;特殊值见 IM_AT_ALL_USER_ID@ 全体成员)
nickname: string // 真实昵称:永远是用户的 nickname专给 UserAvatar 色卡用,保证同一个人色卡首字母在所有界面一致
showName: string // 展示昵称:好友备注 > 用户群备注displayUserName > 真实昵称nickname给"显示给用户看"的位置用(行内文字、@候选标签等)
avatar?: string
status?: number
role?: number // 成员角色,仅在群信息抽屉等需要展示角色标签的场景透传;@候选 / 已读列表等场景可不传
}
const props = withDefaults(
defineProps<{
member: GroupMemberLite
height?: number // 行高px影响头像大小
active?: boolean // 选中态(@候选键盘高亮等)
clickable?: boolean // 头像点击是否弹 UserInfoCard@候选场景通常禁用(避免嵌套交互)
groupName?: string // 群名:加好友时拼「我是 'XX 群' 的 YY」话术落库 add_source=GROUP
}>(),
{
height: 50,
active: false,
clickable: false,
groupName: ''
}
)
const avatarSize = computed(() => Math.ceil(props.height * 0.75))
</script>