mirror of
https://github.com/pezkuwichain/pezkuwi-mobile-app.git
synced 2026-04-26 14:27:57 +00:00
140 lines
3.4 KiB
TypeScript
140 lines
3.4 KiB
TypeScript
import React, { createContext, useState, useContext, useEffect } from 'react';
|
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
import { API_ENDPOINTS } from '../config/api';
|
|
|
|
interface User {
|
|
user_id: string;
|
|
email: string;
|
|
first_name: string;
|
|
last_name: string;
|
|
access_token: string;
|
|
refresh_token: string;
|
|
}
|
|
|
|
interface AuthContextType {
|
|
user: User | null;
|
|
loading: boolean;
|
|
signIn: (email: string, password: string) => Promise<void>;
|
|
signUp: (
|
|
email: string,
|
|
password: string,
|
|
firstName: string,
|
|
lastName: string,
|
|
phone: string,
|
|
referralCode?: string,
|
|
language?: string
|
|
) => Promise<void>;
|
|
signOut: () => Promise<void>;
|
|
setUser: (user: User | null) => void;
|
|
}
|
|
|
|
const AuthContext = createContext<AuthContextType | undefined>(undefined);
|
|
|
|
export function AuthProvider({ children }: { children: React.ReactNode }) {
|
|
const [user, setUser] = useState<User | null>(null);
|
|
const [loading, setLoading] = useState(true);
|
|
|
|
useEffect(() => {
|
|
loadUser();
|
|
}, []);
|
|
|
|
const loadUser = async () => {
|
|
try {
|
|
const userData = await AsyncStorage.getItem('user');
|
|
if (userData) {
|
|
setUser(JSON.parse(userData));
|
|
}
|
|
} catch (error) {
|
|
console.error('Error loading user:', error);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
const signIn = async (email: string, password: string) => {
|
|
try {
|
|
const response = await fetch(API_ENDPOINTS.AUTH_SIGNIN, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({ email, password }),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error('Invalid credentials');
|
|
}
|
|
|
|
const userData = await response.json();
|
|
await AsyncStorage.setItem('user', JSON.stringify(userData));
|
|
setUser(userData);
|
|
} catch (error) {
|
|
console.error('Sign in error:', error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
const signUp = async (
|
|
email: string,
|
|
password: string,
|
|
firstName: string,
|
|
lastName: string,
|
|
phone: string,
|
|
referralCode?: string,
|
|
language: string = 'en'
|
|
) => {
|
|
try {
|
|
const response = await fetch(API_ENDPOINTS.AUTH_SIGNUP, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
email,
|
|
password,
|
|
first_name: firstName,
|
|
last_name: lastName,
|
|
phone,
|
|
referral_code: referralCode,
|
|
language,
|
|
}),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const error = await response.json();
|
|
throw new Error(error.detail || 'Sign up failed');
|
|
}
|
|
|
|
const userData = await response.json();
|
|
await AsyncStorage.setItem('user', JSON.stringify(userData));
|
|
setUser(userData);
|
|
} catch (error) {
|
|
console.error('Sign up error:', error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
const signOut = async () => {
|
|
try {
|
|
await AsyncStorage.removeItem('user');
|
|
setUser(null);
|
|
} catch (error) {
|
|
console.error('Sign out error:', error);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<AuthContext.Provider value={{ user, loading, signIn, signUp, signOut, setUser }}>
|
|
{children}
|
|
</AuthContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useAuth() {
|
|
const context = useContext(AuthContext);
|
|
if (context === undefined) {
|
|
throw new Error('useAuth must be used within an AuthProvider');
|
|
}
|
|
return context;
|
|
}
|