mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
Added analytics for message pinning (#3284)
This commit is contained in:
@@ -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"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -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,
|
||||||
|
|||||||
+5
-1
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user