Skip to content

Commit dd7ce8c

Browse files
authored
feat(analytics, web): add support for options on Web (#12914)
* feat(analytics, web): add support for options on Web * licence
1 parent a292282 commit dd7ce8c

File tree

7 files changed

+66
-21
lines changed

7 files changed

+66
-21
lines changed

packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart

+12-5
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,35 @@ part of firebase_analytics;
66

77
/// Firebase Analytics API.
88
class FirebaseAnalytics extends FirebasePluginPlatform {
9-
FirebaseAnalytics._({required this.app})
10-
: super(app.name, 'plugins.flutter.io/firebase_analytics');
9+
FirebaseAnalytics._({
10+
required this.app,
11+
this.webOptions,
12+
}) : super(app.name, 'plugins.flutter.io/firebase_analytics');
1113

1214
static Map<String, FirebaseAnalytics> _firebaseAnalyticsInstances = {};
1315

16+
final Map<String, dynamic>? webOptions;
17+
1418
// Cached and lazily loaded instance of [FirebaseAnalyticsPlatform] to avoid
1519
// creating a [MethodChannelFirebaseAnalytics] when not needed or creating an
1620
// instance with the default app before a user specifies an app.
1721
FirebaseAnalyticsPlatform? _delegatePackingProperty;
1822

1923
FirebaseAnalyticsPlatform get _delegate {
2024
return _delegatePackingProperty ??=
21-
FirebaseAnalyticsPlatform.instanceFor(app: app);
25+
FirebaseAnalyticsPlatform.instanceFor(app: app, webOptions: webOptions);
2226
}
2327

2428
/// Returns an instance using a specified [FirebaseApp].
2529
///
2630
/// Note; multi-app support is only supported on web.
27-
factory FirebaseAnalytics.instanceFor({required FirebaseApp app}) {
31+
factory FirebaseAnalytics.instanceFor({
32+
required FirebaseApp app,
33+
Map<String, dynamic>? webOptions,
34+
}) {
2835
if (kIsWeb || app.name == defaultFirebaseAppName) {
2936
return _firebaseAnalyticsInstances.putIfAbsent(app.name, () {
30-
return FirebaseAnalytics._(app: app);
37+
return FirebaseAnalytics._(app: app, webOptions: webOptions);
3138
});
3239
}
3340

packages/firebase_analytics/firebase_analytics_platform_interface/lib/src/method_channel/method_channel_firebase_analytics.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ class MethodChannelFirebaseAnalytics extends FirebaseAnalyticsPlatform {
3434
MethodChannel('plugins.flutter.io/firebase_analytics');
3535

3636
@override
37-
FirebaseAnalyticsPlatform delegateFor({required FirebaseApp app}) {
37+
FirebaseAnalyticsPlatform delegateFor({
38+
required FirebaseApp app,
39+
Map<String, dynamic>? webOptions,
40+
}) {
3841
return MethodChannelFirebaseAnalytics(app: app);
3942
}
4043

packages/firebase_analytics/firebase_analytics_platform_interface/lib/src/platform_interface/platform_interface_firebase_analytics.dart

+10-3
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,12 @@ abstract class FirebaseAnalyticsPlatform extends PlatformInterface {
4040
}
4141

4242
/// Create an instance using [app] using the existing implementation
43-
factory FirebaseAnalyticsPlatform.instanceFor({required FirebaseApp app}) {
44-
return FirebaseAnalyticsPlatform.instance.delegateFor(app: app);
43+
factory FirebaseAnalyticsPlatform.instanceFor({
44+
required FirebaseApp app,
45+
Map<String, dynamic>? webOptions,
46+
}) {
47+
return FirebaseAnalyticsPlatform.instance
48+
.delegateFor(app: app, webOptions: webOptions);
4549
}
4650

4751
/// The current default [FirebaseAnalyticsPlatform] instance.
@@ -59,7 +63,10 @@ abstract class FirebaseAnalyticsPlatform extends PlatformInterface {
5963
}
6064

6165
/// Enables delegates to create new instances of themselves
62-
FirebaseAnalyticsPlatform delegateFor({required FirebaseApp app}) {
66+
FirebaseAnalyticsPlatform delegateFor({
67+
required FirebaseApp app,
68+
Map<String, dynamic>? webOptions,
69+
}) {
6370
throw UnimplementedError('delegateFor() is not implemented');
6471
}
6572

packages/firebase_analytics/firebase_analytics_web/lib/firebase_analytics_web.dart

+15-5
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,22 @@ class FirebaseAnalyticsWeb extends FirebaseAnalyticsPlatform {
1717
/// instance of Analytics from the web plugin
1818
analytics_interop.Analytics? _webAnalytics;
1919

20+
final Map<String, dynamic>? webOptions;
21+
2022
/// Lazily initialize [_webAnalytics] on first method call
2123
analytics_interop.Analytics get _delegate {
22-
return _webAnalytics ??=
23-
analytics_interop.getAnalyticsInstance(core_interop.app(app.name));
24+
return _webAnalytics ??= analytics_interop.getAnalyticsInstance(
25+
core_interop.app(app.name),
26+
webOptions,
27+
);
2428
}
2529

2630
/// Builds an instance of [FirebaseAnalyticsWeb] with an optional [FirebaseApp] instance
2731
/// If [app] is null then the created instance will use the default [FirebaseApp]
28-
FirebaseAnalyticsWeb({FirebaseApp? app}) : super(appInstance: app);
32+
FirebaseAnalyticsWeb({
33+
FirebaseApp? app,
34+
this.webOptions,
35+
}) : super(appInstance: app);
2936

3037
/// Called by PluginRegistry to register this plugin for Flutter Web
3138
static void registerWith(Registrar registrar) {
@@ -34,8 +41,11 @@ class FirebaseAnalyticsWeb extends FirebaseAnalyticsPlatform {
3441
}
3542

3643
@override
37-
FirebaseAnalyticsPlatform delegateFor({FirebaseApp? app}) {
38-
return FirebaseAnalyticsWeb(app: app);
44+
FirebaseAnalyticsPlatform delegateFor({
45+
FirebaseApp? app,
46+
Map<String, dynamic>? webOptions,
47+
}) {
48+
return FirebaseAnalyticsWeb(app: app, webOptions: webOptions);
3949
}
4050

4151
@override

packages/firebase_analytics/firebase_analytics_web/lib/interop/analytics.dart

+5-2
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ import 'analytics_interop.dart' as analytics_interop;
1414
export 'analytics_interop.dart';
1515

1616
/// Given an AppJSImp, return the Analytics instance.
17-
Analytics getAnalyticsInstance([App? app]) {
17+
Analytics getAnalyticsInstance([
18+
App? app,
19+
Map<String, dynamic>? options = const {},
20+
]) {
1821
return Analytics.getInstance(
1922
app != null
20-
? analytics_interop.getAnalytics(app.jsObject)
23+
? analytics_interop.initializeAnalytics(app.jsObject, options.jsify())
2124
: analytics_interop.getAnalytics(),
2225
);
2326
}

packages/firebase_analytics/firebase_analytics_web/lib/interop/analytics_interop.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ external AnalyticsJsImpl getAnalytics([AppJsImpl? app]);
1717

1818
@JS()
1919
@staticInterop
20-
external AnalyticsJsImpl initializeAnalytics([AppJsImpl app]);
20+
external AnalyticsJsImpl initializeAnalytics(
21+
AppJsImpl app, [
22+
JSAny? options,
23+
]);
2124

2225
@JS()
2326
@staticInterop

packages/firebase_analytics/firebase_analytics_web/test/firebase_analytics_web_test.mocks.dart

+16-4
Original file line numberDiff line numberDiff line change
@@ -77,27 +77,39 @@ class MockFirebaseAnalyticsWeb extends _i1.Mock
7777
) as _i2.FirebaseApp);
7878

7979
@override
80-
_i3.FirebaseAnalyticsPlatform delegateFor({_i2.FirebaseApp? app}) =>
80+
_i3.FirebaseAnalyticsPlatform delegateFor({
81+
_i2.FirebaseApp? app,
82+
Map<String, dynamic>? webOptions,
83+
}) =>
8184
(super.noSuchMethod(
8285
Invocation.method(
8386
#delegateFor,
8487
[],
85-
{#app: app},
88+
{
89+
#app: app,
90+
#webOptions: webOptions,
91+
},
8692
),
8793
returnValue: _FakeFirebaseAnalyticsPlatform_1(
8894
this,
8995
Invocation.method(
9096
#delegateFor,
9197
[],
92-
{#app: app},
98+
{
99+
#app: app,
100+
#webOptions: webOptions,
101+
},
93102
),
94103
),
95104
returnValueForMissingStub: _FakeFirebaseAnalyticsPlatform_1(
96105
this,
97106
Invocation.method(
98107
#delegateFor,
99108
[],
100-
{#app: app},
109+
{
110+
#app: app,
111+
#webOptions: webOptions,
112+
},
101113
),
102114
),
103115
) as _i3.FirebaseAnalyticsPlatform);

0 commit comments

Comments
 (0)