| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import React, { createContext, useContext, useState, useEffect } from 'react';
- const API_BASE = 'http://localhost:3001/api';
- const AuthContext = createContext();
- export function useAuth() {
- const context = useContext(AuthContext);
- if (context === undefined) {
- throw new Error('useAuth must be used within an AuthProvider');
- }
- return context;
- }
- export function AuthProvider({ children }) {
- const [user, setUser] = useState(null);
- const [loading, setLoading] = useState(true);
- const [error, setError] = useState(null);
- // Check if user is already authenticated on app start
- useEffect(() => {
- checkAuth();
- }, []);
- const checkAuth = async () => {
- try {
- const response = await fetch(`${API_BASE}/auth/me`, {
- credentials: 'include'
- });
-
- if (response.ok) {
- const data = await response.json();
- setUser(data.user);
- } else {
- setUser(null);
- }
- } catch (err) {
- console.error('Auth check failed:', err);
- setUser(null);
- } finally {
- setLoading(false);
- }
- };
- const login = async (username, password) => {
- try {
- setLoading(true);
- setError(null);
-
- const response = await fetch(`${API_BASE}/auth/login`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- credentials: 'include',
- body: JSON.stringify({ username, password }),
- });
- const data = await response.json();
- if (response.ok) {
- setUser(data.user);
- return { success: true };
- } else {
- setError(data.error || 'Login failed');
- return { success: false, error: data.error || 'Login failed' };
- }
- } catch (err) {
- const errorMessage = 'Network error. Please check if the server is running.';
- setError(errorMessage);
- return { success: false, error: errorMessage };
- } finally {
- setLoading(false);
- }
- };
- const logout = async () => {
- try {
- await fetch(`${API_BASE}/auth/logout`, {
- method: 'POST',
- credentials: 'include',
- });
- } catch (err) {
- console.error('Logout request failed:', err);
- } finally {
- setUser(null);
- setError(null);
- }
- };
- const changePassword = async (currentPassword, newPassword) => {
- try {
- const response = await fetch(`${API_BASE}/auth/change-password`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- credentials: 'include',
- body: JSON.stringify({ currentPassword, newPassword }),
- });
- const data = await response.json();
- if (response.ok) {
- return { success: true, message: data.message };
- } else {
- return { success: false, error: data.error || 'Password change failed' };
- }
- } catch (err) {
- return { success: false, error: 'Network error. Please try again.' };
- }
- };
- const value = {
- user,
- loading,
- error,
- login,
- logout,
- changePassword,
- isAdmin: user?.role === 'admin',
- isAuthenticated: !!user,
- };
- return (
- <AuthContext.Provider value={value}>
- {children}
- </AuthContext.Provider>
- );
- }
|