A react-firebaseui alternative for React 19

Firebase archived the react-firebaseui repo on October 22, 2026, and its last release only accepts React up to 17. If StyledFirebaseAuth gave you email and password plus Google and GitHub buttons, Gateway Dive is that screen as one React component, with the Firebase calls in your own code.

Gateway Dive, preview
One payment$3

By buying you agree to the Terms.

Ready forCursorv0Lovableshadcn CLI

Full product pageReact · Tailwind · TypeScript

Use it in Next.js

app/login/page.tsx

"use client";
// Before: <StyledFirebaseAuth uiConfig={uiConfig} firebaseAuth={getAuth()} />
import { useState } from "react";
import { useRouter } from "next/navigation";
import { FirebaseError } from "firebase/app";
import {
  GithubAuthProvider, GoogleAuthProvider, createUserWithEmailAndPassword,
  signInWithEmailAndPassword, signInWithPopup, updateProfile,
} from "firebase/auth";
import GatewayDive from "@/components/gateway-dive/GatewayDive";
import { auth } from "@/lib/firebase";

// uiConfig.signInOptions, minus email: the form is always there
const providers = [
  { id: "google", label: "Google" },
  { id: "github", label: "GitHub" },
];

const messages: Record<string, string> = {
  "auth/invalid-credential": "Wrong email or password.",
  "auth/email-already-in-use": "That email already has an account. Sign in instead.",
  "auth/weak-password": "Pick a longer password.",
  "auth/too-many-requests": "Too many tries. Wait a minute and try again.",
  "auth/account-exists-with-different-credential": "That email used another button last time.",
};
const say = (e: unknown) =>
  (e instanceof FirebaseError && messages[e.code]) || "Sign-in didn't work. Try again.";

export default function Login() {
  const router = useRouter();
  const [popupError, setPopupError] = useState("");

  return (
    <main style={{ height: "100dvh", position: "relative" }}>
      {popupError ? (
        <p role="alert" className="absolute inset-x-0 top-4 z-10 text-center text-sm text-red-400">{popupError}</p>
      ) : null}
      <GatewayDive
        autoplayDemo={false}
        brand="Acme"
        providers={providers}
        onProvider={async (id) => {
          setPopupError("");
          try {
            const provider = id === "github" ? new GithubAuthProvider() : new GoogleAuthProvider();
            await signInWithPopup(auth, provider); // uiConfig.signInFlow: "popup"
            router.push("/dashboard");
          } catch (e) {
            if (e instanceof FirebaseError && e.code === "auth/popup-closed-by-user") return;
            setPopupError(say(e));
          }
        }}
        onSubmit={async ({ mode, name, email, password }) => {
          try {
            if (mode === "signin") {
              await signInWithEmailAndPassword(auth, email, password);
            } else {
              const { user } = await createUserWithEmailAndPassword(auth, email, password);
              await updateProfile(user, { displayName: name });
            }
            return { ok: true };
          } catch (e) {
            return { ok: false, error: say(e) };
          }
        }}
        // uiConfig.signInSuccessUrl: route after the dive (about 1.4 s)
        onSuccess={() => setTimeout(() => router.push("/dashboard"), 1400)}
      />
    </main>
  );
}

lib/firebase.ts

import { getApp, getApps, initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";

const app = getApps().length ? getApp() : initializeApp({
  apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
  authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
  projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
  appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
});

export const auth = getAuth(app);

Good to know

  • react-firebaseui 6.0.0 came out on November 9, 2021, and it's still the latest. Its peer range is react >=15 <=17 and firebase ^9.1.3. We tried it on October 25, 2026: next to react 19.1 and firebase 12, npm 10 stops with ERESOLVE unless you pass --legacy-peer-deps. npm still counted 7,291 downloads in the week to October 22, 2026.
  • GitHub shows firebase/firebaseui-web-react as "archived by the owner on Oct 22, 2026", so it's read-only now. The firebaseui package it wraps last shipped 6.1.0 in August 2023.
  • When the free option fits better: Firebase's own FirebaseUI v7 is a rewrite with a React package (@firebase-oss/ui-react 7.1.0, August 12, 2026, peer react ^19) and a shadcn/ui registry. Firebase's docs list email link, phone auth, OAuth providers, multi-factor flows and Google One Tap. If you need any of those, use it. Gateway Dive has email and password plus provider buttons, and nothing else.
  • One thing to know before you pick v7: its peer range is firebase ^11 || ^12. firebase 13.1.0 came out on October 21, 2026, and on a project with firebase 13 npm 10 stops with ERESOLVE on @firebase-oss/ui-react (we tried). With firebase@12 it installs cleanly. Gateway Dive doesn't import firebase at all, so any version works.
  • The card shows a Forgot? link, but the component has no prop for it yet. Put your own reset link under the card and call sendPasswordResetEmail there.
  • Popup errors happen outside the card, so the snippet shows them in a line above it. A closed popup is ignored on purpose.
  • Type-checked against firebase 13.1, next 15.5 and react 19.1 with TypeScript 5.9, using the shipped component source. We didn't run it against a live Firebase project.

What your uiConfig maps to

  • signInOptions with GoogleAuthProvider and GithubAuthProvider: the providers array. The ids "google" and "github" draw the logos, and onProvider gets the id.
  • EmailAuthProvider: the form itself. Sign in and Create account are tabs on the same card, and Create account adds a name field and a strength meter.
  • signInFlow: "popup" or "redirect": your call inside onProvider, signInWithPopup or signInWithRedirect.
  • signInSuccessUrl and callbacks.signInSuccessWithAuthResult: onSuccess. Route there after the dive, or straight away for the popup.
  • callbacks.signInFailure: return { ok: false, error } from onSubmit. The card shakes and shows your sentence.
  • PhoneAuthProvider, email link sign-in and anonymous upgrade: no match. Our Firebase phone auth guide covers phone codes with a separate code screen.
  • tosUrl and privacyPolicyUrl: no match. Put the links under the card.

Install

  1. Copy from the zipPut react/src/components into src/, then npm uninstall react-firebaseui && npm i firebase.
  2. Or ask your AIPaste PROMPT.md into Cursor, Lovable or v0.

Props

providers
{ id, label }[]; google and github draw logos
onProvider
(id) → signInWithPopup or signInWithRedirect
onSubmit
mode, name, email, password; returns { ok, error? }
onSuccess
runs when the check appears; route here
backdrop
your own screen behind the card
autoplayDemo
false in a real app

How qodesign compares

All comparisons, with prices read on each library's own site.

Questions

Is react-firebaseui deprecated?

npm doesn't mark it deprecated, but the GitHub repo was archived on October 22, 2026, and the last release is from November 2021. Its peer range stops at React 17.

Does react-firebaseui work with React 19?

Not cleanly. npm 10 refuses the install next to React 19 unless you pass --legacy-peer-deps. We didn't test how it behaves after a forced install.

What does Firebase recommend now?

FirebaseUI v7: @firebase-oss/ui-react for React or the shadcn/ui registry. It's free and covers far more flows than this card, including phone auth and multi-factor.

Does Gateway Dive do phone sign-in or MFA?

No. It's email and password plus provider buttons. For phone codes, see our Firebase phone auth guide, or use FirebaseUI v7.

Does the sign-in card work in Next.js?

Yes, as a client component. Keep "use client" at the top of the file that renders it, as in the snippet above. App Router and Pages Router both work.

Can Cursor or v0 add it for me?

Yes. Each download has a PROMPT.md. Paste it into Cursor, Lovable, v0 or Claude Code and it fits the piece into your app.

Can I use it in client work?

Yes, in personal and client projects. You can't resell the code itself as a kit.