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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 71 additions and 8 deletions

View File

@ -231,7 +231,6 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
}
}
/// Updates the navigation stack so it displays the timeline for the given room
/// - Parameters:
/// - roomID: the identifier of the room that is to be presented
@ -283,6 +282,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
mediaProvider: userSession.mediaProvider)
self.timelineController = timelineController
ServiceLocator.shared.analytics.trackViewRoom(isDM: roomProxy.isDirect, isSpace: roomProxy.isSpace)
let parameters = RoomScreenCoordinatorParameters(roomProxy: roomProxy,
timelineController: timelineController,
mediaProvider: userSession.mediaProvider,

View File

@ -37,6 +37,7 @@ struct InvitesScreen: View {
.background(Color.compound.bgCanvasDefault.ignoresSafeArea())
.navigationTitle(L10n.actionInvitesList)
.alert(item: $context.alertInfo)
.track(screen: .invites)
}
// MARK: - Private

View File

@ -36,6 +36,7 @@ struct RoomDetailsEditScreen: View {
.navigationTitle(L10n.screenRoomDetailsEditRoomTitle)
.navigationBarTitleDisplayMode(.inline)
.toolbar { toolbar }
.track(screen: .roomSettings)
}
// MARK: - Private

View File

@ -60,6 +60,7 @@ struct RoomDetailsScreen: View {
}
}
}
.track(screen: .roomDetails)
}
// MARK: - Private

View File

@ -30,6 +30,7 @@ struct RoomMemberDetailsScreen: View {
.elementFormStyle()
.alert(item: $context.ignoreUserAlert, actions: blockUserAlertActions, message: blockUserAlertMessage)
.alert(item: $context.alertInfo)
.track(screen: .user)
}
// MARK: - Private

View File

@ -39,6 +39,7 @@ struct RoomMembersListScreen: View {
inviteButton
}
}
.track(screen: .roomMembers)
}
// MARK: - Private

View File

@ -60,6 +60,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
}
buildTimelineViews()
trackComposerMode()
}
// MARK: - Public
@ -86,9 +88,9 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
case .sendReaction(let emoji, let itemId):
Task { await timelineController.sendReaction(emoji, to: itemId) }
case .cancelReply:
state.composerMode = .default
setComposerMode(.default)
case .cancelEdit:
state.composerMode = .default
setComposerMode(.default)
state.bindings.composerText = ""
case .markRoomAsRead:
Task { await markRoomAsRead() }
@ -279,7 +281,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
let currentComposerState = state.composerMode
state.bindings.composerText = ""
state.composerMode = .default
setComposerMode(.default)
switch currentComposerState {
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) {
switch type {
case .alert(let message):
@ -380,7 +403,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
state.bindings.composerFocused = true
state.bindings.composerText = messageTimelineItem.body
state.composerMode = .edit(originalItemId: messageTimelineItem.id)
setComposerMode(.edit(originalItemId: messageTimelineItem.id))
case .quote:
guard let messageTimelineItem = timelineItem as? EventBasedMessageTimelineItemProtocol else {
return
@ -404,7 +427,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
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):
callback?(.displayMessageForwarding(itemID: itemID))
case .viewSource:
@ -420,7 +443,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
}
if action.switchToDefaultComposer {
state.composerMode = .default
setComposerMode(.default)
}
}

View File

@ -131,4 +131,35 @@ extension Analytics {
func trackCreatedRoom(isDM: Bool) {
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))
}
}

View File

@ -506,7 +506,9 @@ class RoomProxy: RoomProxyProtocol {
func acceptInvitation() async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
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 {
return .failure(.failedAcceptingInvite)
}

1
changelog.d/1097.feature Normal file
View File

@ -0,0 +1 @@
Add analytics events.