csa-dashboard-sementara/csa-dashboard/providers/auth-provider.tsx

78 lines
2.0 KiB
TypeScript

"use client";
import { createContext, useContext, useState, useEffect } from "react";
import { useRouter } from "next/navigation";
interface User {
email: string;
username?: string;
}
interface AuthContextType {
user: User | null;
token: string | null;
login: (token: string, user: User) => void;
logout: () => void;
isAuthenticated: boolean;
}
const AuthContext = createContext<AuthContextType | undefined>(undefined);
export function AuthProvider({ children }: { children: React.ReactNode }) {
const [user, setUser] = useState<User | null>(null);
const [token, setToken] = useState<string | null>(null);
const router = useRouter();
useEffect(() => {
const storedToken = localStorage.getItem("token");
const storedUser = localStorage.getItem("user");
if (storedToken && storedUser) {
setToken(storedToken);
setUser(JSON.parse(storedUser));
}
}, []);
const login = (newToken: string, newUser: User) => {
localStorage.setItem("token", newToken);
localStorage.setItem("user", JSON.stringify(newUser));
document.cookie = `token=${newToken}; path=/; max-age=${60 * 60 * 24 * 7}`; // 7 days
setToken(newToken);
setUser(newUser);
router.push("/");
};
const logout = () => {
localStorage.removeItem("token");
localStorage.removeItem("user");
document.cookie = "token=; path=/; max-age=0";
setToken(null);
setUser(null);
router.push("/login");
};
return (
<AuthContext.Provider
value={{
user,
token,
login,
logout,
isAuthenticated: !!token,
}}
>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const context = useContext(AuthContext);
if (!context) {
throw new Error("useAuth must be used within AuthProvider");
}
return context;
}