From e361a277154cd5a04f31259c45cfd8dc21e96040 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 29 Mar 2022 20:11:05 +0300 Subject: [PATCH 1/8] instance dont work --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a9edc67..1656672 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,7 +20,7 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -build.localDependencies=false +build.localDependencies=true build.localAndroidDependencies=false build.localKotlinExtLibrary=false From 3b8346fa214644debf48c2c29a3d9faeec9852ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9C?= =?UTF-8?q?=D1=83=D0=B4=D1=80=D1=8F=D0=BA=D0=BE=D0=B2?= Date: Thu, 21 Apr 2022 20:18:42 +0300 Subject: [PATCH 2/8] review done. again. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 1656672..a9edc67 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,7 +20,7 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -build.localDependencies=true +build.localDependencies=false build.localAndroidDependencies=false build.localKotlinExtLibrary=false From bead3319e0e2cab99eb559d7ac1dfeb5cf6379c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9C?= =?UTF-8?q?=D1=83=D0=B4=D1=80=D1=8F=D0=BA=D0=BE=D0=B2?= Date: Wed, 4 May 2022 20:13:48 +0300 Subject: [PATCH 3/8] dialogs added --- utils-core/utils_core.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils-core/utils_core.podspec b/utils-core/utils_core.podspec index 00204d1..4449009 100644 --- a/utils-core/utils_core.podspec +++ b/utils-core/utils_core.podspec @@ -28,7 +28,7 @@ Pod::Spec.new do |spec| fi set -ev REPO_ROOT="$PODS_TARGET_SRCROOT" - "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \ + "$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" From 2c2c275123d38cb42820a8fd99643dd9d882ec85 Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Wed, 11 May 2022 17:49:49 +0700 Subject: [PATCH 4/8] Add ktor exts, refactoring --- gradle.properties | 2 +- .../kotlin/com/merseyside/sample/view/MainActivity.kt | 5 ++++- sample/ios-app/Podfile.lock | 4 ++-- .../ios-app/Pods/Local Podspecs/mpp_library.podspec.json | 2 +- sample/ios-app/Pods/Manifest.lock | 4 ++-- sample/mpp-library/mpp_library.podspec | 2 +- settings.gradle.kts | 1 + .../merseyside/merseyLib/utils/core/ktor/KtorHelper.kt | 8 ++------ utils-core/utils_core.podspec | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/gradle.properties b/gradle.properties index 15edf49..ff6dc46 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,7 +21,7 @@ android.enableJetifier=true kotlin.code.style=official build.localAndroidDependencies=false -build.localKotlinExtLibrary=false +build.localKotlinExtLibrary=true kotlin.mpp.stability.nowarn=true kotlin.native.ignoreDisabledTargets=true diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt index d140bdc..ffcd8be 100644 --- a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt +++ b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt @@ -3,6 +3,7 @@ package com.merseyside.sample.view import android.os.Bundle import androidx.appcompat.widget.Toolbar import com.merseyside.archy.presentation.activity.BaseBindingActivity +import com.merseyside.sample.ObservableFieldTest import com.merseyside.sample.R import com.merseyside.sample.databinding.ActivityMainBinding import com.merseyside.sample.notifications.NotificationTest @@ -30,6 +31,8 @@ class MainActivity : BaseBindingActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - requireBinding().showNotification.onClick { test.showNotification() } + requireBinding().showNotification.onClick { + test.showNotification() + } } } \ No newline at end of file diff --git a/sample/ios-app/Podfile.lock b/sample/ios-app/Podfile.lock index e1f4134..a143e4c 100644 --- a/sample/ios-app/Podfile.lock +++ b/sample/ios-app/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - mpp_library (1.4.8) + - mpp_library (1.4.9) - Reachability (3.2) DEPENDENCIES: @@ -15,7 +15,7 @@ EXTERNAL SOURCES: :path: "../mpp-library" SPEC CHECKSUMS: - mpp_library: 680c6d9fdce134722cb13b9e389951a07bebda13 + mpp_library: 5fd5c55682e489edcb3d98bd6456f9251806df3f Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 PODFILE CHECKSUM: 984fdf42b2cd57b5e14197719552245436d87e71 diff --git a/sample/ios-app/Pods/Local Podspecs/mpp_library.podspec.json b/sample/ios-app/Pods/Local Podspecs/mpp_library.podspec.json index 240f619..eb73c50 100644 --- a/sample/ios-app/Pods/Local Podspecs/mpp_library.podspec.json +++ b/sample/ios-app/Pods/Local Podspecs/mpp_library.podspec.json @@ -1,6 +1,6 @@ { "name": "mpp_library", - "version": "1.4.8", + "version": "1.4.9", "homepage": "https://github.com/Merseyside/mersey-kmp-library", "source": { "http": "" diff --git a/sample/ios-app/Pods/Manifest.lock b/sample/ios-app/Pods/Manifest.lock index e1f4134..a143e4c 100644 --- a/sample/ios-app/Pods/Manifest.lock +++ b/sample/ios-app/Pods/Manifest.lock @@ -1,5 +1,5 @@ PODS: - - mpp_library (1.4.8) + - mpp_library (1.4.9) - Reachability (3.2) DEPENDENCIES: @@ -15,7 +15,7 @@ EXTERNAL SOURCES: :path: "../mpp-library" SPEC CHECKSUMS: - mpp_library: 680c6d9fdce134722cb13b9e389951a07bebda13 + mpp_library: 5fd5c55682e489edcb3d98bd6456f9251806df3f Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 PODFILE CHECKSUM: 984fdf42b2cd57b5e14197719552245436d87e71 diff --git a/sample/mpp-library/mpp_library.podspec b/sample/mpp-library/mpp_library.podspec index 8f0f154..67a07da 100644 --- a/sample/mpp-library/mpp_library.podspec +++ b/sample/mpp-library/mpp_library.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'mpp_library' - spec.version = '1.4.8' + spec.version = '1.4.9' spec.homepage = 'https://github.com/Merseyside/mersey-kmp-library' spec.source = { :http=> ''} spec.authors = '' diff --git a/settings.gradle.kts b/settings.gradle.kts index d09e853..0f07dba 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -23,6 +23,7 @@ dependencyResolutionManagement { val common by creating { from("$group:catalog-version-common:$catalogVersions") + version("kotlin-ext", "1.1.5") } val catalogPlugins by creating { diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/ktor/KtorHelper.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/ktor/KtorHelper.kt index d5af2ec..abd2d10 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/ktor/KtorHelper.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/ktor/KtorHelper.kt @@ -16,12 +16,8 @@ import io.ktor.client.request.setBody as builderSetBody typealias Response = Any -fun HttpRequestBuilder.addHeader(key: String, value: Any) { - header(key, value) -} - -fun HttpRequestBuilder.addHeaders(vararg pairs: Pair) { - pairs.forEach { pair -> addHeader(pair.first, pair.second) } +fun HttpMessageBuilder.headers(vararg pairs: Pair) { + pairs.forEach { pair -> header(pair.first, pair.second) } } fun HttpRequestBuilder.setFormData(vararg pairs: Pair) { diff --git a/utils-core/utils_core.podspec b/utils-core/utils_core.podspec index 4449009..12d082d 100644 --- a/utils-core/utils_core.podspec +++ b/utils-core/utils_core.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'utils_core' - spec.version = '1.4.8' + spec.version = '1.4.9' spec.homepage = 'https://github.com/Merseyside/mersey-kmp-library/tree/master/utils-core' spec.source = { :http=> ''} spec.authors = '' From f7e1062617cf4a3d0c02ff44c62c2033418b543c Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Tue, 17 May 2022 14:51:26 +0700 Subject: [PATCH 5/8] Koin changes --- .../presentation/fragment/BaseVMFragment.kt | 8 +- .../merseyLib/archy/android/utils/KoinExt.kt | 14 +- .../presentation/di/KoinStateViewModelOf.kt | 124 ++++++++++++++++++ .../core/presentation/model/BaseViewModel.kt | 9 +- 4 files changed, 137 insertions(+), 18 deletions(-) create mode 100644 archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/di/KoinStateViewModelOf.kt diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt index 9beeec4..c4223f1 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt @@ -9,6 +9,7 @@ import com.merseyside.archy.presentation.fragment.BaseBindingFragment import com.merseyside.merseyLib.archy.core.presentation.model.BaseViewModel import com.merseyside.merseyLib.archy.core.presentation.model.StateViewModel import com.merseyside.merseyLib.archy.core.presentation.model.StateViewModel.Companion.INSTANCE_STATE_KEY +import com.merseyside.merseyLib.kotlin.extensions.log import com.merseyside.merseyLib.utils.core.SavedState import com.merseyside.utils.ext.getSerialize import com.merseyside.utils.ext.putSerialize @@ -112,13 +113,10 @@ abstract class BaseVMFragment val savedState = SavedState().apply { savedInstanceState?.getSerialize( INSTANCE_STATE_KEY, MapSerializer(String.serializer(), String.serializer()) - )?.let { - addAll( - it - ) - } + )?.let { addAll(it) } } if (viewModel is StateViewModel) { + "here!!!".log() (viewModel as StateViewModel).onRestoreState(savedState) } super.onViewStateRestored(savedInstanceState) diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/utils/KoinExt.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/utils/KoinExt.kt index d68aeaa..6c37008 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/utils/KoinExt.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/utils/KoinExt.kt @@ -4,9 +4,6 @@ import androidx.annotation.IdRes import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModel import androidx.navigation.NavBackStackEntry -import androidx.navigation.fragment.findNavController -import org.koin.androidx.viewmodel.ViewModelOwner -import org.koin.androidx.viewmodel.scope.getViewModel import org.koin.core.annotation.KoinInternalApi import org.koin.core.component.KoinComponent import org.koin.core.context.GlobalContext @@ -17,11 +14,12 @@ fun Fragment.navGraphViewModel( @IdRes navGraphId: Int, clazz: KClass ): VM { - val backStackEntry: NavBackStackEntry by lazy { findNavController().getBackStackEntry(navGraphId) } - return getKoinScope(this).getViewModel( - owner = { ViewModelOwner(backStackEntry.viewModelStore) }, - clazz = clazz - ) + TODO() +// val backStackEntry: NavBackStackEntry by lazy { findNavController().getBackStackEntry(navGraphId) } +// return getKoinScope(this).getViewModel( +// owner = { ViewModelOwner(backStackEntry.viewModelStore) }, +// clazz = clazz +// ) } @OptIn(KoinInternalApi::class) diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/di/KoinStateViewModelOf.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/di/KoinStateViewModelOf.kt new file mode 100644 index 0000000..9550cd3 --- /dev/null +++ b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/di/KoinStateViewModelOf.kt @@ -0,0 +1,124 @@ +//@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/presentation/model/BaseViewModel.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/BaseViewModel.kt index 8827529..a123c65 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/BaseViewModel.kt +++ b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/BaseViewModel.kt @@ -76,11 +76,10 @@ abstract class BaseViewModel protected constructor() : ViewModel() { protected fun showMsg(msg: String) { Logger.log(this, msg) - val textMessage = - TextMessage( - isError = false, - msg = msg - ) + val textMessage = TextMessage( + isError = false, + msg = msg + ) mutMessageLiveEvent.value = textMessage } From 407b850aadfe3cf11404a5c96c8a9386ab9fa54f Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Sun, 22 May 2022 16:35:26 +0700 Subject: [PATCH 6/8] Small fragment refactoring --- .../archy/android/presentation/fragment/BaseVMFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt index c4223f1..fb56a50 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt @@ -116,7 +116,6 @@ abstract class BaseVMFragment )?.let { addAll(it) } } if (viewModel is StateViewModel) { - "here!!!".log() (viewModel as StateViewModel).onRestoreState(savedState) } super.onViewStateRestored(savedInstanceState) From fe3c19f9a87245f8a10fab9ddaa305e6bb1b17e4 Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Mon, 23 May 2022 00:20:45 +0700 Subject: [PATCH 7/8] Add view model flow exts --- archy-core/build.gradle.kts | 4 ++ .../core/presentation/model/BaseViewModel.kt | 66 +++++++++++++++++++ .../presentation/model/ext/ViewModelExt.kt | 2 + buildSrc/settings.gradle.kts | 2 +- gradle.properties | 4 +- .../merseyside/sample/view/MainActivity.kt | 1 - sample/mpp-library/build.gradle.kts | 6 +- settings.gradle.kts | 5 +- utils-core/build.gradle.kts | 3 +- utils-core/utils_core.podspec | 2 +- 10 files changed, 82 insertions(+), 13 deletions(-) create mode 100644 archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/ext/ViewModelExt.kt diff --git a/archy-core/build.gradle.kts b/archy-core/build.gradle.kts index ae679e0..6b4c596 100644 --- a/archy-core/build.gradle.kts +++ b/archy-core/build.gradle.kts @@ -47,6 +47,10 @@ kotlinConvention { ) } +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class).all { + kotlinOptions.freeCompilerArgs = listOf("-Xcontext-receivers") +} + val mppLibs = listOf( multiplatformLibs.coroutines, multiplatformLibs.serialization, diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/BaseViewModel.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/BaseViewModel.kt index a123c65..8cb122c 100644 --- a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/BaseViewModel.kt +++ b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/BaseViewModel.kt @@ -1,15 +1,24 @@ package com.merseyside.merseyLib.archy.core.presentation.model import com.merseyside.merseyLib.kotlin.Logger +import com.merseyside.merseyLib.kotlin.coroutines.ext.mapState import com.merseyside.merseyLib.utils.core.ext.getString import com.merseyside.merseyLib.utils.core.ext.getStringNull import com.merseyside.merseyLib.utils.core.mvvm.MutableSingleEvent import dev.icerock.moko.mvvm.livedata.LiveData import dev.icerock.moko.mvvm.viewmodel.ViewModel import dev.icerock.moko.resources.StringResource +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.stateIn abstract class BaseViewModel protected constructor() : ViewModel() { + internal val scope: CoroutineScope + get() { return viewModelScope } + private val mutProgress = MutableSingleEvent(false) val isInProgress: LiveData = mutProgress @@ -195,4 +204,61 @@ abstract class BaseViewModel protected constructor() : ViewModel() { open fun onBack(): Boolean { return true } + + + + + + fun StateFlow.mapState( + transform: (data: T) -> K + ): StateFlow { + return mapState( + scope = viewModelScope, + transform = transform + ) + } + + fun StateFlow.mapState( + initialValue: K, + transform: suspend (data: T) -> K + ): StateFlow { + return mapState( + scope = viewModelScope, + initialValue = initialValue, + transform = transform + ) + } + + fun combineState( + flow1: StateFlow, + flow2: StateFlow, + scope: CoroutineScope = viewModelScope, + sharingStarted: SharingStarted = SharingStarted.Eagerly, + transform: (T1, T2) -> R + ): StateFlow = combine(flow1, flow2) { + o1, o2 -> transform.invoke(o1, o2) + }.stateIn(scope, sharingStarted, transform.invoke(flow1.value, flow2.value)) + + fun combineState( + flow1: StateFlow, + flow2: StateFlow, + flow3: StateFlow, + scope: CoroutineScope = viewModelScope, + sharingStarted: SharingStarted = SharingStarted.Eagerly, + transform: (T1, T2, T3) -> R + ): StateFlow = combine(flow1, flow2, flow3) { + o1, o2, o3 -> transform.invoke(o1, o2, o3) + }.stateIn(scope, sharingStarted, transform.invoke(flow1.value, flow2.value, flow3.value)) + + fun combineState( + flow1: StateFlow, + flow2: StateFlow, + flow3: StateFlow, + flow4: StateFlow, + scope: CoroutineScope = viewModelScope, + sharingStarted: SharingStarted = SharingStarted.Eagerly, + transform: (T1, T2, T3, T4) -> R + ): StateFlow = combine(flow1, flow2, flow3, flow4) { + o1, o2, o3, o4 -> transform.invoke(o1, o2, o3, o4) + }.stateIn(scope, sharingStarted, transform.invoke(flow1.value, flow2.value, flow3.value, flow4.value)) } \ No newline at end of file diff --git a/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/ext/ViewModelExt.kt b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/ext/ViewModelExt.kt new file mode 100644 index 0000000..91c286c --- /dev/null +++ b/archy-core/src/commonMain/kotlin/com/merseyside/merseyLib/archy/core/presentation/model/ext/ViewModelExt.kt @@ -0,0 +1,2 @@ +package com.merseyside.merseyLib.archy.core.presentation.model.ext + diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index 0d0365b..6caa6c6 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -16,7 +16,7 @@ dependencyResolutionManagement { gradlePluginPortal() } - val catalogVersions = "1.4.5" + val catalogVersions = "1.4.8" val group = "io.github.merseyside" versionCatalogs { diff --git a/gradle.properties b/gradle.properties index ff6dc46..1dee2a7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,8 +20,8 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -build.localAndroidDependencies=false -build.localKotlinExtLibrary=true +build.localAndroidDependencies=true +build.localKotlinExtLibrary=false kotlin.mpp.stability.nowarn=true kotlin.native.ignoreDisabledTargets=true diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt index ffcd8be..a6ca99a 100644 --- a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt +++ b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt @@ -3,7 +3,6 @@ package com.merseyside.sample.view import android.os.Bundle import androidx.appcompat.widget.Toolbar import com.merseyside.archy.presentation.activity.BaseBindingActivity -import com.merseyside.sample.ObservableFieldTest import com.merseyside.sample.R import com.merseyside.sample.databinding.ActivityMainBinding import com.merseyside.sample.notifications.NotificationTest diff --git a/sample/mpp-library/build.gradle.kts b/sample/mpp-library/build.gradle.kts index f3ae137..50b5b73 100644 --- a/sample/mpp-library/build.gradle.kts +++ b/sample/mpp-library/build.gradle.kts @@ -26,9 +26,9 @@ val merseyModules = listOf( kotlinConvention { debug = true - setCompilerArgs( - "-Xbinary=memoryModel=experimental" - ) +// setCompilerArgs( +// +// ) } val multiplatform = listOf( diff --git a/settings.gradle.kts b/settings.gradle.kts index 0f07dba..131716c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,7 +1,7 @@ enableFeaturePreview("VERSION_CATALOGS") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -private val isLocalAndroidDependencies = false +private val isLocalAndroidDependencies = true private val isLocalKotlinExtLibrary = false dependencyResolutionManagement { @@ -10,7 +10,7 @@ dependencyResolutionManagement { mavenLocal() } - val catalogVersions = "1.4.5" + val catalogVersions = "1.4.8" val group = "io.github.merseyside" versionCatalogs { val multiplatformLibs by creating { @@ -23,7 +23,6 @@ dependencyResolutionManagement { val common by creating { from("$group:catalog-version-common:$catalogVersions") - version("kotlin-ext", "1.1.5") } val catalogPlugins by creating { diff --git a/utils-core/build.gradle.kts b/utils-core/build.gradle.kts index db20a29..fc56eda 100644 --- a/utils-core/build.gradle.kts +++ b/utils-core/build.gradle.kts @@ -58,8 +58,7 @@ kotlinConvention { setCompilerArgs( "-Xinline-classes", "-Xskip-prerelease-check", - "-opt-in=kotlin.RequiresOptIn", - "-Xbinary=memoryModel=experimental" + "-opt-in=kotlin.RequiresOptIn" ) } diff --git a/utils-core/utils_core.podspec b/utils-core/utils_core.podspec index 12d082d..6255301 100644 --- a/utils-core/utils_core.podspec +++ b/utils-core/utils_core.podspec @@ -28,7 +28,7 @@ Pod::Spec.new do |spec| fi set -ev REPO_ROOT="$PODS_TARGET_SRCROOT" - "$REPO_ROOT/../../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \ + "$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" From 401c09e542ee7891c04c72c3409408564b362d9f Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Mon, 23 May 2022 13:23:33 +0700 Subject: [PATCH 8/8] ++ver 1.4.9 --- gradle.properties | 4 ++-- settings.gradle.kts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1dee2a7..00c65f7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,11 +16,11 @@ org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true +android.enableJetifier=false # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -build.localAndroidDependencies=true +build.localAndroidDependencies=false build.localKotlinExtLibrary=false kotlin.mpp.stability.nowarn=true diff --git a/settings.gradle.kts b/settings.gradle.kts index 131716c..9188463 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,7 +1,7 @@ enableFeaturePreview("VERSION_CATALOGS") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -private val isLocalAndroidDependencies = true +private val isLocalAndroidDependencies = false private val isLocalKotlinExtLibrary = false dependencyResolutionManagement {