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 } from 'react-native'; import Constants from 'expo-constants'; import * as Notifications from 'expo-notifications'; 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) { if (user && session) { const data: any = {}; if (email) data.email = email; if (full_name) data.full_name = full_name; const { error: updateError } = await supabase.auth.updateUser({ data, }); if (updateError) { console.error('Error updating user metadata:', updateError); } const { error: updateProfileError } = await supabase.from('profiles').upsert({ id: session.user.id, username: data?.email.split('@')[0], full_name: data?.full_name, updated_at: new Date(), }); if (updateProfileError) { console.error('Error updating profile:', updateProfileError); } } } } 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; const styles = StyleSheet.create({ verticallySpaced: { paddingTop: 4, paddingBottom: 4, alignItems: 'center', marginTop: 20, }, });