mirror of
https://github.com/cuigh/swirl
synced 2025-06-26 18:16:50 +00:00
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
import { createStore, createLogger } from 'vuex'
|
|
import { Mutations } from "./mutations";
|
|
|
|
const debug = import.meta.env.DEV
|
|
|
|
interface User {
|
|
name: string;
|
|
token: string;
|
|
perms: Set<string>;
|
|
}
|
|
|
|
export interface State {
|
|
user?: User | null;
|
|
preference: {
|
|
theme: string | null;
|
|
locale: string | null;
|
|
}
|
|
ajaxLoading: boolean;
|
|
}
|
|
|
|
function loadObject(key: string) {
|
|
let value = null
|
|
try {
|
|
value = JSON.parse(localStorage.getItem(key) as string)
|
|
} catch {
|
|
}
|
|
return value
|
|
}
|
|
|
|
function initState(): State {
|
|
const user = Object.assign({}, loadObject('user'))
|
|
const locale = navigator.language.startsWith('zh') ? 'zh' : 'en'
|
|
return {
|
|
user: { perms: new Set(user.perms), name: user.name, token: user.token },
|
|
preference: Object.assign({ theme: 'light', locale: locale }, loadObject('preference')),
|
|
ajaxLoading: false,
|
|
}
|
|
}
|
|
|
|
export const store = createStore<State>({
|
|
strict: debug,
|
|
state: initState(),
|
|
getters: {
|
|
anonymous(state) {
|
|
return !state.user?.token
|
|
},
|
|
allow(state) {
|
|
return (perm: string) => state.user?.perms?.has('*') || state.user?.perms?.has(perm)
|
|
},
|
|
},
|
|
mutations: {
|
|
[Mutations.Logout](state) {
|
|
localStorage.removeItem("user");
|
|
state.user = null;
|
|
},
|
|
[Mutations.SetUser](state, user) {
|
|
localStorage.setItem("user", JSON.stringify(user));
|
|
state.user = { perms: new Set(user.perms), name: user.name, token: user.token };
|
|
},
|
|
[Mutations.SetPreference](state, preference) {
|
|
localStorage.setItem("preference", JSON.stringify(preference));
|
|
state.preference = preference;
|
|
},
|
|
[Mutations.SetAjaxLoading](state, loading) {
|
|
state.ajaxLoading = loading;
|
|
},
|
|
},
|
|
plugins: debug ? [createLogger()] : [],
|
|
})
|