Skip to content

Commit

Permalink
feat(Matomo): Track principal screens
Browse files Browse the repository at this point in the history
  • Loading branch information
FabianDevel committed Mar 5, 2025
1 parent 7f6d265 commit ba103ae
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.navigation.navDeepLink
import androidx.navigation.toRoute
import com.infomaniak.core.sentry.SentryLog
import com.infomaniak.swisstransfer.BuildConfig
import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
import com.infomaniak.swisstransfer.ui.navigation.MainNavigation.SettingsDestination.getDeeplinkDirection
import com.infomaniak.swisstransfer.ui.screen.main.DeeplinkViewModel.Companion.SENT_DEEPLINK_SUFFIX
import com.infomaniak.swisstransfer.ui.screen.newtransfer.importfiles.components.TransferTypeUi
Expand All @@ -35,7 +36,7 @@ import kotlinx.serialization.Serializable
* Sealed class representing the navigation arguments for the main navigation flow.
*/
@Serializable
sealed class MainNavigation : NavigationDestination() {
sealed class MainNavigation(override val matomoValue: String) : NavigationDestination() {

protected inline fun <reified T : MainNavigation> NavGraphBuilder.getDeeplinkDirection(
noinline content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit),
Expand All @@ -50,7 +51,7 @@ sealed class MainNavigation : NavigationDestination() {

// If it has to be renamed, don't forget to rename `*DestinationName` in the companion object too.
@Serializable
data class SentDestination(val transferUuid: String? = null) : MainNavigation() {
data class SentDestination(val transferUuid: String? = null) : MainNavigation("SentScreen") {

companion object {
fun NavGraphBuilder.sentDestination(content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)) {
Expand All @@ -61,7 +62,7 @@ sealed class MainNavigation : NavigationDestination() {

// If it has to be renamed, don't forget to rename `*DestinationName` in the companion object too.
@Serializable
data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation() {
data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation("ReceivedScreen") {

companion object {
fun NavGraphBuilder.receivedDestination(content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)) {
Expand All @@ -71,7 +72,7 @@ sealed class MainNavigation : NavigationDestination() {
}

@Serializable
data object SettingsDestination : MainNavigation()
data object SettingsDestination : MainNavigation("SettingsScreen")

companion object {
private val TAG = MainNavigation::class.java.simpleName
Expand Down Expand Up @@ -110,48 +111,93 @@ sealed class MainNavigation : NavigationDestination() {
* Sealed class representing the navigation arguments for the new transfer flow.
*/
@Serializable
sealed class NewTransferNavigation : NavigationDestination() {
sealed class NewTransferNavigation(override val matomoValue: String) : NavigationDestination() {

@Serializable
data object ImportFilesDestination : NewTransferNavigation()
data object ImportFilesDestination : NewTransferNavigation("ImportFileScreen")

@Serializable
data class ValidateUserEmailDestination(val authorEmail: String) : NewTransferNavigation()
data class ValidateUserEmailDestination(val authorEmail: String) : NewTransferNavigation("ValidateUserEmailScreen")

@Serializable
data class UploadProgressDestination(
val transferType: TransferTypeUi,
val totalSize: Long,
val authorEmail: String?,
) : NewTransferNavigation()
) : NewTransferNavigation("UploadProgressScreen")

@Serializable
data class UploadSuccessDestination(
val transferType: TransferTypeUi,
val transferUuid: String,
val transferUrl: String,
) : NewTransferNavigation()
) : NewTransferNavigation("UploadSuccessScreen")

@Serializable
data class UploadErrorDestination(
val transferType: TransferTypeUi,
val totalSize: Long,
val authorEmail: String?,
) : NewTransferNavigation()
) : NewTransferNavigation("UploadErrorScreen")

@Serializable
data object UploadIntegrityErrorDestination : NewTransferNavigation()
data object UploadIntegrityErrorDestination : NewTransferNavigation("UploadIntegrityErrorScreen")

@Serializable
data object NewTransferFilesDetailsDestination : NewTransferNavigation()
data object NewTransferFilesDetailsDestination : NewTransferNavigation("NewTransferFilesDetailsScreen")

companion object {
val startDestination = ImportFilesDestination

private val TAG = NewTransferNavigation::class.java.simpleName

private const val importFilesDestinationName = "ImportFilesDestination"
private const val ValidateUserEmailDestinationName = "ValidateUserEmailDestination"
private const val UploadProgressDestinationName = "UploadProgressDestination"
private const val UploadSuccessDestinationName = "UploadSuccessDestination"
private const val UploadErrorDestinationName = "UploadErrorDestination"
private const val UploadIntegrityErrorDestinationName = "UploadIntegrityErrorDestination"
private const val NewTransferFilesDetailsDestinationName = "NewTransferFilesDetailsDestination"
val newTransferDestinationsNames = listOf(
importFilesDestinationName,
ValidateUserEmailDestinationName,
UploadProgressDestinationName,
UploadSuccessDestinationName,
UploadErrorDestinationName,
UploadIntegrityErrorDestinationName,
NewTransferFilesDetailsDestinationName,
)

fun NavBackStackEntry.toNewTransferDestination(): NewTransferNavigation? {
return runCatching {
val destinationRoute = destination.route ?: error("Destination route cannot be empty")
when (newTransferDestinationsNames.firstOrNull(destinationRoute::contains)) {
importFilesDestinationName -> this.toRoute<ImportFilesDestination>()
ValidateUserEmailDestinationName -> this.toRoute<ValidateUserEmailDestination>()
UploadProgressDestinationName -> this.toRoute<UploadProgressDestination>()
UploadSuccessDestinationName -> this.toRoute<UploadSuccessDestination>()
UploadErrorDestinationName -> this.toRoute<UploadErrorDestination>()
UploadIntegrityErrorDestinationName -> this.toRoute<UploadIntegrityErrorDestination>()
NewTransferFilesDetailsDestinationName -> this.toRoute<NewTransferFilesDetailsDestination>()
else -> error("Destination $destinationRoute is not handled")
}
}.getOrElse { exception ->
SentryLog.e(TAG, "toNewTransferDestination: Failure", exception)
null
}
}
}
}

/**
* Sealed class representing navigation arguments with a title resource.
*/
@Serializable
sealed class NavigationDestination
sealed class NavigationDestination {

abstract val matomoValue: String

fun trackScreen() {
MatomoSwissTransfer.trackScreen(path = "/$matomoValue", title = matomoValue)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ fun MainScreen(deeplinkTransferDirection: TransferDirection? = null) {
val hideBottomBar = rememberSaveable { mutableStateOf(false) }

val currentDestination by remember(navBackStackEntry) {
derivedStateOf { navBackStackEntry?.toMainDestination() ?: MainNavigation.startDestination }
val destination = navBackStackEntry?.toMainDestination()
destination?.trackScreen()
derivedStateOf { destination ?: MainNavigation.startDestination }
}

MainScaffold(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
import com.infomaniak.swisstransfer.ui.components.*
import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus
import com.infomaniak.swisstransfer.ui.images.illus.mascotWithMagnifyingGlass.MascotWithMagnifyingGlass
Expand Down Expand Up @@ -140,6 +141,8 @@ private fun ThreePaneScaffoldNavigator<DestinationContent>.navigateToDetails(
direction: TransferDirection,
transferUuid: String,
) {
val destinationName = "${direction.name.lowercase()}TransferDetail"
MatomoSwissTransfer.trackScreen(path = destinationName, title = destinationName)
selectItem(context, windowAdaptiveInfo, DestinationContent.RootLevel(direction, transferUuid))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.ButtonType
import com.infomaniak.swisstransfer.ui.components.SmallButton
import com.infomaniak.swisstransfer.ui.components.SwissTransferAlertDialog
import com.infomaniak.swisstransfer.ui.navigation.NewTransferNavigation
import com.infomaniak.swisstransfer.ui.navigation.NewTransferNavigation.Companion.toNewTransferDestination
import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows

Expand All @@ -41,8 +43,12 @@ fun NewTransferScreen(
) {

val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()

var displayConfirmationDialog by rememberSaveable { mutableStateOf(false) }

navBackStackEntry?.toNewTransferDestination()?.trackScreen()

NewTransferNavHost(
navController = navController,
startDestination = startDestination,
Expand Down

0 comments on commit ba103ae

Please sign in to comment.