1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| import React, { useEffect, useState } from 'react;
import { Button, View, Alert } from 'react-native;
import as WebBrowser from 'expo-web-browser;
import as Google from 'expo-auth-session/providers/google;
import * as AppleAuthentication from 'expo-apple-authentication;
import { GoogleAuthProvider, OAuthProvider, signInWithCredential, signInAnonymously, reauthenticateWithCredential, deleteUser } from 'firebase/auth;
import { auth } from './Firebase;
import clientId from '../.env/GoogleAuth;
import { digestStringAsync, CryptoDigestAlgorithm } from 'expo-crypto;
WebBrowser.maybeCompleteAuthSession();
const Applenonce = Math.random().toString(36).substring(2, 10);
export const appleConnection = (setDisabled: (disable: boolean) => void) => { const [appleCredential, setAppleCredential] = useState(null);
useEffect(() => {
if (appleCredential) {
const { identityToken, email, fullName } = appleCredential;
const provider = new OAuthProvider('apple.com');
const credential = provider.credential({
idToken: identityToken!,
rawNonce: Applenonce
});
signInWithCredential(auth, credential);
setDisabled(true);
} else {
setDisabled(false);
}
}, [appleCredential]);
const signInWithAppleAsync = async () => {
try {
const nonce = await digestStringAsync(
CryptoDigestAlgorithm.SHA256,
Applenonce
);
const appleCredential = await AppleAuthentication.signInAsync({
requestedScopes: [
AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
AppleAuthentication.AppleAuthenticationScope.EMAIL,
],
nonce,
});
setAppleCredential(appleCredential);
} catch (e) {
if (e.code === 'ERR_REQUEST_CANCELED') {
setAppleCredential(null);
} else {
setAppleCredential(null);
}
}
};
return (signInWithAppleAsync);
}
export const googleConnection = (setDisabled: (disable: boolean) => void) => { const [request, response, promptAsync] = Google.useIdTokenAuthRequest({
clientId }, { projectNameForProxy: "@popoters/slug" });
useEffect(() => {
if (response?.type === 'success') {
const { id_token } = response.params;
const credential = GoogleAuthProvider.credential(id_token);
signInWithCredential(auth, credential);
}
setDisabled(!request || response?.type === 'success');
}, [response, request]);
const signInWithGoogleAsync = async () => {
try {
const result = await promptAsync();
if (result.type === 'success') {
return result.params.id_token;
} else {
return { cancelled: true };
}
} catch (e) {
return { error: true };
}
};
return (signInWithGoogleAsync);
}
export const loginAnymously = (setDisabled: (disabled: boolean) => void) => { setDisabled(true); signInAnonymously(auth) .then(() => { }) .catch((error) => { alert(error.message); setDisabled(false); }); }
export const DeleteAppleAccountButton = (setDisabled) => { const [loading, setLoading] = useState(false);
const handleDeleteAccount = async () => {
setLoading(true);
try {
const nonce = await digestStringAsync(
CryptoDigestAlgorithm.SHA256,
Applenonce
);
const appleCredential = await AppleAuthentication.signInAsync({
requestedScopes: [
AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
AppleAuthentication.AppleAuthenticationScope.EMAIL,
],
nonce,
});
const { identityToken } = appleCredential;
const provider = new OAuthProvider('apple.com');
const credential = provider.credential({
idToken: identityToken!,
rawNonce: Applenonce,
});
const user = auth.currentUser;
if (user) {
await reauthenticateWithCredential(user, credential);
await deleteUser(user);
Alert.alert("Compte supprimé avec succès.");
}
} catch (e) {
Alert.alert("Erreur lors de la suppression du compte", e.message);
} finally {
setLoading(false);
setDisabled(false);
}
};
} |
Partager