Skip to content
Merged
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
37 changes: 18 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,12 +202,11 @@ The initializeUI function accepts an options object that allows you to customize
### Type Definition

```js
type FirebaseUIConfigurationOptions = {
type FirebaseUIOptions = {
app: FirebaseApp;
locale?: Locale | undefined;
translations?: RegisteredTranslations[] | undefined;
behaviors?: Partial<Behavior<keyof BehaviorHandlers>>[] | undefined;
recaptchaMode?: 'normal' | 'invisible' | undefined;
auth?: Auth;
locale?: Locale;
behaviors?: Behavior<any>[];
};
```

Expand Down Expand Up @@ -290,7 +289,7 @@ const ui = initializeUI({
Configuration Type:

```js
type FirebaseUIConfigurationOptions = {
type FirebaseUIOptions = {
app: FirebaseApp;
locale?: Locale | undefined;
translations?: RegisteredTranslations[] | undefined;
Expand All @@ -303,61 +302,61 @@ type FirebaseUIConfigurationOptions = {

**signInWithEmailAndPassword**: Signs in the user based on an email/password credential.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _email_: string
- _password_: string

**createUserWithEmailAndPassword**: Creates a user account based on an email/password credential.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _email_: string
- _password_: string

**signInWithPhoneNumber**: Signs in the user based on a provided phone number, using ReCaptcha to verify the sign-in.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _phoneNumber_: string
- _recaptchaVerifier_: string

**confirmPhoneNumber**: Verifies the phonenumber credential and signs in the user.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _confirmationResult_: [ConfirmationResult](https://firebase.google.com/docs/reference/node/firebase.auth.ConfirmationResult)
- _verificationCode_: string

**sendPasswordResetEmail**: Sends password reset instructions to an email account.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _email_: string

**sendSignInLinkToEmail**: Send an sign-in links to an email account.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _email_: string

**signInWithEmailLink**: Signs in with the user with the email link. If `autoUpgradeAnonymousCredential` then a pending credential will be handled.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _email_: string
- _link_: string

**signInAnonymously**: Signs in as an anonymous user.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI

**signInWithOAuth**: Signs in with a provider such as Google via a redirect link. If `autoUpgradeAnonymousCredential` then the account will upgraded.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _provider_: [AuthProvider](https://firebase.google.com/docs/reference/node/firebase.auth.AuthProvider)

**completeEmailLinkSignIn**: Completes the signing process based on a user signing in with an email link.

- _ui_: FirebaseUIConfiguration
- _ui_: FirebaseUI
- _currentUrl_: string

#### Provide a Store via Context

Using the returned `FirebaseUIConfiguration`, it is reccomended to use local context/providers/dependency-injection to expose the FirebaseUIConfiguration to the application. Here is an example context wrapper which accepts the configuration as a `ui` parameter:
Using the returned `FirebaseUI`, it is reccomended to use local context/providers/dependency-injection to expose the FirebaseUI to the application. Here is an example context wrapper which accepts the configuration as a `ui` parameter:

```js
/** Creates a framework-agnostic context for Firebase UI configuration **/
Expand Down Expand Up @@ -391,7 +390,7 @@ export function createFirebaseUIContext(initialConfig) {
FirebaseUI Configuration Type:

```js
export type FirebaseUIConfiguration = {
export type FirebaseUI = {
app: FirebaseApp,
getAuth: () => Auth,
setLocale: (locale: Locale) => void,
Expand Down Expand Up @@ -556,7 +555,7 @@ The core library provides a function for handling errors.

```js
export function handleFirebaseError(
ui: FirebaseUIConfiguration,
ui: FirebaseUI,
error: any,
opts?: {
enableHandleExistingCredential?: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import {
FirebaseUIError,
completeEmailLinkSignIn,
sendSignInLinkToEmail,
FirebaseUIConfiguration,
FirebaseUI,
} from "@firebase-ui/core";
import { firstValueFrom } from "rxjs";

Expand Down Expand Up @@ -75,7 +75,7 @@ export class EmailLinkFormComponent implements OnInit {
formError: string | null = null;
emailSent = false;
private formSchema: any;
private config: FirebaseUIConfiguration;
private config: FirebaseUI;

form = injectForm({
defaultValues: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { TermsAndPrivacyComponent } from "../../../components/terms-and-privacy/
import {
createEmailFormSchema,
EmailFormSchema,
FirebaseUIConfiguration,
FirebaseUI,
FirebaseUIError,
signInWithEmailAndPassword,
} from "@firebase-ui/core";
Expand Down Expand Up @@ -111,7 +111,7 @@ export class EmailPasswordFormComponent implements OnInit {

formError: string | null = null;
private formSchema: any;
private config: FirebaseUIConfiguration;
private config: FirebaseUI;

form = injectForm({
defaultValues: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,7 @@ import { FirebaseUI } from "../../../provider";
import { Auth } from "@angular/fire/auth";
import { ButtonComponent } from "../../../components/button/button.component";
import { TermsAndPrivacyComponent } from "../../../components/terms-and-privacy/terms-and-privacy.component";
import {
createForgotPasswordFormSchema,
FirebaseUIConfiguration,
FirebaseUIError,
sendPasswordResetEmail,
} from "@firebase-ui/core";
import { createForgotPasswordFormSchema, FirebaseUI, FirebaseUIError, sendPasswordResetEmail } from "@firebase-ui/core";
import { firstValueFrom } from "rxjs";
import { Router } from "@angular/router";

Expand Down Expand Up @@ -85,7 +80,7 @@ export class ForgotPasswordFormComponent implements OnInit {
formError: string | null = null;
emailSent = false;
private formSchema: any;
private config: FirebaseUIConfiguration;
private config: FirebaseUI;

form = injectForm({
defaultValues: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import {
formatPhoneNumberWithCountry,
confirmPhoneNumber,
signInWithPhoneNumber,
FirebaseUIConfiguration,
FirebaseUI,
} from "@firebase-ui/core";
import { interval, Subscription, firstValueFrom } from "rxjs";
import { Router } from "@angular/router";
Expand Down Expand Up @@ -103,7 +103,7 @@ export class PhoneNumberFormComponent implements OnInit, OnDestroy {
recaptchaVerifier: RecaptchaVerifier | null = null;
selectedCountry: CountryData = countryData[0];
private formSchema: any;
private config: FirebaseUIConfiguration;
private config: FirebaseUI;

form = injectForm({
defaultValues: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import {
EmailFormSchema,
FirebaseUIError,
createUserWithEmailAndPassword,
FirebaseUIConfiguration,
FirebaseUI,
} from "@firebase-ui/core";
import { Auth } from "@angular/fire/auth";
import { TermsAndPrivacyComponent } from "../../../components/terms-and-privacy/terms-and-privacy.component";
Expand Down Expand Up @@ -106,7 +106,7 @@ export class RegisterFormComponent implements OnInit {

formError: string | null = null;
private formSchema: any;
private config: FirebaseUIConfiguration;
private config: FirebaseUI;

form = injectForm({
defaultValues: {
Expand Down
46 changes: 14 additions & 32 deletions packages/core/src/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,13 @@ import {
type PhoneInfoOptions,
} from "firebase/auth";
import QRCode from "qrcode-generator";
import { type FirebaseUIConfiguration } from "./config";
import { type FirebaseUI } from "./config";
import { handleFirebaseError } from "./errors";
import { hasBehavior, getBehavior } from "./behaviors/index";
import { FirebaseError } from "firebase/app";
import { getTranslation } from "./translations";

async function handlePendingCredential(_ui: FirebaseUIConfiguration, user: UserCredential): Promise<UserCredential> {
async function handlePendingCredential(_ui: FirebaseUI, user: UserCredential): Promise<UserCredential> {
const pendingCredString = window.sessionStorage.getItem("pendingCred");
if (!pendingCredString) return user;

Expand All @@ -55,7 +55,7 @@ async function handlePendingCredential(_ui: FirebaseUIConfiguration, user: UserC
}

export async function signInWithEmailAndPassword(
ui: FirebaseUIConfiguration,
ui: FirebaseUI,
email: string,
password: string
): Promise<UserCredential> {
Expand All @@ -81,7 +81,7 @@ export async function signInWithEmailAndPassword(
}

export async function createUserWithEmailAndPassword(
ui: FirebaseUIConfiguration,
ui: FirebaseUI,
email: string,
password: string,
displayName?: string
Expand Down Expand Up @@ -121,7 +121,7 @@ export async function createUserWithEmailAndPassword(
}

export async function verifyPhoneNumber(
ui: FirebaseUIConfiguration,
ui: FirebaseUI,
phoneNumber: PhoneInfoOptions | string,
appVerifier: ApplicationVerifier
): Promise<string> {
Expand All @@ -137,7 +137,7 @@ export async function verifyPhoneNumber(
}

export async function confirmPhoneNumber(
ui: FirebaseUIConfiguration,
ui: FirebaseUI,
verificationId: string,
verificationCode: string
): Promise<UserCredential> {
Expand All @@ -163,7 +163,7 @@ export async function confirmPhoneNumber(
}
}

export async function sendPasswordResetEmail(ui: FirebaseUIConfiguration, email: string): Promise<void> {
export async function sendPasswordResetEmail(ui: FirebaseUI, email: string): Promise<void> {
try {
ui.setState("pending");
await _sendPasswordResetEmail(ui.auth, email);
Expand All @@ -174,7 +174,7 @@ export async function sendPasswordResetEmail(ui: FirebaseUIConfiguration, email:
}
}

export async function sendSignInLinkToEmail(ui: FirebaseUIConfiguration, email: string): Promise<void> {
export async function sendSignInLinkToEmail(ui: FirebaseUI, email: string): Promise<void> {
try {
ui.setState("pending");
const actionCodeSettings = {
Expand All @@ -193,19 +193,12 @@ export async function sendSignInLinkToEmail(ui: FirebaseUIConfiguration, email:
}
}

export async function signInWithEmailLink(
ui: FirebaseUIConfiguration,
email: string,
link: string
): Promise<UserCredential> {
export async function signInWithEmailLink(ui: FirebaseUI, email: string, link: string): Promise<UserCredential> {
const credential = EmailAuthProvider.credentialWithLink(email, link);
return signInWithCredential(ui, credential);
}

export async function signInWithCredential(
ui: FirebaseUIConfiguration,
credential: AuthCredential
): Promise<UserCredential> {
export async function signInWithCredential(ui: FirebaseUI, credential: AuthCredential): Promise<UserCredential> {
try {
ui.setState("pending");
if (hasBehavior(ui, "autoUpgradeAnonymousCredential")) {
Expand All @@ -227,7 +220,7 @@ export async function signInWithCredential(
}
}

export async function signInAnonymously(ui: FirebaseUIConfiguration): Promise<UserCredential> {
export async function signInAnonymously(ui: FirebaseUI): Promise<UserCredential> {
try {
ui.setState("pending");
const result = await _signInAnonymously(ui.auth);
Expand All @@ -239,10 +232,7 @@ export async function signInAnonymously(ui: FirebaseUIConfiguration): Promise<Us
}
}

export async function signInWithProvider(
ui: FirebaseUIConfiguration,
provider: AuthProvider
): Promise<UserCredential | never> {
export async function signInWithProvider(ui: FirebaseUI, provider: AuthProvider): Promise<UserCredential | never> {
try {
ui.setState("pending");
if (hasBehavior(ui, "autoUpgradeAnonymousProvider")) {
Expand All @@ -268,10 +258,7 @@ export async function signInWithProvider(
}
}

export async function completeEmailLinkSignIn(
ui: FirebaseUIConfiguration,
currentUrl: string
): Promise<UserCredential | null> {
export async function completeEmailLinkSignIn(ui: FirebaseUI, currentUrl: string): Promise<UserCredential | null> {
try {
if (!_isSignInWithEmailLink(ui.auth, currentUrl)) {
return null;
Expand All @@ -291,12 +278,7 @@ export async function completeEmailLinkSignIn(
}
}

export function generateTotpQrCode(
ui: FirebaseUIConfiguration,
secret: TotpSecret,
accountName?: string,
issuer?: string
): string {
export function generateTotpQrCode(ui: FirebaseUI, secret: TotpSecret, accountName?: string, issuer?: string): string {
const currentUser = ui.auth.currentUser;

if (!currentUser) {
Expand Down
14 changes: 5 additions & 9 deletions packages/core/src/behaviors/anonymous-upgrade.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
import { type AuthCredential, type AuthProvider, linkWithCredential, type UserCredential } from "firebase/auth";
import { type FirebaseUIConfiguration } from "~/config";
import { type FirebaseUI } from "~/config";
import { getBehavior } from "~/behaviors";

export type OnUpgradeCallback = (
ui: FirebaseUIConfiguration,
oldUserId: string,
credential: UserCredential
) => Promise<void> | void;
export type OnUpgradeCallback = (ui: FirebaseUI, oldUserId: string, credential: UserCredential) => Promise<void> | void;

export const autoUpgradeAnonymousCredentialHandler = async (
ui: FirebaseUIConfiguration,
ui: FirebaseUI,
credential: AuthCredential,
onUpgrade?: OnUpgradeCallback
) => {
Expand All @@ -31,7 +27,7 @@ export const autoUpgradeAnonymousCredentialHandler = async (
};

export const autoUpgradeAnonymousProviderHandler = async (
ui: FirebaseUIConfiguration,
ui: FirebaseUI,
provider: AuthProvider,
onUpgrade?: OnUpgradeCallback
) => {
Expand Down Expand Up @@ -61,7 +57,7 @@ export const autoUpgradeAnonymousProviderHandler = async (
};

export const autoUpgradeAnonymousUserRedirectHandler = async (
ui: FirebaseUIConfiguration,
ui: FirebaseUI,
credential: UserCredential | null,
onUpgrade?: OnUpgradeCallback
) => {
Expand Down
Loading