150 lines
3.7 KiB
JavaScript
Raw Permalink Normal View History

/**
* channel-state.js
* 频道状态管理器 - 记忆妈妈的浏览足迹
* 使用localStorage持久化刷新页面自动恢复
* 功能保存/恢复当前路由已访问模块列表历史栈
*/
const ChannelState = (function() {
const STORAGE_KEY = 'm-channel-state';
// 默认状态
const defaultState = {
currentRoute: '/home',
visitedModules: [], // 已访问过的模块ID列表
historyStack: ['/home'], // 历史记录栈
historyIndex: 0 // 当前在历史栈中的位置
};
let state = { ...defaultState };
// 加载本地存储的状态
function load() {
try {
const saved = localStorage.getItem(STORAGE_KEY);
if (saved) {
state = JSON.parse(saved);
// 确保必要字段存在
if (!state.visitedModules) state.visitedModules = [];
if (!state.historyStack || !Array.isArray(state.historyStack)) {
state.historyStack = [state.currentRoute || '/home'];
}
if (typeof state.historyIndex !== 'number') {
state.historyIndex = 0;
}
console.log('[state] restore', state);
} else {
reset();
}
} catch (e) {
console.warn('[state] load failed, use default', e);
reset();
}
return state;
}
// 保存当前状态到localStorage
function save() {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(state));
console.log('[state] save', state);
} catch (e) {
console.warn('[state] save failed', e);
}
}
// 重置为默认状态
function reset() {
state = { ...defaultState };
save();
}
// 更新当前路由
function setCurrentRoute(route) {
if (state.currentRoute !== route) {
state.currentRoute = route;
// 添加到已访问模块(如果是模块路由)
if (route.startsWith('/module/')) {
const moduleId = route.replace('/module/', '');
if (!state.visitedModules.includes(moduleId)) {
state.visitedModules.push(moduleId);
}
}
save();
}
}
// 添加到历史栈(用于前进后退)
function pushHistory(route) {
// 如果当前不在栈顶,先截断后面的记录
if (state.historyIndex < state.historyStack.length - 1) {
state.historyStack = state.historyStack.slice(0, state.historyIndex + 1);
}
state.historyStack.push(route);
state.historyIndex = state.historyStack.length - 1;
setCurrentRoute(route); // 会触发保存
}
// 后退
function goBack() {
if (state.historyIndex > 0) {
state.historyIndex--;
state.currentRoute = state.historyStack[state.historyIndex];
save();
return state.currentRoute;
}
return null;
}
// 前进
function goForward() {
if (state.historyIndex < state.historyStack.length - 1) {
state.historyIndex++;
state.currentRoute = state.historyStack[state.historyIndex];
save();
return state.currentRoute;
}
return null;
}
// 获取当前状态
function getState() {
return { ...state };
}
// 标记模块为已访问(外部调用)
function markModuleVisited(moduleId) {
if (!state.visitedModules.includes(moduleId)) {
state.visitedModules.push(moduleId);
save();
}
}
// 清除状态(用于测试)
function clear() {
localStorage.removeItem(STORAGE_KEY);
reset();
}
// 初始化:加载状态
load();
return {
load,
save,
reset,
setCurrentRoute,
pushHistory,
goBack,
goForward,
getState,
markModuleVisited,
clear
};
})();
// 导出(如果是模块环境)
if (typeof module !== 'undefined' && module.exports) {
module.exports = ChannelState;
}