fix(#7): localize import snackbar strings and drop class.simpleName fallback

The three snackbar strings in ImportBankStatementScreenModel were
hardcoded English while the rest of the app uses stringResource. Move
them to res/values/strings.xml. Also drop the
error::class.simpleName fallback in the failure branch — it surfaced
Kotlin class names like NotImplementedError to end users. Now falls
back to the localized 'Import failed' string.
This commit is contained in:
Achmad Setyabudi Susilo
2026-06-28 18:32:58 +07:00
parent ce01c175df
commit 5893ffc955
2 changed files with 10 additions and 5 deletions
@@ -1,9 +1,11 @@
package dev.achmad.ledgerr.ui.screens.import_bank_statement package dev.achmad.ledgerr.ui.screens.import_bank_statement
import android.content.Context
import android.net.Uri import android.net.Uri
import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.ScreenModel
import cafe.adriel.voyager.core.model.screenModelScope import cafe.adriel.voyager.core.model.screenModelScope
import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.Navigator
import dev.achmad.ledgerr.R
import dev.achmad.ledgerr.di.util.inject import dev.achmad.ledgerr.di.util.inject
import dev.achmad.ledgerr.domain.bankstatement.interactor.BankStatementImporter import dev.achmad.ledgerr.domain.bankstatement.interactor.BankStatementImporter
import dev.achmad.ledgerr.domain.bankstatement.model.PendingImportExpense import dev.achmad.ledgerr.domain.bankstatement.model.PendingImportExpense
@@ -38,6 +40,7 @@ class ImportBankStatementScreenModel(
private val importers: List<BankStatementImporter> = inject(), private val importers: List<BankStatementImporter> = inject(),
private val getCategories: GetCategories = inject(), private val getCategories: GetCategories = inject(),
private val insertExpenses: InsertExpenses = inject(), private val insertExpenses: InsertExpenses = inject(),
private val context: Context = inject(),
) : ScreenModel { ) : ScreenModel {
private val _state = MutableStateFlow<ImportState>(ImportState.BankPicker(importers)) private val _state = MutableStateFlow<ImportState>(ImportState.BankPicker(importers))
@@ -66,16 +69,15 @@ class ImportBankStatementScreenModel(
.onSuccess { rows -> .onSuccess { rows ->
if (rows.isEmpty()) { if (rows.isEmpty()) {
_state.value = ImportState.BankPicker(importers) _state.value = ImportState.BankPicker(importers)
_snackbar.tryEmit("No transactions found in PDF") _snackbar.tryEmit(context.getString(R.string.import_no_transactions))
} else { } else {
_state.value = ImportState.Confirmation(importer.bankName, rows) _state.value = ImportState.Confirmation(importer.bankName, rows)
} }
} }
.onFailure { error -> .onFailure { error ->
_state.value = ImportState.BankPicker(importers) _state.value = ImportState.BankPicker(importers)
val message = error.message val message = error.message?.takeIf { it.isNotBlank() }
?: error::class.simpleName ?: context.getString(R.string.import_failed)
?: "Import failed"
_snackbar.tryEmit(message) _snackbar.tryEmit(message)
} }
} }
@@ -113,7 +115,7 @@ class ImportBankStatementScreenModel(
val confirmation = _state.value as? ImportState.Confirmation ?: return@launch val confirmation = _state.value as? ImportState.Confirmation ?: return@launch
val selected = confirmation.rows.filter { it.isSelected } val selected = confirmation.rows.filter { it.isSelected }
if (selected.isEmpty()) { if (selected.isEmpty()) {
_snackbar.tryEmit("No items selected") _snackbar.tryEmit(context.getString(R.string.import_no_items_selected))
return@launch return@launch
} }
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
+3
View File
@@ -39,6 +39,9 @@
<string name="import_amount">Amount</string> <string name="import_amount">Amount</string>
<string name="import_date">Date (yyyy-MM-dd)</string> <string name="import_date">Date (yyyy-MM-dd)</string>
<string name="import_description">Description</string> <string name="import_description">Description</string>
<string name="import_no_transactions">No transactions found in PDF</string>
<string name="import_failed">Import failed</string>
<string name="import_no_items_selected">No items selected</string>
<!-- Settings --> <!-- Settings -->
<string name="settings_title">Settings</string> <string name="settings_title">Settings</string>