diff --git a/packages/hoppscotch-app/components/firebase/Login.vue b/packages/hoppscotch-app/components/firebase/Login.vue index 59a41f0de..d1d9a128a 100644 --- a/packages/hoppscotch-app/components/firebase/Login.vue +++ b/packages/hoppscotch-app/components/firebase/Login.vue @@ -128,6 +128,7 @@ import { currentUser$, signInWithEmail, linkWithFBCredential, + linkWithFBCredentialFromAuthError, getGithubCredentialFromResult, } from "~/helpers/fb/auth" import { setLocalConfig } from "~/newstore/localpersistence" @@ -218,8 +219,6 @@ export default defineComponent({ if (e.code === "auth/account-exists-with-different-credential") { // Step 2. // User's email already exists. - // The pending Google credential. - const pendingCred = e.credential this.$toast.info(`${this.$t("auth.account_exists")}`, { duration: 0, closeOnSwipe: false, @@ -227,7 +226,7 @@ export default defineComponent({ text: `${this.$t("action.yes")}`, onClick: async (_, toastObject) => { const { user } = await signInUserWithGoogle() - await linkWithFBCredential(user, pendingCred) + await linkWithFBCredentialFromAuthError(user, e) this.showLoginSuccess() diff --git a/packages/hoppscotch-app/helpers/fb/auth.ts b/packages/hoppscotch-app/helpers/fb/auth.ts index 5da8229a9..04d0c721e 100644 --- a/packages/hoppscotch-app/helpers/fb/auth.ts +++ b/packages/hoppscotch-app/helpers/fb/auth.ts @@ -16,6 +16,7 @@ import { signOut, linkWithCredential, AuthCredential, + AuthError, UserCredential, updateProfile, updateEmail, @@ -239,6 +240,24 @@ export async function linkWithFBCredential( return await linkWithCredential(user, credential) } +/** + * Links account with another account given in a auth/account-exists-with-different-credential error + * + * @param user - User who has the errors + * + * @param error - Error caught after trying to login + * + * @returns Promise of UserCredential + */ +export async function linkWithFBCredentialFromAuthError( + user: User, + error: unknown +) { + // Marked as not null since this function is supposed to be called after an auth/account-exists-with-different-credential error, ie credentials actually exist + const credentials = OAuthProvider.credentialFromError(error as AuthError)! + return await linkWithCredential(user, credentials) +} + /** * Sends an email with the signin link to the user *