@@ -20,6 +20,9 @@ import React from 'react';
20
20
// Global ID for the element.
21
21
const ELEMENT_ID = 'firebaseui_container' ;
22
22
23
+ // Promise that resolves unless the FirebaseUI instance is currently being deleted.
24
+ let firebaseUiDeletion = Promise . resolve ( ) ;
25
+
23
26
/**
24
27
* React Component wrapper for the FirebaseUI Auth widget.
25
28
*/
@@ -46,24 +49,36 @@ export default class FirebaseAuth extends React.Component {
46
49
// Import the css only on the client.
47
50
require ( 'firebaseui/dist/firebaseui.css' ) ;
48
51
49
- // Firebase UI only works on the Client. So we're loading in `componentDidMount`.
52
+ // Firebase UI only works on the Client. So we're loading the package in `componentDidMount`
53
+ // So that this works when doing server-side rendering.
50
54
const firebaseui = require ( 'firebaseui' ) ;
51
- this . firebaseUiWidget = firebaseui . auth . AuthUI . getInstance ( )
52
- || new firebaseui . auth . AuthUI ( this . firebaseAuth ) ;
53
- if ( this . uiConfig . signInFlow === 'popup' ) {
54
- this . firebaseUiWidget . reset ( ) ;
55
- }
56
- if ( this . uiCallback ) {
57
- this . uiCallback ( this . firebaseUiWidget ) ;
58
- }
59
- this . firebaseUiWidget . start ( '#' + ELEMENT_ID , this . uiConfig ) ;
55
+
56
+ // Wait in case the firebase UI instance is being deleted.
57
+ // This can happen if you unmount/remount the element quickly.
58
+ firebaseUiDeletion . then ( ( ) => {
59
+ // Get or Create a firebaseUI instance.
60
+ this . firebaseUiWidget = firebaseui . auth . AuthUI . getInstance ( )
61
+ || new firebaseui . auth . AuthUI ( this . firebaseAuth ) ;
62
+ if ( this . uiConfig . signInFlow === 'popup' ) {
63
+ this . firebaseUiWidget . reset ( ) ;
64
+ }
65
+
66
+ // Trigger the callback if any was set.
67
+ if ( this . uiCallback ) {
68
+ this . uiCallback ( this . firebaseUiWidget ) ;
69
+ }
70
+
71
+ // Render the firebaseUi Widget.
72
+ this . firebaseUiWidget . start ( '#' + ELEMENT_ID , this . uiConfig ) ;
73
+ } ) ;
60
74
}
61
75
62
76
/**
63
77
* @inheritDoc
64
78
*/
65
79
componentWillUnmount ( ) {
66
- this . firebaseUiWidget . reset ( ) ;
80
+ this . unregisterAuthObserver ( ) ;
81
+ firebaseUiDeletion = this . firebaseUiWidget . delete ( ) ;
67
82
}
68
83
69
84
/**
0 commit comments