1
0
mirror of https://github.com/ZeroCatDev/Classworks.git synced 2025-12-10 23:13:10 +00:00
Classworks/src/utils/message.js
2025-11-16 15:14:17 +08:00

131 lines
3.0 KiB
JavaScript

import {getSetting} from './settings';
class LogDB {
constructor() {
this.logs = [];
}
async addLog(message) {
this.logs.push(message);
// 只保留最近100条消息
if (this.logs.length > 100) {
this.logs.shift();
}
return true;
}
async getLogs(limit = 20) {
return this.logs.slice(-limit).reverse();
}
}
const logDB = new LogDB();
const messages = [];
let snackbarCallback = null;
let logCallback = null;
const MessageType = {
SUCCESS: 'success',
ERROR: 'error',
INFO: 'info',
WARNING: 'warning'
};
const defaultOptions = {
timeout: 3000,
showSnackbar: true,
addToLog: true
};
async function createMessage(type, title, content = '', options = {}) {
const msgOptions = {...defaultOptions, ...options};
const message = {
id: Date.now() + Math.random(),
type,
title,
content: content.substring(0, 500),
timestamp: new Date()
};
if (msgOptions.addToLog) {
try {
await logDB.addLog(message);
messages.unshift(message);
while (messages.length > getSetting('message.maxActiveMessages')) {
messages.pop();
}
logCallback?.(messages);
} catch (error) {
console.error('保存日志失败:', error);
}
}
if (msgOptions.showSnackbar) {
snackbarCallback?.(message);
}
return message;
}
function debounce(fn, delay) {
let timer = null;
return function (...args) {
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
}
export default {
install: (app) => {
app.config.globalProperties.$message = {
success: (title, content, options) => createMessage(MessageType.SUCCESS, title, content, options),
error: (title, content, options) => createMessage(MessageType.ERROR, title, content, options),
info: (title, content, options) => createMessage(MessageType.INFO, title, content, options),
warning: (title, content, options) => createMessage(MessageType.WARNING, title, content, options),
};
},
onSnackbar: (callback) => {
snackbarCallback = callback;
},
onLog: (callback) => {
logCallback = callback;
},
getMessages: async () => {
try {
return await logDB.getLogs();
} catch (error) {
console.error('获取日志失败:', error);
return [...messages];
}
},
clearMessages: async () => {
try {
await logDB.clearLogs();
messages.length = 0;
logCallback?.(messages);
} catch (error) {
console.error('清除日志失败:', error);
}
},
MessageType,
markAsRead: () => {
}, // 移除标记已读功能
deleteMessage: async (messageId) => {
try {
await logDB.deleteLog(messageId);
const index = messages.findIndex(m => m.id === messageId);
if (index !== -1) {
messages.splice(index, 1);
}
logCallback?.(messages);
} catch (error) {
console.error('删除消息失败:', error);
}
},
getUnreadCount: () => 0, // 移除未读计数
debounce,
};