Files

50 lines
1.3 KiB
JavaScript

const TOKEN_KEY = 'wo_token';
const USER_KEY = 'wo_user';
export function getToken() {
return localStorage.getItem(TOKEN_KEY) || '';
}
export function setToken(token) {
localStorage.setItem(TOKEN_KEY, token);
try {
const payload = JSON.parse(atob(token.split('.')[1]));
localStorage.setItem(USER_KEY, JSON.stringify({
id: payload.uid,
username: payload.username,
email: payload.email,
displayName: payload.name,
role: payload.role,
}));
} catch { /* ignore decode errors */ }
}
export function clearToken() {
localStorage.removeItem(TOKEN_KEY);
localStorage.removeItem(USER_KEY);
}
export function getUser() {
const token = getToken();
if (!token) return null;
try {
const payload = JSON.parse(atob(token.split('.')[1]));
if (payload.exp && payload.exp * 1000 < Date.now()) {
clearToken();
return null;
}
const stored = localStorage.getItem(USER_KEY);
return stored ? JSON.parse(stored) : null;
} catch {
return null;
}
}
const ROLE_LEVEL = { admin: 4, dispatcher: 3, field_tech: 2, viewer: 1 };
export function hasRole(minRole) {
const user = getUser();
if (!user) return false;
return (ROLE_LEVEL[user.role] || 0) >= (ROLE_LEVEL[minRole] || 0);
}