guanghulab/modules/m-channel/channel-preferences.js
2026-05-10 13:12:44 +08:00

195 lines
5.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 频道偏好管理 - 记住用户的装修设置
window.ChannelPreferences = {
STORAGE_KEY: 'hololake_channel_preferences',
// 默认配置
defaults: {
layout: 'grid', // grid, list, compact
theme: 'default', // default, ocean, forest, sunset, lavender
favorites: [], // 收藏的模块ID列表
moduleOrder: [], // 模块排序顺序默认按ID
stats: {} // 使用统计
},
// 当前配置
config: null,
// 初始化(加载配置)
init: function() {
console.log('[preferences] 初始化');
this.load();
return this.config;
},
// 加载配置
load: function() {
const saved = localStorage.getItem(this.STORAGE_KEY);
if (saved) {
try {
this.config = JSON.parse(saved);
console.log('[preferences] 加载配置:', this.config);
} catch (e) {
console.error('[preferences] 解析失败,使用默认配置', e);
this.config = { ...this.defaults };
}
} else {
console.log('[preferences] 无保存配置,使用默认');
this.config = { ...this.defaults };
}
return this.config;
},
// 保存配置
save: function() {
if (!this.config) return;
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(this.config));
console.log('[preferences] 保存配置:', this.config);
},
// 获取指定键的值
get: function(key) {
if (!this.config) this.load();
return this.config[key];
},
// 设置指定键的值(自动保存)
set: function(key, value) {
if (!this.config) this.load();
this.config[key] = value;
this.save();
// 触发事件总线通知
if (window.EventBus) {
EventBus.emit('preferences:changed', { key, value });
}
},
// 更新整个配置(合并)
update: function(newConfig) {
if (!this.config) this.load();
this.config = { ...this.config, ...newConfig };
this.save();
if (window.EventBus) {
EventBus.emit('preferences:changed', { full: this.config });
}
},
// 恢复默认设置
reset: function() {
this.config = { ...this.defaults };
this.save();
if (window.EventBus) {
EventBus.emit('preferences:reset', this.config);
}
console.log('[preferences] 恢复默认');
},
// 记录模块使用(用于统计)
recordUsage: function(moduleId) {
if (!this.config) this.load();
if (!this.config.stats) this.config.stats = {};
if (!this.config.stats[moduleId]) {
this.config.stats[moduleId] = {
count: 0,
lastUsed: null,
totalTime: 0
};
}
this.config.stats[moduleId].count++;
this.config.stats[moduleId].lastUsed = Date.now();
this.save();
// 开始计时(将在模块卸载时记录时长)
this.startTiming(moduleId);
},
// 计时相关
timing: {},
startTiming: function(moduleId) {
this.timing[moduleId] = Date.now();
},
stopTiming: function(moduleId) {
if (this.timing[moduleId]) {
const duration = (Date.now() - this.timing[moduleId]) / 1000; // 秒
if (this.config.stats[moduleId]) {
this.config.stats[moduleId].totalTime += duration;
this.save();
}
delete this.timing[moduleId];
}
},
// 获取统计报告
getStats: function() {
if (!this.config) this.load();
return this.config.stats || {};
},
// 获取收藏列表
getFavorites: function() {
return this.get('favorites') || [];
},
// 切换收藏状态
toggleFavorite: function(moduleId) {
let favorites = this.get('favorites') || [];
if (favorites.includes(moduleId)) {
favorites = favorites.filter(id => id !== moduleId);
} else {
favorites.push(moduleId);
}
this.set('favorites', favorites);
return favorites.includes(moduleId);
},
// 获取布局
getLayout: function() {
return this.get('layout') || 'grid';
},
// 设置布局
setLayout: function(layout) {
this.set('layout', layout);
},
// 获取主题
getTheme: function() {
return this.get('theme') || 'default';
},
// 设置主题
setTheme: function(theme) {
this.set('theme', theme);
},
// 获取模块排序
getModuleOrder: function() {
return this.get('moduleOrder') || [];
},
// 设置模块排序
setModuleOrder: function(order) {
this.set('moduleOrder', order);
},
// 重新排序(拖拽后调用)
reorderModules: function(fromIndex, toIndex) {
const order = this.getModuleOrder();
if (order.length === 0) {
// 如果还没有自定义顺序,则基于当前模块列表生成
const modules = window.ModuleRegistry ? ModuleRegistry.list() : [];
// 排除非显示模块(如调试面板)
const displayModules = modules.filter(m => ['m06','m08','m11','home','debug'].includes(m));
this.setModuleOrder(displayModules);
}
// 重新加载最新顺序
const currentOrder = this.getModuleOrder();
if (fromIndex < 0 || fromIndex >= currentOrder.length || toIndex < 0 || toIndex >= currentOrder.length) return;
const [moved] = currentOrder.splice(fromIndex, 1);
currentOrder.splice(toIndex, 0, moved);
this.setModuleOrder(currentOrder);
}
};
console.log('[preferences] 已加载');