Add user database migration, core reusable components, and layout structure
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user