60 lines
1.3 KiB
TypeScript
60 lines
1.3 KiB
TypeScript
import { authApi } from '../api/modules';
|
|
|
|
export interface AuthUser {
|
|
id: number;
|
|
username: string;
|
|
role: string;
|
|
role_label?: string;
|
|
permissions: string[];
|
|
}
|
|
|
|
const TOKEN_KEY = 'token';
|
|
const USER_KEY = 'user';
|
|
|
|
export function getToken(): string | null {
|
|
return localStorage.getItem(TOKEN_KEY);
|
|
}
|
|
|
|
export function getUser(): AuthUser | null {
|
|
const raw = localStorage.getItem(USER_KEY);
|
|
if (!raw) return null;
|
|
try {
|
|
return JSON.parse(raw);
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function setAuth(token: string, user: AuthUser) {
|
|
localStorage.setItem(TOKEN_KEY, token);
|
|
localStorage.setItem(USER_KEY, JSON.stringify(user));
|
|
}
|
|
|
|
export function clearAuth() {
|
|
localStorage.removeItem(TOKEN_KEY);
|
|
localStorage.removeItem(USER_KEY);
|
|
}
|
|
|
|
export async function fetchCurrentUser(): Promise<AuthUser | null> {
|
|
const token = getToken();
|
|
if (!token) return null;
|
|
try {
|
|
const data = await authApi.me();
|
|
return {
|
|
id: data.id,
|
|
username: data.username,
|
|
role: data.role,
|
|
role_label: data.role_label,
|
|
permissions: data.permissions,
|
|
};
|
|
} catch {
|
|
clearAuth();
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function hasPerm(user: AuthUser | null, perm: string): boolean {
|
|
if (!user) return false;
|
|
return user.permissions.includes(perm);
|
|
}
|