Skip to content

Commit d584c7b

Browse files
committed
Bridge .analyticsScreen View modifier
Fixes #49
1 parent 8eae24b commit d584c7b

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ let package = Package(
9393
.target(name: "SkipFirebaseAnalytics", dependencies: [
9494
"SkipFirebaseCore",
9595
.product(name: "FirebaseAnalytics", package: "firebase-ios-sdk", condition: .when(platforms: [.macOS, .iOS, .tvOS, .watchOS, .macCatalyst])),
96+
.product(name: "SkipUI", package: "skip-ui"),
9697
], resources: [.process("Resources")], plugins: skipstone),
9798
.testTarget(name: "SkipFirebaseAnalyticsTests", dependencies: [
9899
"SkipFirebaseAnalytics",
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// SPDX-License-Identifier: LGPL-3.0-only WITH LGPL-3.0-linking-exception
2+
#if !SKIP_BRIDGE
3+
#if SKIP
4+
import SwiftUI
5+
6+
struct LoggedAnalyticsModifier: ViewModifier {
7+
/// The name of the view to log in the `AnalyticsParameterScreenName` parameter.
8+
let screenName: String
9+
10+
/// The name of the view to log in the `AnalyticsParameterScreenClass` parameter.
11+
let screenClass: String
12+
13+
/// Extra parameters to log with the screen view event.
14+
let extraParameters: [String: Any]
15+
16+
func body(content: Content) -> some View {
17+
// Take the content and add an onAppear action to know when the view has appeared on screen.
18+
content.onAppear {
19+
// Log the event appearing, adding the appropriate keys and values needed for screen
20+
// view events.
21+
var parameters = extraParameters
22+
parameters[AnalyticsParameterScreenName] = screenName
23+
parameters[AnalyticsParameterScreenClass] = screenClass
24+
Analytics.logEvent(AnalyticsEventScreenView, parameters: parameters)
25+
}
26+
}
27+
}
28+
29+
public extension View {
30+
/// Logs `screen_view` events in Google Analytics for Firebase when this view appears on screen.
31+
/// - Parameters:
32+
/// - name: Current screen name logged with the `screen_view` event.
33+
/// - class: Current screen class or struct logged with the `screen_view` event.
34+
/// - extraParameters: Any additional parameters to be logged. These extra parameters must
35+
/// follow the same rules as described in the `Analytics.logEvent(_:parameters:)` docs.
36+
/// - Returns: A view with a custom `ViewModifier` used to log `screen_view` events when this
37+
/// view appears on screen.
38+
func analyticsScreen(name: String,
39+
class: String = "View",
40+
extraParameters: [String: Any] = [:]) -> some View {
41+
// `self` is the view, we're just adding an `LoggedAnalyticsModifier` modifier on it.
42+
modifier(LoggedAnalyticsModifier(screenName: name,
43+
screenClass: `class`,
44+
extraParameters: extraParameters))
45+
}
46+
}
47+
48+
#endif
49+
#endif

0 commit comments

Comments
 (0)