feat(folio): introduce Metro AppGraph in commonMain

Single shared @DependencyGraph(AppScope::class) that exposes
Repository, Navigator, and ViewModels. LedgerDatabase enters the
graph via @DependencyGraph.Factory.create(database) so the suspend
DriverFactory.create() can stay outside the DI surface.

@Binds wires SqlLedgerStore to LedgerStore; Navigator is provided
explicitly so its Route.Home start state stays in DI rather than
relying on a default-parameter being honored by the graph.
This commit is contained in:
pj committed 2026-04-26 16:00:10 +07:00
1 parent d0b1c3f07c
commit 2f1633abdf
1 file changed
+42
@@ -0,0 +1,42 @@
package app.folio.di
import app.folio.core.data.LedgerStore
import app.folio.core.data.Repository
import app.folio.core.data.SqlLedgerStore
import app.folio.db.LedgerDatabase
import app.folio.feature.account.AddAccountViewModel
import app.folio.feature.auth.LoginViewModel
import app.folio.feature.home.HomeViewModel
import app.folio.feature.ledger.AddTransactionViewModel
import app.folio.feature.ledger.LedgerViewModel
import app.folio.navigation.Navigator
import app.folio.navigation.Route
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Binds
import dev.zacsweers.metro.DependencyGraph
import dev.zacsweers.metro.Provides
import dev.zacsweers.metro.SingleIn
@SingleIn(AppScope::class)
@DependencyGraph(AppScope::class)
interface AppGraph {
val repository: Repository
val navigator: Navigator
val loginViewModel: LoginViewModel
val homeViewModel: HomeViewModel
val addAccountViewModel: AddAccountViewModel
val ledgerViewModelFactory: LedgerViewModel.Factory
val addTransactionViewModelFactory: AddTransactionViewModel.Factory
@Binds val SqlLedgerStore.bindLedgerStore: LedgerStore
@SingleIn(AppScope::class)
@Provides
fun provideNavigator(): Navigator = Navigator(initial = Route.Home)
@DependencyGraph.Factory
fun interface Factory {
fun create(@Provides database: LedgerDatabase): AppGraph
}
}