File size: 3,337 Bytes
0f8617c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { createContext, useState, useContext, useEffect } from 'react';
import api from '../api/api';

const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
    const [user, setUser] = useState(null);
    const [activeRole, setActiveRole] = useState(null); // The role being "used" right now
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        const storedUser = localStorage.getItem('user');
        const storedRole = localStorage.getItem('activeRole');
        if (storedUser) {
            const parsedUser = JSON.parse(storedUser);
            setUser(parsedUser);
            // Restore active role if stored, otherwise use user's primary role
            setActiveRole(storedRole || parsedUser.role);
        }
        setLoading(false);
    }, []);

    const login = async (email, password) => {
        try {
            const response = await api.post('/auth/login', { email, password });
            const userData = response.data;
            setUser(userData);
            localStorage.setItem('user', JSON.stringify(userData));
            return { success: true, user: userData };
        } catch (error) {
            return {
                success: false,
                message: error.response?.data?.message || 'Login failed'
            };
        }
    };

    const register = async (formData) => {
        try {
            const response = await api.post('/auth/register', formData);
            const data = response.data;
            setUser(data);
            // Default activeRole = first role selected
            const defaultRole = data.roles?.[0] || data.role;
            setActiveRole(defaultRole);
            localStorage.setItem('user', JSON.stringify(data));
            localStorage.setItem('activeRole', defaultRole);
            return { success: true };
        } catch (error) {
            return {
                success: false,
                message: error.response?.data?.message || 'Registration failed'
            };
        }
    };

    const logout = () => {
        setUser(null);
        setActiveRole(null);
        localStorage.removeItem('user');
        localStorage.removeItem('activeRole');
    };

    const updateProfile = (updatedData) => {
        const newUser = { ...user, ...updatedData };
        setUser(newUser);
        localStorage.setItem('user', JSON.stringify(newUser));
    };

    // Switch the "active role" the user is currently using (Customer <-> Photographer)
    const switchRole = (role) => {
        const availableRoles = user?.roles || [user?.role];
        if (!availableRoles.includes(role)) return;
        setActiveRole(role);
        localStorage.setItem('activeRole', role);
    };

    // Set active role after login (called by Login.jsx)
    const setLoginRole = (role) => {
        setActiveRole(role);
        localStorage.setItem('activeRole', role);
    };

    return (
        <AuthContext.Provider value={{ user, activeRole, login, register, logout, updateProfile, switchRole, setLoginRole, loading }}>
            {children}
        </AuthContext.Provider>
    );
};

export const useAuth = () => {
    const context = useContext(AuthContext);
    if (!context) {
        throw new Error('useAuth must be used within an AuthProvider');
    }
    return context;
};