63 lines
1.1 KiB
TypeScript
63 lines
1.1 KiB
TypeScript
|
|
import {createContext, useContext, useState} from "react";
|
||
|
|
import api from "@/services/api";
|
||
|
|
|
||
|
|
type AuthContextType = {
|
||
|
|
user: any;
|
||
|
|
token: string | null;
|
||
|
|
login: (username: string, password: string) => Promise<void>;
|
||
|
|
logout: () => void;
|
||
|
|
};
|
||
|
|
|
||
|
|
const AuthContext = createContext<AuthContextType | null>(null);
|
||
|
|
|
||
|
|
export function AuthProvider({children}: {children: React.ReactNode}) {
|
||
|
|
const [token, setToken] = useState<string | null>(
|
||
|
|
localStorage.getItem("token"),
|
||
|
|
);
|
||
|
|
|
||
|
|
const [user, setUser] = useState(null);
|
||
|
|
|
||
|
|
async function login(username: string, password: string) {
|
||
|
|
const response = await api.post("/auth/login", {
|
||
|
|
username,
|
||
|
|
password,
|
||
|
|
});
|
||
|
|
|
||
|
|
const token = response.data.token;
|
||
|
|
|
||
|
|
localStorage.setItem("token", token);
|
||
|
|
|
||
|
|
setToken(token);
|
||
|
|
}
|
||
|
|
|
||
|
|
function logout() {
|
||
|
|
localStorage.removeItem("token");
|
||
|
|
|
||
|
|
setToken(null);
|
||
|
|
setUser(null);
|
||
|
|
}
|
||
|
|
|
||
|
|
return (
|
||
|
|
<AuthContext.Provider
|
||
|
|
value={{
|
||
|
|
user,
|
||
|
|
token,
|
||
|
|
login,
|
||
|
|
logout,
|
||
|
|
}}
|
||
|
|
>
|
||
|
|
{children}
|
||
|
|
</AuthContext.Provider>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function useAuth() {
|
||
|
|
const context = useContext(AuthContext);
|
||
|
|
|
||
|
|
if (!context) {
|
||
|
|
throw new Error("useAuth must be used inside AuthProvider");
|
||
|
|
}
|
||
|
|
|
||
|
|
return context;
|
||
|
|
}
|