Spaces:
Build error
Build error
File size: 1,689 Bytes
76d6db7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | import React, { createContext, useContext, useState } from 'react';
interface UserState {
isAuthenticated: boolean;
username: string | null;
progress: {
completedModules: string[];
achievements: Array<{
name: string;
date: string;
description: string;
}>;
learningStreak: number;
};
}
interface UserContextType {
user: UserState;
login: (username: string) => void;
logout: () => void;
updateProgress: (moduleId: string) => void;
}
const defaultUserState: UserState = {
isAuthenticated: false,
username: null,
progress: {
completedModules: [],
achievements: [],
learningStreak: 0
}
};
const UserContext = createContext<UserContextType | undefined>(undefined);
export const UserProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [user, setUser] = useState<UserState>(defaultUserState);
const login = (username: string) => {
setUser({
isAuthenticated: true,
username,
progress: {
...defaultUserState.progress
}
});
};
const logout = () => {
setUser(defaultUserState);
};
const updateProgress = (moduleId: string) => {
setUser(prev => ({
...prev,
progress: {
...prev.progress,
completedModules: [...prev.progress.completedModules, moduleId]
}
}));
};
return (
<UserContext.Provider value={{ user, login, logout, updateProgress }}>
{children}
</UserContext.Provider>
);
};
export const useUser = () => {
const context = useContext(UserContext);
if (context === undefined) {
throw new Error('useUser must be used within a UserProvider');
}
return context;
}; |