STRAPS_LOCALHOST/lib/auth.tsx

76 lines
1.8 KiB
TypeScript

import React, { createContext, useContext, useEffect, useState } from 'react';
type UserRole = 'COACH' | 'CLIENT';
interface User {
id: string; // Changed to string
name: string;
role: UserRole;
coach_id?: string | null;
coach?: {
id: string;
name: string;
} | null;
}
interface AuthContextType {
user: User | null;
login: (userId: string) => Promise<User | null>; // Changed to string
logout: () => void;
isLoading: boolean;
}
const AuthContext = createContext<AuthContextType>({
user: null,
login: async () => null,
logout: () => {},
isLoading: true,
});
export function AuthProvider({ children }: { children: React.ReactNode }) {
const [user, setUser] = useState<User | null>(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
// Check sessionStorage on mount
const storedUser = sessionStorage.getItem('straps_user');
if (storedUser) {
setUser(JSON.parse(storedUser));
}
setIsLoading(false);
}, []);
const login = async (id: string): Promise<User | null> => {
setIsLoading(true);
try {
const res = await fetch(`/api/users/${id}`);
if (res.ok) {
const userData = await res.json();
setUser(userData);
sessionStorage.setItem('straps_user', JSON.stringify(userData)); // Store full object in Session
return userData;
}
return null;
} catch (error) {
console.error("Login failed", error);
return null;
} finally {
setIsLoading(false);
}
};
const logout = () => {
setUser(null);
sessionStorage.removeItem('straps_user');
};
return (
<AuthContext.Provider value={{ user, login, logout, isLoading }}>
{children}
</AuthContext.Provider>
);
}
export const useAuth = () => useContext(AuthContext);