diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index b953c48..2011516 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -1,5 +1,7 @@ + import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask plugins { alias(libs.plugins.kotlinMultiplatform) @@ -8,6 +10,7 @@ plugins { alias(libs.plugins.composeCompiler) alias(libs.plugins.google.services) alias(libs.plugins.firebase.crashlytics) + alias(libs.plugins.ksp) } kotlin { @@ -35,9 +38,6 @@ kotlin { implementation(compose.preview) implementation(libs.androidx.activity.compose) - implementation(libs.koin.android) - implementation(libs.koin.androidx.compose) - implementation(libs.firebase.analytics) implementation(project.dependencies.platform(libs.firebase.bom)) implementation(libs.firebase.crashlytics.ktx) @@ -57,6 +57,7 @@ kotlin { implementation(libs.adaptive.navigation) //koin api(libs.koin.core) + api(libs.koin.annotations) implementation(libs.koin.compose) implementation(libs.koin.compose.viewmodel) } @@ -64,8 +65,23 @@ kotlin { implementation(libs.kotlin.test) } } + + sourceSets.named("commonMain").configure { + kotlin.srcDir("build/generated/ksp/metadata/commonMain/kotlin") + } +} + +ksp { + arg("KOIN_CONFIG_CHECK","true") } +project.tasks.withType(KotlinCompilationTask::class.java).configureEach { + if (name != "kspCommonMainKotlinMetadata") { + dependsOn("kspCommonMainKotlinMetadata") + } +} + + android { namespace = "org.example.project" compileSdk = libs.versions.android.compileSdk.get().toInt() @@ -95,5 +111,7 @@ android { dependencies { debugImplementation(compose.uiTooling) + add("kspCommonMainMetadata", libs.koin.ksp.compiler) + } diff --git a/composeApp/src/androidMain/kotlin/org/example/project/MyApp.kt b/composeApp/src/androidMain/kotlin/org/example/project/MyApp.kt index 6ce1c8e..de685ea 100644 --- a/composeApp/src/androidMain/kotlin/org/example/project/MyApp.kt +++ b/composeApp/src/androidMain/kotlin/org/example/project/MyApp.kt @@ -2,14 +2,10 @@ package org.example.project import android.app.Application import org.example.project.di.initKoin -import org.koin.android.ext.koin.androidContext class MyApp : Application() { override fun onCreate() { super.onCreate() - initKoin { - androidContext(this@MyApp) - } - + initKoin () } } \ No newline at end of file diff --git a/composeApp/src/androidMain/kotlin/org/example/project/di/modules.android.kt b/composeApp/src/androidMain/kotlin/org/example/project/di/modules.android.kt deleted file mode 100644 index ccae8d5..0000000 --- a/composeApp/src/androidMain/kotlin/org/example/project/di/modules.android.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.example.project.di - -import org.koin.dsl.module - -actual val platformModule = module { - -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/example/project/App.kt b/composeApp/src/commonMain/kotlin/org/example/project/App.kt index 81da5e0..bda642c 100644 --- a/composeApp/src/commonMain/kotlin/org/example/project/App.kt +++ b/composeApp/src/commonMain/kotlin/org/example/project/App.kt @@ -4,14 +4,11 @@ import androidx.compose.runtime.Composable import org.example.project.presentation.designsystem.textstyle.AppTheme import org.example.project.presentation.ui.screens.setupScreens.AccountSetupCategoryScreen import org.jetbrains.compose.ui.tooling.preview.Preview -import org.koin.compose.KoinContext @Composable @Preview fun App() { AppTheme { - KoinContext { - AccountSetupCategoryScreen() - } + AccountSetupCategoryScreen() } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/example/project/data/memory/dataSource/CategoryDataSourceImpl.kt b/composeApp/src/commonMain/kotlin/org/example/project/data/memory/dataSource/CategoryDataSourceImpl.kt index 1a803f6..e3b4fc0 100644 --- a/composeApp/src/commonMain/kotlin/org/example/project/data/memory/dataSource/CategoryDataSourceImpl.kt +++ b/composeApp/src/commonMain/kotlin/org/example/project/data/memory/dataSource/CategoryDataSourceImpl.kt @@ -4,9 +4,14 @@ import org.example.project.data.repository.dataSource.CategoryDataSource import org.example.project.data.repository.dataSource.memory.dto.CategoryEntity import org.example.project.data.repository.mapper.toCategoryEntity import org.example.project.domain.entity.Category +import org.koin.core.annotation.Provided +import org.koin.core.annotation.Single -class CategoryDataSourceImpl(val categoryList: List) : CategoryDataSource { +@Single(binds = [CategoryDataSource::class]) +class CategoryDataSourceImpl( + @Provided val categoryList: List +) : CategoryDataSource { override suspend fun getCategories(): List { return categoryList.map { it.toCategoryEntity() } } -} +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/example/project/data/repository/CategoryRepositoryImpl.kt b/composeApp/src/commonMain/kotlin/org/example/project/data/repository/CategoryRepositoryImpl.kt index 915675e..4ed14b3 100644 --- a/composeApp/src/commonMain/kotlin/org/example/project/data/repository/CategoryRepositoryImpl.kt +++ b/composeApp/src/commonMain/kotlin/org/example/project/data/repository/CategoryRepositoryImpl.kt @@ -4,8 +4,13 @@ import org.example.project.data.repository.dataSource.CategoryDataSource import org.example.project.data.repository.mapper.toCategoryDomain import org.example.project.domain.entity.Category import org.example.project.domain.repository.CategoryRepository +import org.koin.core.annotation.Provided +import org.koin.core.annotation.Single -class CategoryRepositoryImpl(val dataSource: CategoryDataSource) : CategoryRepository { +@Single(binds = [CategoryRepository::class]) +class CategoryRepositoryImpl( + @Provided val dataSource: CategoryDataSource +) : CategoryRepository { override suspend fun getCategories(): List { return dataSource.getCategories().map { it.toCategoryDomain() } } diff --git a/composeApp/src/commonMain/kotlin/org/example/project/di/CraftoModule.kt b/composeApp/src/commonMain/kotlin/org/example/project/di/CraftoModule.kt new file mode 100644 index 0000000..032127c --- /dev/null +++ b/composeApp/src/commonMain/kotlin/org/example/project/di/CraftoModule.kt @@ -0,0 +1,8 @@ +package org.example.project.di + +import org.koin.core.annotation.ComponentScan +import org.koin.core.annotation.Module + +@Module +@ComponentScan("org.example.project") +class CraftoModule \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/example/project/di/initKoin.kt b/composeApp/src/commonMain/kotlin/org/example/project/di/initKoin.kt index 655ef21..efae486 100644 --- a/composeApp/src/commonMain/kotlin/org/example/project/di/initKoin.kt +++ b/composeApp/src/commonMain/kotlin/org/example/project/di/initKoin.kt @@ -2,11 +2,11 @@ package org.example.project.di import org.koin.core.context.startKoin import org.koin.dsl.KoinAppDeclaration +import org.koin.ksp.generated.module fun initKoin(config: KoinAppDeclaration? = null) { startKoin { config?.invoke(this) - modules(sharedModules, platformModule) - + modules(CraftoModule().module) } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/example/project/di/modules.kt b/composeApp/src/commonMain/kotlin/org/example/project/di/modules.kt deleted file mode 100644 index 80bad2f..0000000 --- a/composeApp/src/commonMain/kotlin/org/example/project/di/modules.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.example.project.di - -import org.example.project.data.memory.dataSource.CategoryDataSourceImpl -import org.example.project.data.memory.dataSource.categoryList -import org.example.project.data.repository.CategoryRepositoryImpl -import org.example.project.data.repository.dataSource.CategoryDataSource -import org.example.project.domain.repository.CategoryRepository -import org.example.project.domain.usecase.GetCategoriesUseCase -import org.example.project.presentation.viewmodel.accountSetup.AccountSetupViewModel -import org.koin.compose.viewmodel.dsl.viewModelOf -import org.koin.core.module.Module -import org.koin.core.module.dsl.bind -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.module - -val sharedModules = module { - //account setup screens - category - single { categoryList } - singleOf(::CategoryRepositoryImpl) { bind() } - singleOf(::CategoryDataSourceImpl) { bind() } - singleOf(::GetCategoriesUseCase) - viewModelOf(::AccountSetupViewModel) -} - -expect val platformModule: Module \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/org/example/project/domain/usecase/GetCategoriesUseCase.kt b/composeApp/src/commonMain/kotlin/org/example/project/domain/usecase/GetCategoriesUseCase.kt index 09d8a3f..1c5536f 100644 --- a/composeApp/src/commonMain/kotlin/org/example/project/domain/usecase/GetCategoriesUseCase.kt +++ b/composeApp/src/commonMain/kotlin/org/example/project/domain/usecase/GetCategoriesUseCase.kt @@ -2,8 +2,12 @@ package org.example.project.domain.usecase import org.example.project.domain.entity.Category import org.example.project.domain.repository.CategoryRepository +import org.koin.core.annotation.Provided +import org.koin.core.annotation.Single -class GetCategoriesUseCase(val repository: CategoryRepository) { +@Single +class GetCategoriesUseCase( + @Provided val repository: CategoryRepository) { suspend operator fun invoke(): List { return repository.getCategories() } diff --git a/composeApp/src/commonMain/kotlin/org/example/project/presentation/viewmodel/accountSetup/AccountSetupViewModel.kt b/composeApp/src/commonMain/kotlin/org/example/project/presentation/viewmodel/accountSetup/AccountSetupViewModel.kt index d1bb3e8..02e120b 100644 --- a/composeApp/src/commonMain/kotlin/org/example/project/presentation/viewmodel/accountSetup/AccountSetupViewModel.kt +++ b/composeApp/src/commonMain/kotlin/org/example/project/presentation/viewmodel/accountSetup/AccountSetupViewModel.kt @@ -4,9 +4,12 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch import org.example.project.domain.usecase.GetCategoriesUseCase import org.example.project.presentation.viewmodel.base.BaseViewModel +import org.koin.android.annotation.KoinViewModel +import org.koin.core.annotation.Provided +@KoinViewModel class AccountSetupViewModel( - private val getCategoriesUseCase: GetCategoriesUseCase, + @Provided private val getCategoriesUseCase : GetCategoriesUseCase ) : BaseViewModel(AccountSetupState()), AccountSetupInterActionListener { @@ -16,7 +19,7 @@ class AccountSetupViewModel( private fun fetchCategories() { viewModelScope.launch { - val categories = getCategoriesUseCase() + val categories = getCategoriesUseCase.invoke() updateState { it.copy( categoryState = it.categoryState.copy(categories = categories) @@ -25,7 +28,6 @@ class AccountSetupViewModel( } } - override fun onCategorySelected(id: Int) { updateState { val categories = it.categoryState.categories.map { category -> @@ -39,6 +41,5 @@ class AccountSetupViewModel( categoryState = it.categoryState.copy(categories = categories) ) } - } } \ No newline at end of file diff --git a/composeApp/src/nativeMain/kotlin/org/example/project/di/modules.native.kt b/composeApp/src/nativeMain/kotlin/org/example/project/di/modules.native.kt index ccae8d5..022f889 100644 --- a/composeApp/src/nativeMain/kotlin/org/example/project/di/modules.native.kt +++ b/composeApp/src/nativeMain/kotlin/org/example/project/di/modules.native.kt @@ -1,7 +1,10 @@ package org.example.project.di -import org.koin.dsl.module +import org.example.project.Platform -actual val platformModule = module { -} \ No newline at end of file +class NativePlatform : Platform { + override val name: String = "Native" +} + +fun getPlatform(): Platform = NativePlatform() \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 24ada54..97d4998 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,10 @@ junit = "4.13.2" kotlin = "2.2.20" koin = "4.1.1" koinComposeMultiplatform = "4.1.1" +ksp = "2.2.10-2.0.2" +koin-annotations = "2.1.0" + + google-services = "4.4.3" #newer version of firebase-bom causes gradle errors @@ -40,11 +44,12 @@ firebase-bom = {group = "com.google.firebase", name = "firebase-bom", version.re firebase-analytics = {group = "com.google.firebase", name = "firebase-analytics" } firebase-crashlytics-ktx = { module = "com.google.firebase:firebase-crashlytics-ktx" } -koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } -koin-androidx-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" } +#koin koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } -koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koinComposeMultiplatform" } -koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koinComposeMultiplatform" } +koin-ksp-compiler = { module = "io.insert-koin:koin-ksp-compiler", version.ref = "koin-annotations" } +koin-annotations = { module = "io.insert-koin:koin-annotations", version.ref = "koin-annotations" } +koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" } +koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" } @@ -54,3 +59,4 @@ composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "k kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } google-services = { id = "com.google.gms.google-services", version.ref = "google-services" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebaseCrashlytics" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } \ No newline at end of file