import AsyncStorage from "@react-native-async-storage/async-storage"; import * as Google from "expo-auth-session/providers/google"; import React, { createContext, useEffect, useState } from "react"; import { googleApi, loginApi, registerApi } from "../service/user"; import { revokeAsync } from "expo-auth-session"; export const AuthContext = createContext(); export const AuthProvider = ({ children }) => { const [userInfo, setUserInfo] = useState({}); const [isLoading, setIsLoading] = useState(false); // Google Auth const [request, response, promptAsync] = Google.useAuthRequest({ androidClientId: "1032296921439-dpgvgkss3ggds0egvo6puf0r7un9em6c.apps.googleusercontent.com", iosClientId: "1032296921439-j7jfahhm7q3l07aj04qvdblmcns77oul.apps.googleusercontent.com", expoClientId: "1032296921439-vfs9k28sn7kei4nft998ck3067m8ksiq.apps.googleusercontent.com", }); useEffect(() => { if (response?.type === "success") { googleApi(response.authentication.accessToken) .then((res) => { if (res.user) { setUserInfo(res); AsyncStorage.setItem("userInfo", JSON.stringify(res)); setIsLoading(false); } else { callback(res); setIsLoading(false); } }) .catch((e) => { console.log("error", e); setIsLoading(false); }); } }, [response]); const login = (email, password, callback) => { setIsLoading(true); loginApi({ identifier: email, password }) .then((res) => { if (res.user) { setUserInfo(res); AsyncStorage.setItem("userInfo", JSON.stringify(res)); AsyncStorage.setItem("jwt-token", res.jwt); setIsLoading(false); } else { callback(res); setIsLoading(false); } }) .catch((e) => { console.log("error", e); setIsLoading(false); }); }; const googleAuth = () => { promptAsync({ useProxy: true, showInRecents: true }); }; const register = (username, email, password, callback) => { setIsLoading(true); registerApi({ username, email, password }) .then((res) => { if (res.user) { setUserInfo(res); AsyncStorage.setItem("userInfo", JSON.stringify(res)); AsyncStorage.setItem("jwt-token", res.jwt); setIsLoading(false); } else { callback(res); setIsLoading(false); } }) .catch((e) => { console.log("error", e); setIsLoading(false); }); }; const logout = async () => { setIsLoading(true); AsyncStorage.removeItem("userInfo"); AsyncStorage.removeItem("jwt-token"); setUserInfo({}); if (userInfo.user.provider === "google") { await revokeAsync( { token: response.authentication.accessToken }, { revocationEndpoint: "https://oauth2.googleapis.com/revoke" } ); } setIsLoading(false); }; const isLoggedIn = async () => { try { let userInfo = await AsyncStorage.getItem("userInfo"); userInfo = JSON.parse(userInfo); if (userInfo) { setUserInfo(userInfo); } } catch (e) { console.log(e); } }; useEffect(() => { isLoggedIn(); }, []); return ( {children} ); };