import AsyncStorage from '@react-native-community/async-storage'; import React, {createContext, useEffect, useState} from 'react'; import { GET_FB_POSTS_ENDPOINT, GET_IG_POSTS_ENDPOINT, GET_TWITTER_POSTS_ENDPOINT, } from '../../constants'; import { loadAvatar, loadCover, loadProfileInfo, loadRecentlySearchedUsers, loadSocialPosts, } from '../../services'; import { ProfilePreviewType, ProfileType, SocialAccountType, UserType, } from '../../types'; interface AuthContextProps { user: UserType; profile: ProfileType; login: (userId: string, username: string) => void; logout: () => void; avatar: string | null; cover: string | null; socialAccounts: Record; recentSearches: Array; newMomentsAvailable: boolean; updateMoments: (value: boolean) => void; } const NO_USER: UserType = { userId: '', username: '', }; const NO_PROFILE: ProfileType = { biography: '', website: '', name: '', }; // Not necessary, but safer, in case SocialAccountType object is undefined const NO_SOCIAL_ACCOUNTS: Record = { Instagram: {}, Facebook: {}, Twitter: {}, }; export const AuthContext = createContext({ user: NO_USER, profile: NO_PROFILE, login: () => {}, logout: () => {}, avatar: null, cover: null, socialAccounts: NO_SOCIAL_ACCOUNTS, recentSearches: [], newMomentsAvailable: true, updateMoments: () => {}, }); /** * 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 [socialAccounts, setSocialAccounts] = useState< Record >(NO_SOCIAL_ACCOUNTS); const [recentSearches, setRecentSearches] = useState< Array >([]); const [newMomentsAvailable, setNewMomentsAvailable] = useState(true); 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); loadRecentlySearchedUsers(setRecentSearches); loadSocialPosts( token, userId, 'Instagram', GET_IG_POSTS_ENDPOINT, socialAccounts, ).then((newSocialAccounts) => setSocialAccounts(newSocialAccounts)); loadSocialPosts( token, userId, 'Facebook', GET_FB_POSTS_ENDPOINT, socialAccounts, ).then((newSocialAccounts) => setSocialAccounts(newSocialAccounts)); loadSocialPosts( token, userId, 'Twitter', GET_TWITTER_POSTS_ENDPOINT, socialAccounts, ).then((newSocialAccounts) => setSocialAccounts(newSocialAccounts)); } catch (err) { console.log(err); } }; loadData(); }, [socialAccounts, userId]); return ( { setUser({...user, userId: id, username}); }, logout: () => { try { new Promise(() => { AsyncStorage.removeItem('token'); }).then(() => { setUser(NO_USER); }); } catch (err) { console.log(err); } }, recentSearches, updateMoments: (value) => { setNewMomentsAvailable(value); }, }}> {children} ); }; export default AuthProvider;