Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
8c41477
feat(angular): Add injectors
Ehesp Sep 18, 2025
a9fe689
refactor(angular): Update sign-in-auth-form
Ehesp Sep 18, 2025
50e6890
refator(angular): Update forgot-password-auth-screen
Ehesp Sep 18, 2025
8547c42
refactor(angular): Update sign-in-auth-screen
Ehesp Sep 18, 2025
1ed20e2
refactor(angular): Update forgot-password-auth-form
Ehesp Sep 18, 2025
a5b2ca2
refactor(angular): Refactor fui-button
Ehesp Sep 18, 2025
85fd1bc
refactor(angular): Update card component
Ehesp Sep 18, 2025
f1b76cf
refactor(divider): Update divider component
Ehesp Sep 18, 2025
d7815f3
refactor(angular): Upgrade tanstack form
Ehesp Sep 18, 2025
57048c4
refactor(angular): updated email link auth screen
dackers86 Sep 19, 2025
b2cf40f
refactor(angular): Upgrade tanstack form
dackers86 Sep 22, 2025
8f33341
refactor(angular): Update sign-up-auth-{screen,form} components
Ehesp Sep 22, 2025
9c72f46
refactor(angular): Update fui-oauth-screen
Ehesp Sep 22, 2025
f8bc5c6
refactor(angular): email-link-auth-{screen,form}
Ehesp Sep 22, 2025
35c4c49
refactor(angular): Update forgot-password-auth-{screen,form}
Ehesp Sep 22, 2025
da11775
refactor(angular): forgot-password-{screen,form} updates
Ehesp Sep 23, 2025
3084b81
refactor(angular): oauth-button & google-sign-in-button component upd…
Ehesp Sep 23, 2025
1efd69e
refactor(angular): Migrate outputs to signals
Ehesp Sep 23, 2025
ee4c08c
fix(angular): Set default country
Ehesp Sep 23, 2025
00a3731
refactor(angular): Rework phone auth flows
Ehesp Sep 23, 2025
d68e549
refactor(angular): Align policies component
Ehesp Sep 23, 2025
ef25f6d
refactor(angular): Rework to contentChildren signal
Ehesp Sep 23, 2025
8a8a265
fix(angular): Fix build issues
Ehesp Sep 23, 2025
abcaa82
chore(angular): Align example with updates
Ehesp Sep 24, 2025
5faad00
fix(angular): Bump tanstack form version
Ehesp Sep 24, 2025
9cbd4e7
chore(angular): updated client and server routing
dackers86 Sep 24, 2025
6657b88
fix(angular): Subscribe to form state correctly
Ehesp Sep 25, 2025
5d3a9ac
fix(angular): Ensure fui-form-action is imported
Ehesp Sep 25, 2025
2a254de
fix(angular): Correctly bubble output events
Ehesp Sep 25, 2025
a8a0026
fix(angular): Correctly handle children rendering
Ehesp Sep 25, 2025
741e2ed
Merge branch '@invertase/align-core' of https://github.com/firebase/f…
Ehesp Sep 26, 2025
bbcad15
Merge branch '@invertase/align-core' of https://github.com/firebase/f…
Ehesp Sep 29, 2025
05f21a6
test(angular): Switch to testing-library angular + vitest
Ehesp Sep 29, 2025
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
7 changes: 6 additions & 1 deletion examples/angular/src/app/app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,12 @@ import { provideFirebaseUI, provideFirebaseUIPolicies } from "@firebase-ui/angul
import { initializeUI } from "@firebase-ui/core";

const firebaseConfig = {
// your Firebase config here
apiKey: "AIzaSyCvMftIUCD9lUQ3BzIrimfSfBbCUQYZf-I",
authDomain: "fir-ui-rework.firebaseapp.com",
projectId: "fir-ui-rework",
storageBucket: "fir-ui-rework.firebasestorage.app",
messagingSenderId: "200312857118",
appId: "1:200312857118:web:94e3f69b0e0a4a863f040f"
};

export const appConfig: ApplicationConfig = {
Expand Down
41 changes: 25 additions & 16 deletions examples/angular/src/app/app.routes.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,39 +22,48 @@ export const serverRoutes: ServerRoute[] = [
path: "",
renderMode: RenderMode.Prerender,
},
/** Key auth screen demos - good for SSG as they showcase Firebase UI components */
/** Static auth demos - good for SSG as they showcase Firebase UI components */
{
path: "screens/sign-in-auth-screen",
path: "sign-in",
renderMode: RenderMode.Prerender,
},
{
path: "screens/oauth-screen",
path: "oauth",
renderMode: RenderMode.Prerender,
},
/** Interactive auth routes - better as CSR for user interaction */
{
path: "screens/sign-up-auth-screen",
renderMode: RenderMode.Prerender,
path: "sign-up",
renderMode: RenderMode.Client,
},
{
path: "screens/email-link-auth-screen",
renderMode: RenderMode.Prerender,
path: "forgot-password",
renderMode: RenderMode.Client,
},
/** Dynamic auth routes - good for SSR as they may need server-side data */
{
path: "screens/phone-auth-screen",
renderMode: RenderMode.Prerender,
path: "email-link",
renderMode: RenderMode.Server,
},
/** Interactive auth routes - better as CSR for user interaction */
{
path: "sign-in",
renderMode: RenderMode.Client,
path: "email-link-oauth",
renderMode: RenderMode.Server,
},
{
path: "register",
renderMode: RenderMode.Client,
path: "phone",
renderMode: RenderMode.Server,
},
{
path: "forgot-password",
renderMode: RenderMode.Client,
path: "phone-oauth",
renderMode: RenderMode.Server,
},
{
path: "sign-in-oauth",
renderMode: RenderMode.Server,
},
{
path: "sign-up-oauth",
renderMode: RenderMode.Server,
},
/** All other routes will be rendered on the server (SSR) */
{
Expand Down
59 changes: 16 additions & 43 deletions examples/angular/src/app/app.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,72 +21,45 @@ export const routes: Routes = [
path: "",
loadComponent: () => import("./home").then((m) => m.HomeComponent),
},
// Direct auth routes (matching NextJS paths)
{
path: "sign-in",
loadComponent: () => import("./auth/sign-in").then((m) => m.SignInComponent),
path: "email-link",
loadComponent: () => import("./auth/email-link").then((m) => m.EmailLinkComponent),
},
{
path: "register",
loadComponent: () => import("./auth/register").then((m) => m.RegisterComponent),
path: "email-link-oauth",
loadComponent: () => import("./auth/email-link-oauth").then((m) => m.EmailLinkOAuthComponent),
},
{
path: "forgot-password",
loadComponent: () => import("./auth/forgot-password").then((m) => m.ForgotPasswordComponent),
},
// Sign-in subdirectories
{
path: "sign-in/phone",
loadComponent: () => import("./auth/phone").then((m) => m.PhoneComponent),
path: "oauth",
loadComponent: () => import("./auth/oauth").then((m) => m.OAuthComponent),
},
{
path: "sign-in/email",
loadComponent: () => import("./auth/email-link").then((m) => m.EmailLinkComponent),
path: "phone",
loadComponent: () => import("./auth/phone").then((m) => m.PhoneComponent),
},
// Screen routes
{
path: "screens/sign-in-auth-screen",
loadComponent: () => import("./auth/sign-in-screen").then((m) => m.SignInScreenComponent),
path: "phone-oauth",
loadComponent: () => import("./auth/phone-oauth").then((m) => m.PhoneOAuthComponent),
},
{
path: "screens/sign-in-auth-screen-w-handlers",
loadComponent: () => import("./auth/sign-in-handlers").then((m) => m.SignInHandlersComponent),
path: "sign-in",
loadComponent: () => import("./auth/sign-in").then((m) => m.SignInComponent),
},
{
path: "screens/sign-in-auth-screen-w-oauth",
path: "sign-in-oauth",
loadComponent: () => import("./auth/sign-in-oauth").then((m) => m.SignInOAuthComponent),
},
{
path: "screens/email-link-auth-screen",
loadComponent: () => import("./auth/email-link-screen").then((m) => m.EmailLinkScreenComponent),
},
{
path: "screens/email-link-auth-screen-w-oauth",
loadComponent: () => import("./auth/email-link-oauth").then((m) => m.EmailLinkOAuthComponent),
},
{
path: "screens/phone-auth-screen",
loadComponent: () => import("./auth/phone-screen").then((m) => m.PhoneScreenComponent),
},
{
path: "screens/phone-auth-screen-w-oauth",
loadComponent: () => import("./auth/phone-oauth").then((m) => m.PhoneOAuthComponent),
},
{
path: "screens/sign-up-auth-screen",
path: "sign-up",
loadComponent: () => import("./auth/sign-up").then((m) => m.SignUpComponent),
},
{
path: "screens/sign-up-auth-screen-w-oauth",
loadComponent: () => import("./auth/register-oauth").then((m) => m.RegisterOAuthComponent),
},
{
path: "screens/oauth-screen",
loadComponent: () => import("./auth/oauth").then((m) => m.OAuthComponent),
},
{
path: "screens/password-reset-screen",
loadComponent: () => import("./auth/password-reset").then((m) => m.PasswordResetComponent),
path: "sign-up-oauth",
loadComponent: () => import("./auth/sign-up-oauth").then((m) => m.SignUpOAuthComponent),
},
{
path: "**",
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { EmailLinkAuthScreenComponent } from "@firebase-ui/angular";
selector: "app-email-link",
standalone: true,
imports: [CommonModule, RouterModule, EmailLinkAuthScreenComponent],
template: ` <fui-email-link-auth-screen></fui-email-link-auth-screen> `,
template: `<fui-email-link-auth-screen></fui-email-link-auth-screen> `,
styles: [],
})
export class EmailLinkComponent implements OnInit {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ import { Component, OnInit, inject } from "@angular/core";
import { CommonModule } from "@angular/common";
import { Router, RouterModule } from "@angular/router";
import { Auth, User, authState } from "@angular/fire/auth";
import { PasswordResetScreenComponent } from "@firebase-ui/angular";
import { ForgotPasswordAuthScreenComponent } from "@firebase-ui/angular";

@Component({
selector: "app-forgot-password",
standalone: true,
imports: [CommonModule, RouterModule, PasswordResetScreenComponent],
template: ` <fui-password-reset-screen signInRoute="/sign-in"></fui-password-reset-screen> `,
imports: [CommonModule, RouterModule, ForgotPasswordAuthScreenComponent],
template: `<fui-forgot-password-auth-screen (backToSignIn)="backToSignIn()"></fui-forgot-password-auth-screen> `,
styles: [],
})
export class ForgotPasswordComponent implements OnInit {
Expand All @@ -39,4 +39,8 @@ export class ForgotPasswordComponent implements OnInit {
}
});
}

backToSignIn() {
this.router.navigate(["/sign-in"]);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { PhoneAuthScreenComponent, GoogleSignInButtonComponent } from "@firebase
imports: [CommonModule, RouterModule, PhoneAuthScreenComponent, GoogleSignInButtonComponent],
template: `
<fui-phone-auth-screen>
<fui-google-sign-in-button></fui-google-sign-in-button>
<fui-google-sign-in-button />
</fui-phone-auth-screen>
`,
styles: [],
Expand Down
2 changes: 1 addition & 1 deletion examples/angular/src/app/auth/phone/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@
* limitations under the License.
*/

export * from "./phone.component";
export * from "./phone-screen.component";
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ import { Auth, User, authState } from "@angular/fire/auth";
import { PhoneAuthScreenComponent } from "@firebase-ui/angular";

@Component({
selector: "app-phone-screen",
selector: "app-phone",
standalone: true,
imports: [CommonModule, RouterModule, PhoneAuthScreenComponent],
template: ` <fui-phone-auth-screen [resendDelay]="2"></fui-phone-auth-screen> `,
template: ` <fui-phone-auth-screen [resendDelay]="2"></fui-phone-auth-screen>`,
styles: [],
})
export class PhoneScreenComponent implements OnInit {
export class PhoneComponent implements OnInit {
private auth = inject(Auth);
private router = inject(Router);

Expand Down
42 changes: 0 additions & 42 deletions examples/angular/src/app/auth/phone/phone.component.ts

This file was deleted.

16 changes: 0 additions & 16 deletions examples/angular/src/app/auth/register/index.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1 @@
/**
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

export * from "./register.component";
Loading
Loading