import { defineStore } from "pinia";
|
import { ref } from "vue";
|
|
function parsePermissions(raw: string | null) {
|
if (!raw) return [] as string[];
|
try {
|
const parsed = JSON.parse(raw);
|
return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === "string") : [];
|
} catch {
|
return [];
|
}
|
}
|
|
export const useAuthStore = defineStore("auth", () => {
|
const token = ref<string | null>(localStorage.getItem("satoken"));
|
const userId = ref<number | null>(parseUserId(localStorage.getItem("userId")));
|
const displayName = ref<string | null>(localStorage.getItem("displayName"));
|
const avatarUrl = ref<string | null>(localStorage.getItem("avatarUrl"));
|
const permissions = ref<string[]>(parsePermissions(localStorage.getItem("permissions")));
|
|
function setSession(t: string, name: string, avatar?: string | null, perms?: string[], uid?: number | null) {
|
token.value = t;
|
userId.value = typeof uid === "number" && Number.isFinite(uid) ? uid : null;
|
displayName.value = name;
|
avatarUrl.value = avatar || null;
|
permissions.value = Array.isArray(perms) ? [...new Set(perms.filter(Boolean))] : [];
|
localStorage.setItem("satoken", t);
|
if (userId.value != null) {
|
localStorage.setItem("userId", String(userId.value));
|
} else {
|
localStorage.removeItem("userId");
|
}
|
localStorage.setItem("displayName", name);
|
localStorage.setItem("permissions", JSON.stringify(permissions.value));
|
if (avatar) {
|
localStorage.setItem("avatarUrl", avatar);
|
} else {
|
localStorage.removeItem("avatarUrl");
|
}
|
}
|
|
function hasPermission(permission?: string | null) {
|
if (!permission) return true;
|
return permissions.value.includes(permission);
|
}
|
|
function hasAnyPermission(permissionList?: Array<string | null | undefined>) {
|
if (!permissionList || permissionList.length === 0) return true;
|
return permissionList.some((permission) => hasPermission(permission));
|
}
|
|
function clear() {
|
token.value = null;
|
userId.value = null;
|
displayName.value = null;
|
avatarUrl.value = null;
|
permissions.value = [];
|
localStorage.removeItem("satoken");
|
localStorage.removeItem("userId");
|
localStorage.removeItem("displayName");
|
localStorage.removeItem("avatarUrl");
|
localStorage.removeItem("permissions");
|
}
|
|
return { token, userId, displayName, avatarUrl, permissions, setSession, hasPermission, hasAnyPermission, clear };
|
});
|
|
function parseUserId(raw: string | null) {
|
if (!raw) return null;
|
const value = Number(raw);
|
return Number.isFinite(value) ? value : null;
|
}
|