@@ -10,12 +10,17 @@ import kotlinx.coroutines.flow.MutableSharedFlow
1010import kotlinx.coroutines.flow.MutableStateFlow
1111import kotlinx.coroutines.flow.asSharedFlow
1212import kotlinx.coroutines.flow.asStateFlow
13+ import kotlinx.coroutines.flow.combine
1314import kotlinx.coroutines.flow.update
1415import kotlinx.coroutines.launch
1516import to.bitkit.R
17+ import to.bitkit.data.CacheStore
1618import to.bitkit.data.SettingsStore
1719import to.bitkit.data.keychain.Keychain
20+ import to.bitkit.models.BackupCategory
21+ import to.bitkit.models.HealthState
1822import to.bitkit.models.Toast
23+ import to.bitkit.repositories.HealthRepo
1924import to.bitkit.ui.settings.backups.BackupContract.SideEffect
2025import to.bitkit.ui.settings.backups.BackupContract.UiState
2126import to.bitkit.ui.shared.toast.ToastEventBus
@@ -27,6 +32,8 @@ class BackupNavSheetViewModel @Inject constructor(
2732 @ApplicationContext private val context : Context ,
2833 private val settingsStore : SettingsStore ,
2934 private val keychain : Keychain ,
35+ private val healthRepo : HealthRepo ,
36+ private val cacheStore : CacheStore ,
3037) : ViewModel() {
3138
3239 private val _uiState = MutableStateFlow (UiState ())
@@ -37,6 +44,34 @@ class BackupNavSheetViewModel @Inject constructor(
3744
3845 private fun setEffect (effect : SideEffect ) = viewModelScope.launch { _effects .emit(effect) }
3946
47+ companion object {
48+ private const val TAG = " BackupNavSheetViewModel"
49+ }
50+
51+ init {
52+ collectState()
53+ }
54+
55+ private fun collectState () {
56+ viewModelScope.launch {
57+ combine(healthRepo.healthState, cacheStore.backupStatuses) { healthState, backupStatuses ->
58+ when (healthState.backups) {
59+ HealthState .ERROR -> null
60+ else -> {
61+ BackupCategory .entries
62+ .filter { it != BackupCategory .LIGHTNING_CONNECTIONS }
63+ .maxOfOrNull { category -> backupStatuses[category]?.synced ? : 0L }
64+ .takeIf { it != 0L }
65+ }
66+ }
67+ }.collect { lastBackupTimeMs ->
68+ _uiState .update {
69+ it.copy(lastBackupTimeMs = lastBackupTimeMs)
70+ }
71+ }
72+ }
73+ }
74+
4075 fun loadMnemonicData () {
4176 viewModelScope.launch {
4277 try {
@@ -50,7 +85,7 @@ class BackupNavSheetViewModel @Inject constructor(
5085 )
5186 }
5287 } catch (e: Throwable ) {
53- Logger .error(" Error loading mnemonic" , e)
88+ Logger .error(" Error loading mnemonic" , e, context = TAG )
5489 ToastEventBus .send(
5590 type = Toast .ToastType .WARNING ,
5691 title = context.getString(R .string.security__mnemonic_error),
@@ -109,11 +144,6 @@ class BackupNavSheetViewModel @Inject constructor(
109144 }
110145
111146 fun onMultipleDevicesContinue () {
112- // TODO: get from actual repository state
113- val lastBackupTimeMs = System .currentTimeMillis()
114- _uiState .update {
115- it.copy(lastBackupTimeMs = lastBackupTimeMs)
116- }
117147 setEffect(SideEffect .NavigateToMetadata )
118148 }
119149
@@ -136,7 +166,7 @@ interface BackupContract {
136166 val bip39Passphrase : String = " " ,
137167 val showMnemonic : Boolean = false ,
138168 val enteredPassphrase : String = " " ,
139- val lastBackupTimeMs : Long = System .currentTimeMillis() ,
169+ val lastBackupTimeMs : Long? = null ,
140170 )
141171
142172 sealed interface SideEffect {
0 commit comments