From 2f1633abdfe397ec4695f1b0500bb3991f73c278 Mon Sep 17 00:00:00 2001 From: PJ Date: Sun, 26 Apr 2026 16:00:10 +0700 Subject: [PATCH] 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. --- .../kotlin/app/folio/di/AppGraph.kt | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 examples/folio/app/shared/src/commonMain/kotlin/app/folio/di/AppGraph.kt diff --git a/examples/folio/app/shared/src/commonMain/kotlin/app/folio/di/AppGraph.kt b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/di/AppGraph.kt new file mode 100644 index 0000000..a8a8bbf --- /dev/null +++ b/examples/folio/app/shared/src/commonMain/kotlin/app/folio/di/AppGraph.kt @@ -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 + } +}