@@ -30,6 +30,8 @@ type AugmentedConfigCatClient = IConfigCatClient & {
3030
3131class ConfigCatProvider extends Component < PropsWithChildren < ConfigCatProviderProps > , ConfigCatProviderState , { } > {
3232 private configChangedHandler ?: ( newConfig : Config ) => void ;
33+ private originalClearDefaultUser ?: ( ) => void ;
34+ private originalSetDefaultUser ?: ( defaultUser : IUser ) => void ;
3335
3436 constructor ( props : ConfigCatProviderProps ) {
3537 super ( props ) ;
@@ -42,31 +44,72 @@ class ConfigCatProvider extends Component<PropsWithChildren<ConfigCatProviderPro
4244 const providers = client . _configCatReactSdkProviders ??= new Set ( ) ;
4345 providers . add ( this ) ;
4446
45- this . state = { client } ;
47+ this . state = { client, defaultUser : this . props . options ?. defaultUser } ;
4648 }
4749
4850 componentDidMount ( ) : void {
51+ const { client } = this . state ;
52+
53+ // Monkey-patch client's `clearDefaultUser` and `setDefaultUser` methods to detect default user changes.
54+
55+ // eslint-disable-next-line @typescript-eslint/unbound-method
56+ this . originalClearDefaultUser = client . clearDefaultUser ;
57+ client . clearDefaultUser = ( ) => {
58+ if ( this . originalClearDefaultUser && this . state . client === client ) {
59+ this . originalClearDefaultUser . call ( client ) ;
60+ this . setState ( { defaultUser : void 0 } ) ;
61+ }
62+ } ;
63+
64+ // eslint-disable-next-line @typescript-eslint/unbound-method
65+ this . originalSetDefaultUser = client . setDefaultUser ;
66+ client . setDefaultUser = defaultUser => {
67+ if ( this . originalSetDefaultUser && this . state . client === client ) {
68+ this . originalSetDefaultUser . call ( client , defaultUser ) ;
69+ this . setState ( { defaultUser } ) ;
70+ }
71+ } ;
72+
73+ // Wire up config data change detection.
74+
4975 this . configChangedHandler = newConfig => this . reactConfigChanged ( newConfig ) ;
5076
51- this . state . client . waitForReady ( ) . then ( ( ) => {
52- if ( ! this . configChangedHandler ) {
53- // If the component was unmounted before client initialization finished, we have nothing left to do.
54- return ;
77+ client . waitForReady ( ) . then ( ( ) => {
78+ // If the component was unmounted before client initialization finished, we have nothing left to do.
79+ if ( this . configChangedHandler && this . state . client === client ) {
80+ client . on ( "configChanged" , this . configChangedHandler ) ;
81+ this . clientReady ( ) ;
5582 }
56- this . state . client . on ( "configChanged" , this . configChangedHandler ) ;
57- this . clientReady ( ) ;
5883 } ) ;
5984 }
6085
6186 componentWillUnmount ( ) : void {
87+ const { client } = this . state ;
88+
89+ // Stop config data change detection.
90+
6291 if ( this . configChangedHandler ) {
63- this . state . client . off ( "configChanged" , this . configChangedHandler ) ;
64- delete this . configChangedHandler ;
92+ client . off ( "configChanged" , this . configChangedHandler ) ;
93+ this . configChangedHandler = void 0 ;
94+ }
95+
96+ // Restore monkey-patched client methods.
97+
98+ if ( this . originalClearDefaultUser ) {
99+ client . clearDefaultUser = this . originalClearDefaultUser ! ;
100+ this . originalClearDefaultUser = void 0 ;
101+ }
102+
103+ if ( this . originalSetDefaultUser ) {
104+ client . setDefaultUser = this . originalSetDefaultUser ! ;
105+ this . originalSetDefaultUser = void 0 ;
65106 }
66107
67- const providers = ( this . state . client as AugmentedConfigCatClient ) . _configCatReactSdkProviders ;
108+ // Dispose client if no longer in use.
109+
110+ const providers = ( client as AugmentedConfigCatClient ) . _configCatReactSdkProviders ;
68111 if ( providers ?. delete ( this ) && ! providers . size ) {
69- this . state . client . dispose ( ) ;
112+ client . dispose ( ) ;
70113 }
71114 }
72115
0 commit comments