import { useMutation } from "@apollo/react-hooks"; import { FontAwesome } from "@expo/vector-icons"; import { useNavigation, useTheme } from "@react-navigation/native"; import * as AppleAuthentication from "expo-apple-authentication"; import Constants from "expo-constants"; //import * as Google from 'expo-google-app-auth' import * as Google from "expo-auth-session/providers/google"; import * as Notifications from "expo-notifications"; import gql from "graphql-tag"; import React, { useContext, useEffect, useState } from "react"; import { Platform, TouchableOpacity, View } from "react-native"; import getEnvVars from "../../../environment"; import { login } from "../../apollo/server"; import { EnategaImage, FdEmailBtn, FdGoogleBtn, FlashMessage, RegistrationHeader, Spinner, TextDefault, WrapperView, } from "../../components"; import UserContext from "../../context/User"; import { alignment } from "../../utils/alignment"; import Analytics from "../../utils/analytics"; import { NAVIGATION_SCREEN } from "../../utils/constant"; import { scale } from "../../utils/scaling"; import useStyle from "./styles"; import ApolloClient from "apollo-client"; const { IOS_CLIENT_ID_GOOGLE, ANDROID_CLIENT_ID_GOOGLE, Expo_CLIENT_ID_GOOGLE, } = getEnvVars(); const LOGIN = gql` ${login} `; const Logo = require("../../../assets/logo.png"); const CreateAccount = () => { const styles = useStyle(); const { colors } = useTheme(); const navigation = useNavigation(); const [enableApple, setEnableApple] = useState(false); const [loginButton, loginButtonSetter] = useState(null); const [loading, setLoading] = useState(false); const { setTokenAsync } = useContext(UserContext); useEffect(() => { checkIfSupportsAppleAuthentication(); }, []); const [mutate] = useMutation(LOGIN, { onCompleted, onError }); async function checkIfSupportsAppleAuthentication() { setEnableApple(await AppleAuthentication.isAvailableAsync()); } async function onCompleted(data) { try { const trackingOpts = { id: data.login.userId, usernameOrEmail: data.login.email, }; Analytics.identify(data.login.userId, trackingOpts); Analytics.track(Analytics.events.USER_CREATED_ACCOUNT, trackingOpts); setTokenAsync(data.login.token); navigation.navigate(NAVIGATION_SCREEN.Menu); } catch (e) { console.log(e); } finally { setLoading(false); } } function onError(error) { try { console.log(JSON.stringify(error)); FlashMessage({ message: error.graphQLErrors[0].message, }); loginButtonSetter(null); } catch (e) { console.log(e); } finally { setLoading(false); } } async function mutateLogin(user) { setLoading(true); let notificationToken = null; if (Constants.isDevice) { const { status: existingStatus } = await Notifications.getPermissionsAsync(); if (existingStatus === "granted") { notificationToken = (await Notifications.getExpoPushTokenAsync()).data; } } mutate({ variables: { ...user, notificationToken } }); } function renderAppleAction() { if (loading && loginButton === "Apple") { return ( ); } return ( { try { const credential = await AppleAuthentication.signInAsync({ requestedScopes: [ AppleAuthentication.AppleAuthenticationScope.FULL_NAME, AppleAuthentication.AppleAuthenticationScope.EMAIL, ], }); console.log(credential); if (credential) { const user = { appleId: credential.user, phone: "", email: credential.email, password: "", name: credential.fullName.givenName + " " + credential.fullName.familyName, picture: "", type: "apple", }; mutateLogin(user); } loginButtonSetter("Apple"); // signed in } catch (e) { if (e.code === "ERR_CANCELLED") { // handle that the user canceled the sign-in flow loginButtonSetter(null); } else { // handle other errors loginButtonSetter(null); } } }} > Signup with Apple ); } const [googleRequest, googleResponse, googlePromptAsync] = Google.useAuthRequest({ expoClientId: Expo_CLIENT_ID_GOOGLE, iosClientId: IOS_CLIENT_ID_GOOGLE, iosStandaloneAppClientId: IOS_CLIENT_ID_GOOGLE, androidClientId: ANDROID_CLIENT_ID_GOOGLE, androidStandaloneAppClientId: ANDROID_CLIENT_ID_GOOGLE, //redirectUrl: `${AuthSession.OAuthRedirect}:/oauth2redirect/google`, scopes: ["profile", "email"], ...{ useProxy: true }, }); const googleSignUp = () => { if (googleResponse?.type === "success") { const { authentication } = googleResponse; console.log(authentication.accessToken); (async () => { const userInfoResponse = await fetch( "https://www.googleapis.com/oauth2/v1/userinfo?alt=json", { headers: { Authorization: `Bearer ${authentication.accessToken}` }, } ); const googleUser = await userInfoResponse.json(); const user = { phone: "", email: googleUser.email, password: "", name: googleUser.name, picture: googleUser.picture, type: "google", }; mutateLogin(user); })(); } }; useEffect(() => { googleSignUp(); }, [googleResponse]); function renderGoogleAction() { return ( { loginButtonSetter("Google"); }} disabled={!googleRequest} onPress={() => googlePromptAsync()} /> ); } function renderEmailAction() { return ( { loginButtonSetter("Email"); navigation.navigate(NAVIGATION_SCREEN.Register); }} /> ); } return ( {renderGoogleAction()} {enableApple && ( {renderAppleAction()} )} {renderEmailAction()} navigation.navigate(NAVIGATION_SCREEN.Login)} > Already a member? Log in ); }; export default CreateAccount;