Start trying to support Microsoft Azure Sign in
This commit is contained in:
108
components/auth/AppleSignIniOS.tsx
Normal file
108
components/auth/AppleSignIniOS.tsx
Normal file
@ -0,0 +1,108 @@
|
||||
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 <ThemedView />;
|
||||
else return (
|
||||
|
||||
<ThemedView style={styles.verticallySpaced}>
|
||||
<AppleAuthentication.AppleAuthenticationButton
|
||||
buttonType={AppleAuthentication.AppleAuthenticationButtonType.SIGN_IN}
|
||||
buttonStyle={
|
||||
scheme === 'light'
|
||||
? AppleAuthentication.AppleAuthenticationButtonStyle.BLACK
|
||||
: AppleAuthentication.AppleAuthenticationButtonStyle.WHITE
|
||||
}
|
||||
cornerRadius={5}
|
||||
style={{ width: 200, height: 64 }}
|
||||
onPress={signInWithApple}
|
||||
/>
|
||||
</ThemedView>
|
||||
);
|
||||
}
|
||||
export default AppleSignInButton;
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
verticallySpaced: {
|
||||
paddingTop: 4,
|
||||
paddingBottom: 4,
|
||||
alignItems: 'center',
|
||||
marginTop: 20,
|
||||
},
|
||||
});
|
Reference in New Issue
Block a user