This commit is contained in:
@@ -1,15 +1,33 @@
|
|||||||
import React, { createContext, useContext, useState, useEffect, type ReactNode } from 'react';
|
import React, {
|
||||||
|
createContext,
|
||||||
|
useContext,
|
||||||
|
useState,
|
||||||
|
useEffect,
|
||||||
|
type ReactNode,
|
||||||
|
} from "react";
|
||||||
import {
|
import {
|
||||||
getToken, setToken as storeToken, removeToken,
|
getToken,
|
||||||
getAdminToken, setAdminToken as storeAdminToken, removeAdminToken,
|
setToken as storeToken,
|
||||||
setUsername, removeUsername,
|
removeToken,
|
||||||
setAdminUsername, removeAdminUsername,
|
getAdminToken,
|
||||||
setRole as storeRole, getRole, removeRole,
|
setAdminToken as storeAdminToken,
|
||||||
|
removeAdminToken,
|
||||||
|
setUsername,
|
||||||
|
removeUsername,
|
||||||
|
setAdminUsername,
|
||||||
|
removeAdminUsername,
|
||||||
|
setRole as storeRole,
|
||||||
|
getRole,
|
||||||
|
removeRole,
|
||||||
clearAllAuth,
|
clearAllAuth,
|
||||||
} from './tokenStorage';
|
} from "./tokenStorage";
|
||||||
import { extractUsernameFromToken, extractRoleFromToken, isTokenExpired } from './jwtUtils';
|
import {
|
||||||
|
extractUsernameFromToken,
|
||||||
|
extractRoleFromToken,
|
||||||
|
isTokenExpired,
|
||||||
|
} from "./jwtUtils";
|
||||||
|
|
||||||
export type UserRole = 'client' | 'admin' | 'cabine' | 'livreur' | null;
|
export type UserRole = "client" | "admin" | "cabine" | "livreur" | null;
|
||||||
|
|
||||||
interface AuthState {
|
interface AuthState {
|
||||||
token: string | null;
|
token: string | null;
|
||||||
@@ -22,7 +40,10 @@ interface AuthState {
|
|||||||
|
|
||||||
interface AuthContextType extends AuthState {
|
interface AuthContextType extends AuthState {
|
||||||
loginClient: (token: string, mustChangePassword?: boolean) => Promise<void>;
|
loginClient: (token: string, mustChangePassword?: boolean) => Promise<void>;
|
||||||
loginAdmin: (token: string, role: 'admin' | 'cabine' | 'livreur') => Promise<void>;
|
loginAdmin: (
|
||||||
|
token: string,
|
||||||
|
role: "admin" | "cabine" | "livreur",
|
||||||
|
) => Promise<void>;
|
||||||
logout: () => Promise<void>;
|
logout: () => Promise<void>;
|
||||||
setMustChangePassword: (value: boolean) => void;
|
setMustChangePassword: (value: boolean) => void;
|
||||||
}
|
}
|
||||||
@@ -39,27 +60,30 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|||||||
mustChangePassword: false,
|
mustChangePassword: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Restore session on mount
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const restore = async () => {
|
const restore = async () => {
|
||||||
try {
|
try {
|
||||||
const savedRole = await getRole();
|
const savedRole = await getRole();
|
||||||
|
|
||||||
if (savedRole === 'client') {
|
if (savedRole === "client") {
|
||||||
const token = await getToken();
|
const token = await getToken();
|
||||||
if (token && !isTokenExpired(token)) {
|
if (token && !isTokenExpired(token)) {
|
||||||
const uname = extractUsernameFromToken(token);
|
const uname = extractUsernameFromToken(token);
|
||||||
setState({
|
setState({
|
||||||
token,
|
token,
|
||||||
username: uname,
|
username: uname,
|
||||||
role: 'client',
|
role: "client",
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
isAuthenticated: true,
|
isAuthenticated: true,
|
||||||
mustChangePassword: false,
|
mustChangePassword: false,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (savedRole === 'admin' || savedRole === 'cabine' || savedRole === 'livreur') {
|
} else if (
|
||||||
|
savedRole === "admin" ||
|
||||||
|
savedRole === "cabine" ||
|
||||||
|
savedRole === "livreur"
|
||||||
|
) {
|
||||||
const token = await getAdminToken();
|
const token = await getAdminToken();
|
||||||
if (token && !isTokenExpired(token)) {
|
if (token && !isTokenExpired(token)) {
|
||||||
const uname = extractUsernameFromToken(token);
|
const uname = extractUsernameFromToken(token);
|
||||||
@@ -105,11 +129,11 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|||||||
const uname = extractUsernameFromToken(token);
|
const uname = extractUsernameFromToken(token);
|
||||||
await storeToken(token);
|
await storeToken(token);
|
||||||
if (uname) await setUsername(uname);
|
if (uname) await setUsername(uname);
|
||||||
await storeRole('client');
|
await storeRole("client");
|
||||||
setState({
|
setState({
|
||||||
token,
|
token,
|
||||||
username: uname,
|
username: uname,
|
||||||
role: 'client',
|
role: "client",
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
isAuthenticated: true,
|
isAuthenticated: true,
|
||||||
mustChangePassword,
|
mustChangePassword,
|
||||||
@@ -117,10 +141,13 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const setMustChangePassword = (value: boolean) => {
|
const setMustChangePassword = (value: boolean) => {
|
||||||
setState(prev => ({ ...prev, mustChangePassword: value }));
|
setState((prev) => ({ ...prev, mustChangePassword: value }));
|
||||||
};
|
};
|
||||||
|
|
||||||
const loginAdmin = async (token: string, role: 'admin' | 'cabine' | 'livreur') => {
|
const loginAdmin = async (
|
||||||
|
token: string,
|
||||||
|
role: "admin" | "cabine" | "livreur",
|
||||||
|
) => {
|
||||||
const uname = extractUsernameFromToken(token);
|
const uname = extractUsernameFromToken(token);
|
||||||
await storeAdminToken(token);
|
await storeAdminToken(token);
|
||||||
if (uname) await setAdminUsername(uname);
|
if (uname) await setAdminUsername(uname);
|
||||||
@@ -148,7 +175,15 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AuthContext.Provider value={{ ...state, loginClient, loginAdmin, logout, setMustChangePassword }}>
|
<AuthContext.Provider
|
||||||
|
value={{
|
||||||
|
...state,
|
||||||
|
loginClient,
|
||||||
|
loginAdmin,
|
||||||
|
logout,
|
||||||
|
setMustChangePassword,
|
||||||
|
}}
|
||||||
|
>
|
||||||
{children}
|
{children}
|
||||||
</AuthContext.Provider>
|
</AuthContext.Provider>
|
||||||
);
|
);
|
||||||
@@ -157,7 +192,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|||||||
export function useAuth() {
|
export function useAuth() {
|
||||||
const context = useContext(AuthContext);
|
const context = useContext(AuthContext);
|
||||||
if (!context) {
|
if (!context) {
|
||||||
throw new Error('useAuth must be used within an AuthProvider');
|
throw new Error("useAuth must be used within an AuthProvider");
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user