97 lines
3.5 KiB
TypeScript
97 lines
3.5 KiB
TypeScript
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 <ThemedView />;
|
|
else
|
|
return (
|
|
<AppleAuthentication.AppleAuthenticationButton
|
|
buttonType={AppleAuthentication.AppleAuthenticationButtonType.SIGN_IN}
|
|
buttonStyle={
|
|
scheme === 'light'
|
|
? AppleAuthentication.AppleAuthenticationButtonStyle.BLACK
|
|
: AppleAuthentication.AppleAuthenticationButtonStyle.WHITE
|
|
}
|
|
cornerRadius={5}
|
|
style={{ width: '85%', height: 64 }}
|
|
onPress={signInWithApple}
|
|
/>
|
|
);
|
|
};
|
|
export default AppleSignInButton;
|