Added analytics for message pinning (#3284)

This commit is contained in:
Mauro
2024-09-17 10:02:26 +02:00
committed by GitHub
parent 20f4a43751
commit efe352c319
10 changed files with 23 additions and 7 deletions
+1 -1
View File
@@ -7775,7 +7775,7 @@
repositoryURL = "https://github.com/matrix-org/matrix-analytics-events"; repositoryURL = "https://github.com/matrix-org/matrix-analytics-events";
requirement = { requirement = {
kind = upToNextMinorVersion; kind = upToNextMinorVersion;
minimumVersion = 0.23.1; minimumVersion = 0.25.0;
}; };
}; };
C13F55E4518415CB4C278E73 /* XCRemoteSwiftPackageReference "DTCoreText" */ = { C13F55E4518415CB4C278E73 /* XCRemoteSwiftPackageReference "DTCoreText" */ = {
@@ -131,8 +131,8 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/matrix-org/matrix-analytics-events", "location" : "https://github.com/matrix-org/matrix-analytics-events",
"state" : { "state" : {
"revision" : "de0cac487e5e7f607ee17045882204c91585461f", "revision" : "c9b40120a5f7b8ce1bab3f09f8417fdc9407f006",
"version" : "0.23.1" "version" : "0.25.0"
} }
}, },
{ {
@@ -40,7 +40,7 @@ final class PinnedEventsTimelineScreenCoordinator: CoordinatorProtocol {
init(parameters: PinnedEventsTimelineScreenCoordinatorParameters) { init(parameters: PinnedEventsTimelineScreenCoordinatorParameters) {
self.parameters = parameters self.parameters = parameters
viewModel = PinnedEventsTimelineScreenViewModel() viewModel = PinnedEventsTimelineScreenViewModel(analyticsService: ServiceLocator.shared.analytics)
timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy, timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy,
timelineController: parameters.timelineController, timelineController: parameters.timelineController,
mediaProvider: parameters.mediaProvider, mediaProvider: parameters.mediaProvider,
@@ -11,12 +11,15 @@ import SwiftUI
typealias PinnedEventsTimelineScreenViewModelType = StateStoreViewModel<PinnedEventsTimelineScreenViewState, PinnedEventsTimelineScreenViewAction> typealias PinnedEventsTimelineScreenViewModelType = StateStoreViewModel<PinnedEventsTimelineScreenViewState, PinnedEventsTimelineScreenViewAction>
class PinnedEventsTimelineScreenViewModel: PinnedEventsTimelineScreenViewModelType, PinnedEventsTimelineScreenViewModelProtocol { class PinnedEventsTimelineScreenViewModel: PinnedEventsTimelineScreenViewModelType, PinnedEventsTimelineScreenViewModelProtocol {
private let analyticsService: AnalyticsService
private let actionsSubject: PassthroughSubject<PinnedEventsTimelineScreenViewModelAction, Never> = .init() private let actionsSubject: PassthroughSubject<PinnedEventsTimelineScreenViewModelAction, Never> = .init()
var actionsPublisher: AnyPublisher<PinnedEventsTimelineScreenViewModelAction, Never> { var actionsPublisher: AnyPublisher<PinnedEventsTimelineScreenViewModelAction, Never> {
actionsSubject.eraseToAnyPublisher() actionsSubject.eraseToAnyPublisher()
} }
init() { init(analyticsService: AnalyticsService) {
self.analyticsService = analyticsService
super.init(initialViewState: PinnedEventsTimelineScreenViewState()) super.init(initialViewState: PinnedEventsTimelineScreenViewState())
} }
@@ -27,6 +30,7 @@ class PinnedEventsTimelineScreenViewModel: PinnedEventsTimelineScreenViewModelTy
switch viewAction { switch viewAction {
case .close: case .close:
analyticsService.trackInteraction(name: .PinnedMessageBannerCloseListButton)
actionsSubject.send(.dismiss) actionsSubject.send(.dismiss)
} }
} }
@@ -84,7 +84,7 @@ struct PinnedEventsTimelineScreen: View {
// MARK: - Previews // MARK: - Previews
struct PinnedEventsTimelineScreen_Previews: PreviewProvider, TestablePreview { struct PinnedEventsTimelineScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = PinnedEventsTimelineScreenViewModel() static let viewModel = PinnedEventsTimelineScreenViewModel(analyticsService: ServiceLocator.shared.analytics)
static let emptyTimelineViewModel: TimelineViewModel = { static let emptyTimelineViewModel: TimelineViewModel = {
let timelineController = MockRoomTimelineController(timelineKind: .pinned) let timelineController = MockRoomTimelineController(timelineKind: .pinned)
timelineController.timelineItems = [] timelineController.timelineItems = []
@@ -161,6 +161,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
case .processTapCall: case .processTapCall:
actionsSubject.send(.startCall) actionsSubject.send(.startCall)
case .processTapPinnedEvents: case .processTapPinnedEvents:
analyticsService.trackInteraction(name: .PinnedMessageRoomInfoButton)
actionsSubject.send(.displayPinnedEventsTimeline) actionsSubject.send(.displayPinnedEventsTimeline)
} }
} }
@@ -73,11 +73,13 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
override func process(viewAction: RoomScreenViewAction) { override func process(viewAction: RoomScreenViewAction) {
switch viewAction { switch viewAction {
case .tappedPinnedEventsBanner: case .tappedPinnedEventsBanner:
analyticsService.trackInteraction(name: .PinnedMessageBannerClick)
if let eventID = state.pinnedEventsBannerState.selectedPinnedEventID { if let eventID = state.pinnedEventsBannerState.selectedPinnedEventID {
actionsSubject.send(.focusEvent(eventID: eventID)) actionsSubject.send(.focusEvent(eventID: eventID))
} }
state.pinnedEventsBannerState.previousPin() state.pinnedEventsBannerState.previousPin()
case .viewAllPins: case .viewAllPins:
analyticsService.trackInteraction(name: .PinnedMessageBannerViewAllButton)
actionsSubject.send(.displayPinnedEventsTimeline) actionsSubject.send(.displayPinnedEventsTimeline)
case .displayRoomDetails: case .displayRoomDetails:
actionsSubject.send(.displayRoomDetails) actionsSubject.send(.displayRoomDetails)
@@ -163,12 +163,17 @@ class TimelineInteractionHandler {
case .endPoll(let pollStartID): case .endPoll(let pollStartID):
endPoll(pollStartID: pollStartID) endPoll(pollStartID: pollStartID)
case .pin: case .pin:
analyticsService.trackPinUnpinEvent(.init(from: timelineController.timelineKind == .pinned ? .MessagePinningList : .Timeline,
kind: .Pin))
guard let eventID = itemID.eventID else { return } guard let eventID = itemID.eventID else { return }
Task { await timelineController.pin(eventID: eventID) } Task { await timelineController.pin(eventID: eventID) }
case .unpin: case .unpin:
analyticsService.trackPinUnpinEvent(.init(from: timelineController.timelineKind == .pinned ? .MessagePinningList : .Timeline,
kind: .Unpin))
guard let eventID = itemID.eventID else { return } guard let eventID = itemID.eventID else { return }
Task { await timelineController.unpin(eventID: eventID) } Task { await timelineController.unpin(eventID: eventID) }
case .viewInRoomTimeline: case .viewInRoomTimeline:
analyticsService.trackInteraction(name: .PinnedMessageListViewTimeline)
guard let eventID = itemID.eventID else { return } guard let eventID = itemID.eventID else { return }
actionsSubject.send(.viewInRoomTimeline(eventID: eventID)) actionsSubject.send(.viewInRoomTimeline(eventID: eventID))
} }
@@ -243,4 +243,8 @@ extension AnalyticsService {
func updateUserProperties(_ userProperties: AnalyticsEvent.UserProperties) { func updateUserProperties(_ userProperties: AnalyticsEvent.UserProperties) {
client.updateUserProperties(userProperties) client.updateUserProperties(userProperties)
} }
func trackPinUnpinEvent(_ event: AnalyticsEvent.PinUnpinAction) {
capture(event: event)
}
} }
+1 -1
View File
@@ -68,7 +68,7 @@ packages:
# path: ../compound-ios # path: ../compound-ios
AnalyticsEvents: AnalyticsEvents:
url: https://github.com/matrix-org/matrix-analytics-events url: https://github.com/matrix-org/matrix-analytics-events
minorVersion: 0.23.1 minorVersion: 0.25.0
# path: ../matrix-analytics-events # path: ../matrix-analytics-events
Emojibase: Emojibase:
url: https://github.com/matrix-org/emojibase-bindings url: https://github.com/matrix-org/emojibase-bindings