11package com.x8bit.bitwarden.ui.vault.feature.cardscanner
22
33import android.os.Parcelable
4+ import androidx.lifecycle.SavedStateHandle
45import com.bitwarden.ui.platform.base.BaseViewModel
56import com.bitwarden.ui.platform.base.DeferredBackgroundEvent
67import com.bitwarden.ui.platform.feature.cardscanner.manager.CardScanManager
78import com.bitwarden.ui.platform.feature.cardscanner.util.CardScanData
89import com.bitwarden.ui.platform.feature.cardscanner.util.CardScanResult
910import dagger.hilt.android.lifecycle.HiltViewModel
11+ import kotlinx.coroutines.flow.update
1012import kotlinx.parcelize.Parcelize
1113import javax.inject.Inject
1214
15+ private const val KEY_STATE = " state"
16+
1317/* *
1418 * Handles [CardScanAction] and launches [CardScanEvent] for the [CardScanScreen].
1519 */
1620@HiltViewModel
1721class CardScanViewModel @Inject constructor(
22+ savedStateHandle : SavedStateHandle ,
1823 private val cardScanManager : CardScanManager ,
1924) : BaseViewModel<CardScanState, CardScanEvent, CardScanAction>(
20- initialState = CardScanState ,
25+ initialState = savedStateHandle[KEY_STATE ]
26+ ? : CardScanState (hasHandledScan = false),
2127) {
22- private var hasHandledScan = false
2328
2429 override fun handleAction (action : CardScanAction ) {
2530 when (action) {
@@ -39,8 +44,8 @@ class CardScanViewModel @Inject constructor(
3944 }
4045
4146 private fun handleCardScanReceive (action : CardScanAction .CardScanReceive ) {
42- if (hasHandledScan) return
43- hasHandledScan = true
47+ if (state. hasHandledScan) return
48+ mutableStateFlow.update { it.copy( hasHandledScan = true ) }
4449 cardScanManager.emitCardScanResult(
4550 CardScanResult .Success (cardScanData = action.cardScanData),
4651 )
@@ -87,4 +92,6 @@ sealed class CardScanAction {
8792 * Represents the state of the card scan screen.
8893 */
8994@Parcelize
90- data object CardScanState : Parcelable
95+ data class CardScanState (
96+ val hasHandledScan : Boolean ,
97+ ) : Parcelable
0 commit comments