mirror of
https://github.com/element-hq/element-x-ios.git
synced 2025-03-10 21:39:12 +00:00
Add posthog events (#1097)
This commit is contained in:
parent
2ae8f471c6
commit
6d5652d56a
@ -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,
|
||||
|
@ -37,6 +37,7 @@ struct InvitesScreen: View {
|
||||
.background(Color.compound.bgCanvasDefault.ignoresSafeArea())
|
||||
.navigationTitle(L10n.actionInvitesList)
|
||||
.alert(item: $context.alertInfo)
|
||||
.track(screen: .invites)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
@ -36,6 +36,7 @@ struct RoomDetailsEditScreen: View {
|
||||
.navigationTitle(L10n.screenRoomDetailsEditRoomTitle)
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.toolbar { toolbar }
|
||||
.track(screen: .roomSettings)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
@ -60,6 +60,7 @@ struct RoomDetailsScreen: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
.track(screen: .roomDetails)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
@ -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
|
||||
|
@ -39,6 +39,7 @@ struct RoomMembersListScreen: View {
|
||||
inviteButton
|
||||
}
|
||||
}
|
||||
.track(screen: .roomMembers)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
@ -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
1
changelog.d/1097.feature
Normal file
@ -0,0 +1 @@
|
||||
Add analytics events.
|
Loading…
x
Reference in New Issue
Block a user