|
| 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