Skip to content

Commit 197c746

Browse files
committed
feat: last backup time in backup sheet
1 parent 8b62cf1 commit 197c746

File tree

2 files changed

+60
-12
lines changed

2 files changed

+60
-12
lines changed

app/src/main/java/to/bitkit/ui/settings/backups/BackupNavSheetViewModel.kt

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,17 @@ import kotlinx.coroutines.flow.MutableSharedFlow
1010
import kotlinx.coroutines.flow.MutableStateFlow
1111
import kotlinx.coroutines.flow.asSharedFlow
1212
import kotlinx.coroutines.flow.asStateFlow
13+
import kotlinx.coroutines.flow.combine
1314
import kotlinx.coroutines.flow.update
1415
import kotlinx.coroutines.launch
1516
import to.bitkit.R
17+
import to.bitkit.data.CacheStore
1618
import to.bitkit.data.SettingsStore
1719
import to.bitkit.data.keychain.Keychain
20+
import to.bitkit.models.BackupCategory
21+
import to.bitkit.models.HealthState
1822
import to.bitkit.models.Toast
23+
import to.bitkit.repositories.HealthRepo
1924
import to.bitkit.ui.settings.backups.BackupContract.SideEffect
2025
import to.bitkit.ui.settings.backups.BackupContract.UiState
2126
import 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 {

app/src/main/java/to/bitkit/ui/settings/backups/MetadataScreen.kt

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,19 @@ fun MetadataScreen(
4444

4545
@Composable
4646
private fun MetadataContent(
47-
lastBackupTimeMs: Long,
47+
lastBackupTimeMs: Long?,
4848
onDismiss: () -> Unit,
4949
onBack: () -> Unit,
5050
) {
51-
val latestBackupTime = remember(lastBackupTimeMs) { lastBackupTimeMs.toLocalizedTimestamp() }
51+
val backupTimeText = remember(lastBackupTimeMs) {
52+
runCatching { lastBackupTimeMs?.toLocalizedTimestamp() }.getOrNull()
53+
}
54+
val lastBackupText = backupTimeText
55+
?.let { stringResource(R.string.security__mnemonic_latest_backup).replace("{time}", it) }
56+
?: run {
57+
val err = stringResource(R.string.settings__status__backup__error)
58+
stringResource(R.string.security__mnemonic_latest_backup).replace("{time}", err)
59+
}
5260

5361
Column(
5462
modifier = Modifier
@@ -80,9 +88,7 @@ private fun MetadataContent(
8088
)
8189

8290
BodyS(
83-
text = stringResource(R.string.security__mnemonic_latest_backup)
84-
.replace("{time}", latestBackupTime)
85-
.withBold(),
91+
text = lastBackupText.withBold(),
8692
modifier = Modifier.testTag("backup_time_text")
8793
)
8894

@@ -110,3 +116,15 @@ private fun Preview() {
110116
)
111117
}
112118
}
119+
120+
@Preview
121+
@Composable
122+
private fun PreviewFailed() {
123+
AppThemeSurface {
124+
MetadataContent(
125+
lastBackupTimeMs = null,
126+
onDismiss = {},
127+
onBack = {},
128+
)
129+
}
130+
}

0 commit comments

Comments
 (0)