admin-vben/apps/web-ele/src/views/im/home/components/card/card-bubble.vue

69 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.

<script lang="ts" setup>
import { computed } from 'vue'
import { isPrivateConversation } from '#/views/im/utils/constants'
import {
type CardMessage,
type CardTarget,
getCardLabelInfo
} from '#/views/im/utils/message'
import { UserAvatar } from '../user'
defineOptions({ name: 'ImCardBubble' })
const props = withDefaults(
defineProps<{
/** 名片数据CardMessage接收侧消息体或 CardTarget发送侧预览共用结构 */
card: CardMessage | CardTarget
/** 是否显示 cursor: pointer调用方负责绑 @click 监听 */
clickable?: boolean
}>(),
{ clickable: false }
)
/** 是否用户名片:决定 UserAvatar 是否带 id 触发 UserInfoCard */
const isUser = computed(() => isPrivateConversation(props.card.targetType))
/** 名片标签信息 */
const labelInfo = computed(() => getCardLabelInfo(props.card))
</script>
<template>
<!--
名片消息气泡 / 名片预览卡240px用户名片 + 群名片通用
- 头像 + 名字 + 群成员数副标题仅群名片+ 底部分隔条群名片 / 个人名片
- 用户名片把 :id 传给 UserAvatar 让点击 avatar UserInfoCard群名片不传 id
- 整卡 click 由调用方监听@click组件不内嵌业务逻辑
-->
<div
class="flex flex-col w-[240px] rounded-md overflow-hidden bg-[var(--ant-color-bg-container)] border border-solid border-[var(--im-border-color-lighter)]"
:class="{ 'cursor-pointer': clickable }"
>
<div class="flex gap-2.5 items-center px-3 py-2.5">
<UserAvatar
:id="isUser ? card.targetId : undefined"
:url="card.avatar"
:name="card.name"
:size="40"
:clickable="false"
/>
<div class="flex flex-col flex-1 min-w-0">
<div class="text-sm font-medium truncate text-[var(--ant-color-text)]">
{{ card.name }}
</div>
<div
v-if="!isUser && card.memberCount"
class="text-12px truncate text-[var(--ant-color-text-placeholder)]"
>
{{ card.memberCount }} 人群聊
</div>
</div>
</div>
<div
class="px-3 py-1 text-12px border-t border-t-solid text-[var(--ant-color-text-placeholder)] border-[var(--im-border-color-lighter)] bg-[var(--ant-color-fill-tertiary)]"
>
{{ labelInfo.label }}
</div>
</div>
</template>