Skip to content

Commit e5972bd

Browse files
committed
Merge branch '@invertase/v7-development' of https://github.com/firebase/firebaseui-web into @invertase/provider-strategy
2 parents 67e15da + 32de52a commit e5972bd

File tree

9 files changed

+640
-153
lines changed

9 files changed

+640
-153
lines changed

examples/react/src/firebase/firebase.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,17 @@
1919
import { initializeApp, getApps } from "firebase/app";
2020
import { firebaseConfig } from "./config";
2121
import { connectAuthEmulator, getAuth } from "firebase/auth";
22-
import { autoAnonymousLogin, initializeUI } from "@firebase-ui/core";
22+
import { autoAnonymousLogin, initializeUI, oneTapSignIn } from "@firebase-ui/core";
2323

2424
export const firebaseApp = getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0];
2525

2626
export const auth = getAuth(firebaseApp);
2727

2828
export const ui = initializeUI({
2929
app: firebaseApp,
30-
behaviors: [autoAnonymousLogin()],
30+
behaviors: [autoAnonymousLogin(), oneTapSignIn({
31+
clientId: '200312857118-lscdui98fkaq7ffr81446blafjn5o6r0.apps.googleusercontent.com',
32+
})],
3133
});
3234

3335
if (import.meta.env.MODE === "development") {

packages/core/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"zod": "catalog:"
5353
},
5454
"devDependencies": {
55+
"@types/google-one-tap": "^1.2.6",
5556
"@types/jsdom": "catalog:",
5657
"firebase": "catalog:",
5758
"jsdom": "catalog:",
@@ -60,7 +61,7 @@
6061
"tsup": "catalog:",
6162
"typescript": "catalog:",
6263
"vite": "catalog:",
63-
"vitest-tsconfig-paths": "catalog:",
64-
"vitest": "catalog:"
64+
"vitest": "catalog:",
65+
"vitest-tsconfig-paths": "catalog:"
6566
}
6667
}

packages/core/src/auth.test.ts

Lines changed: 152 additions & 38 deletions
Large diffs are not rendered by default.

packages/core/src/auth.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ import {
2121
sendSignInLinkToEmail as _sendSignInLinkToEmail,
2222
signInAnonymously as _signInAnonymously,
2323
signInWithPhoneNumber as _signInWithPhoneNumber,
24+
signInWithCredential as _signInWithCredential,
2425
ActionCodeSettings,
2526
ApplicationVerifier,
2627
AuthProvider,
2728
ConfirmationResult,
2829
EmailAuthProvider,
2930
linkWithCredential,
3031
PhoneAuthProvider,
31-
signInWithCredential,
3232
UserCredential,
33+
AuthCredential,
3334
} from "firebase/auth";
3435
import { FirebaseUIConfiguration } from "./config";
3536
import { handleFirebaseError } from "./errors";
@@ -69,7 +70,7 @@ export async function signInWithEmailAndPassword(
6970
}
7071

7172
ui.setState("pending");
72-
const result = await signInWithCredential(ui.auth, credential);
73+
const result = await _signInWithCredential(ui.auth, credential);
7374
return handlePendingCredential(ui, result);
7475
} catch (error) {
7576
handleFirebaseError(ui, error);
@@ -137,7 +138,7 @@ export async function confirmPhoneNumber(
137138
}
138139

139140
ui.setState("pending");
140-
const result = await signInWithCredential(ui.auth, credential);
141+
const result = await _signInWithCredential(ui.auth, credential);
141142
return handlePendingCredential(ui, result);
142143
} catch (error) {
143144
handleFirebaseError(ui, error);
@@ -181,18 +182,27 @@ export async function signInWithEmailLink(
181182
email: string,
182183
link: string
183184
): Promise<UserCredential> {
184-
try {
185-
const credential = EmailAuthProvider.credentialWithLink(email, link);
185+
const credential = EmailAuthProvider.credentialWithLink(email, link);
186+
return signInWithCredential(ui, credential);
187+
}
186188

189+
export async function signInWithCredential(
190+
ui: FirebaseUIConfiguration,
191+
credential: AuthCredential
192+
): Promise<UserCredential> {
193+
try {
187194
if (hasBehavior(ui, "autoUpgradeAnonymousCredential")) {
188-
const result = await getBehavior(ui, "autoUpgradeAnonymousCredential")(ui, credential);
189-
if (result) {
190-
return handlePendingCredential(ui, result);
195+
const userCredential = await getBehavior(ui, "autoUpgradeAnonymousCredential")(ui, credential);
196+
197+
// If they got here, they're either not anonymous or they've been linked.
198+
// If the credential has been linked, we don't need to sign them in, so return early.
199+
if (userCredential) {
200+
return handlePendingCredential(ui, userCredential);
191201
}
192202
}
193203

194204
ui.setState("pending");
195-
const result = await signInWithCredential(ui.auth, credential);
205+
const result = await _signInWithCredential(ui.auth, credential);
196206
return handlePendingCredential(ui, result);
197207
} catch (error) {
198208
handleFirebaseError(ui, error);

packages/core/src/behaviors/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as anonymousUpgradeHandlers from "./anonymous-upgrade";
44
import * as autoAnonymousLoginHandlers from "./auto-anonymous-login";
55
import * as recaptchaHandlers from "./recaptcha";
66
import * as providerStrategyHandlers from "./provider-strategy";
7+
import * as oneTapSignInHandlers from "./one-tap";
78
import {
89
callableBehavior,
910
initBehavior,
@@ -25,6 +26,7 @@ type Registry = {
2526
recaptchaVerification: CallableBehavior<(ui: FirebaseUIConfiguration, element: HTMLElement) => RecaptchaVerifier>;
2627
providerSignInStrategy: CallableBehavior<providerStrategyHandlers.ProviderSignInStrategyHandler>;
2728
providerLinkStrategy: CallableBehavior<providerStrategyHandlers.ProviderLinkStrategyHandler>;
29+
oneTapSignIn: InitBehavior<(ui: FirebaseUIConfiguration) => ReturnType<typeof oneTapSignInHandlers.oneTapSignInHandler>>;
2830
};
2931

3032
export type Behavior<T extends keyof Registry = keyof Registry> = Pick<Registry, T>;
@@ -72,6 +74,14 @@ export function providerPopupStrategy(): Behavior<"providerSignInStrategy" | "pr
7274
};
7375
}
7476

77+
export type OneTapSignInOptions = oneTapSignInHandlers.OneTapSignInOptions;
78+
79+
export function oneTapSignIn(options: OneTapSignInOptions): Behavior<"oneTapSignIn"> {
80+
return {
81+
oneTapSignIn: initBehavior((ui) => oneTapSignInHandlers.oneTapSignInHandler(ui, options)),
82+
};
83+
}
84+
7585
export function hasBehavior<T extends keyof Registry>(ui: FirebaseUIConfiguration, key: T): boolean {
7686
return !!ui.behaviors[key];
7787
}

0 commit comments

Comments
 (0)