57 lines
1.5 KiB
TypeScript
57 lines
1.5 KiB
TypeScript
import { createContext, useContext, useState, ReactNode } from "react";
|
|
import { userService } from "../api/userService";
|
|
|
|
interface AuthContextType {
|
|
token: string | null;
|
|
login: (username: string, password: string) => Promise<any>;
|
|
logout: () => void;
|
|
isAuthenticated: () => boolean;
|
|
}
|
|
|
|
const AuthContext = createContext<AuthContextType | undefined>(undefined);
|
|
|
|
interface AuthProviderProps {
|
|
children: ReactNode;
|
|
}
|
|
|
|
export const AuthProvider = ({ children }: AuthProviderProps) => {
|
|
const [token, setToken] = useState(localStorage.getItem("access_token"));
|
|
|
|
const login = async (username: string, password: string) => {
|
|
try {
|
|
const data = await userService.login(username, password);
|
|
setToken(data.access_token);
|
|
localStorage.setItem("access_token", data.access_token);
|
|
localStorage.setItem("refresh_token", data.refresh_token);
|
|
return data;
|
|
} catch (error) {
|
|
console.error("Login failed:", error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
const logout = () => {
|
|
setToken(null);
|
|
localStorage.removeItem("access_token");
|
|
localStorage.removeItem("refresh_token");
|
|
};
|
|
|
|
const isAuthenticated = () => {
|
|
return token !== null && token !== undefined && token !== "";
|
|
};
|
|
|
|
return (
|
|
<AuthContext.Provider value={{ token, login, logout, isAuthenticated }}>
|
|
{children}
|
|
</AuthContext.Provider>
|
|
);
|
|
};
|
|
|
|
export const useAuth = () => {
|
|
const context = useContext(AuthContext);
|
|
if (context === undefined) {
|
|
throw new Error("useAuth must be used within an AuthProvider");
|
|
}
|
|
return context;
|
|
};
|