Add posthog events (#1097)

This commit is contained in:
Nicolas Mauri
2023-06-21 18:00:33 +02:00
committed by GitHub
parent 2ae8f471c6
commit 6d5652d56a
10 changed files with 71 additions and 8 deletions
@@ -231,7 +231,6 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
} }
} }
/// Updates the navigation stack so it displays the timeline for the given room /// Updates the navigation stack so it displays the timeline for the given room
/// - Parameters: /// - Parameters:
/// - roomID: the identifier of the room that is to be presented /// - roomID: the identifier of the room that is to be presented
@@ -283,6 +282,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
mediaProvider: userSession.mediaProvider) mediaProvider: userSession.mediaProvider)
self.timelineController = timelineController self.timelineController = timelineController
ServiceLocator.shared.analytics.trackViewRoom(isDM: roomProxy.isDirect, isSpace: roomProxy.isSpace)
let parameters = RoomScreenCoordinatorParameters(roomProxy: roomProxy, let parameters = RoomScreenCoordinatorParameters(roomProxy: roomProxy,
timelineController: timelineController, timelineController: timelineController,
mediaProvider: userSession.mediaProvider, mediaProvider: userSession.mediaProvider,
@@ -37,6 +37,7 @@ struct InvitesScreen: View {
.background(Color.compound.bgCanvasDefault.ignoresSafeArea()) .background(Color.compound.bgCanvasDefault.ignoresSafeArea())
.navigationTitle(L10n.actionInvitesList) .navigationTitle(L10n.actionInvitesList)
.alert(item: $context.alertInfo) .alert(item: $context.alertInfo)
.track(screen: .invites)
} }
// MARK: - Private // MARK: - Private
@@ -36,6 +36,7 @@ struct RoomDetailsEditScreen: View {
.navigationTitle(L10n.screenRoomDetailsEditRoomTitle) .navigationTitle(L10n.screenRoomDetailsEditRoomTitle)
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.toolbar { toolbar } .toolbar { toolbar }
.track(screen: .roomSettings)
} }
// MARK: - Private // MARK: - Private
@@ -60,6 +60,7 @@ struct RoomDetailsScreen: View {
} }
} }
} }
.track(screen: .roomDetails)
} }
// MARK: - Private // MARK: - Private
@@ -30,6 +30,7 @@ struct RoomMemberDetailsScreen: View {
.elementFormStyle() .elementFormStyle()
.alert(item: $context.ignoreUserAlert, actions: blockUserAlertActions, message: blockUserAlertMessage) .alert(item: $context.ignoreUserAlert, actions: blockUserAlertActions, message: blockUserAlertMessage)
.alert(item: $context.alertInfo) .alert(item: $context.alertInfo)
.track(screen: .user)
} }
// MARK: - Private // MARK: - Private
@@ -39,6 +39,7 @@ struct RoomMembersListScreen: View {
inviteButton inviteButton
} }
} }
.track(screen: .roomMembers)
} }
// MARK: - Private // MARK: - Private
@@ -60,6 +60,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
} }
buildTimelineViews() buildTimelineViews()
trackComposerMode()
} }
// MARK: - Public // MARK: - Public
@@ -86,9 +88,9 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
case .sendReaction(let emoji, let itemId): case .sendReaction(let emoji, let itemId):
Task { await timelineController.sendReaction(emoji, to: itemId) } Task { await timelineController.sendReaction(emoji, to: itemId) }
case .cancelReply: case .cancelReply:
state.composerMode = .default setComposerMode(.default)
case .cancelEdit: case .cancelEdit:
state.composerMode = .default setComposerMode(.default)
state.bindings.composerText = "" state.bindings.composerText = ""
case .markRoomAsRead: case .markRoomAsRead:
Task { await markRoomAsRead() } Task { await markRoomAsRead() }
@@ -279,7 +281,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
let currentComposerState = state.composerMode let currentComposerState = state.composerMode
state.bindings.composerText = "" state.bindings.composerText = ""
state.composerMode = .default setComposerMode(.default)
switch currentComposerState { switch currentComposerState {
case .reply(let itemId, _): case .reply(let itemId, _):
@@ -291,6 +293,27 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
} }
} }
private func setComposerMode(_ mode: RoomScreenComposerMode) {
guard mode != state.composerMode else { return }
state.composerMode = mode
trackComposerMode()
}
private func trackComposerMode() {
var isEdit = false
var isReply = false
switch state.composerMode {
case .edit:
isEdit = true
case .reply:
isReply = true
default:
break
}
ServiceLocator.shared.analytics.trackComposer(inThread: false, isEditing: isEdit, isReply: isReply, startsThread: nil)
}
private func displayError(_ type: RoomScreenErrorType) { private func displayError(_ type: RoomScreenErrorType) {
switch type { switch type {
case .alert(let message): case .alert(let message):
@@ -380,7 +403,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
state.bindings.composerFocused = true state.bindings.composerFocused = true
state.bindings.composerText = messageTimelineItem.body state.bindings.composerText = messageTimelineItem.body
state.composerMode = .edit(originalItemId: messageTimelineItem.id) setComposerMode(.edit(originalItemId: messageTimelineItem.id))
case .quote: case .quote:
guard let messageTimelineItem = timelineItem as? EventBasedMessageTimelineItemProtocol else { guard let messageTimelineItem = timelineItem as? EventBasedMessageTimelineItemProtocol else {
return return
@@ -404,7 +427,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
let replyDetails = TimelineItemReplyDetails.loaded(sender: eventTimelineItem.sender, contentType: buildReplyContent(for: eventTimelineItem)) let replyDetails = TimelineItemReplyDetails.loaded(sender: eventTimelineItem.sender, contentType: buildReplyContent(for: eventTimelineItem))
state.composerMode = .reply(itemID: eventTimelineItem.id, replyDetails: replyDetails) setComposerMode(.reply(itemID: eventTimelineItem.id, replyDetails: replyDetails))
case .forward(let itemID): case .forward(let itemID):
callback?(.displayMessageForwarding(itemID: itemID)) callback?(.displayMessageForwarding(itemID: itemID))
case .viewSource: case .viewSource:
@@ -420,7 +443,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
} }
if action.switchToDefaultComposer { if action.switchToDefaultComposer {
state.composerMode = .default setComposerMode(.default)
} }
} }
@@ -131,4 +131,35 @@ extension Analytics {
func trackCreatedRoom(isDM: Bool) { func trackCreatedRoom(isDM: Bool) {
capture(event: AnalyticsEvent.CreatedRoom(isDM: isDM)) capture(event: AnalyticsEvent.CreatedRoom(isDM: isDM))
} }
/// Track the composer
/// - Parameters:
/// - inThread: whether the composer is used in a Thread
/// - isEditing: whether the composer is used to edit a message
/// - isReply: whether the composer is used to reply a message
/// - startsThread: whether the composer is used to start a new thread
func trackComposer(inThread: Bool, isEditing: Bool, isReply: Bool, startsThread: Bool?) {
capture(event: AnalyticsEvent.Composer(inThread: inThread, isEditing: isEditing, isReply: isReply, startsThread: startsThread))
}
/// Track the presentation of a room
/// - Parameters:
/// - isDM: whether the room is a direct message
/// - isSpace: whether the room is a space
func trackViewRoom(isDM: Bool, isSpace: Bool) {
capture(event: AnalyticsEvent.ViewRoom(activeSpace: nil, isDM: isDM, isSpace: isSpace, trigger: nil, viaKeyboard: nil))
}
/// Track the action of joining a room
/// - Parameters:
/// - isDM: whether the room is a direct message
/// - isSpace: whether the room is a space
/// - activeMemberCount: the number of active members in the room
func trackJoinedRoom(isDM: Bool, isSpace: Bool, activeMemberCount: UInt) {
guard let roomSize = AnalyticsEvent.JoinedRoom.RoomSize(memberCount: activeMemberCount) else {
MXLog.error("invalid room size")
return
}
capture(event: AnalyticsEvent.JoinedRoom(isDM: isDM, isSpace: isSpace, roomSize: roomSize, trigger: nil))
}
} }
@@ -506,7 +506,9 @@ class RoomProxy: RoomProxyProtocol {
func acceptInvitation() async -> Result<Void, RoomProxyError> { func acceptInvitation() async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) { await Task.dispatch(on: .global()) {
do { do {
return try .success(self.room.acceptInvitation()) try self.room.acceptInvitation()
ServiceLocator.shared.analytics.trackJoinedRoom(isDM: self.room.isDirect(), isSpace: self.room.isSpace(), activeMemberCount: UInt(self.room.activeMembersCount()))
return .success(())
} catch { } catch {
return .failure(.failedAcceptingInvite) return .failure(.failedAcceptingInvite)
} }
+1
View File
@@ -0,0 +1 @@
Add analytics events.