| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import type { GroupMemberLite } from './group-member.vue' |
| | | |
| | | import { computed } from 'vue' |
| | | |
| | | import { DICT_TYPE } from '#/packages/constants/src' |
| | | import { getDictLabel } from '#/packages/effects/hooks/src' |
| | | |
| | | import { ImGroupMemberRole } from '../../../utils/constants' |
| | | import { UserAvatar } from '../user' |
| | | |
| | | defineOptions({ name: 'ImGroupMemberItem' }) |
| | | |
| | | const props = withDefaults( |
| | | defineProps<{ |
| | | active?: boolean |
| | | height?: number |
| | | member: GroupMemberLite |
| | | }>(), |
| | | { |
| | | height: 50, |
| | | active: false |
| | | } |
| | | ) |
| | | |
| | | defineEmits<{ |
| | | click: [member: GroupMemberLite] |
| | | }>() |
| | | |
| | | const avatarSize = computed(() => Math.ceil(props.height * 0.75)) |
| | | |
| | | /** è§è²æ ç¾ææ¡ï¼æ®éæå䏿¾ç¤ºï¼å
¶ä½å im_group_member_role åå
¸ label */ |
| | | const roleLabel = computed(() => { |
| | | if (props.member.role == null || props.member.role === ImGroupMemberRole.NORMAL) { |
| | | return '' |
| | | } |
| | | return getDictLabel(DICT_TYPE.IM_GROUP_MEMBER_ROLE, props.member.role) |
| | | }) |
| | | |
| | | /** è§è²æ ç¾æ ·å¼ï¼ç¾¤ä¸»ç¨ä¸»è²ï¼ç®¡çåç¨æ¬¡è¦è² */ |
| | | const roleLabelClass = computed(() => { |
| | | if (props.member.role === ImGroupMemberRole.OWNER) { |
| | | return 'text-[var(--ant-color-primary)] bg-[var(--ant-color-primary-bg)]' |
| | | } |
| | | return 'text-[var(--ant-color-info)] bg-[var(--ant-color-fill)]' |
| | | }) |
| | | </script> |
| | | |
| | | <template> |
| | | <!-- |
| | | 群æåè¡å½¢æ |
| | | - 横æã带 hover æï¼slot æ¾ checkbox / æä½æé®ç |
| | | - ä¸ GroupMember çå·®å«ï¼å¸¦ hover æ + slot æ©å±ç¹ï¼éå selector / admin å表 |
| | | --> |
| | | <div |
| | | class="relative flex gap-2.5 items-center mx-px px-4 box-border whitespace-nowrap rounded cursor-pointer transition-colors hover:bg-[var(--ant-color-fill)]" |
| | | :class="{ '!bg-[#e1eaf7] dark:!bg-[var(--ant-color-primary-bg-hover)]': active }" |
| | | :style="{ height: `${height }px` }" |
| | | @click="$emit('click', member)" |
| | | > |
| | | <UserAvatar |
| | | :id="member.userId" |
| | | :url="member.avatar" |
| | | :name="member.nickname" |
| | | :size="avatarSize" |
| | | :clickable="false" |
| | | /> |
| | | <div |
| | | class="flex-1 h-full pl-1 overflow-hidden text-sm truncate text-[var(--ant-color-text)]" |
| | | :style="{ lineHeight: `${height }px` }" |
| | | > |
| | | {{ member.showName }} |
| | | </div> |
| | | <!-- è§è²æ ç¾ï¼ç¾¤ä¸» / 管çåï¼æ®éæå䏿¾ç¤ºãä»
å¨ä¼ å
¥ member.role æ¶çæ --> |
| | | <span |
| | | v-if="roleLabel" |
| | | class="px-1.5 py-px rounded text-xs whitespace-nowrap" |
| | | :class="roleLabelClass" |
| | | > |
| | | {{ roleLabel }} |
| | | </span> |
| | | <slot></slot> |
| | | </div> |
| | | </template> |