50 lines
1.3 KiB
JavaScript
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);
|
|
}
|