import React, {useEffect} from 'react'; import {createContext, useState} from 'react'; import { UserType, ProfileType, InstagramPostType, ProfilePreviewType, } from '../../types'; import AsyncStorage from '@react-native-community/async-storage'; import { loadProfileInfo, loadAvatar, loadCover, loadInstaPosts, loadRecentlySearchedUsers, } from '../../services'; interface AuthContextProps { user: UserType; profile: ProfileType; login: (userId: string, username: string) => void; logout: () => void; avatar: string | null; cover: string | null; instaPosts: Array; recentSearches: Array; } const NO_USER: UserType = { userId: '', username: '', }; const NO_PROFILE: ProfileType = { biography: '', website: '', name: '', }; export const AuthContext = createContext({ user: NO_USER, profile: NO_PROFILE, login: () => {}, logout: () => {}, avatar: null, cover: null, instaPosts: [], recentSearches: [], }); /** * Authentication provider for the application. */ const AuthProvider: React.FC = ({children}) => { const [user, setUser] = useState(NO_USER); const [profile, setProfile] = useState(NO_PROFILE); const [avatar, setAvatar] = useState(null); const [cover, setCover] = useState(null); const [instaPosts, setInstaPosts] = useState>([]); const [recentSearches, setRecentSearches] = useState< Array >([]); const {userId} = user; useEffect(() => { if (!userId) { return; } const loadData = async () => { try { const token = await AsyncStorage.getItem('token'); if (!token) { setUser(NO_USER); return; } loadProfileInfo(token, userId, setProfile); loadAvatar(token, userId, setAvatar); loadCover(token, userId, setCover); loadInstaPosts(token, userId, setInstaPosts); loadRecentlySearchedUsers(setRecentSearches); } catch (err) { console.log(err); } }; loadData(); }, [userId]); return ( { setUser({...user, userId: id, username}); }, logout: () => { try { new Promise(() => { AsyncStorage.removeItem('token'); }).then(() => { setUser(NO_USER); }); } catch (err) { console.log(err); } }, recentSearches, }}> {children} ); }; export default AuthProvider;