Skip to content

Commit 88ccdf2

Browse files
committed
feat(analytics): track card scanning and addition events
Add two new analytics events to track the card management flow: - CardScanned: Tracks when users scan or input a card number - Property: scanMethod (enum: NFC, MANUAL) to distinguish input method - Tracked when valid 12-digit card number is received - CardAdded: Tracks successful card additions to user's collection - Property: cardType to identify the type of card added - Tracked after card is saved to repository Both scan methods (NFC and manual input) now explicitly specify the scan method parameter, ensuring accurate tracking and preventing future errors if new input sources are added.
1 parent 6b5275c commit 88ccdf2

3 files changed

Lines changed: 27 additions & 4 deletions

File tree

app/src/main/java/com/sloy/sevibus/feature/cards/CardViewModel.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.sloy.sevibus.domain.repository.CardsRepository
88
import com.sloy.sevibus.infrastructure.SevLogger
99
import com.sloy.sevibus.infrastructure.analytics.Analytics
1010
import com.sloy.sevibus.infrastructure.analytics.events.Clicks
11+
import com.sloy.sevibus.infrastructure.analytics.events.Events
1112
import kotlinx.coroutines.ExperimentalCoroutinesApi
1213
import kotlinx.coroutines.flow.Flow
1314
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -55,12 +56,12 @@ class CardViewModel(
5556
CardsScreenState.Error(error)
5657
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), CardsScreenState.Loading)
5758

58-
fun onNewCardNumber(serialNumber: String) {
59+
fun onNewCardNumber(serialNumber: String, scanMethod: Events.CardScanned.ScanMethod) {
5960
newCardState.value = CardsScreenNewCardState.InputForm(serialNumber)
6061
if (serialNumber.length < 12 || !serialNumber.all { it.isDigit() }) return
6162
val cardId = serialNumber.toLong()
6263

63-
64+
analytics.track(Events.CardScanned(scanMethod))
6465
newCardState.value = CardsScreenNewCardState.CheckingCard(serialNumber)
6566
viewModelScope.launch {
6667
runCatching { cardsRepository.checkCard(cardId) }
@@ -89,6 +90,7 @@ class CardViewModel(
8990
events.emit(CardsScreenEvent.ShowMessage("Ya tienes guardada esa tarjeta"))
9091
} else {
9192
cardsRepository.addUserCard(card)
93+
analytics.track(Events.CardAdded(card.type))
9294
scrollToCard.value = card.serialNumber
9395
}
9496
newCardState.value = CardsScreenNewCardState.InputForm()

app/src/main/java/com/sloy/sevibus/feature/cards/CardsScreen.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ import com.sloy.sevibus.domain.model.CardInfo
9898
import com.sloy.sevibus.infrastructure.EventCollector
9999
import com.sloy.sevibus.infrastructure.FeatureFlags
100100
import com.sloy.sevibus.infrastructure.SevLogger
101+
import com.sloy.sevibus.infrastructure.analytics.events.Events
101102
import com.sloy.sevibus.infrastructure.extensions.performHapticGestureStart
102103
import com.sloy.sevibus.infrastructure.extensions.performHapticSegmentTick
103104
import com.sloy.sevibus.infrastructure.extensions.splitPhrase
@@ -136,7 +137,10 @@ fun CardsScreen(
136137
val nfcAnimation = remember { Animatable(1f) }
137138

138139
EventCollector(nfcStateManager.events) { nfcReadEvent ->
139-
viewModel.onNewCardNumber(CardSerialNumberUtils.calculateVisibleSerialNumber(nfcReadEvent.cardId))
140+
viewModel.onNewCardNumber(
141+
CardSerialNumberUtils.calculateVisibleSerialNumber(nfcReadEvent.cardId),
142+
scanMethod = Events.CardScanned.ScanMethod.NFC
143+
)
140144
nfcAnimation.animatePulse()
141145
}
142146
EventCollector(viewModel.events) {
@@ -155,7 +159,9 @@ fun CardsScreen(
155159
state,
156160
newCardState,
157161
nfcState,
158-
viewModel::onNewCardNumber,
162+
onNewCardNumber = { serialNumber ->
163+
viewModel.onNewCardNumber(serialNumber, Events.CardScanned.ScanMethod.MANUAL)
164+
},
159165
viewModel::onDeleteCard,
160166
viewModel::onTopUpClicked,
161167
viewModel::onStartReordering,

app/src/main/java/com/sloy/sevibus/infrastructure/analytics/events/Events.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,20 @@ interface Events {
3434
"Review Dialog Failed",
3535
"reason" to reason
3636
)
37+
38+
data class CardAdded(val cardType: String) : SevEvent(
39+
"Card Added",
40+
"cardType" to cardType
41+
)
42+
43+
data class CardScanned(val scanMethod: ScanMethod) : SevEvent(
44+
"Card Scanned",
45+
"scanMethod" to scanMethod.name.lowercase()
46+
) {
47+
enum class ScanMethod {
48+
NFC,
49+
MANUAL
50+
}
51+
}
3752
}
3853

0 commit comments

Comments
 (0)