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;
};