sourabhrealtime
Version:
ROBUST RICH TEXT EDITOR: Single-pane contentEditable with direct text selection formatting, speech features, undo/redo, professional UI - Perfect TipTap alternative
123 lines (102 loc) • 3.06 kB
JSX
import React, { createContext, useContext, useState, useEffect } from 'react';
const AuthContext = createContext();
export const useAuth = () => {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
};
export const AuthProvider = ({ children, apiUrl = 'http://localhost:3002' }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
// Check for existing session
const token = localStorage.getItem('auth_token');
const userData = localStorage.getItem('user_data');
if (token && userData) {
try {
setUser(JSON.parse(userData));
} catch (err) {
localStorage.removeItem('auth_token');
localStorage.removeItem('user_data');
}
}
setLoading(false);
}, []);
const login = async (email, password) => {
setLoading(true);
setError(null);
try {
const response = await fetch(`${apiUrl}/api/login`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, password }),
});
const data = await response.json();
if (!response.ok) {
throw new Error(data.message || 'Login failed');
}
localStorage.setItem('auth_token', data.token);
localStorage.setItem('user_data', JSON.stringify(data.user));
setUser(data.user);
return { success: true, user: data.user };
} catch (err) {
setError(err.message);
return { success: false, error: err.message };
} finally {
setLoading(false);
}
};
const signup = async (userData) => {
setLoading(true);
setError(null);
try {
const response = await fetch(`${apiUrl}/api/users`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userData),
});
const data = await response.json();
if (!response.ok) {
throw new Error(data.message || 'Signup failed');
}
localStorage.setItem('auth_token', data.token);
localStorage.setItem('user_data', JSON.stringify(data.user));
setUser(data.user);
return { success: true, user: data.user };
} catch (err) {
setError(err.message);
return { success: false, error: err.message };
} finally {
setLoading(false);
}
};
const logout = () => {
localStorage.removeItem('auth_token');
localStorage.removeItem('user_data');
setUser(null);
};
const value = {
user,
loading,
error,
login,
signup,
logout,
isAuthenticated: !!user,
isSuperAdmin: user?.role === 'super_admin',
isAdmin: user?.role === 'admin' || user?.role === 'super_admin'
};
return (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
);
};
export default AuthProvider;