Skip to content

Commit a05fb0d

Browse files
committed
feat(analytics): track Screen and callsite with each use of showError
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 556dc61 commit a05fb0d

5 files changed

Lines changed: 34 additions & 11 deletions

File tree

apps/flipcash/app/src/main/kotlin/com/flipcash/app/internal/ui/navigation/decorators/NavMessagingEntryDecorator.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.navigation3.runtime.NavBackStack
77
import androidx.navigation3.runtime.NavEntryDecorator
88
import androidx.navigation3.runtime.NavKey
99
import com.flipcash.app.analytics.rememberAnalytics
10+
import com.flipcash.app.core.AppRoute
1011
import com.getcode.manager.BottomBarManager
1112
import com.getcode.navigation.NavMetadataKeys
1213
import com.getcode.ui.components.bars.BarManager
@@ -40,7 +41,13 @@ fun NavMessagingEntryDecorator(
4041
when (message.type) {
4142
BottomBarManager.BottomBarMessageType.DESTRUCTIVE -> Unit
4243
BottomBarManager.BottomBarMessageType.ERROR -> {
43-
analytics.displayedErrorModal(message.title, message.subtitle)
44+
val screen = backStack.lastOrNull()?.screenName()
45+
analytics.displayedErrorModal(
46+
title = message.title,
47+
message = message.subtitle,
48+
screen = screen,
49+
callSite = message.callSite,
50+
)
4451
}
4552
BottomBarManager.BottomBarMessageType.WARNING -> Unit
4653
BottomBarManager.BottomBarMessageType.INFO -> Unit
@@ -58,3 +65,9 @@ fun rememberNavMessagingEntryDecorator(
5865
backStack: NavBackStack<NavKey>,
5966
barManager: BarManager
6067
) = remember { NavMessagingEntryDecorator(backStack, barManager) }
68+
69+
private fun NavKey.screenName(): String? {
70+
val prefix = AppRoute::class.qualifiedName ?: return null
71+
val qualifiedName = this::class.qualifiedName ?: return null
72+
return qualifiedName.removePrefix("$prefix.").takeIf { it != qualifiedName }
73+
}

apps/flipcash/shared/analytics/src/main/kotlin/com/flipcash/app/analytics/Analytics.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ interface FlipcashAnalyticsService : AnalyticsService {
3232
fun deeplinkOpened(url: String)
3333
fun deeplinkParsed(type: DeeplinkType?, url: String)
3434
fun deeplinkRouted(type: DeeplinkType, error: Throwable? = null)
35-
fun displayedErrorModal(title: String, message: String)
35+
fun displayedErrorModal(title: String, message: String, screen: String? = null, callSite: String? = null)
3636

3737
fun buttonTapped(button: Button) {
3838
action(button)
@@ -99,7 +99,7 @@ class StubFlipcashAnalytics : FlipcashAnalyticsService {
9999
override fun deeplinkOpened(url: String) = Unit
100100
override fun deeplinkParsed(type: DeeplinkType?, url: String) = Unit
101101
override fun deeplinkRouted(type: DeeplinkType, error: Throwable?) = Unit
102-
override fun displayedErrorModal(title: String, message: String) = Unit
102+
override fun displayedErrorModal(title: String, message: String, screen: String?, callSite: String?) = Unit
103103
}
104104

105105
@Composable

apps/flipcash/shared/analytics/src/main/kotlin/com/flipcash/app/analytics/Events.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,17 @@ internal sealed interface AnalyticsEvent {
3232

3333
data class ErrorModalDisplayed(
3434
val title: String,
35-
val message: String
35+
val message: String,
36+
val screen: String? = null,
37+
val callSite: String? = null,
3638
): AnalyticsEvent {
3739
override val name = "Error Modal Displayed"
38-
override fun toProperties() = mapOf(
39-
"Title" to title,
40-
"Message" to message
41-
)
40+
override fun toProperties() = buildMap {
41+
put("Title", title)
42+
put("Message", message)
43+
screen?.let { put("Screen", it) }
44+
callSite?.let { put("Call Site", it) }
45+
}
4246
}
4347

4448
sealed interface DeeplinkEvent : AnalyticsEvent {

apps/flipcash/shared/analytics/src/main/kotlin/com/flipcash/app/analytics/internal/MixpanelAnalyticsDelegate.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ internal class MixpanelAnalyticsDelegate @Inject constructor(
216216
track(AnalyticsEvent.DeeplinkEvent.Routed(type, error))
217217
}
218218

219-
override fun displayedErrorModal(title: String, message: String) {
220-
track(AnalyticsEvent.ErrorModalDisplayed(title, message))
219+
override fun displayedErrorModal(title: String, message: String, screen: String?, callSite: String?) {
220+
track(AnalyticsEvent.ErrorModalDisplayed(title, message, screen, callSite))
221221
}
222222

223223
// region Internal

libs/messaging/src/main/kotlin/com/getcode/manager/BottomBarManager.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ object BottomBarManager {
6969
val showScrim: Boolean = true,
7070
val timeoutSeconds: Int? = null,
7171
val id: Long = UUID.randomUUID().mostSignificantBits,
72+
val callSite: String? = null,
7273
) {
7374
constructor(
7475
title: String = "",
@@ -288,6 +289,10 @@ object BottomBarManager {
288289
showCancel: Boolean = false,
289290
onDismiss: (fromAction: Boolean) -> Unit = { },
290291
) {
292+
val callSite = Throwable().stackTrace
293+
.firstOrNull { it.className != BottomBarManager::class.java.name }
294+
?.let { "${it.fileName}:${it.lineNumber}" }
295+
291296
showMessage(
292297
BottomBarMessage(
293298
title = title,
@@ -298,7 +303,8 @@ object BottomBarManager {
298303
type = BottomBarMessageType.ERROR,
299304
isDismissible = true,
300305
showScrim = true,
301-
onClose = { onDismiss(it.index != -1) }
306+
onClose = { onDismiss(it.index != -1) },
307+
callSite = callSite,
302308
)
303309
)
304310
}

0 commit comments

Comments
 (0)