Bonjour, Je développe une application apple depuis un an maintenant, j’aimerais ajouter l’option de déconnexion pour mes utilisateurs qui ont créé un compte, mais je rencontre de nombreuses erreurs. Quelqu’un saurait-il comment y remédier? Je vous en remercie par avance. Terminal: Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
- You might have mismatching versions of React and the renderer (such as React DOM)
- You might be breaking the Rules of Hooks
- You might have more than one copy of React in the same app See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem., js engine: hermes
Le fichier que j’ai modifié avant d’avoir cette erreur:
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);
}
};
}
+0
-0