diff --git a/archy-android/build.gradle.kts b/archy-android/build.gradle.kts index f392d21..708385f 100644 --- a/archy-android/build.gradle.kts +++ b/archy-android/build.gradle.kts @@ -3,8 +3,8 @@ plugins { with(catalogPlugins.plugins) { plugin(android.library) plugin(kotlin.android) - id(mersey.android.convention.id()) - id(mersey.kotlin.convention.id()) + id(mersey.android.extension.id()) + id(mersey.kotlin.extension.id()) plugin(kotlin.kapt) plugin(android.navigation.args) } @@ -25,7 +25,7 @@ android { } } -kotlinConvention { +kotlinExtension { debug = true setCompilerArgs( "-Xinline-classes", diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/SharedScopeExt.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/SharedScopeExt.kt index 735a127..32ef411 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/SharedScopeExt.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/SharedScopeExt.kt @@ -1,7 +1,7 @@ package com.merseyside.merseyLib.archy.android.di import androidx.fragment.app.Fragment -import com.merseyside.merseyLib.archy.core.di.SharedScopeHolder +import com.merseyside.merseyLib.utils.core.koin.SharedScopeHolder import org.koin.core.scope.ScopeID fun Fragment.findParentSharedScopeHolder(scopeID: ScopeID? = null): SharedScopeHolder? { diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/state/AndroidKoinStateHolder.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/state/AndroidKoinStateHolder.kt index 31cff38..5d72c9d 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/state/AndroidKoinStateHolder.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/di/state/AndroidKoinStateHolder.kt @@ -1,10 +1,10 @@ package com.merseyside.merseyLib.archy.android.di.state import android.os.Bundle -import com.merseyside.merseyLib.archy.core.di.state.KoinStateHolder -import com.merseyside.merseyLib.archy.core.di.state.toSavedState +import com.merseyside.merseyLib.utils.core.koin.state.KoinStateHolder +import com.merseyside.merseyLib.utils.core.koin.state.toBundle +import com.merseyside.merseyLib.utils.core.koin.state.toSavedState import com.merseyside.merseyLib.utils.core.state.SavedState -import com.merseyside.merseyLib.archy.core.di.state.toBundle import org.koin.android.scope.AndroidScopeComponent import org.koin.core.context.loadKoinModules import org.koin.core.qualifier.Qualifier @@ -31,13 +31,6 @@ interface AndroidKoinScopeState : AndroidScopeComponent { } } -// private fun getKoinStateScope(): Scope { -// return getKoin().getOrCreateScope( -// scopeId = linkableScope.id, -// qualifier = qualifier -// ) -// } - fun getKoinStateHolder(): KoinStateHolder = scope.get() } diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMActivity.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMActivity.kt index 3a2fda8..76fce39 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMActivity.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMActivity.kt @@ -5,13 +5,13 @@ import android.os.Bundle import androidx.annotation.CallSuper import androidx.databinding.ViewDataBinding import com.merseyside.archy.presentation.activity.BaseBindingActivity -import com.merseyside.merseyLib.archy.core.di.state.getStateKey +import com.merseyside.merseyLib.utils.core.koin.state.getStateKey import com.merseyside.merseyLib.archy.core.presentation.viewModel.BaseViewModel -import com.merseyside.merseyLib.archy.core.di.state.saveState +import com.merseyside.merseyLib.utils.core.koin.state.saveState import com.merseyside.merseyLib.kotlin.logger.Logger import com.merseyside.merseyLib.utils.core.state.StateSaver import com.merseyside.utils.reflection.ReflectionUtils -import org.koin.androidx.viewmodel.ext.android.getViewModel +import org.koin.androidx.viewmodel.ext.android.viewModelForClass import org.koin.core.context.loadKoinModules import org.koin.core.module.Module import org.koin.core.parameter.parametersOf @@ -37,10 +37,10 @@ abstract class VMActivity } protected open fun provideViewModel(bundle: Bundle?, vararg params: Any): Model { - return getViewModel( + return viewModelForClass( clazz = getViewModelClass(), parameters = { parametersOf(bundle, *params) } - ) + ).value } @CallSuper diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMEventsActivity.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMEventsActivity.kt index a22b540..0bb1604 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMEventsActivity.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/activity/VMEventsActivity.kt @@ -60,6 +60,8 @@ abstract class VMEventsActivity } } + override fun onConnectionStateChanged(state: Boolean) {} + private fun showErrorMsg(textMessage: TextMessage) { with(textMessage) { actionMsg?.let { diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/dialog/VMDialog.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/dialog/VMDialog.kt index 96acb7b..c25e017 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/dialog/VMDialog.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/dialog/VMDialog.kt @@ -9,7 +9,7 @@ import com.merseyside.merseyLib.archy.core.presentation.viewModel.BaseViewModel import com.merseyside.merseyLib.archy.core.presentation.viewModel.entity.TextMessage import com.merseyside.merseyLib.kotlin.logger.Logger import com.merseyside.utils.reflection.ReflectionUtils -import org.koin.androidx.viewmodel.ext.android.getViewModel +import org.koin.androidx.viewmodel.ext.android.viewModelForClass import org.koin.core.context.loadKoinModules import org.koin.core.module.Module import org.koin.core.parameter.parametersOf @@ -39,7 +39,7 @@ abstract class VMDialog override fun performInjection(bundle: Bundle?, vararg params: Any) { loadKoinModules(getKoinModules(bundle, *params)) - viewModel = provideViewModel(bundle, params) + viewModel = provideViewModel(bundle, *params) } open fun getKoinModules(bundle: Bundle?, vararg params: Any): List { @@ -49,10 +49,10 @@ abstract class VMDialog } protected open fun provideViewModel(bundle: Bundle?, vararg params: Any): Model { - return getViewModel( + return viewModelForClass( clazz = getViewModelClass(), parameters = { parametersOf(bundle, *params) } - ) + ).value } private fun showErrorMsg(textMessage: TextMessage) { diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMEventsFragment.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMEventsFragment.kt index 032c3eb..20630f8 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMEventsFragment.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMEventsFragment.kt @@ -60,6 +60,8 @@ abstract class VMEventsFragment : } } + override fun onConnectionStateChanged(state: Boolean) {} + private fun showErrorMsg(textMessage: TextMessage) { with(textMessage) { actionMsg?.let { diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMFragment.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMFragment.kt index 487609d..6e13562 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMFragment.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/VMFragment.kt @@ -5,13 +5,13 @@ import android.os.Bundle import android.view.View import androidx.databinding.ViewDataBinding import com.merseyside.archy.presentation.fragment.BaseBindingFragment -import com.merseyside.merseyLib.archy.core.di.state.getStateKey -import com.merseyside.merseyLib.archy.core.di.state.saveState +import com.merseyside.merseyLib.utils.core.koin.state.getStateKey +import com.merseyside.merseyLib.utils.core.koin.state.saveState import com.merseyside.merseyLib.archy.core.presentation.viewModel.BaseViewModel import com.merseyside.merseyLib.kotlin.logger.Logger import com.merseyside.merseyLib.utils.core.state.StateSaver import com.merseyside.utils.reflection.ReflectionUtils -import org.koin.androidx.viewmodel.ext.android.getViewModel +import org.koin.androidx.viewmodel.ext.android.viewModelForClass import org.koin.core.context.loadKoinModules import org.koin.core.module.Module import org.koin.core.parameter.parametersOf @@ -46,10 +46,10 @@ abstract class VMFragment } protected open fun provideViewModel(bundle: Bundle?, vararg params: Any): Model { - return getViewModel( + return viewModelForClass( clazz = getViewModelClass(), parameters = { parametersOf(*params, bundle) } - ) + ).value } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationScrollListener.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationScrollListener.kt new file mode 100644 index 0000000..adace59 --- /dev/null +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/recycler/PaginationScrollListener.kt @@ -0,0 +1,29 @@ +package com.merseyside.merseyLib.archy.android.presentation.recycler + +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.merseyside.merseyLib.kotlin.utils.safeLet + +abstract class PaginationScrollListener( + private val loadItemsCountOffset: Int = 5 +) : RecyclerView.OnChildAttachStateChangeListener { + + abstract val recyclerView: RecyclerView + abstract val onLoadNextPage: () -> Unit + + override fun onChildViewAttachedToWindow(view: View) { + if (needToLoadNextPage(view)) onLoadNextPage() + } + + override fun onChildViewDetachedFromWindow(view: View) {} + + private fun needToLoadNextPage(view: View): Boolean { + with(recyclerView) { + val lastPosition = getChildAdapterPosition(view) + val itemCount = adapter?.itemCount + return safeLet(itemCount) { + (it - lastPosition) <= loadItemsCountOffset + } ?: false + } + } +} \ No newline at end of file diff --git a/archy-core/build.gradle.kts b/archy-core/build.gradle.kts index 11a8970..c9bee42 100644 --- a/archy-core/build.gradle.kts +++ b/archy-core/build.gradle.kts @@ -3,8 +3,8 @@ plugins { with(catalogPlugins.plugins) { plugin(android.library) plugin(kotlin.multiplatform) - id(mersey.android.convention.id()) - id(mersey.kotlin.convention.id()) + id(mersey.android.extension.id()) + id(mersey.kotlin.extension.id()) plugin(kotlin.serialization) plugin(kotlin.kapt) plugin(moko.multiplatform) @@ -39,7 +39,7 @@ kotlin { } } -kotlinConvention { +kotlinExtension { debug = true setCompilerArgs( "-Xinline-classes", diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/KoinModuleLoader.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/KoinModuleLoader.kt deleted file mode 100644 index 7f7a68a..0000000 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/KoinModuleLoader.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.merseyside.merseyLib.archy.core.di - -import org.koin.core.context.loadKoinModules -import org.koin.core.context.unloadKoinModules -import org.koin.core.module.Module -import org.koin.dsl.ModuleDeclaration -import org.koin.dsl.module - -abstract class KoinModuleLoader(val createdAtStart: Boolean = false) { - - abstract val moduleDefinition: Module.() -> Unit - - private val module = module(createdAtStart, moduleDefinition) - - fun load() { - loadKoinModules(module) - } - - fun unload() { - unloadKoinModules(module) - } -} \ No newline at end of file diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/KoinStateViewModelOf.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/KoinStateViewModelOf.kt deleted file mode 100644 index 9550cd3..0000000 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/KoinStateViewModelOf.kt +++ /dev/null @@ -1,124 +0,0 @@ -//@file:OptIn(KoinInternalApi::class) -// -//package com.merseyside.merseyLib.archy.core.presentation.di -// -//import com.merseyside.merseyLib.archy.core.presentation.model.StateViewModel -//import org.koin.core.annotation.KoinInternalApi -//import org.koin.core.definition.BeanDefinition -//import org.koin.core.module.KoinDefinition -//import org.koin.core.module._scopedInstanceFactory -//import org.koin.core.module.dsl.new -//import org.koin.core.module.dsl.stateViewModelOf -//import org.koin.core.module.dsl.setupInstance -//import org.koin.dsl.ScopeDSL -// -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: () -> R, -// options: BeanDefinition.() -> Unit -//): KoinDefinition = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options) -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: () -> R, -//): KoinDefinition = scoped { new(constructor) } -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1) -> R, -// options: BeanDefinition.() -> Unit -//): KoinDefinition = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options) -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1) -> R, -//): KoinDefinition = scoped { new(constructor) } -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2) -> R, -// options: BeanDefinition.() -> Unit -//): KoinDefinition = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options) -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2) -> R, -//): KoinDefinition = scoped { new(constructor) } -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3) -> R, -// options: BeanDefinition.() -> Unit -//): KoinDefinition = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options) -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3) -> R, -//): KoinDefinition = scoped { new(constructor) } -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3, T4) -> R, -// options: BeanDefinition.() -> Unit -//): KoinDefinition = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options) -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3, T4) -> R, -//): KoinDefinition = scoped { new(constructor) } -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3, T4, T5) -> R, -// options: BeanDefinition.() -> Unit -//): KoinDefinition = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options) -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3, T4, T5) -> R, -//): KoinDefinition = scoped { new(constructor) } -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, -// options: BeanDefinition.() -> Unit -//): KoinDefinition = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options) -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, -//): KoinDefinition = scoped { new(constructor) } -// -///** -// * @see stateViewModelOf -// */ -//inline fun ScopeDSL.stateViewModelOf( -// crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, -// options: BeanDefinition.() -> Unit -//): KoinDefinition = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options) -// diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinSavedStateModuleExt.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinSavedStateModuleExt.kt deleted file mode 100644 index 1f67e3b..0000000 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinSavedStateModuleExt.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.merseyside.merseyLib.archy.core.di.ext - - diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/moduleLoader/CoroutineScopeKoinModuleLoader.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/moduleLoader/CoroutineScopeKoinModuleLoader.kt deleted file mode 100644 index 36cfbc3..0000000 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/moduleLoader/CoroutineScopeKoinModuleLoader.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.merseyside.merseyLib.archy.core.di.moduleLoader - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.cancel -import org.koin.core.qualifier.Qualifier -import org.koin.dsl.ModuleDeclaration - -class CoroutineScopeKoinModuleLoader internal constructor( - createdAtStart: Boolean = false, - private val scopeQualifier: Qualifier? = null, - private val coroutineScope: () -> CoroutineScope, - moduleDeclaration: ModuleDeclaration -) : KoinModuleLoader(createdAtStart, moduleDeclaration) { - - private var currentScope: CoroutineScope? = null - - init { - declarations.add { - single(scopeQualifier) { coroutineScope().also { - currentScope = it - }} - } - } - - override fun unload() { - currentScope?.run { - cancel("Scope canceled because module unloaded") - currentScope = null - } - super.unload() - } -} - -fun coroutineScopeModuleLoader( - createdAtStart: Boolean = false, - scopeQualifier: Qualifier? = null, - coroutineScope: () -> CoroutineScope, - moduleDeclaration: ModuleDeclaration -): CoroutineScopeKoinModuleLoader { - return CoroutineScopeKoinModuleLoader( - createdAtStart, - scopeQualifier, - coroutineScope, - moduleDeclaration - ) -} \ No newline at end of file diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/viewModel/BaseViewModel.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/viewModel/BaseViewModel.kt index f1cb79c..c572b4d 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/viewModel/BaseViewModel.kt +++ b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/viewModel/BaseViewModel.kt @@ -7,9 +7,6 @@ import kotlinx.coroutines.flow.* abstract class BaseViewModel protected constructor() : ViewModel() { -// internal val scope: CoroutineScope -// get() { return viewModelScope } - private val mutProgress = MutableStateFlow(false) val isInProgress = mutProgress.asStateFlow() diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/viewModel/EventsViewModel.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/viewModel/EventsViewModel.kt index df559a2..8b0499c 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/viewModel/EventsViewModel.kt +++ b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/viewModel/EventsViewModel.kt @@ -4,9 +4,7 @@ import com.merseyside.merseyLib.archy.core.presentation.viewModel.entity.Alert import com.merseyside.merseyLib.archy.core.presentation.viewModel.entity.TextMessage import com.merseyside.merseyLib.archy.core.presentation.viewModel.entity.TextValue import com.merseyside.merseyLib.kotlin.logger.Logger -import com.merseyside.merseyLib.utils.core.ext.getStringNull import dev.icerock.moko.mvvm.dispatcher.EventsDispatcher -import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.desc.StringDesc abstract class EventsViewModel : BaseViewModel() { @@ -162,9 +160,14 @@ abstract class EventsViewModel : BaseViewModel() { eventsDispatcher.dispatchEvent { onAlert(alert) } } + protected open fun dispatchConnectionStateEvent(state: Boolean) { + eventsDispatcher.dispatchEvent { onConnectionStateChanged(state) } + } + interface BaseEventsListener { fun onError(throwable: Throwable): Boolean fun onMessage(message: TextMessage) fun onAlert(alert: Alert) + fun onConnectionStateChanged(state: Boolean) } } \ No newline at end of file diff --git a/archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinExt.kt b/archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/koin/ext/KoinExt.kt similarity index 94% rename from archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinExt.kt rename to archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/koin/ext/KoinExt.kt index a8a7011..1ad3b49 100644 --- a/archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinExt.kt +++ b/archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/koin/ext/KoinExt.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di.ext +package com.merseyside.merseyLib.archy.core.koin.ext import kotlinx.cinterop.ObjCClass import kotlinx.cinterop.getOriginalKotlinClass diff --git a/build.gradle.kts b/build.gradle.kts index c3a885d..071dc63 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,19 +1,34 @@ -buildscript { - repositories { - gradlePluginPortal() - } -} - plugins { `nexus-config` } allprojects { group = "io.github.merseyside" - version = "1.5.2" + version = "1.5.3" +} + +buildscript { // disable pod install tasks until find a solution + repositories { + gradlePluginPortal() + } + + if (!isBuildIos()) { + with(project.gradle.startParameter.excludedTaskNames) { + add("podImport") + add("podInstall") + add("podGenIOS") +// add("podSetupBuildReachabilityIphoneos") +// add("podSetupBuildReachabilityIphonesimulator") +// add("podBuildReachabilityIphoneos") +// add("podBuildReachabilityIphonesimulator") +// add("cinteropReachabilityIosX64") +// add("cinteropReachabilityIosSimulatorArm64") +// add("cinteropReachabilityIosArm64") + } + } } tasks.register("clean", Delete::class).configure { group = "build" delete(rootProject.buildDir) -} +} \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 357835a..1635a18 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,6 +1,4 @@ plugins { - kotlin("jvm") version "1.7.0" - kotlin("plugin.serialization") version "1.7.0" `kotlin-dsl` } @@ -19,7 +17,7 @@ dependencies { implementation(kotlin.gradle) implementation(kotlin.serialization) implementation(moko.resourcesGenerator) - implementation(sqlDelight) + implementation(sqldelight) implementation(nexusPublish) implementation(android.navigation.safeArgs) } diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index 95549fa..a8ebd08 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -16,7 +16,7 @@ dependencyResolutionManagement { gradlePluginPortal() } - val catalogVersions = "1.5.7" + val catalogVersions = "1.6.4" val group = "io.github.merseyside" versionCatalogs { diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 90b03c4..2e7e860 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,7 +1,7 @@ object Application { const val applicationId = "com.merseyside.sample" - const val compileSdk = 32 - const val targetSdk = 32 + const val compileSdk = 33 + const val targetSdk = 33 const val minSdk = 21 } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ffe5069..88e56a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,16 +2,19 @@ org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 kotlin.code.style=official -kotlin.mpp.stability.nowarn=true kotlin.native.ignoreDisabledTargets=true -kotlin.mpp.enableCInteropCommonization=true kotlin.native.binary.memoryModel=experimental kotlin.native.cacheKind=none +kotlin.mpp.stability.nowarn=true +kotlin.mpp.enableCInteropCommonization=true +kotlin.mpp.androidSourceSetLayoutVersion=2 + android.useAndroidX=true android.enableJetifier=false android.disableAutomaticComponentCreation=true build.localAndroidDependencies=false build.localKotlinExtLibrary=false +build.buildIos=false diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4e5996f..867eb9c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Thu Feb 04 15:25:14 NOVT 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/sample/androidApp/build.gradle.kts b/sample/androidApp/build.gradle.kts index e728c6f..65d8973 100644 --- a/sample/androidApp/build.gradle.kts +++ b/sample/androidApp/build.gradle.kts @@ -3,13 +3,14 @@ plugins { with(catalogPlugins.plugins) { plugin(android.application) plugin(kotlin.android) - id(mersey.android.convention.id()) - id(mersey.kotlin.convention.id()) + id(mersey.android.extension.id()) + id(mersey.kotlin.extension.id()) plugin(kotlin.kapt) } } android { + namespace = "com.merseyside.sample" compileSdk = Application.compileSdk defaultConfig { @@ -43,7 +44,7 @@ android { } } -kotlinConvention { +kotlinExtension { debug = true setCompilerArgs( "-Xinline-classes", diff --git a/sample/androidApp/src/main/AndroidManifest.xml b/sample/androidApp/src/main/AndroidManifest.xml index 3c35280..845d390 100644 --- a/sample/androidApp/src/main/AndroidManifest.xml +++ b/sample/androidApp/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ - + + + + android:theme="@style/Theme.Sample" + android:windowSoftInputMode="adjustResize"> diff --git a/sample/mpp-library/build.gradle.kts b/sample/mpp-library/build.gradle.kts index 04277b9..50cacfa 100644 --- a/sample/mpp-library/build.gradle.kts +++ b/sample/mpp-library/build.gradle.kts @@ -4,13 +4,14 @@ plugins { plugin(android.library) plugin(kotlin.multiplatform) plugin(moko.multiplatform) - id(mersey.kotlin.convention.id()) - id(mersey.android.convention.id()) + id(mersey.kotlin.extension.id()) + id(mersey.android.extension.id()) id(cocoapods.id()) } } android { + namespace = "com.merseyside.sample.mppLibrary" compileSdk = Application.compileSdk defaultConfig { @@ -24,7 +25,7 @@ val merseyModules = listOf( Modules.MultiPlatform.MerseyLibs.utils ) -kotlinConvention { +kotlinExtension { debug = true } diff --git a/sample/mpp-library/src/androidMain/AndroidManifest.xml b/sample/mpp-library/src/androidMain/AndroidManifest.xml index 8a83053..568741e 100644 --- a/sample/mpp-library/src/androidMain/AndroidManifest.xml +++ b/sample/mpp-library/src/androidMain/AndroidManifest.xml @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/sample/mpp-library/src/androidMain/kotlin/com/merseyside/sample/notifications/Converters.kt b/sample/mpp-library/src/androidMain/kotlin/com/merseyside/sample/notifications/Converters.kt index 93476fd..fb3560b 100644 --- a/sample/mpp-library/src/androidMain/kotlin/com/merseyside/sample/notifications/Converters.kt +++ b/sample/mpp-library/src/androidMain/kotlin/com/merseyside/sample/notifications/Converters.kt @@ -13,8 +13,8 @@ actual class MessageEntityConverter { ): NotificationDefinition { return { with(data) { - setContentTitle(sender) - setContentText(message) + //setContentTitle(sender) + //setContentText(message) } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 4fdd5a3..cf890db 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,7 +11,7 @@ dependencyResolutionManagement { google() } - val catalogVersions = "1.5.7" + val catalogVersions = "1.6.4" val group = "io.github.merseyside" versionCatalogs { val multiplatformLibs by creating { diff --git a/utils-core/.gitignore b/utils-core/.gitignore index 796b96d..7ec9198 100644 --- a/utils-core/.gitignore +++ b/utils-core/.gitignore @@ -1 +1,3 @@ /build + +*.podspec \ No newline at end of file diff --git a/utils-core/build.gradle.kts b/utils-core/build.gradle.kts index 763a647..516045c 100644 --- a/utils-core/build.gradle.kts +++ b/utils-core/build.gradle.kts @@ -4,11 +4,11 @@ plugins { plugin(android.library) plugin(kotlin.multiplatform) plugin(moko.multiplatform) - id(mersey.android.convention.id()) - id(mersey.kotlin.convention.id()) + id(mersey.android.extension.id()) + id(mersey.kotlin.extension.id()) plugin(kotlin.serialization) plugin(kotlin.kapt) - id(cocoapods.id()) + //id(cocoapods.id()) } `maven-publish-config` } @@ -38,23 +38,23 @@ kotlin { iosSimulatorArm64Main.dependsOn(iosMain) } - cocoapods { - - framework { - summary = "A Kotlin multiplatform mobile library with useful utils" - homepage = "https://github.com/Merseyside/mersey-kmp-library/tree/master/utils-core" - - version = multiplatformLibs.versions.mersey.kmm.get() - } - - // https://github.com/tonymillion/Reachability - pod("Reachability") { - version = "3.2" - } - } +// cocoapods { +// +// framework { +// summary = "A Kotlin multiplatform mobile library with useful utils" +// homepage = "https://github.com/Merseyside/mersey-kmp-library/tree/master/utils-core" +// +// version = multiplatformLibs.versions.mersey.kmm.get() +// } +// +// // https://github.com/tonymillion/Reachability +// pod("Reachability") { +// version = "3.2" +// } +// } } -kotlinConvention { +kotlinExtension { debug = true setCompilerArgs( "-Xinline-classes", @@ -74,7 +74,8 @@ val mppLibs = listOf( val android = listOf( androidLibs.sqldelight, - androidLibs.lifecycleLiveDataKtx + androidLibs.lifecycleLiveDataKtx, + androidLibs.koin ) val merseyLibs = listOf( diff --git a/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/ActivitySharedScopeExt.kt b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/ActivitySharedScopeExt.kt new file mode 100644 index 0000000..9959bcf --- /dev/null +++ b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/ActivitySharedScopeExt.kt @@ -0,0 +1,29 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.ext + +import androidx.activity.ComponentActivity +import org.koin.android.ext.android.getKoin +import org.koin.core.qualifier.Qualifier +import org.koin.core.scope.ScopeID + +fun ComponentActivity.sharedScope( + scopeID: Lazy, + qualifier: Lazy +): LifecycleSharedScopeDelegate { + return LifecycleSharedScopeDelegate( + koin = getKoin(), + lifecycleOwner = this, + provideScope = { koin -> + koin.getScopeOrNull(scopeID.value) + }, + createScope = { koin -> + koin.createScope(scopeID.value, qualifier.value, this) + } + ) +} + +fun ComponentActivity.sharedScope( + scopeID: ScopeID, + qualifier: Qualifier +): LifecycleSharedScopeDelegate { + return sharedScope(lazy {scopeID}, lazy {qualifier}) +} \ No newline at end of file diff --git a/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/FragmentSharedScopeExt.kt b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/FragmentSharedScopeExt.kt new file mode 100644 index 0000000..372b72f --- /dev/null +++ b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/FragmentSharedScopeExt.kt @@ -0,0 +1,29 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.ext + +import androidx.fragment.app.Fragment +import org.koin.android.ext.android.getKoin +import org.koin.core.qualifier.Qualifier +import org.koin.core.scope.ScopeID + +fun Fragment.sharedScope( + scopeID: ScopeID, + qualifier: Qualifier +): LifecycleSharedScopeDelegate { + return sharedScope(lazy { scopeID }, lazy { qualifier }) +} + +fun Fragment.sharedScope( + scopeID: Lazy, + qualifier: Lazy +): LifecycleSharedScopeDelegate { + return LifecycleSharedScopeDelegate( + koin = getKoin(), + lifecycleOwner = this, + provideScope = { koin -> + koin.getScopeOrNull(scopeID.value) + }, + createScope = { koin -> + koin.createScope(scopeID.value, qualifier.value, this) + } + ) +} \ No newline at end of file diff --git a/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/LifecycleOwnerExt.kt b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/LifecycleOwnerExt.kt new file mode 100644 index 0000000..e0086f7 --- /dev/null +++ b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/LifecycleOwnerExt.kt @@ -0,0 +1,17 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.ext + +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import org.koin.core.scope.Scope + +internal fun LifecycleOwner.addLifecycleObserver(scope: Scope): Scope { + + lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + scope.close() + } + }) + + return scope +} \ No newline at end of file diff --git a/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/LifecycleSharedScopeDelegate.kt b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/LifecycleSharedScopeDelegate.kt new file mode 100644 index 0000000..a430ffa --- /dev/null +++ b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ext/LifecycleSharedScopeDelegate.kt @@ -0,0 +1,44 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.ext + +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import org.koin.core.Koin +import org.koin.core.scope.Scope +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty + +class LifecycleSharedScopeDelegate( + val koin: Koin, + val lifecycleOwner: LifecycleOwner, + private val provideScope: (Koin) -> Scope?, + private val createScope: (Koin) -> Scope +) : ReadOnlyProperty { + + private var _scope: Scope? = null + + private fun createScope(): Scope { + koin.logger.debug("Create scope: $_scope for $lifecycleOwner") + return this.createScope.invoke(koin).also { scope -> + lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver { + + override fun onDestroy(owner: LifecycleOwner) { + koin.logger.debug("Closing scope: $_scope for $lifecycleOwner") + if (!scope.closed) { + scope.close() + } + _scope = null + } + }) + } + } + + override fun getValue(thisRef: LifecycleOwner, property: KProperty<*>): Scope { + return if (_scope == null) { + val _scope = provideScope(koin) ?: createScope() + return _scope + } + else { + _scope ?: error("can't get Scope for $lifecycleOwner") + } + } +} \ No newline at end of file diff --git a/archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/BundleExt.kt b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/BundleExt.kt similarity index 90% rename from archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/BundleExt.kt rename to utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/BundleExt.kt index a29bfe5..2e24b0e 100644 --- a/archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/BundleExt.kt +++ b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/BundleExt.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di.state +package com.merseyside.merseyLib.utils.core.koin.state import android.os.Bundle import com.merseyside.merseyLib.utils.core.state.SavedState diff --git a/archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt similarity index 85% rename from archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt rename to utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt index 2aad653..22cb478 100644 --- a/archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt +++ b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di.state +package com.merseyside.merseyLib.utils.core.koin.state import android.os.Bundle import com.merseyside.merseyLib.utils.core.state.SavedState diff --git a/archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/SavedStateExt.kt b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/SavedStateExt.kt similarity index 92% rename from archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/SavedStateExt.kt rename to utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/SavedStateExt.kt index 58e6b27..409edf6 100644 --- a/archy-core/src/androidMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/SavedStateExt.kt +++ b/utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/SavedStateExt.kt @@ -1,5 +1,5 @@ @file:JvmName("StateExtAndroid") -package com.merseyside.merseyLib.archy.core.di.state +package com.merseyside.merseyLib.utils.core.koin.state import android.os.Bundle import com.merseyside.merseyLib.utils.core.state.SavedState diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/coroutines/CountDownTimer.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/coroutines/CountDownTimer.kt deleted file mode 100644 index 6e65810..0000000 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/coroutines/CountDownTimer.kt +++ /dev/null @@ -1,142 +0,0 @@ -package com.merseyside.merseyLib.utils.core.coroutines - -/* -* https://github.com/Kotlin/kotlinx.coroutines/issues/2171 - */ - -import com.merseyside.merseyLib.kotlin.logger.Logger -import com.merseyside.merseyLib.time.units.Seconds -import com.merseyside.merseyLib.time.units.TimeUnit -import com.merseyside.merseyLib.time.units.minus -import com.merseyside.merseyLib.utils.core.ext.delay -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.* -import kotlinx.coroutines.withContext - -class CountDownTimer( - private val listener: CoroutineTimerListener, - private val delay: TimeUnit = Seconds(1), - private val scope: CoroutineScope = CoroutineScope(Job() + Dispatchers.Unconfined) -) { - - private var timerJob: Job? = null - private var countDownTimer: TimeUnit = TimeUnit.getEmpty() - - var state: CurrentTimerState = CurrentTimerState.STOPPED - private set(value) { - if (field == CurrentTimerState.DESTROYED) { - return - } - field = value - } - - fun startTimer(countDownTimer: TimeUnit) { - this.countDownTimer = countDownTimer - when (state) { - CurrentTimerState.RUNNING -> { - listener.onTick(countDownTimer, TimerException(TimerErrorTypes.ALREADY_RUNNING)) - } - CurrentTimerState.PAUSED -> { - listener.onTick(countDownTimer, TimerException(TimerErrorTypes.CURRENTLY_PAUSED)) - } - CurrentTimerState.DESTROYED -> { - listener.onTick(countDownTimer, TimerException(TimerErrorTypes.DESTROYED)) - } - else -> { - timerCanStart() - } - } - } - - fun stopTimer() { - val error = if (state == CurrentTimerState.STOPPED) { - TimerException(TimerErrorTypes.NO_TIMER_RUNNING) - } else { - null - } - timerJob?.cancel() - state = CurrentTimerState.STOPPED - listener.onStop(error) - } - - fun pauseTimer() { - if (state == CurrentTimerState.PAUSED) { - Logger.logErr(TAG, "Already paused, check your code for multiple callers") - } - state = CurrentTimerState.PAUSED - } - - fun continueTimer() { - if (state == CurrentTimerState.RUNNING) { - Logger.logErr(TAG, "Already running, check your code for multiple callers") - } - state = CurrentTimerState.RUNNING - listener.onContinue() - } - - fun destroyTimer() { - scope.cancel("Timer was now destroyed. Need a new instance to work") - listener.onDestroy() - state = CurrentTimerState.DESTROYED - } - - private fun timerCanStart() { - timerJob = scope.launch { - - state = CurrentTimerState.RUNNING - - onTick(countDownTimer) - delay(delay) - - timerLoop@ while (isActive) { - countDownTimer -= delay - - if (countDownTimer <= TimeUnit.getEmpty()) { - state = CurrentTimerState.STOPPED - - onTick(TimeUnit.getEmpty()) - timerJob?.cancel() - listener.onStop() - } else { - onTick(countDownTimer) - - if (countDownTimer < delay) { - delay(countDownTimer) - } else { - delay(delay) - } - } - } - } - } - - private suspend fun onTick(timeLeft: TimeUnit, error: Exception? = null) = - withContext(Dispatchers.Main) { - listener.onTick(timeLeft, error) - } - - companion object { - const val TAG = "CoroutineTimer" - } -} - -interface CoroutineTimerListener { - fun onTick(timeLeft: TimeUnit, error: Exception? = null) - fun onStop(error: Exception? = null) {} - fun onContinue() {} - fun onPause(remainingTime: TimeUnit) {} - fun onDestroy() {} -} - -enum class CurrentTimerState { - RUNNING, PAUSED, STOPPED, DESTROYED -} - -enum class TimerErrorTypes(val message: String) { - ALREADY_RUNNING("This instance of the timer is already running, create a new instance or stop your current one"), - CURRENTLY_PAUSED("This timer is currently paused. Choose to continue or stop to start over"), - NO_TIMER_RUNNING("You are trying to stop or pause a timer that isn't running"), - DESTROYED("This timer is destroyed and can't be used anymore") -} - -private class TimerException(val type: TimerErrorTypes) : Exception(type.message) \ No newline at end of file diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/SharedScopeHolder.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/SharedScopeHolder.kt similarity index 75% rename from archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/SharedScopeHolder.kt rename to utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/SharedScopeHolder.kt index cdf3b79..77726aa 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/SharedScopeHolder.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/SharedScopeHolder.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di +package com.merseyside.merseyLib.utils.core.koin import org.koin.core.scope.Scope import org.koin.core.scope.ScopeID diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/ext/KoinSavedStateModuleExt.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/ext/KoinSavedStateModuleExt.kt new file mode 100644 index 0000000..e4e4135 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/ext/KoinSavedStateModuleExt.kt @@ -0,0 +1,3 @@ +package com.merseyside.merseyLib.utils.core.koin.ext + + diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinSavedStateScopeExt.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/ext/KoinSavedStateScopeExt.kt similarity index 75% rename from archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinSavedStateScopeExt.kt rename to utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/ext/KoinSavedStateScopeExt.kt index 850be71..ad1f3d3 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/ext/KoinSavedStateScopeExt.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/ext/KoinSavedStateScopeExt.kt @@ -1,13 +1,13 @@ -package com.merseyside.merseyLib.archy.core.di.ext +package com.merseyside.merseyLib.utils.core.koin.ext -import com.merseyside.merseyLib.archy.core.di.state.KoinStateHolder -import com.merseyside.merseyLib.archy.core.di.state.getStateKey +import com.merseyside.merseyLib.utils.core.koin.state.KoinStateHolder +import com.merseyside.merseyLib.utils.core.koin.state.getSavedStateFromParams +import com.merseyside.merseyLib.utils.core.koin.state.getStateKey +import com.merseyside.merseyLib.utils.core.state.DummySavedState import com.merseyside.merseyLib.utils.core.state.SavedState import com.merseyside.merseyLib.utils.core.state.StateSaver import org.koin.core.parameter.ParametersHolder import org.koin.core.scope.Scope -import com.merseyside.merseyLib.archy.core.di.state.getSavedStateFromParams -import com.merseyside.merseyLib.utils.core.state.DummySavedState inline fun getSavedStateFromParams(paramsHolder: ParametersHolder): SavedState { return getSavedStateFromParams(paramsHolder, getStateKey()) ?: DummySavedState() diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/dsl/KoinModuleExt.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/ModuleViewModel.kt similarity index 66% rename from archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/dsl/KoinModuleExt.kt rename to utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/ModuleViewModel.kt index 7b71d14..4649cf4 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/dsl/KoinModuleExt.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/ModuleViewModel.kt @@ -1,25 +1,25 @@ -package com.merseyside.merseyLib.archy.core.di.dsl +package com.merseyside.merseyLib.utils.core.koin.module.dsl -import com.merseyside.merseyLib.archy.core.di.ext.getSavedStateFromParams -import com.merseyside.merseyLib.archy.core.di.state.StateDefinition +import com.merseyside.merseyLib.utils.core.koin.ext.getSavedStateFromParams +import com.merseyside.merseyLib.utils.core.koin.state.StateDefinition import com.merseyside.merseyLib.utils.core.state.StateSaver import dev.icerock.moko.mvvm.viewmodel.ViewModel import org.koin.core.definition.Definition -import org.koin.core.instance.InstanceFactory +import org.koin.core.definition.KoinDefinition import org.koin.core.module.Module import org.koin.core.qualifier.Qualifier inline fun Module.viewModel( qualifier: Qualifier? = null, noinline definition: Definition -): Pair> { +): KoinDefinition { return factory(qualifier, definition) } inline fun Module.stateViewModel( qualifier: Qualifier? = null, noinline viewModelDefinition: StateDefinition -): Pair> where T : ViewModel, T : StateSaver { +): KoinDefinition where T : ViewModel, T : StateSaver { return factory(qualifier) { paramsHolder -> viewModelDefinition( getSavedStateFromParams(paramsHolder), diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/New.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/New.kt new file mode 100644 index 0000000..a8457fd --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/New.kt @@ -0,0 +1,31 @@ +package com.merseyside.merseyLib.utils.core.koin.module.dsl + +import org.koin.core.scope.Scope + +inline fun Scope.new( + constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): R = constructor(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) + +inline fun Scope.new( + constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): R = constructor(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) + +inline fun Scope.new( + constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): R = constructor(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) + +inline fun Scope.new( + constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): R = constructor(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) + +inline fun Scope.new( + constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): R = constructor(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) + +inline fun Scope.new( + constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): R = constructor(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) + +inline fun Scope.new( + constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): R = constructor(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleOf.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleOf.kt new file mode 100644 index 0000000..5881917 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleOf.kt @@ -0,0 +1,32 @@ +package com.merseyside.merseyLib.utils.core.koin.module.dsl + +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.Module + +inline fun Module.singleOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): KoinDefinition = single { new(constructor) } + +inline fun Module.singleOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): KoinDefinition = single { new(constructor) } + +inline fun Module.singleOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): KoinDefinition = single { new(constructor) } + +inline fun Module.singleOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): KoinDefinition = single { new(constructor) } + +inline fun Module.singleOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): KoinDefinition = single { new(constructor) } + +inline fun Module.singleOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): KoinDefinition = single { new(constructor) } + +inline fun Module.singleOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): KoinDefinition = single { new(constructor) } \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleStateViewModelOf.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleStateViewModelOf.kt new file mode 100644 index 0000000..e5f9704 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleStateViewModelOf.kt @@ -0,0 +1,82 @@ +package com.merseyside.merseyLib.utils.core.koin.module.dsl + +import com.merseyside.merseyLib.utils.core.state.SavedState +import com.merseyside.merseyLib.utils.core.state.StateSaver +import dev.icerock.moko.mvvm.viewmodel.ViewModel +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.Module +import org.koin.dsl.ScopeDSL +import com.merseyside.merseyLib.utils.core.koin.scope.newSavedState as new + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleViewModelOf.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleViewModelOf.kt new file mode 100644 index 0000000..e28c897 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/module/dsl/SingleViewModelOf.kt @@ -0,0 +1,79 @@ +package com.merseyside.merseyLib.utils.core.koin.module.dsl + +import dev.icerock.moko.mvvm.viewmodel.ViewModel +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.Module +import org.koin.core.module.dsl.new +import com.merseyside.merseyLib.utils.core.koin.module.dsl.new as hugeNew + +inline fun Module.viewModelOf( + crossinline constructor: () -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun Module.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/moduleLoader/CoroutineScopeKoinModuleLoader.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/moduleLoader/CoroutineScopeKoinModuleLoader.kt new file mode 100644 index 0000000..dbc57ad --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/moduleLoader/CoroutineScopeKoinModuleLoader.kt @@ -0,0 +1,25 @@ +package com.merseyside.merseyLib.utils.core.koin.moduleLoader + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.cancel +import org.koin.core.qualifier.Qualifier +import org.koin.dsl.ModuleDeclaration + +class CoroutineScopeKoinModuleLoader( + private val scopeQualifier: Qualifier, + val coroutineScope: CoroutineScope, + createdAtStart: Boolean = false, + moduleDeclaration: ModuleDeclaration +) : KoinModuleLoader(createdAtStart, moduleDeclaration) { + + init { + declarations.add { + single(scopeQualifier) { coroutineScope } + } + } + + override fun unload() { + coroutineScope.cancel("Scope canceled because module unloaded") + super.unload() + } +} \ No newline at end of file diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/moduleLoader/KoinModuleLoader.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/moduleLoader/KoinModuleLoader.kt similarity index 76% rename from archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/moduleLoader/KoinModuleLoader.kt rename to utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/moduleLoader/KoinModuleLoader.kt index 119df71..3a38bb2 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/moduleLoader/KoinModuleLoader.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/moduleLoader/KoinModuleLoader.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di.moduleLoader +package com.merseyside.merseyLib.utils.core.koin.moduleLoader import org.koin.core.context.loadKoinModules import org.koin.core.context.unloadKoinModules @@ -6,7 +6,7 @@ import org.koin.core.module.Module import org.koin.dsl.ModuleDeclaration import org.koin.dsl.module -open class KoinModuleLoader internal constructor( +open class KoinModuleLoader( private val createdAtStart: Boolean = false, moduleDeclaration: ModuleDeclaration ) { @@ -36,11 +36,4 @@ open class KoinModuleLoader internal constructor( declarations.forEach { declaration -> declaration() } } } -} - -fun moduleLoader( - createdAtStart: Boolean = false, - moduleDeclaration: ModuleDeclaration -): KoinModuleLoader { - return KoinModuleLoader(createdAtStart, moduleDeclaration) } \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ScopeNewSavedState.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ScopeNewSavedState.kt new file mode 100644 index 0000000..0ca930c --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/ScopeNewSavedState.kt @@ -0,0 +1,115 @@ +package com.merseyside.merseyLib.utils.core.koin.scope + +import com.merseyside.merseyLib.utils.core.koin.ext.getKoinStateHolder +import com.merseyside.merseyLib.utils.core.koin.ext.getSavedStateFromStateHolder +import com.merseyside.merseyLib.utils.core.state.SavedState +import com.merseyside.merseyLib.utils.core.state.StateSaver +import org.koin.core.scope.Scope + +inline fun Scope.newSavedState( + constructor: (SavedState) -> R, +): R = constructor(getSavedStateFromStateHolder()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1) -> R, +): R = constructor(getSavedStateFromStateHolder(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} + +inline fun Scope.newSavedState( + constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): R = constructor(getSavedStateFromStateHolder(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()).also { + getKoinStateHolder()?.addStateSaver(it) +} \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/SavedScopedOf.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/SavedScopedOf.kt new file mode 100644 index 0000000..75038e5 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/SavedScopedOf.kt @@ -0,0 +1,79 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.dsl + +import com.merseyside.merseyLib.utils.core.state.SavedState +import com.merseyside.merseyLib.utils.core.state.StateSaver +import org.koin.core.definition.KoinDefinition +import org.koin.dsl.ScopeDSL +import com.merseyside.merseyLib.utils.core.koin.scope.newSavedState as new + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } + +inline fun ScopeDSL.savedScopedOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): KoinDefinition where R : StateSaver = scoped { new(constructor) } diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/dsl/KoinScopeDSLExt.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopeViewModel.kt similarity index 64% rename from archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/dsl/KoinScopeDSLExt.kt rename to utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopeViewModel.kt index c602caf..2a6ac55 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/dsl/KoinScopeDSLExt.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopeViewModel.kt @@ -1,26 +1,25 @@ -package com.merseyside.merseyLib.archy.core.di.dsl +package com.merseyside.merseyLib.utils.core.koin.scope.dsl -import com.merseyside.merseyLib.archy.core.di.ext.getSavedStateFromParams -import com.merseyside.merseyLib.archy.core.di.state.StateDefinition +import com.merseyside.merseyLib.utils.core.koin.ext.getSavedStateFromParams +import com.merseyside.merseyLib.utils.core.koin.state.StateDefinition import com.merseyside.merseyLib.utils.core.state.StateSaver import dev.icerock.moko.mvvm.viewmodel.ViewModel import org.koin.core.definition.Definition -import org.koin.core.instance.InstanceFactory -import org.koin.core.module.Module +import org.koin.core.definition.KoinDefinition import org.koin.core.qualifier.Qualifier import org.koin.dsl.ScopeDSL inline fun ScopeDSL.viewModel( qualifier: Qualifier? = null, noinline definition: Definition -): Pair> { +): KoinDefinition { return factory(qualifier, definition) } inline fun ScopeDSL.stateViewModel( qualifier: Qualifier? = null, noinline viewModelDefinition: StateDefinition -): Pair> where T : ViewModel, T : StateSaver { +): KoinDefinition where T : ViewModel, T : StateSaver { return factory(qualifier) { paramsHolder -> viewModelDefinition( getSavedStateFromParams(paramsHolder), diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedOf.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedOf.kt new file mode 100644 index 0000000..f5cc9c5 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedOf.kt @@ -0,0 +1,34 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.dsl + +import com.merseyside.merseyLib.utils.core.koin.module.dsl.new +import dev.icerock.moko.mvvm.viewmodel.ViewModel +import org.koin.core.definition.KoinDefinition +import org.koin.dsl.ScopeDSL + +inline fun ScopeDSL.scopedOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): KoinDefinition = scoped { new(constructor) } + +inline fun ScopeDSL.scopedOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): KoinDefinition = scoped { new(constructor) } + +inline fun ScopeDSL.scopedOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): KoinDefinition = scoped { new(constructor) } + +inline fun ScopeDSL.scopedOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): KoinDefinition = scoped { new(constructor) } + +inline fun ScopeDSL.scopedOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): KoinDefinition = scoped { new(constructor) } + +inline fun ScopeDSL.scopedOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): KoinDefinition = scoped { new(constructor) } + +inline fun ScopeDSL.scopedOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): KoinDefinition = scoped { new(constructor) } \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedStateViewModelOf.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedStateViewModelOf.kt new file mode 100644 index 0000000..7b4becf --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedStateViewModelOf.kt @@ -0,0 +1,80 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.dsl + +import com.merseyside.merseyLib.utils.core.state.SavedState +import com.merseyside.merseyLib.utils.core.state.StateSaver +import dev.icerock.moko.mvvm.viewmodel.ViewModel +import org.koin.core.definition.KoinDefinition +import org.koin.dsl.ScopeDSL +import com.merseyside.merseyLib.utils.core.koin.scope.newSavedState as new + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (SavedState, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): KoinDefinition where R : ViewModel, R : StateSaver = viewModel { new(constructor) } \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedViewModelOf.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedViewModelOf.kt new file mode 100644 index 0000000..23c1b4d --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/scope/dsl/ScopedViewModelOf.kt @@ -0,0 +1,79 @@ +package com.merseyside.merseyLib.utils.core.koin.scope.dsl + +import dev.icerock.moko.mvvm.viewmodel.ViewModel +import org.koin.core.definition.KoinDefinition +import org.koin.core.module.dsl.new +import org.koin.dsl.ScopeDSL +import com.merseyside.merseyLib.utils.core.koin.module.dsl.new as hugeNew + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: () -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, +): KoinDefinition = viewModel { new(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } + +inline fun ScopeDSL.viewModelOf( + crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, +): KoinDefinition = viewModel { hugeNew(constructor) } \ No newline at end of file diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt similarity index 79% rename from archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt rename to utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt index edc8ca5..fb086ab 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di.state +package com.merseyside.merseyLib.utils.core.koin.state import com.merseyside.merseyLib.utils.core.state.SavedState import org.koin.core.parameter.ParametersHolder diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinSavedStateUtils.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinSavedStateUtils.kt similarity index 88% rename from archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinSavedStateUtils.kt rename to utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinSavedStateUtils.kt index 38d1521..7a481f5 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinSavedStateUtils.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinSavedStateUtils.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di.state +package com.merseyside.merseyLib.utils.core.koin.state import com.merseyside.merseyLib.utils.core.state.SavedState import org.koin.core.parameter.ParametersHolder diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinStateHolder.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinStateHolder.kt similarity index 96% rename from archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinStateHolder.kt rename to utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinStateHolder.kt index cc541ed..4cf95e8 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinStateHolder.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinStateHolder.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di.state +package com.merseyside.merseyLib.utils.core.koin.state import com.merseyside.merseyLib.utils.core.state.DummySavedState import com.merseyside.merseyLib.utils.core.state.SavedState diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PagerData.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PagerData.kt new file mode 100644 index 0000000..cf1a687 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PagerData.kt @@ -0,0 +1,7 @@ +package com.merseyside.merseyLib.utils.core.pagination + +open class PagerData( + val data: Data, + val nextPage: Page?, + val prevPage: Page? = null +) \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt new file mode 100644 index 0000000..1298caa --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/Pagination.kt @@ -0,0 +1,61 @@ +package com.merseyside.merseyLib.utils.core.pagination + +import com.merseyside.merseyLib.kotlin.entity.Result +import com.merseyside.merseyLib.kotlin.logger.ILogger +import com.merseyside.merseyLib.kotlin.utils.safeLet +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.filterIsInstance +import kotlinx.coroutines.flow.map + +abstract class Pagination(private val initPage: Page): ILogger + where PD : PagerData { + + private var lastData: PD? = null + var currentPage: Page = initPage + + private val mutSharedFlow: MutableSharedFlow> = MutableSharedFlow(extraBufferCapacity = 10) + val resultFlow: Flow> = mutSharedFlow + + val dataFlow: Flow = resultFlow.filterIsInstance>().map { it.value } + + private fun getNextPage(): Page { + return safeLet(lastData) { + it.nextPage + } ?: initPage + } + + abstract suspend fun loadData(page: Page): PD + + private suspend fun onDataLoaded(pagerData: PD) { + lastData = pagerData + emitResult(Result.Success(pagerData.data)) + } + + private fun isNextPageValid(): Boolean { + return getNextPage() != null || lastData == null + } + + suspend fun loadNextPage() { + if (!isNextPageValid()) { + logMsg("No next page") + return + } + + currentPage = getNextPage() + + try { + val newData = loadData(currentPage) + emitResult(Result.Loading()) + onDataLoaded(newData) + } catch (e: Exception) { + emitResult(Result.Error(e)) + } + } + + private suspend fun emitResult(result: Result) { + mutSharedFlow.emit(result) + } + + override val tag: String = "Pagination" +} \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagerData.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagerData.kt new file mode 100644 index 0000000..c5cec80 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagerData.kt @@ -0,0 +1,6 @@ +package com.merseyside.merseyLib.utils.core.pagination + +class PositionPagerData( + data: Data, + currentPage: Int +) : PagerData(data, currentPage + 1, currentPage - 1) \ No newline at end of file diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagination.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagination.kt new file mode 100644 index 0000000..b50f0f8 --- /dev/null +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/pagination/PositionPagination.kt @@ -0,0 +1,4 @@ +package com.merseyside.merseyLib.utils.core.pagination + +abstract class PositionPagination(initPage: Int) : + Pagination, Data, Int>(initPage) \ No newline at end of file diff --git a/archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt b/utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt similarity index 80% rename from archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt rename to utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt index 540753a..58a015b 100644 --- a/archy-core/src/iosMain/kotlin/com/merseyside/merseyLib/archy/core/di/state/KoinParametersState.kt +++ b/utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/koin/state/KoinParametersState.kt @@ -1,4 +1,4 @@ -package com.merseyside.merseyLib.archy.core.di.state +package com.merseyside.merseyLib.utils.core.koin.state import com.merseyside.merseyLib.utils.core.state.SavedState import org.koin.core.parameter.ParametersHolder diff --git a/utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/ktor/ConnectionStateChecker.kt b/utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/ktor/ConnectionStateChecker.kt index d3ee0bc..9725455 100644 --- a/utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/ktor/ConnectionStateChecker.kt +++ b/utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/ktor/ConnectionStateChecker.kt @@ -1,6 +1,6 @@ package com.merseyside.merseyLib.utils.core.ktor -import cocoapods.Reachability.Reachability +//import cocoapods.Reachability.Reachability import com.merseyside.merseyLib.kotlin.coroutines.utils.uiDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -12,32 +12,33 @@ actual class ConnectionStateChecker { private val mutFlow = MutableStateFlow(false) actual val networkStateFlow: Flow = mutFlow - private lateinit var reachability: Reachability +// private lateinit var reachability: Reachability actual fun isOnline(): Boolean { - return reachability.isReachable() + TODO() + //return reachability.isReachable() } actual fun start() { - reachability = Reachability.reachabilityForInternetConnection() - ?: throw Exception("Can not init reachability") - - val reachableCallback = { _: Reachability? -> - mutFlow.update { true } - } - reachability.reachableBlock = reachableCallback - - val unreachableCallback = { _: Reachability? -> - mutFlow.update { false } - } - reachability.unreachableBlock = unreachableCallback - - reachability.startNotifier() - mutFlow.update { reachability.isReachable() } +// reachability = Reachability.reachabilityForInternetConnection() +// ?: throw Exception("Can not init reachability") +// +// val reachableCallback = { _: Reachability? -> +// mutFlow.update { true } +// } +// reachability.reachableBlock = reachableCallback +// +// val unreachableCallback = { _: Reachability? -> +// mutFlow.update { false } +// } +// reachability.unreachableBlock = unreachableCallback +// +// reachability.startNotifier() +// mutFlow.update { reachability.isReachable() } } actual fun stop() { - reachability.stopNotifier() + //reachability.stopNotifier() } actual fun addNetworkStateCallback(callback: (Boolean) -> Unit) { diff --git a/utils-core/utils_core.podspec b/utils-core/utils_core.podspec deleted file mode 100644 index 7da5611..0000000 --- a/utils-core/utils_core.podspec +++ /dev/null @@ -1,39 +0,0 @@ -Pod::Spec.new do |spec| - spec.name = 'utils_core' - spec.version = '1.5.2' - spec.homepage = 'https://github.com/Merseyside/mersey-kmp-library/tree/master/utils-core' - spec.source = { :http=> ''} - spec.authors = '' - spec.license = '' - spec.summary = 'A Kotlin multiplatform mobile library with useful utils' - spec.vendored_frameworks = 'build/cocoapods/framework/utils_core.framework' - spec.libraries = 'c++' - - spec.dependency 'Reachability', '3.2' - - spec.pod_target_xcconfig = { - 'KOTLIN_PROJECT_PATH' => ':utils-core', - 'PRODUCT_MODULE_NAME' => 'utils_core', - } - - spec.script_phases = [ - { - :name => 'Build utils_core', - :execution_position => :before_compile, - :shell_path => '/bin/sh', - :script => <<-SCRIPT - if [ "YES" = "$COCOAPODS_SKIP_KOTLIN_BUILD" ]; then - echo "Skipping Gradle build task invocation due to COCOAPODS_SKIP_KOTLIN_BUILD environment variable set to \"YES\"" - exit 0 - fi - set -ev - REPO_ROOT="$PODS_TARGET_SRCROOT" - "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \ - -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \ - -Pkotlin.native.cocoapods.archs="$ARCHS" \ - -Pkotlin.native.cocoapods.configuration="$CONFIGURATION" - SCRIPT - } - ] - -end \ No newline at end of file