Files
YelayMaths/yelaymaths/utils/store.js
T
2026-09-29 20:51:39 +08:00

121 lines
3.8 KiB
JavaScript

/**
* 极简全局状态。
*
* 替代旧版本在各页面直接读写 wx.getStorageSync 的做法:
* 统一从内存读、同步落盘,页面只与这里交互。
*/
const config = require('../config/index');
const memory = {
user: null,
siteConfig: null,
entitlements: [],
};
const listeners = new Set();
function notify() {
listeners.forEach((fn) => {
try {
fn();
} catch (e) {
console.error('[store] 监听器执行失败', e);
}
});
}
function read(key, fallback) {
try {
const v = wx.getStorageSync(key);
return v === '' || v === undefined || v === null ? fallback : v;
} catch (e) {
return fallback;
}
}
const store = {
// ── token ────────────────────────────────────────────────────────────
getToken: () => read(config.STORAGE.TOKEN, ''),
getRefreshToken: () => read(config.STORAGE.REFRESH_TOKEN, ''),
setTokens(accessToken, refreshToken) {
wx.setStorageSync(config.STORAGE.TOKEN, accessToken);
if (refreshToken) wx.setStorageSync(config.STORAGE.REFRESH_TOKEN, refreshToken);
},
clearTokens() {
wx.removeStorageSync(config.STORAGE.TOKEN);
wx.removeStorageSync(config.STORAGE.REFRESH_TOKEN);
},
isLoggedIn: () => !!read(config.STORAGE.TOKEN, ''),
// ── 用户 ─────────────────────────────────────────────────────────────
getUser() {
if (memory.user) return memory.user;
memory.user = read(config.STORAGE.USER, null);
return memory.user;
},
setUser(user) {
memory.user = user;
wx.setStorageSync(config.STORAGE.USER, user);
notify();
},
// ── 站点配置 ─────────────────────────────────────────────────────────
getSiteConfig() {
if (memory.siteConfig) return memory.siteConfig;
memory.siteConfig = read(config.STORAGE.CONFIG, {});
return memory.siteConfig;
},
setSiteConfig(cfg) {
memory.siteConfig = cfg || {};
wx.setStorageSync(config.STORAGE.CONFIG, memory.siteConfig);
notify();
},
/** 取配置项,带兜底值,避免配置缺失时页面直接崩掉。 */
cfg(key, fallback) {
const value = store.getSiteConfig()[key];
return value === undefined || value === '' ? (fallback === undefined ? '' : fallback) : value;
},
// ── 已购课程 ─────────────────────────────────────────────────────────
getEntitlements() {
if (memory.entitlements && memory.entitlements.length) return memory.entitlements;
memory.entitlements = read(config.STORAGE.ENTITLEMENTS, []) || [];
return memory.entitlements;
},
setEntitlements(list) {
memory.entitlements = list || [];
wx.setStorageSync(config.STORAGE.ENTITLEMENTS, memory.entitlements);
notify();
},
hasCourse(code) {
return store.getEntitlements().some((item) => item.code === code);
},
// ── 订阅与清理 ───────────────────────────────────────────────────────
subscribe(fn) {
listeners.add(fn);
return () => listeners.delete(fn);
},
reset() {
memory.user = null;
memory.entitlements = [];
store.clearTokens();
// 站点配置与登录态无关,保留;否则退出登录后页面文案会退回默认值
wx.removeStorageSync(config.STORAGE.USER);
wx.removeStorageSync(config.STORAGE.ENTITLEMENTS);
notify();
},
};
module.exports = store;