UNPKG

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