From d0b1c3f07c99e3cccfa9a7284769d721f8d20dfb Mon Sep 17 00:00:00 2001 From: PJ Date: Sun, 26 Apr 2026 16:00:02 +0700 Subject: [PATCH] feat(folio): annotate ViewModels with Metro @Inject / @AssistedInject LedgerViewModel and AddTransactionViewModel use @AssistedInject for their accountId param plus a nested @AssistedFactory; the rest are plain @Inject constructor classes. --- .../app/folio/feature/account/AddAccountViewModel.kt | 2 ++ .../kotlin/app/folio/feature/auth/LoginViewModel.kt | 2 ++ .../kotlin/app/folio/feature/home/HomeViewModel.kt | 2 ++ .../folio/feature/ledger/AddTransactionViewModel.kt | 11 ++++++++++- .../app/folio/feature/ledger/LedgerViewModel.kt | 11 ++++++++++- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/account/AddAccountViewModel.kt b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/account/AddAccountViewModel.kt index 5929284..0262050 100644 --- a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/account/AddAccountViewModel.kt +++ b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/account/AddAccountViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import app.folio.core.data.Repository import app.folio.navigation.Navigator import app.folio.navigation.Route +import dev.zacsweers.metro.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -22,6 +23,7 @@ sealed interface AddAccountEvent { data object Back : AddAccountEvent } +@Inject class AddAccountViewModel( private val repository: Repository, private val navigator: Navigator, diff --git a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/auth/LoginViewModel.kt b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/auth/LoginViewModel.kt index 72b9dcd..bcfd389 100644 --- a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/auth/LoginViewModel.kt +++ b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/auth/LoginViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import app.folio.core.data.Repository import app.folio.navigation.Navigator import app.folio.navigation.Route +import dev.zacsweers.metro.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -26,6 +27,7 @@ sealed interface LoginEvent { data object Submit : LoginEvent } +@Inject class LoginViewModel( private val repository: Repository, private val navigator: Navigator, diff --git a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/home/HomeViewModel.kt b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/home/HomeViewModel.kt index 75bf68d..c41d0a8 100644 --- a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/home/HomeViewModel.kt +++ b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/home/HomeViewModel.kt @@ -7,6 +7,7 @@ import app.folio.core.data.Repository import app.folio.core.data.Transaction import app.folio.navigation.Navigator import app.folio.navigation.Route +import dev.zacsweers.metro.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine @@ -25,6 +26,7 @@ sealed interface HomeEvent { data class OpenAccount(val accountId: String) : HomeEvent } +@Inject class HomeViewModel( private val repository: Repository, private val navigator: Navigator, diff --git a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/ledger/AddTransactionViewModel.kt b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/ledger/AddTransactionViewModel.kt index 315719a..60bc0aa 100644 --- a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/ledger/AddTransactionViewModel.kt +++ b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/ledger/AddTransactionViewModel.kt @@ -8,6 +8,9 @@ import app.folio.core.data.TxnType import app.folio.navigation.Navigator import app.folio.navigation.Route import app.folio.util.parseCents +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -36,10 +39,11 @@ sealed interface AddTransactionEvent { data object BackToHome : AddTransactionEvent } +@AssistedInject class AddTransactionViewModel( private val repository: Repository, private val navigator: Navigator, - private val accountId: String, + @Assisted private val accountId: String, ) : ViewModel() { private val form = MutableStateFlow(AddTransactionUiState()) @@ -85,4 +89,9 @@ class AddTransactionViewModel( } } } + + @AssistedFactory + fun interface Factory { + fun create(accountId: String): AddTransactionViewModel + } } diff --git a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/ledger/LedgerViewModel.kt b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/ledger/LedgerViewModel.kt index 3aaa0d1..e5c9bae 100644 --- a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/ledger/LedgerViewModel.kt +++ b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/feature/ledger/LedgerViewModel.kt @@ -7,6 +7,9 @@ import app.folio.core.data.Repository import app.folio.core.data.Transaction import app.folio.navigation.Navigator import app.folio.navigation.Route +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine @@ -24,10 +27,11 @@ sealed interface LedgerEvent { data object BackToHome : LedgerEvent } +@AssistedInject class LedgerViewModel( private val repository: Repository, private val navigator: Navigator, - private val accountId: String, + @Assisted private val accountId: String, ) : ViewModel() { val state: StateFlow = combine( repository.accounts, @@ -49,4 +53,9 @@ class LedgerViewModel( LedgerEvent.BackToHome -> navigator.replace(Route.Home) } } + + @AssistedFactory + fun interface Factory { + fun create(accountId: String): LedgerViewModel + } }