auth-web/src/layout/components/lay-notice/data.tsx

148 lines
4.3 KiB
TypeScript
Raw Normal View History

import { computed, ref } from 'vue';
import { throttle } from '@pureadmin/utils';
import { ElNotification, ElTag } from 'element-plus';
2025-04-27 22:16:06 +08:00
import { getMessageReceivedPageByUser } from '@/api/v1/message/messageReceived';
import { $t } from '@/plugins/i18n';
2025-05-01 18:24:43 +08:00
import { router } from '@/store/utils';
2024-09-26 09:38:02 +08:00
export interface ListItem {
2025-04-24 13:43:37 +08:00
messageId: string;
cover: string;
title: string;
datetime: string;
type: string;
description: string;
messageType: string;
status?: 'primary' | 'success' | 'warning' | 'info' | 'danger';
extra?: string;
2024-09-26 09:38:02 +08:00
}
export interface TabItem {
2025-04-24 13:43:37 +08:00
key: string;
name: string;
list: ListItem[];
emptyText: string;
2024-09-26 09:38:02 +08:00
}
// 请求参数
const form = { status: false, currentPage: 1, pageSize: 100 };
// 响应内容
export const noticesData = ref<TabItem[]>([]);
2024-11-02 17:03:59 +08:00
// 通知消息数据
export const noticesNum = ref(0);
export const notices = ref(noticesData);
// 选择的消息栏目
export const activeKey = ref(noticesData.value[0]?.key);
2025-04-24 13:43:37 +08:00
export const getLabel = computed(() => (item) => item.name + (item.list.length > 0 ? `(${item.list.length})` : ''));
2024-11-02 17:03:59 +08:00
/** 获取所有消息 */
export const getAllMessageList = async () => {
2025-04-27 22:16:06 +08:00
const baseResult = await getMessageReceivedPageByUser(form);
2025-04-24 13:43:37 +08:00
const datalist = baseResult?.data?.list;
2025-04-24 13:43:37 +08:00
// 通知消息
const notifications = datalist
.filter((message) => message.messageType === 'notifications')
.map((message) => ({
messageId: message.id,
cover: message.cover,
title: message.title,
datetime: message.createTime,
description: message.summary,
messageType: message.messageType,
type: '1',
2025-04-27 22:16:06 +08:00
status: message.level ? message.level : 'info',
2025-04-24 13:43:37 +08:00
extra: message.extra,
})) as ListItem[];
2025-04-24 13:43:37 +08:00
// 消息
const notify = datalist
.filter((message) => message.messageType !== 'notifications' && message.messageType !== 'sys')
.map((message) => ({
messageId: message.id,
cover: message.cover,
description: message.summary,
messageType: message.messageType,
title: message.title,
datetime: message.createTime,
type: '2',
2025-04-27 22:16:06 +08:00
status: message.level ? message.level : 'info',
2025-04-24 13:43:37 +08:00
extra: message.extra,
})) as ListItem[];
2025-04-24 13:43:37 +08:00
// 系统消息
const system = datalist
.filter((message) => message.messageType === 'sys')
.map((message) => ({
messageId: message.id,
cover: message.cover,
description: message.summary,
messageType: message.messageType,
title: message.title,
datetime: message.createTime,
type: '3',
2025-04-27 22:16:06 +08:00
status: message.level ? message.level : 'info',
2025-04-24 13:43:37 +08:00
extra: message.extra,
})) as ListItem[];
2025-04-24 13:43:37 +08:00
noticesData.value = [
2025-04-29 18:18:07 +08:00
{
key: '1',
name: $t('status.pureNotify'),
list: notifications,
emptyText: $t('status.pureNoNotify'),
},
{
key: '2',
name: $t('status.pureMessage'),
list: notify,
emptyText: $t('status.pureNoMessage'),
},
{
key: '3',
name: $t('status.systemMessage'),
list: system,
emptyText: $t('status.systemMessage'),
},
2025-04-24 13:43:37 +08:00
];
2025-04-24 13:43:37 +08:00
// 调用浏览器系统通知
showNotification([...system, ...notify, ...notifications]);
2024-11-02 17:03:59 +08:00
};
/** 计算消息数量 */
export const computedNoticesNum = throttle(async () => {
2025-04-24 13:43:37 +08:00
// 获取所有的消息
await getAllMessageList();
// 请求成功后将原本条数置为0
noticesNum.value = 0;
// 整合消息一共多少条
notices.value.map((v) => (noticesNum.value += v.list.length));
// 默认选中的消息类别
activeKey.value = noticesData.value[0]?.key;
// 定时刷新
}, 666);
/** 显示通知消息 */
2025-04-24 13:43:37 +08:00
const showNotification = (NotificationList) => {
if (NotificationList.length > 0) {
NotificationList.forEach((message) => {
ElNotification({
title: message?.title,
2025-05-01 18:24:43 +08:00
position: 'bottom-left',
duration: 2000,
2025-04-24 13:43:37 +08:00
message: (
2025-05-01 18:24:43 +08:00
<div class="flex" onClick={() => router.push(`/message-detail/${message.messageType}/${message.messageId}`)}>
2025-04-24 13:43:37 +08:00
<img src={message.cover} alt="" style={{ width: '50px', height: '50px', objectFit: 'cover' }} />
<div class="flex justify-between mt-3 mx-2">
<span class="mr-2">{message.description}</span>
{message.status && <ElTag type={message.status}>{message?.extra}</ElTag>}
</div>
</div>
),
});
});
}
};