Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion packages/core/src/auth.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { signInWithEmailAndPassword, createUserWithEmailAndPassword, signInWithPhoneNumber, confirmPhoneNumber, sendPasswordResetEmail, sendSignInLinkToEmail, signInWithEmailLink, signInAnonymously, signInWithProvider, completeEmailLinkSignIn, } from "./auth";
import type { FirebaseUIConfiguration } from "./config";

// Mock the external dependencies
vi.mock("firebase/auth", () => ({
Expand Down
46 changes: 19 additions & 27 deletions packages/core/src/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,18 @@
*/

import {
createUserWithEmailAndPassword as _createUserWithEmailAndPassword,
isSignInWithEmailLink as _isSignInWithEmailLink,
sendPasswordResetEmail as _sendPasswordResetEmail,
sendSignInLinkToEmail as _sendSignInLinkToEmail,
signInAnonymously as _signInAnonymously,
signInWithPhoneNumber as _signInWithPhoneNumber,
ActionCodeSettings,
AuthProvider,
ConfirmationResult,
type ActionCodeSettings,
type AuthProvider,
type ConfirmationResult,
type RecaptchaVerifier,
type UserCredential,
EmailAuthProvider,
linkWithCredential,
PhoneAuthProvider,
RecaptchaVerifier,
signInWithCredential,
signInWithRedirect,
UserCredential,
} from "firebase/auth";
import { getBehavior, hasBehavior } from "./behaviors";
import { FirebaseUIConfiguration } from "./config";
import { handleFirebaseError } from "./errors";
import { getAuthImp } from "./imp/auth";

async function handlePendingCredential(ui: FirebaseUIConfiguration, user: UserCredential): Promise<UserCredential> {
const pendingCredString = window.sessionStorage.getItem("pendingCred");
Expand All @@ -43,7 +35,7 @@ async function handlePendingCredential(ui: FirebaseUIConfiguration, user: UserCr
try {
const pendingCred = JSON.parse(pendingCredString);
ui.setState("pending");
const result = await linkWithCredential(user.user, pendingCred);
const result = await getAuthImp(ui).linkWithCredential(user.user, pendingCred);
ui.setState("idle");
window.sessionStorage.removeItem("pendingCred");
return result;
Expand All @@ -63,14 +55,14 @@ export async function signInWithEmailAndPassword(

if (hasBehavior(ui, "autoUpgradeAnonymousCredential")) {
const result = await getBehavior(ui, "autoUpgradeAnonymousCredential")(ui, credential);

if (result) {
return handlePendingCredential(ui, result);
}
}

ui.setState("pending");
const result = await signInWithCredential(ui.auth, credential);
const result = await getAuthImp(ui).signInWithCredential(ui.auth, credential);
return handlePendingCredential(ui, result);
} catch (error) {
handleFirebaseError(ui, error);
Expand All @@ -96,7 +88,7 @@ export async function createUserWithEmailAndPassword(
}

ui.setState("pending");
const result = await _createUserWithEmailAndPassword(ui.auth, email, password);
const result = await getAuthImp(ui).createUserWithEmailAndPassword(ui.auth, email, password);
return handlePendingCredential(ui, result);
} catch (error) {
handleFirebaseError(ui, error);
Expand All @@ -112,7 +104,7 @@ export async function signInWithPhoneNumber(
): Promise<ConfirmationResult> {
try {
ui.setState("pending");
return await _signInWithPhoneNumber(ui.auth, phoneNumber, recaptchaVerifier);
return await getAuthImp(ui).signInWithPhoneNumber(ui.auth, phoneNumber, recaptchaVerifier);
} catch (error) {
handleFirebaseError(ui, error);
} finally {
Expand All @@ -138,7 +130,7 @@ export async function confirmPhoneNumber(
}

ui.setState("pending");
const result = await signInWithCredential(ui.auth, credential);
const result = await getAuthImp(ui).signInWithCredential(ui.auth, credential);
return handlePendingCredential(ui, result);
} catch (error) {
handleFirebaseError(ui, error);
Expand All @@ -150,7 +142,7 @@ export async function confirmPhoneNumber(
export async function sendPasswordResetEmail(ui: FirebaseUIConfiguration, email: string): Promise<void> {
try {
ui.setState("pending");
await _sendPasswordResetEmail(ui.auth, email);
await getAuthImp(ui).sendPasswordResetEmail(ui.auth, email);
} catch (error) {
handleFirebaseError(ui, error);
} finally {
Expand All @@ -167,7 +159,7 @@ export async function sendSignInLinkToEmail(ui: FirebaseUIConfiguration, email:
} satisfies ActionCodeSettings;

ui.setState("pending");
await _sendSignInLinkToEmail(ui.auth, email, actionCodeSettings);
await getAuthImp(ui).sendSignInLinkToEmail(ui.auth, email, actionCodeSettings);
// TODO: Should this be a behavior ("storageStrategy")?
window.localStorage.setItem("emailForSignIn", email);
} catch (error) {
Expand All @@ -193,7 +185,7 @@ export async function signInWithEmailLink(
}

ui.setState("pending");
const result = await signInWithCredential(ui.auth, credential);
const result = await getAuthImp(ui).signInWithCredential(ui.auth, credential);
return handlePendingCredential(ui, result);
} catch (error) {
handleFirebaseError(ui, error);
Expand All @@ -205,7 +197,7 @@ export async function signInWithEmailLink(
export async function signInAnonymously(ui: FirebaseUIConfiguration): Promise<UserCredential> {
try {
ui.setState("pending");
const result = await _signInAnonymously(ui.auth);
const result = await getAuthImp(ui).signInAnonymously(ui.auth);
return handlePendingCredential(ui, result);
} catch (error) {
handleFirebaseError(ui, error);
Expand All @@ -225,7 +217,7 @@ export async function signInWithProvider(ui: FirebaseUIConfiguration, provider:
ui.setState("pending");

// TODO(ehesp): Handle popup or redirect based on behavior
await signInWithRedirect(ui.auth, provider);
await getAuthImp(ui).signInWithRedirect(ui.auth, provider);
// We don't modify state here since the user is redirected.
// If we support popups, we'd need to modify state here.
} catch (error) {
Expand All @@ -240,15 +232,15 @@ export async function completeEmailLinkSignIn(
currentUrl: string
): Promise<UserCredential | null> {
try {
if (!_isSignInWithEmailLink(ui.auth, currentUrl)) {
if (!getAuthImp(ui).isSignInWithEmailLink(ui.auth, currentUrl)) {
return null;
}

const email = window.localStorage.getItem("emailForSignIn");
if (!email) return null;

ui.setState("pending");
const result = await signInWithEmailLink(ui, email, currentUrl);
const result = await getAuthImp(ui).signInWithEmailLink(ui.auth, email, currentUrl);
ui.setState("idle"); // TODO(ehesp): Do we need this here?
return handlePendingCredential(ui, result);
} catch (error) {
Expand Down
10 changes: 4 additions & 6 deletions packages/core/src/behaviors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,11 @@
import {
AuthCredential,
AuthProvider,
linkWithCredential,
linkWithRedirect,
signInAnonymously,
User,
UserCredential,
} from "firebase/auth";
import { FirebaseUIConfiguration } from "./config";
import { getAuthImp } from "./imp/auth";

export type BehaviorHandlers = {
autoAnonymousLogin: (ui: FirebaseUIConfiguration) => Promise<User>;
Expand Down Expand Up @@ -71,7 +69,7 @@ export function autoAnonymousLogin(): Behavior<"autoAnonymousLogin"> {

if (!auth.currentUser) {
ui.setState("loading");
await signInAnonymously(auth);
await getAuthImp(ui).signInAnonymously(auth);
}

ui.setState("idle");
Expand All @@ -93,7 +91,7 @@ export function autoUpgradeAnonymousUsers(): Behavior<
}

ui.setState("pending");
const result = await linkWithCredential(currentUser, credential);
const result = await getAuthImp(ui).linkWithCredential(currentUser, credential);
ui.setState("idle");
return result;
},
Expand All @@ -105,7 +103,7 @@ export function autoUpgradeAnonymousUsers(): Behavior<
}

ui.setState("pending");
await linkWithRedirect(currentUser, provider);
await getAuthImp(ui).linkWithRedirect(currentUser, provider);
// We don't modify state here since the user is redirected.
// If we support popups, we'd need to modify state here.
},
Expand Down
Loading
Loading