mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Add posthog events (#1097)
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Add analytics events.
|
||||||
Reference in New Issue
Block a user