lfg9-forums/frontend/src/contexts/MockAuthContext.tsx
Developer 097d5c4109 init
2025-09-02 14:05:42 -05:00

102 lines
2.5 KiB
TypeScript

import React, { createContext, useContext, useState, ReactNode } from 'react';
export interface AuthUser {
userId: string;
username: string;
email: string;
token: string;
isAdmin?: boolean;
}
interface AuthContextType {
user: AuthUser | null;
login: (email: string, password: string) => Promise<void>;
register: (username: string, email: string, password: string) => Promise<void>;
logout: () => void;
loading: boolean;
isAuthenticated: boolean;
}
const AuthContext = createContext<AuthContextType | undefined>(undefined);
export const useAuth = (): AuthContextType => {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
};
interface AuthProviderProps {
children: ReactNode;
}
// Mock user for testing
const mockUser: AuthUser = {
userId: 'mock-user-id',
username: 'TestUser',
email: 'test@example.com',
token: 'mock-jwt-token',
isAdmin: true,
};
export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
const [user, setUser] = useState<AuthUser | null>(null);
const [loading, setLoading] = useState(false);
const login = async (email: string, password: string): Promise<void> => {
setLoading(true);
try {
// Simulate API call delay
await new Promise(resolve => setTimeout(resolve, 1000));
// Accept any email/password for demo
setUser(mockUser);
localStorage.setItem('token', mockUser.token);
localStorage.setItem('user', JSON.stringify(mockUser));
} catch (error) {
throw error;
} finally {
setLoading(false);
}
};
const register = async (username: string, email: string, password: string): Promise<void> => {
setLoading(true);
try {
// Simulate API call delay
await new Promise(resolve => setTimeout(resolve, 1000));
const newUser = {
...mockUser,
username,
email,
};
setUser(newUser);
localStorage.setItem('token', newUser.token);
localStorage.setItem('user', JSON.stringify(newUser));
} catch (error) {
throw error;
} finally {
setLoading(false);
}
};
const logout = (): void => {
setUser(null);
localStorage.removeItem('token');
localStorage.removeItem('user');
};
const value: AuthContextType = {
user,
login,
register,
logout,
loading,
isAuthenticated: !!user,
};
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
};