@@ -45,12 +45,28 @@ type PolicyConfig = {
45
45
} ;
46
46
47
47
export function provideFirebaseUI (
48
- uiFactory : ( apps : FirebaseApps ) => FirebaseUIType ,
48
+ uiFactory : ( apps : FirebaseApps ) => FirebaseUIType
49
49
) : EnvironmentProviders {
50
50
const providers : Provider [ ] = [
51
51
// TODO: This should depend on the FirebaseAuth provider via deps,
52
52
// see https://github.com/angular/angularfire/blob/35e0a9859299010488852b1826e4083abe56528f/src/firestore/firestore.module.ts#L76
53
- { provide : FIREBASE_UI_STORE , useFactory : uiFactory , deps : [ FirebaseApps ] } ,
53
+ {
54
+ provide : FIREBASE_UI_STORE ,
55
+ useFactory : ( ) => {
56
+ try {
57
+ // Try to get FirebaseApps, but handle the case where it's not available (SSR)
58
+ const apps = inject ( FirebaseApps , { optional : true } ) ;
59
+ if ( ! apps || apps . length === 0 ) {
60
+ return null as any ;
61
+ }
62
+ return uiFactory ( apps ) ;
63
+ } catch ( error ) {
64
+ // Return null for SSR when FirebaseApps is not available
65
+ return null as any ;
66
+ }
67
+ } ,
68
+ } ,
69
+ FirebaseUI ,
54
70
] ;
55
71
56
72
return makeEnvironmentProviders ( providers ) ;
@@ -59,16 +75,17 @@ export function provideFirebaseUI(
59
75
export function provideFirebaseUIPolicies ( factory : ( ) => PolicyConfig ) {
60
76
const providers : Provider [ ] = [
61
77
{ provide : FIREBASE_UI_POLICIES , useFactory : factory } ,
78
+ FirebaseUIPolicies ,
62
79
] ;
63
80
64
81
return makeEnvironmentProviders ( providers ) ;
65
82
}
66
83
67
84
@Injectable ( {
68
- providedIn : ' root' ,
85
+ providedIn : " root" ,
69
86
} )
70
87
export class FirebaseUI {
71
- private store = inject ( FIREBASE_UI_STORE ) ;
88
+ private store = inject ( FIREBASE_UI_STORE , { optional : true } ) ;
72
89
private destroyed$ : ReplaySubject < void > = new ReplaySubject ( 1 ) ;
73
90
74
91
config ( ) {
@@ -77,14 +94,21 @@ export class FirebaseUI {
77
94
78
95
translation < T extends TranslationCategory > (
79
96
category : T ,
80
- key : TranslationKey < T > ,
97
+ key : TranslationKey < T >
81
98
) {
82
99
return this . config ( ) . pipe (
83
- map ( ( config ) => getTranslation ( config , category , key ) ) ,
100
+ map ( ( config ) => getTranslation ( config , category , key ) )
84
101
) ;
85
102
}
86
103
87
- useStore < T > ( store : Store < T > ) : Observable < T > {
104
+ useStore < T > ( store : Store < T > | null ) : Observable < T > {
105
+ if ( ! store ) {
106
+ // Return an observable that emits a default value for SSR when store is not available
107
+ return new Observable < T > ( ( subscriber ) => {
108
+ subscriber . next ( { } as T ) ;
109
+ subscriber . complete ( ) ;
110
+ } ) ;
111
+ }
88
112
return new Observable < T > ( ( sub ) => {
89
113
sub . next ( store . get ( ) ) ;
90
114
return store . subscribe ( ( value ) => sub . next ( value ) ) ;
0 commit comments