Skip to content

Commit

Permalink
Merge pull request #9 from Merseyside/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
Merseyside authored May 23, 2022
2 parents cb80db2 + 401c09e commit cbfed06
Show file tree
Hide file tree
Showing 18 changed files with 228 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -112,11 +113,7 @@ abstract class BaseVMFragment<Binding : ViewDataBinding, Model : BaseViewModel>
val savedState = SavedState().apply {
savedInstanceState?.getSerialize(
INSTANCE_STATE_KEY, MapSerializer(String.serializer(), String.serializer())
)?.let {
addAll(
it
)
}
)?.let { addAll(it) }
}
if (viewModel is StateViewModel) {
(viewModel as StateViewModel).onRestoreState(savedState)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -17,11 +14,12 @@ fun <VM : ViewModel> Fragment.navGraphViewModel(
@IdRes navGraphId: Int,
clazz: KClass<VM>
): 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)
Expand Down
4 changes: 4 additions & 0 deletions archy-core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <reified R: StateViewModel> ScopeDSL.stateViewModelOf(
// crossinline constructor: () -> R,
// options: BeanDefinition<R>.() -> Unit
//): KoinDefinition<R> = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options)
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R> ScopeDSL.stateViewModelOf(
// crossinline constructor: () -> R,
//): KoinDefinition<R> = scoped { new(constructor) }
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1) -> R,
// options: BeanDefinition<R>.() -> Unit
//): KoinDefinition<R> = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options)
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1) -> R,
//): KoinDefinition<R> = scoped { new(constructor) }
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2) -> R,
// options: BeanDefinition<R>.() -> Unit
//): KoinDefinition<R> = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options)
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2) -> R,
//): KoinDefinition<R> = scoped { new(constructor) }
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3) -> R,
// options: BeanDefinition<R>.() -> Unit
//): KoinDefinition<R> = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options)
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3) -> R,
//): KoinDefinition<R> = scoped { new(constructor) }
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3, reified T4> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3, T4) -> R,
// options: BeanDefinition<R>.() -> Unit
//): KoinDefinition<R> = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options)
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3, reified T4> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3, T4) -> R,
//): KoinDefinition<R> = scoped { new(constructor) }
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3, reified T4, reified T5> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3, T4, T5) -> R,
// options: BeanDefinition<R>.() -> Unit
//): KoinDefinition<R> = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options)
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3, reified T4, reified T5> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3, T4, T5) -> R,
//): KoinDefinition<R> = scoped { new(constructor) }
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R,
// options: BeanDefinition<R>.() -> Unit
//): KoinDefinition<R> = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options)
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R,
//): KoinDefinition<R> = scoped { new(constructor) }
//
///**
// * @see stateViewModelOf
// */
//inline fun <reified R, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7> ScopeDSL.stateViewModelOf(
// crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R,
// options: BeanDefinition<R>.() -> Unit
//): KoinDefinition<R> = module.setupInstance(_scopedInstanceFactory(definition = { new(constructor) }, scopeQualifier = scopeQualifier), options)
//
Original file line number Diff line number Diff line change
@@ -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<Boolean> = mutProgress

Expand Down Expand Up @@ -76,11 +85,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
}
Expand Down Expand Up @@ -196,4 +204,61 @@ abstract class BaseViewModel protected constructor() : ViewModel() {
open fun onBack(): Boolean {
return true
}





fun <T, K> StateFlow<T>.mapState(
transform: (data: T) -> K
): StateFlow<K> {
return mapState(
scope = viewModelScope,
transform = transform
)
}

fun <T, K> StateFlow<T>.mapState(
initialValue: K,
transform: suspend (data: T) -> K
): StateFlow<K> {
return mapState(
scope = viewModelScope,
initialValue = initialValue,
transform = transform
)
}

fun <T1, T2, R> combineState(
flow1: StateFlow<T1>,
flow2: StateFlow<T2>,
scope: CoroutineScope = viewModelScope,
sharingStarted: SharingStarted = SharingStarted.Eagerly,
transform: (T1, T2) -> R
): StateFlow<R> = combine(flow1, flow2) {
o1, o2 -> transform.invoke(o1, o2)
}.stateIn(scope, sharingStarted, transform.invoke(flow1.value, flow2.value))

fun <T1, T2, T3, R> combineState(
flow1: StateFlow<T1>,
flow2: StateFlow<T2>,
flow3: StateFlow<T3>,
scope: CoroutineScope = viewModelScope,
sharingStarted: SharingStarted = SharingStarted.Eagerly,
transform: (T1, T2, T3) -> R
): StateFlow<R> = combine(flow1, flow2, flow3) {
o1, o2, o3 -> transform.invoke(o1, o2, o3)
}.stateIn(scope, sharingStarted, transform.invoke(flow1.value, flow2.value, flow3.value))

fun <T1, T2, T3, T4, R> combineState(
flow1: StateFlow<T1>,
flow2: StateFlow<T2>,
flow3: StateFlow<T3>,
flow4: StateFlow<T4>,
scope: CoroutineScope = viewModelScope,
sharingStarted: SharingStarted = SharingStarted.Eagerly,
transform: (T1, T2, T3, T4) -> R
): StateFlow<R> = 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))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package com.merseyside.merseyLib.archy.core.presentation.model.ext

2 changes: 1 addition & 1 deletion buildSrc/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ dependencyResolutionManagement {
gradlePluginPortal()
}

val catalogVersions = "1.4.5"
val catalogVersions = "1.4.8"
val group = "io.github.merseyside"
versionCatalogs {

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ 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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ class MainActivity : BaseBindingActivity<ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

requireBinding().showNotification.onClick { test.showNotification() }
requireBinding().showNotification.onClick {
test.showNotification()
}
}
}
4 changes: 2 additions & 2 deletions sample/ios-app/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
PODS:
- mpp_library (1.4.8)
- mpp_library (1.4.9)
- Reachability (3.2)

DEPENDENCIES:
Expand All @@ -15,7 +15,7 @@ EXTERNAL SOURCES:
:path: "../mpp-library"

SPEC CHECKSUMS:
mpp_library: 680c6d9fdce134722cb13b9e389951a07bebda13
mpp_library: 5fd5c55682e489edcb3d98bd6456f9251806df3f
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96

PODFILE CHECKSUM: 984fdf42b2cd57b5e14197719552245436d87e71
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions sample/ios-app/Pods/Manifest.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions sample/mpp-library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ val merseyModules = listOf(

kotlinConvention {
debug = true
setCompilerArgs(
"-Xbinary=memoryModel=experimental"
)
// setCompilerArgs(
//
// )
}

val multiplatform = listOf(
Expand Down
2 changes: 1 addition & 1 deletion sample/mpp-library/mpp_library.podspec
Original file line number Diff line number Diff line change
@@ -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 = ''
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Loading

0 comments on commit cbfed06

Please sign in to comment.