UserContext, deleteAccount: if provider is google, use reauthenticateWithPopup to reauthenticate user

This commit is contained in:
gianantoniopini
2021-04-26 15:26:02 +02:00
parent f53e34c37d
commit b5d4d54ad3
2 changed files with 39 additions and 6 deletions

View File

@ -46,7 +46,7 @@ const Settings = ({ id }) => {
try { try {
await deleteAccount(); await deleteAccount();
} catch (error) { } catch (error) {
toast.error('An error occurred deleting your account'); toast.error('An error occurred deleting your account.');
setDeleteText(t('builder.settings.dangerZone.button')); setDeleteText(t('builder.settings.dangerZone.button'));
} }
}; };

View File

@ -73,22 +73,55 @@ const UserProvider = ({ children }) => {
navigate('/'); navigate('/');
}; };
const deleteAccount = async () => { const reauthenticateWithGoogle = async () => {
const { currentUser } = firebase.auth(); const { currentUser } = firebase.auth();
const provider = new firebase.auth.GoogleAuthProvider();
try {
const userCredential = await currentUser.reauthenticateWithPopup(
provider,
);
return userCredential;
} catch (error) {
toast.error(error.message);
throw error;
}
};
const reauthenticate = async () => {
const { currentUser } = firebase.auth();
if (currentUser.isAnonymous) {
return;
}
const googleAuthProvider = new firebase.auth.GoogleAuthProvider();
const authProviderIsGoogle = const authProviderIsGoogle =
currentUser.providerData &&
currentUser.providerData.length > 0 && currentUser.providerData.length > 0 &&
currentUser.providerData[0].providerId === 'google.com'; currentUser.providerData[0].providerId === googleAuthProvider.providerId;
const deleteUser = firebase.functions().httpsCallable('deleteUser');
if (authProviderIsGoogle) { if (authProviderIsGoogle) {
const userCredential = await loginWithGoogle(); await reauthenticateWithGoogle();
await currentUser.reauthenticateWithCredential(userCredential.credential); } else {
const errorMessage = 'Unable to determine reauthentication method.';
toast.error(errorMessage);
throw new Error(errorMessage);
} }
};
const deleteAccount = async () => {
const { currentUser } = firebase.auth();
const deleteUser = firebase.functions().httpsCallable('deleteUser');
await reauthenticate();
await deleteUser(); await deleteUser();
try { try {
await currentUser.delete(); await currentUser.delete();
} catch (error) {
toast.error(error.message);
} finally { } finally {
logout(); logout();
toast( toast(