tech-tracker-expo/components/auth/AppleSignIniOS.tsx

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;