From 79d99713c3e701b7d9bb25f5eba5f83751eb525b Mon Sep 17 00:00:00 2001 From: Syer10 Date: Thu, 21 Apr 2022 19:03:03 -0400 Subject: [PATCH] Change app components structure --- .../main/kotlin/ca/gosyer/jui/android/App.kt | 4 +- .../ca/gosyer/jui/android/AppComponent.kt | 13 ++-- .../ca/gosyer/jui/android/MainActivity.kt | 4 +- .../ca/gosyer/jui/android/ReaderActivity.kt | 2 +- .../data/download/AndroidDownloadService.kt | 7 +- .../android/data/update/UpdateCheckWorker.kt | 1 - .../ca/gosyer/jui/data/DataComponent.kt | 66 ++++++++---------- .../ca/gosyer/jui/data/DataComponent.kt | 2 +- .../ca/gosyer/jui/data/DataComponent.kt | 69 +++++++++---------- .../ca/gosyer/jui/desktop/AppComponent.kt | 10 +-- .../main/kotlin/ca/gosyer/jui/desktop/main.kt | 12 ++-- .../gosyer/jui/ui/base/KamelAndroidHandler.kt | 17 +++++ .../ca/gosyer/jui/ui/base/UiComponent.kt | 45 ------------ .../ca/gosyer/jui/ui/base/UiComponent.kt | 31 +++++---- .../jui/ui/base/image/KamelConfigProvider.kt | 4 +- .../gosyer/jui/ui/base/KamelDesktopHandler.kt | 19 +++++ .../ca/gosyer/jui/ui/base/UiComponent.kt | 45 ------------ 17 files changed, 140 insertions(+), 211 deletions(-) create mode 100644 presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/KamelAndroidHandler.kt delete mode 100644 presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt create mode 100644 presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/KamelDesktopHandler.kt delete mode 100644 presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt diff --git a/android/src/main/kotlin/ca/gosyer/jui/android/App.kt b/android/src/main/kotlin/ca/gosyer/jui/android/App.kt index 8941e949..bad1c668 100644 --- a/android/src/main/kotlin/ca/gosyer/jui/android/App.kt +++ b/android/src/main/kotlin/ca/gosyer/jui/android/App.kt @@ -36,7 +36,7 @@ class App : Application(), DefaultLifecycleObserver { setupNotificationChannels() - appComponent.dataComponent.uiPreferences.themeMode() + appComponent.uiPreferences.themeMode() .getAsFlow { AppCompatDelegate.setDefaultNightMode( when (it) { @@ -48,7 +48,7 @@ class App : Application(), DefaultLifecycleObserver { } .launchIn(ProcessLifecycleOwner.get().lifecycleScope) - setupAppLanguage(appComponent.dataComponent.uiPreferences.language()) + setupAppLanguage(appComponent.uiPreferences.language()) } private fun setupNotificationChannels() { diff --git a/android/src/main/kotlin/ca/gosyer/jui/android/AppComponent.kt b/android/src/main/kotlin/ca/gosyer/jui/android/AppComponent.kt index 8b95d0f2..1f6247a8 100644 --- a/android/src/main/kotlin/ca/gosyer/jui/android/AppComponent.kt +++ b/android/src/main/kotlin/ca/gosyer/jui/android/AppComponent.kt @@ -10,27 +10,24 @@ import android.annotation.SuppressLint import android.content.Context import ca.gosyer.jui.core.di.AppScope import ca.gosyer.jui.data.DataComponent -import ca.gosyer.jui.data.create import ca.gosyer.jui.ui.base.UiComponent -import ca.gosyer.jui.ui.base.create import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides @AppScope @Component abstract class AppComponent( - context: Context, - val dataComponent: DataComponent = DataComponent.create(context), - @Component - val uiComponent: UiComponent = UiComponent.create(dataComponent) -) { + @get:AppScope + @get:Provides + val context: Context +): DataComponent, UiComponent { abstract val appMigrations: AppMigrations @get:AppScope @get:Provides protected val appMigrationsFactory: AppMigrations - get() = AppMigrations(dataComponent.migrationPreferences, uiComponent.contextWrapper) + get() = AppMigrations(migrationPreferences, contextWrapper) companion object { @SuppressLint("StaticFieldLeak") diff --git a/android/src/main/kotlin/ca/gosyer/jui/android/MainActivity.kt b/android/src/main/kotlin/ca/gosyer/jui/android/MainActivity.kt index 81940be5..f47afcef 100644 --- a/android/src/main/kotlin/ca/gosyer/jui/android/MainActivity.kt +++ b/android/src/main/kotlin/ca/gosyer/jui/android/MainActivity.kt @@ -15,13 +15,13 @@ class MainActivity : AppCompatActivity() { val appComponent = AppComponent.getInstance(applicationContext) if (savedInstanceState == null) { - appComponent.dataComponent.migrations.runMigrations() + appComponent.migrations.runMigrations() appComponent.appMigrations.runMigrations() } AndroidDownloadService.start(this, Actions.START) - val uiHooks = appComponent.uiComponent.getHooks() + val uiHooks = appComponent.getHooks() setContent { CompositionLocalProvider(*uiHooks) { AppTheme { diff --git a/android/src/main/kotlin/ca/gosyer/jui/android/ReaderActivity.kt b/android/src/main/kotlin/ca/gosyer/jui/android/ReaderActivity.kt index d4d5246f..417791be 100644 --- a/android/src/main/kotlin/ca/gosyer/jui/android/ReaderActivity.kt +++ b/android/src/main/kotlin/ca/gosyer/jui/android/ReaderActivity.kt @@ -37,7 +37,7 @@ class ReaderActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val hooks = AppComponent.getInstance(applicationContext).uiComponent.getHooks() + val hooks = AppComponent.getInstance(applicationContext).getHooks() val mangaId = intent.extras!!.getLong("manga", -1) val chapterIndex = intent.extras!!.getInt("chapter", -1) diff --git a/android/src/main/kotlin/ca/gosyer/jui/android/data/download/AndroidDownloadService.kt b/android/src/main/kotlin/ca/gosyer/jui/android/data/download/AndroidDownloadService.kt index 19164a52..ccfb1bf9 100644 --- a/android/src/main/kotlin/ca/gosyer/jui/android/data/download/AndroidDownloadService.kt +++ b/android/src/main/kotlin/ca/gosyer/jui/android/data/download/AndroidDownloadService.kt @@ -126,13 +126,12 @@ class AndroidDownloadService : Service() { stopSelf() } - val dataComponent = AppComponent.getInstance(applicationContext) - .dataComponent - val client = dataComponent.http + val appComponent = AppComponent.getInstance(applicationContext) + val client = appComponent.http var errorConnectionCount = 0 - dataComponent + appComponent .serverPreferences .serverUrl() .getAsFlow() diff --git a/android/src/main/kotlin/ca/gosyer/jui/android/data/update/UpdateCheckWorker.kt b/android/src/main/kotlin/ca/gosyer/jui/android/data/update/UpdateCheckWorker.kt index 7d50321c..6e7378c7 100644 --- a/android/src/main/kotlin/ca/gosyer/jui/android/data/update/UpdateCheckWorker.kt +++ b/android/src/main/kotlin/ca/gosyer/jui/android/data/update/UpdateCheckWorker.kt @@ -28,7 +28,6 @@ class UpdateCheckWorker(private val context: Context, workerParams: WorkerParame override suspend fun doWork(): Result { return try { val update = AppComponent.getInstance(context.applicationContext) - .dataComponent .let { if (it.updatePreferences.enabled().get()) { it.updateChecker diff --git a/data/src/androidMain/kotlin/ca/gosyer/jui/data/DataComponent.kt b/data/src/androidMain/kotlin/ca/gosyer/jui/data/DataComponent.kt index 1398d091..720ba6f5 100644 --- a/data/src/androidMain/kotlin/ca/gosyer/jui/data/DataComponent.kt +++ b/data/src/androidMain/kotlin/ca/gosyer/jui/data/DataComponent.kt @@ -6,7 +6,6 @@ package ca.gosyer.jui.data -import android.content.Context import ca.gosyer.jui.core.di.AppScope import ca.gosyer.jui.core.prefs.PreferenceStoreFactory import ca.gosyer.jui.data.catalog.CatalogPreferences @@ -23,111 +22,104 @@ import ca.gosyer.jui.data.server.ServerPreferences import ca.gosyer.jui.data.ui.UiPreferences import ca.gosyer.jui.data.update.UpdateChecker import ca.gosyer.jui.data.update.UpdatePreferences -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides -@AppScope -@Component -actual abstract class DataComponent( - @get:AppScope - @get:Provides - val context: Context -) { - protected abstract val preferenceFactory: PreferenceStoreFactory +actual interface DataComponent { + val preferenceFactory: PreferenceStoreFactory - protected abstract val httpProvider: HttpProvider + val httpProvider: HttpProvider - abstract val downloadService: DownloadService + val downloadService: DownloadService - abstract val libraryUpdateService: LibraryUpdateService + val libraryUpdateService: LibraryUpdateService - abstract val migrations: Migrations + val migrations: Migrations - abstract val updateChecker: UpdateChecker + val updateChecker: UpdateChecker - abstract val http: Http + val http: Http - abstract val serverPreferences: ServerPreferences + val serverPreferences: ServerPreferences - abstract val extensionPreferences: ExtensionPreferences + val extensionPreferences: ExtensionPreferences - abstract val catalogPreferences: CatalogPreferences + val catalogPreferences: CatalogPreferences - abstract val libraryPreferences: LibraryPreferences + val libraryPreferences: LibraryPreferences - abstract val readerPreferences: ReaderPreferences + val readerPreferences: ReaderPreferences - abstract val uiPreferences: UiPreferences + val uiPreferences: UiPreferences - abstract val migrationPreferences: MigrationPreferences + val migrationPreferences: MigrationPreferences - abstract val updatePreferences: UpdatePreferences + val updatePreferences: UpdatePreferences @get:AppScope @get:Provides - protected val serverPreferencesFactory: ServerPreferences + val serverPreferencesFactory: ServerPreferences get() = ServerPreferences(preferenceFactory.create("server")) @get:AppScope @get:Provides - protected val extensionPreferencesFactory: ExtensionPreferences + val extensionPreferencesFactory: ExtensionPreferences get() = ExtensionPreferences(preferenceFactory.create("extension")) @get:AppScope @get:Provides - protected val catalogPreferencesFactory: CatalogPreferences + val catalogPreferencesFactory: CatalogPreferences get() = CatalogPreferences(preferenceFactory.create("catalog")) @get:AppScope @get:Provides - protected val libraryPreferencesFactory: LibraryPreferences + val libraryPreferencesFactory: LibraryPreferences get() = LibraryPreferences(preferenceFactory.create("library")) @get:AppScope @get:Provides - protected val readerPreferencesFactory: ReaderPreferences + val readerPreferencesFactory: ReaderPreferences get() = ReaderPreferences(preferenceFactory.create("reader")) { name -> preferenceFactory.create("reader", name) } @get:AppScope @get:Provides - protected val uiPreferencesFactory: UiPreferences + val uiPreferencesFactory: UiPreferences get() = UiPreferences(preferenceFactory.create("ui")) @get:AppScope @get:Provides - protected val migrationPreferencesFactory: MigrationPreferences + val migrationPreferencesFactory: MigrationPreferences get() = MigrationPreferences(preferenceFactory.create("migration")) @get:AppScope @get:Provides - protected val updatePreferencesFactory: UpdatePreferences + val updatePreferencesFactory: UpdatePreferences get() = UpdatePreferences(preferenceFactory.create("update")) @get:AppScope @get:Provides - protected val httpFactory: Http + val httpFactory: Http get() = httpProvider.get(serverPreferences) @get:AppScope @get:Provides - protected val libraryUpdateServiceFactory: LibraryUpdateService + val libraryUpdateServiceFactory: LibraryUpdateService get() = LibraryUpdateService(serverPreferences, http) @get:AppScope @get:Provides - protected val downloadServiceFactory: DownloadService + val downloadServiceFactory: DownloadService get() = DownloadService(serverPreferences, http) @get:AppScope @get:Provides - protected val migrationsFactory: Migrations + val migrationsFactory: Migrations get() = Migrations(migrationPreferences, readerPreferences) @get:AppScope @get:Provides - protected val updateCheckerFactory: UpdateChecker + val updateCheckerFactory: UpdateChecker get() = UpdateChecker(updatePreferences, http) companion object diff --git a/data/src/commonMain/kotlin/ca/gosyer/jui/data/DataComponent.kt b/data/src/commonMain/kotlin/ca/gosyer/jui/data/DataComponent.kt index 6d642ad9..8b80dd22 100644 --- a/data/src/commonMain/kotlin/ca/gosyer/jui/data/DataComponent.kt +++ b/data/src/commonMain/kotlin/ca/gosyer/jui/data/DataComponent.kt @@ -6,4 +6,4 @@ package ca.gosyer.jui.data -expect abstract class DataComponent +expect interface DataComponent diff --git a/data/src/desktopMain/kotlin/ca/gosyer/jui/data/DataComponent.kt b/data/src/desktopMain/kotlin/ca/gosyer/jui/data/DataComponent.kt index d90f23b0..40bcbb99 100644 --- a/data/src/desktopMain/kotlin/ca/gosyer/jui/data/DataComponent.kt +++ b/data/src/desktopMain/kotlin/ca/gosyer/jui/data/DataComponent.kt @@ -24,121 +24,118 @@ import ca.gosyer.jui.data.server.ServerService import ca.gosyer.jui.data.ui.UiPreferences import ca.gosyer.jui.data.update.UpdateChecker import ca.gosyer.jui.data.update.UpdatePreferences -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides -@AppScope -@Component -actual abstract class DataComponent { - protected abstract val preferenceFactory: PreferenceStoreFactory +actual interface DataComponent { + val preferenceFactory: PreferenceStoreFactory - protected abstract val httpProvider: HttpProvider + val httpProvider: HttpProvider - abstract val downloadService: DownloadService + val downloadService: DownloadService - abstract val libraryUpdateService: LibraryUpdateService + val libraryUpdateService: LibraryUpdateService - abstract val migrations: Migrations + val migrations: Migrations - abstract val updateChecker: UpdateChecker + val updateChecker: UpdateChecker - abstract val serverService: ServerService + val serverService: ServerService - abstract val http: Http + val http: Http - abstract val serverHostPreferences: ServerHostPreferences + val serverHostPreferences: ServerHostPreferences - abstract val serverPreferences: ServerPreferences + val serverPreferences: ServerPreferences - abstract val extensionPreferences: ExtensionPreferences + val extensionPreferences: ExtensionPreferences - abstract val catalogPreferences: CatalogPreferences + val catalogPreferences: CatalogPreferences - abstract val libraryPreferences: LibraryPreferences + val libraryPreferences: LibraryPreferences - abstract val readerPreferences: ReaderPreferences + val readerPreferences: ReaderPreferences - abstract val uiPreferences: UiPreferences + val uiPreferences: UiPreferences - abstract val migrationPreferences: MigrationPreferences + val migrationPreferences: MigrationPreferences - abstract val updatePreferences: UpdatePreferences + val updatePreferences: UpdatePreferences @get:AppScope @get:Provides - protected val serverHostPreferencesFactory: ServerHostPreferences + val serverHostPreferencesFactory: ServerHostPreferences get() = ServerHostPreferences(preferenceFactory.create("host")) @get:AppScope @get:Provides - protected val serverPreferencesFactory: ServerPreferences + val serverPreferencesFactory: ServerPreferences get() = ServerPreferences(preferenceFactory.create("server")) @get:AppScope @get:Provides - protected val extensionPreferencesFactory: ExtensionPreferences + val extensionPreferencesFactory: ExtensionPreferences get() = ExtensionPreferences(preferenceFactory.create("extension")) @get:AppScope @get:Provides - protected val catalogPreferencesFactory: CatalogPreferences + val catalogPreferencesFactory: CatalogPreferences get() = CatalogPreferences(preferenceFactory.create("catalog")) @get:AppScope @get:Provides - protected val libraryPreferencesFactory: LibraryPreferences + val libraryPreferencesFactory: LibraryPreferences get() = LibraryPreferences(preferenceFactory.create("library")) @get:AppScope @get:Provides - protected val readerPreferencesFactory: ReaderPreferences + val readerPreferencesFactory: ReaderPreferences get() = ReaderPreferences(preferenceFactory.create("reader")) { name -> preferenceFactory.create("reader", name) } @get:AppScope @get:Provides - protected val uiPreferencesFactory: UiPreferences + val uiPreferencesFactory: UiPreferences get() = UiPreferences(preferenceFactory.create("ui")) @get:AppScope @get:Provides - protected val migrationPreferencesFactory: MigrationPreferences + val migrationPreferencesFactory: MigrationPreferences get() = MigrationPreferences(preferenceFactory.create("migration")) @get:AppScope @get:Provides - protected val updatePreferencesFactory: UpdatePreferences + val updatePreferencesFactory: UpdatePreferences get() = UpdatePreferences(preferenceFactory.create("update")) @get:AppScope @get:Provides - protected val httpFactory: Http + val httpFactory: Http get() = httpProvider.get(serverPreferences) @get:AppScope @get:Provides - protected val serverServiceFactory: ServerService + val serverServiceFactory: ServerService get() = ServerService(serverHostPreferences) @get:AppScope @get:Provides - protected val libraryUpdateServiceFactory: LibraryUpdateService + val libraryUpdateServiceFactory: LibraryUpdateService get() = LibraryUpdateService(serverPreferences, http) @get:AppScope @get:Provides - protected val downloadServiceFactory: DownloadService + val downloadServiceFactory: DownloadService get() = DownloadService(serverPreferences, http) @get:AppScope @get:Provides - protected val migrationsFactory: Migrations + val migrationsFactory: Migrations get() = Migrations(migrationPreferences, readerPreferences) @get:AppScope @get:Provides - protected val updateCheckerFactory: UpdateChecker + val updateCheckerFactory: UpdateChecker get() = UpdateChecker(updatePreferences, http) companion object diff --git a/desktop/src/main/kotlin/ca/gosyer/jui/desktop/AppComponent.kt b/desktop/src/main/kotlin/ca/gosyer/jui/desktop/AppComponent.kt index 07c45b91..9e2cd175 100644 --- a/desktop/src/main/kotlin/ca/gosyer/jui/desktop/AppComponent.kt +++ b/desktop/src/main/kotlin/ca/gosyer/jui/desktop/AppComponent.kt @@ -8,26 +8,20 @@ package ca.gosyer.jui.desktop import ca.gosyer.jui.core.di.AppScope import ca.gosyer.jui.data.DataComponent -import ca.gosyer.jui.data.create import ca.gosyer.jui.ui.base.UiComponent -import ca.gosyer.jui.ui.base.create import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides @AppScope @Component -abstract class AppComponent constructor( - val dataComponent: DataComponent = DataComponent.create(), - @Component - val uiComponent: UiComponent = UiComponent.create(dataComponent) -) { +abstract class AppComponent: DataComponent, UiComponent { abstract val appMigrations: AppMigrations @get:AppScope @get:Provides protected val appMigrationsFactory: AppMigrations - get() = AppMigrations(dataComponent.migrationPreferences, uiComponent.contextWrapper) + get() = AppMigrations(migrationPreferences, contextWrapper) companion object { private var appComponentInstance: AppComponent? = null diff --git a/desktop/src/main/kotlin/ca/gosyer/jui/desktop/main.kt b/desktop/src/main/kotlin/ca/gosyer/jui/desktop/main.kt index b42e9b0e..654a1786 100644 --- a/desktop/src/main/kotlin/ca/gosyer/jui/desktop/main.kt +++ b/desktop/src/main/kotlin/ca/gosyer/jui/desktop/main.kt @@ -68,23 +68,21 @@ suspend fun main() { } val appComponent = AppComponent.getInstance() - val dataComponent = appComponent.dataComponent - val uiComponent = appComponent.uiComponent - dataComponent.migrations.runMigrations() + appComponent.migrations.runMigrations() appComponent.appMigrations.runMigrations() - val serverService = dataComponent.serverService + val serverService = appComponent.serverService serverService.startServer() serverService.initialized .filter { it == ServerResult.STARTED || it == ServerResult.UNUSED } .onEach { - dataComponent.downloadService.init() + appComponent.downloadService.init() // dataComponent.libraryUpdateService.init() } .launchIn(GlobalScope) - val uiPreferences = dataComponent.uiPreferences - val uiHooks = uiComponent.getHooks() + val uiPreferences = appComponent.uiPreferences + val uiHooks = appComponent.getHooks() // Call setDefault before getting a resource bundle val language = uiPreferences.language().get() diff --git a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/KamelAndroidHandler.kt b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/KamelAndroidHandler.kt new file mode 100644 index 00000000..b1446543 --- /dev/null +++ b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/KamelAndroidHandler.kt @@ -0,0 +1,17 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.jui.ui.base + +import ca.gosyer.jui.uicore.vm.ContextWrapper +import io.kamel.core.config.KamelConfigBuilder +import io.kamel.image.config.resourcesFetcher +import io.kamel.image.config.resourcesIdMapper + +actual fun KamelConfigBuilder.kamelPlatformHandler(contextWrapper: ContextWrapper) { + resourcesIdMapper(contextWrapper.context) + resourcesFetcher(contextWrapper.context) +} \ No newline at end of file diff --git a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt deleted file mode 100644 index 9535fd5d..00000000 --- a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ - -package ca.gosyer.jui.ui.base - -import ca.gosyer.jui.core.di.AppScope -import ca.gosyer.jui.data.DataComponent -import ca.gosyer.jui.ui.base.image.KamelConfigProvider -import ca.gosyer.jui.ui.base.vm.ViewModelFactoryImpl -import ca.gosyer.jui.uicore.vm.ContextWrapper -import ca.gosyer.jui.uicore.vm.LocalViewModelFactory -import io.kamel.core.config.KamelConfig -import io.kamel.image.config.LocalKamelConfig -import io.kamel.image.config.resourcesFetcher -import me.tatarka.inject.annotations.Component -import me.tatarka.inject.annotations.Provides - -@AppScope -@Component -actual abstract class UiComponent( - @Component actual val dataComponent: DataComponent -) { - protected actual abstract val kamelConfigProvider: KamelConfigProvider - - actual abstract val viewModelFactory: ViewModelFactoryImpl - - actual abstract val kamelConfig: KamelConfig - - actual abstract val contextWrapper: ContextWrapper - - @get:AppScope - @get:Provides - protected actual val kamelConfigFactory: KamelConfig - get() = kamelConfigProvider.get { resourcesFetcher(dataComponent.context) } - - actual fun getHooks() = arrayOf( - LocalViewModelFactory provides viewModelFactory, - LocalKamelConfig provides kamelConfig - ) - - actual companion object -} diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt index 1314d041..04951601 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt @@ -6,26 +6,33 @@ package ca.gosyer.jui.ui.base -import androidx.compose.runtime.ProvidedValue -import ca.gosyer.jui.data.DataComponent +import ca.gosyer.jui.core.di.AppScope import ca.gosyer.jui.ui.base.image.KamelConfigProvider import ca.gosyer.jui.ui.base.vm.ViewModelFactoryImpl import ca.gosyer.jui.uicore.vm.ContextWrapper +import ca.gosyer.jui.uicore.vm.LocalViewModelFactory import io.kamel.core.config.KamelConfig +import io.kamel.core.config.KamelConfigBuilder +import io.kamel.image.config.LocalKamelConfig +import me.tatarka.inject.annotations.Provides -expect abstract class UiComponent { - protected val dataComponent: DataComponent - protected abstract val kamelConfigProvider: KamelConfigProvider +interface UiComponent { + val kamelConfigProvider: KamelConfigProvider - abstract val viewModelFactory: ViewModelFactoryImpl + val viewModelFactory: ViewModelFactoryImpl - abstract val kamelConfig: KamelConfig + val kamelConfig: KamelConfig - abstract val contextWrapper: ContextWrapper + val contextWrapper: ContextWrapper - protected val kamelConfigFactory: KamelConfig + @AppScope + @Provides + fun kamelConfigFactory(contextWrapper: ContextWrapper): KamelConfig = kamelConfigProvider.get { kamelPlatformHandler(contextWrapper) } - fun getHooks(): Array> - - companion object + fun getHooks() = arrayOf( + LocalViewModelFactory provides viewModelFactory, + LocalKamelConfig provides kamelConfig + ) } + +expect fun KamelConfigBuilder.kamelPlatformHandler(contextWrapper: ContextWrapper) \ No newline at end of file diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/image/KamelConfigProvider.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/image/KamelConfigProvider.kt index 5a1310c3..d9406891 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/image/KamelConfigProvider.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/image/KamelConfigProvider.kt @@ -49,7 +49,7 @@ class KamelConfigProvider @Inject constructor( @OptIn(DelicateCoroutinesApi::class) val serverUrl = serverPreferences.serverUrl().stateIn(GlobalScope) - fun get(resourcesFetcher: KamelConfigBuilder.() -> Unit): KamelConfig { + fun get(kamelPlatformHandler: KamelConfigBuilder.() -> Unit): KamelConfig { return KamelConfig { // Default config imageBitmapCacheSize = DefaultCacheSize @@ -61,8 +61,8 @@ class KamelConfigProvider @Inject constructor( fileFetcher() // JUI config + kamelPlatformHandler() fetcher(HttpFetcher(http)) - resourcesFetcher() mapper(MangaCoverMapper(serverUrl)) mapper(ExtensionIconMapper(serverUrl)) mapper(SourceIconMapper(serverUrl)) diff --git a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/KamelDesktopHandler.kt b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/KamelDesktopHandler.kt new file mode 100644 index 00000000..29f6424d --- /dev/null +++ b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/KamelDesktopHandler.kt @@ -0,0 +1,19 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package ca.gosyer.jui.ui.base + +import ca.gosyer.jui.uicore.vm.ContextWrapper +import io.kamel.core.config.KamelConfigBuilder +import io.kamel.image.config.imageVectorDecoder +import io.kamel.image.config.resourcesFetcher +import io.kamel.image.config.svgDecoder + +actual fun KamelConfigBuilder.kamelPlatformHandler(contextWrapper: ContextWrapper) { + resourcesFetcher() + imageVectorDecoder() + svgDecoder() +} \ No newline at end of file diff --git a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt deleted file mode 100644 index 2a6c6d07..00000000 --- a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ - -package ca.gosyer.jui.ui.base - -import ca.gosyer.jui.core.di.AppScope -import ca.gosyer.jui.data.DataComponent -import ca.gosyer.jui.ui.base.image.KamelConfigProvider -import ca.gosyer.jui.ui.base.vm.ViewModelFactoryImpl -import ca.gosyer.jui.uicore.vm.ContextWrapper -import ca.gosyer.jui.uicore.vm.LocalViewModelFactory -import io.kamel.core.config.KamelConfig -import io.kamel.image.config.LocalKamelConfig -import io.kamel.image.config.resourcesFetcher -import me.tatarka.inject.annotations.Component -import me.tatarka.inject.annotations.Provides - -@AppScope -@Component -actual abstract class UiComponent( - @Component actual val dataComponent: DataComponent -) { - protected actual abstract val kamelConfigProvider: KamelConfigProvider - - actual abstract val viewModelFactory: ViewModelFactoryImpl - - actual abstract val kamelConfig: KamelConfig - - actual abstract val contextWrapper: ContextWrapper - - @get:AppScope - @get:Provides - protected actual val kamelConfigFactory: KamelConfig - get() = kamelConfigProvider.get { resourcesFetcher() } - - actual fun getHooks() = arrayOf( - LocalViewModelFactory provides viewModelFactory, - LocalKamelConfig provides kamelConfig - ) - - actual companion object -}