guanghulab/modules/m-channel/channel-preferences.js
Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +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] 已加载');