sumona-banerjeee c5946ce95e first commit for the leave management system. built a Leave Management System with role-based access:
Employees can apply for leave and track balance, status, and history.
Managers can view all requests and approve/reject them.
Login with separate dashboards for employees and managers with the dummy json.
Tables with filters (All, Pending, Approved, Rejected) for easy management.
2026-04-29 11:22:14 +05:30

79 lines
1.9 KiB
TypeScript

"use client";
import React, {
createContext,
useContext,
useState,
useEffect,
ReactNode,
} from "react";
import { useRouter } from "next/navigation";
export interface User {
id: number;
username: string;
name: string;
role: "employee" | "manager";
leaveBalance?: number;
}
interface AuthContextType {
user: User | null;
login: (
username: string,
password: string,
) => Promise<{ ok: boolean; error?: string }>;
logout: () => void;
isLoading: boolean;
}
const AuthContext = createContext<AuthContextType | null>(null);
export function AuthProvider({ children }: { children: ReactNode }) {
const [user, setUser] = useState<User | null>(null);
const [isLoading, setIsLoading] = useState(true);
const router = useRouter();
useEffect(() => {
const stored = localStorage.getItem("lms_user");
if (stored) {
try {
setUser(JSON.parse(stored));
} catch {}
}
setIsLoading(false);
}, []);
const login = async (username: string, password: string) => {
const mod = await import("@/data/users.json");
const raw = mod.default ?? mod;
const users: any[] = Array.isArray(raw) ? raw : ((raw as any).users ?? []);
const found = users.find(
(u) => u.username === username && u.password === password,
);
if (!found) return { ok: false, error: "Invalid username or password" };
const { password: _pw, ...safeUser } = found;
setUser(safeUser);
localStorage.setItem("lms_user", JSON.stringify(safeUser));
return { ok: true };
};
const logout = () => {
setUser(null);
localStorage.removeItem("lms_user");
router.push("/");
};
return (
<AuthContext.Provider value={{ user, login, logout, isLoading }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const ctx = useContext(AuthContext);
if (!ctx) throw new Error("useAuth must be used inside AuthProvider");
return ctx;
}