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,
},
});