first commit
Some checks failed
Deploy / lint (push) Failing after 7s
Deploy / test (push) Has been skipped
Deploy / deploy (push) Has been skipped

This commit is contained in:
Dennis Thiessen
2026-02-20 17:31:01 +01:00
commit 61ab24490d
160 changed files with 17034 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
import { create } from 'zustand';
export interface AuthState {
token: string | null;
username: string | null;
role: 'admin' | 'user' | null;
login: (token: string) => void;
logout: () => void;
}
function decodeJwtPayload(token: string): { sub?: string; role?: string } {
try {
const base64 = token.split('.')[1];
const json = atob(base64);
return JSON.parse(json);
} catch {
return {};
}
}
export const useAuthStore = create<AuthState>()((set) => ({
token: localStorage.getItem('token'),
username: (() => {
const t = localStorage.getItem('token');
if (!t) return null;
return decodeJwtPayload(t).sub ?? null;
})(),
role: (() => {
const t = localStorage.getItem('token');
if (!t) return null;
const r = decodeJwtPayload(t).role;
return r === 'admin' ? 'admin' : r === 'user' ? 'user' : null;
})(),
login: (token: string) => {
const payload = decodeJwtPayload(token);
localStorage.setItem('token', token);
set({
token,
username: payload.sub ?? null,
role: payload.role === 'admin' ? 'admin' : 'user',
});
},
logout: () => {
localStorage.removeItem('token');
set({ token: null, username: null, role: null });
},
}));