import React, { useState, useEffect } from 'react'; import { supabase } from '@/lib/supabase'; import * as AppleAuthentication from 'expo-apple-authentication'; import { useColorScheme } from '@/hooks/useColorScheme'; import { ThemedView } from '@/components/theme'; import { StyleSheet, Platform, Alert } from 'react-native'; import Constants from 'expo-constants'; import * as Notifications from 'expo-notifications'; import type { updateUser } from '@/constants/Types'; const AppleSignInButton = () => { const scheme = useColorScheme() ?? 'dark'; const signInWithApple = async () => { try { const credential = await AppleAuthentication.signInAsync({ requestedScopes: [ AppleAuthentication.AppleAuthenticationScope.FULL_NAME, AppleAuthentication.AppleAuthenticationScope.EMAIL, ], }); //const projectId = Constants.expoConfig?.extra?.projectId; //if (!projectId) throw new Error('No projectId found in expo.config.json'); //const pushToken = await Notifications.getExpoPushTokenAsync({ //projectId, //}); if (credential.identityToken) { const email = credential.email; const full_name = credential.fullName && credential.fullName.givenName && credential.fullName.familyName ? `${credential.fullName.givenName} ${credential.fullName.familyName}` : null; const { error, data: { user, session }, } = await supabase.auth.signInWithIdToken({ provider: 'apple', token: credential.identityToken, }); console.log(JSON.stringify({ error, user }, null, 2)); if (!error && session) { if (email) { const data: updateUser = { id: session?.user.id, updated_at: new Date(), email, full_name: full_name ?? '', provider: 'apple', }; const { error: updateError } = await supabase.auth.updateUser({ data }); if (updateError) Alert.alert('Error updating auth info:', updateError.message); const { error: updateProfileError } = await supabase .from('profiles') .upsert({ id: session?.user.id ?? '', updated_at: new Date(), email: email ?? '', full_name: full_name ?? '', provider: 'apple', }); if (updateProfileError) Alert.alert('Error updating profile:', updateProfileError.message); } } } else { throw new Error('No identityToken.'); } } catch (e: any) { if (e.code === 'ERR_REQUEST_CANCELED') { // handle that the user canceled the sign-in flow console.log('User canceled sign-in flow'); } else { // handle other errors console.log('Error signing in with Apple:', e); } } }; if (Platform.OS !== 'ios') return ; else return ( ); }; export default AppleSignInButton;