Files
vendora/frontend/app/context/AuthContext.jsx
T

116 lines
2.9 KiB
React

import React, { createContext, useState, useContext, useEffect } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { STORAGE_KEYS } from '../constants/storageKeys';
import api from '../api';
const AuthContext = createContext();
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
checkUser();
}, []);
const checkUser = async () => {
try {
const token = await AsyncStorage.getItem(STORAGE_KEYS.AUTH_TOKEN);
const userData = await AsyncStorage.getItem(STORAGE_KEYS.USER_DATA);
if (token && userData) {
setUser(JSON.parse(userData));
}
} catch (err) {
console.error('Error checking user:', err);
setError(err.message);
} finally {
setLoading(false);
}
};
const login = async (email, password) => {
try {
setLoading(true);
setError(null);
const response = await api.login(email, password);
if (response.token) {
await AsyncStorage.setItem(STORAGE_KEYS.AUTH_TOKEN, response.token);
await AsyncStorage.setItem(STORAGE_KEYS.USER_DATA, JSON.stringify(response.user));
setUser(response.user);
return true;
}
return false;
} catch (err) {
console.error('Login error:', err);
setError(err.message);
return false;
} finally {
setLoading(false);
}
};
const logout = async () => {
try {
setLoading(true);
await AsyncStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);
await AsyncStorage.removeItem(STORAGE_KEYS.USER_DATA);
setUser(null);
} catch (err) {
console.error('Logout error:', err);
setError(err.message);
} finally {
setLoading(false);
}
};
const register = async (userData) => {
try {
setLoading(true);
setError(null);
const response = await api.register(userData);
if (response.token) {
await AsyncStorage.setItem(STORAGE_KEYS.AUTH_TOKEN, response.token);
await AsyncStorage.setItem(STORAGE_KEYS.USER_DATA, JSON.stringify(response.user));
setUser(response.user);
return true;
}
return false;
} catch (err) {
console.error('Registration error:', err);
setError(err.message);
return false;
} finally {
setLoading(false);
}
};
return (
<AuthContext.Provider value={{
user,
loading,
error,
login,
logout,
register,
isAuthenticated: !!user
}}>
{children}
</AuthContext.Provider>
);
};
export const useAuth = () => {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
};
export default AuthContext;