mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-11-14 21:23:47 +08:00
180 lines
4.0 KiB
TypeScript
180 lines
4.0 KiB
TypeScript
import { NAvatar, NTag, NText, SelectRenderLabel, SelectRenderTag } from 'naive-ui';
|
|
import { Component, h } from 'vue';
|
|
import { BellOutlined, NotificationOutlined, SendOutlined } from '@vicons/antd';
|
|
import { useDictStore } from '@/store/modules/dict';
|
|
|
|
export interface personOption {
|
|
value: number;
|
|
label: string;
|
|
username: string;
|
|
avatar: string;
|
|
}
|
|
|
|
export const renderMultipleSelectTag: SelectRenderTag = ({ option, handleClose }) => {
|
|
// @ts-ignore
|
|
return h(
|
|
NTag,
|
|
{
|
|
style: {
|
|
padding: '0 6px 0 4px',
|
|
},
|
|
round: true,
|
|
closable: true,
|
|
onClose: (e) => {
|
|
e.stopPropagation();
|
|
handleClose();
|
|
},
|
|
},
|
|
{
|
|
default: () =>
|
|
h(
|
|
'div',
|
|
{
|
|
style: {
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
},
|
|
},
|
|
[
|
|
option.avatar !== ''
|
|
? h(NAvatar, {
|
|
src: option.avatar as string,
|
|
round: true,
|
|
size: 22,
|
|
style: {
|
|
marginRight: '4px',
|
|
},
|
|
})
|
|
: h(
|
|
NAvatar,
|
|
{
|
|
round: true,
|
|
size: 22,
|
|
style: {
|
|
marginRight: '4px',
|
|
},
|
|
},
|
|
{
|
|
default: () =>
|
|
option.label !== ''
|
|
? ((option?.label as string).substring(0, 1) as string)
|
|
: ((option?.username as string).substring(0, 1) as string),
|
|
}
|
|
),
|
|
option.label as string,
|
|
]
|
|
),
|
|
}
|
|
);
|
|
};
|
|
|
|
export const renderLabel: SelectRenderLabel = (option) => {
|
|
return h(
|
|
'div',
|
|
{
|
|
style: {
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
},
|
|
},
|
|
[
|
|
option.avatar !== ''
|
|
? h(NAvatar, {
|
|
src: option.avatar as string,
|
|
round: true,
|
|
size: 'small',
|
|
})
|
|
: h(
|
|
NAvatar,
|
|
{
|
|
round: true,
|
|
size: 'small',
|
|
},
|
|
{
|
|
default: () =>
|
|
option.label !== ''
|
|
? ((option?.label as string).substring(0, 1) as string)
|
|
: ((option?.username as string).substring(0, 2) as string),
|
|
}
|
|
),
|
|
h(
|
|
'div',
|
|
{
|
|
style: {
|
|
marginLeft: '12px',
|
|
padding: '4px 0',
|
|
},
|
|
},
|
|
[
|
|
h('div', null, [option.label as string]),
|
|
h(
|
|
NText,
|
|
{ depth: 3, tag: 'div' },
|
|
{
|
|
default: () => option.username,
|
|
}
|
|
),
|
|
]
|
|
),
|
|
]
|
|
);
|
|
};
|
|
|
|
export interface MessageTab {
|
|
/** tab的key */
|
|
key: number;
|
|
/** tab名称 */
|
|
name: string;
|
|
/** badge类型 */
|
|
badgeProps?: import('naive-ui').BadgeProps;
|
|
/** 消息数据 */
|
|
list: MessageRow[];
|
|
}
|
|
|
|
export interface MessageRow {
|
|
/** 消息ID */
|
|
id: number;
|
|
/** 消息类型 */
|
|
type: number;
|
|
/** 消息标题 */
|
|
title: string;
|
|
/** 消息内容 */
|
|
content: string;
|
|
/** 发送时间 */
|
|
createdAt: string;
|
|
/** 是否已读 */
|
|
isRead: boolean;
|
|
/** 发送者头像 */
|
|
senderAvatar: string;
|
|
/** 标签ID */
|
|
tag: number;
|
|
/** 标签名称 */
|
|
tagTitle?: string;
|
|
/** 标签props */
|
|
tagProps?: import('naive-ui').TagProps;
|
|
}
|
|
|
|
// 获取消息的展示图标
|
|
export function getIcon(row: MessageRow): Component {
|
|
if (row.type === 1) {
|
|
return NotificationOutlined;
|
|
}
|
|
if (row.type === 2) {
|
|
return BellOutlined;
|
|
}
|
|
return SendOutlined;
|
|
}
|
|
|
|
// 解析消息
|
|
export function parseMessage(row): MessageRow {
|
|
row = row as MessageRow;
|
|
if (row.tag <= 0) {
|
|
return row;
|
|
}
|
|
const dict = useDictStore();
|
|
const label = dict.getLabel('noticeTagOptions', row.tag);
|
|
row.tagTitle = label;
|
|
row.tagProps = { type: label };
|
|
return row;
|
|
}
|