| Server IP : 54.37.205.81 / Your IP : 216.73.216.76 Web Server : nginx/1.22.1 System : Linux vps-249481fa 6.1.0-50-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.176-1 (2026-07-02) x86_64 User : debian ( 1000) PHP Version : 8.2.32 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/app.copyrightchain.it/copyrightchain_app/context/ |
Upload File : |
import React, { createContext, useContext, useMemo, useState } from 'react';
import { apiFetch, setAuthToken } from '../services/apiClient';
type AuthUser = {
id: number;
username: string;
roles: string[];
};
type AuthContextType = {
token: string | null;
user: AuthUser | null;
isAdmin: boolean;
login: (username: string, password: string) => Promise<void>;
logout: () => void;
};
const AuthContext = createContext<AuthContextType | undefined>(undefined);
export function useAuth() {
const ctx = useContext(AuthContext);
if (!ctx) throw new Error('useAuth must be used within AuthProvider');
return ctx;
}
export const AuthProvider: React.FC<{ children: React.ReactNode }>
= ({ children }) => {
const [token, setToken] = useState<string | null>(null);
const [user, setUser] = useState<AuthUser | null>(null);
const isAdmin = useMemo(() => {
if (!user) return false;
return user.roles.includes('administrator') || user.roles.includes('admin');
}, [user]);
const login = async (username: string, password: string) => {
const res = await apiFetch<{ token: string; user: AuthUser }>(`/auth/login`, {
method: 'POST',
body: JSON.stringify({ username, password }),
});
setToken(res.token);
setAuthToken(res.token);
setUser(res.user);
};
const logout = () => {
setToken(null);
setAuthToken(null);
setUser(null);
};
const value: AuthContextType = { token, user, isAdmin, login, logout };
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
};