1616 */
1717import { Storage } from '../storage/storage' ;
1818import { FirebaseExperimentDescription } from '../public_types' ;
19+ import { Provider } from '@firebase/component' ;
20+ import { FirebaseAnalyticsInternalName } from '@firebase/analytics-interop-types' ;
21+ import { Logger } from '@firebase/logger' ;
22+ import { RemoteConfig } from '../remote_config' ;
23+ import { ERROR_FACTORY , ErrorCode } from '../errors' ;
1924
2025export class Experiment {
21- constructor ( private readonly storage : Storage ) { }
26+ private storage : Storage ;
27+ private logger : Logger ;
28+ private analyticsProvider : Provider < FirebaseAnalyticsInternalName > ;
29+
30+ constructor ( rc : RemoteConfig ) {
31+ this . storage = rc . _storage ;
32+ this . logger = rc . _logger ;
33+ this . analyticsProvider = rc . _analyticsProvider ;
34+ }
2235
2336 async updateActiveExperiments (
2437 latestExperiments : FirebaseExperimentDescription [ ]
@@ -45,32 +58,47 @@ export class Experiment {
4558 currentActiveExperiments : Set < string > ,
4659 experimentInfoMap : Map < string , FirebaseExperimentDescription >
4760 ) : void {
61+ const customProperty : Record < string , string | null > = { } ;
4862 for ( const [ experimentId , experimentInfo ] of experimentInfoMap . entries ( ) ) {
4963 if ( ! currentActiveExperiments . has ( experimentId ) ) {
50- this . addExperimentToAnalytics ( experimentId , experimentInfo . variantId ) ;
64+ customProperty [ experimentId ] = experimentInfo . variantId ;
5165 }
5266 }
67+ this . addExperimentToAnalytics ( customProperty ) ;
5368 }
5469
5570 private removeInactiveExperiments (
5671 currentActiveExperiments : Set < string > ,
5772 experimentInfoMap : Map < string , FirebaseExperimentDescription >
5873 ) : void {
74+ const customProperty : Record < string , string | null > = { } ;
5975 for ( const experimentId of currentActiveExperiments ) {
6076 if ( ! experimentInfoMap . has ( experimentId ) ) {
61- this . removeExperimentFromAnalytics ( experimentId ) ;
77+ customProperty [ experimentId ] = null ;
6278 }
6379 }
80+ this . addExperimentToAnalytics ( customProperty ) ;
6481 }
6582
6683 private addExperimentToAnalytics (
67- _experimentId : string ,
68- _variantId : string
84+ customProperty : Record < string , string | null >
6985 ) : void {
70- // TODO
71- }
72-
73- private removeExperimentFromAnalytics ( _experimentId : string ) : void {
74- // TODO
86+ if ( Object . keys ( customProperty ) . length === 0 ) {
87+ return ;
88+ }
89+ try {
90+ const analytics = this . analyticsProvider . getImmediate ( { optional : true } ) ;
91+ if ( analytics ) {
92+ analytics . setUserProperties ( { properties : customProperty } ) ;
93+ } else {
94+ // TODO: Update warning message
95+ this . logger . warn ( `Analytics is not imported correctly` ) ;
96+ }
97+ } catch ( error ) {
98+ // TODO: Update error message
99+ throw ERROR_FACTORY . create ( ErrorCode . ANALYTICS_UNAVAILABLE , {
100+ originalErrorMessage : ( error as Error ) ?. message
101+ } ) ;
102+ }
75103 }
76104}
0 commit comments