22
33package androidx.lifecycle
44
5+ import com.monstarlab.arch.extensions.LoadingAware
56import com.monstarlab.arch.extensions.UseCaseResult
7+ import com.monstarlab.arch.extensions.ViewErrorAware
68import com.monstarlab.arch.extensions.onError
79import com.monstarlab.core.sharedui.errorhandling.ViewError
810import com.monstarlab.core.sharedui.errorhandling.mapToViewError
@@ -12,49 +14,53 @@ import kotlinx.coroutines.launch
1214private const val ERROR_FLOW_KEY = " androidx.lifecycle.ErrorFlow"
1315private const val LOADING_FLOW_KEY = " androidx.lifecycle.LoadingFlow"
1416
15- fun ViewModel .sendViewError (viewError : ViewError ) {
17+ fun < T > T .sendViewError (viewError : ViewError ) where T : ViewErrorAware, T : ViewModel {
1618 viewModelScope.launch {
1719 getErrorMutableSharedFlow().emit(viewError)
1820 }
1921}
2022
21- suspend fun ViewModel .emitViewError (viewError : ViewError ) {
23+ suspend fun < T > T .emitViewError (viewError : ViewError ) where T : ViewErrorAware, T : ViewModel {
2224 getErrorMutableSharedFlow().emit(viewError)
2325}
2426
25- val ViewModel .viewErrorFlow: SharedFlow <ViewError >
27+ val < T > T .viewErrorFlow: SharedFlow <ViewError > where T : ViewErrorAware , T : ViewModel
2628 get() {
2729 return getErrorMutableSharedFlow()
2830 }
2931
30- val ViewModel .loadingFlow: StateFlow <Boolean >
32+
33+ val <T > T .loadingFlow: StateFlow <Boolean > where T : LoadingAware , T : ViewModel
3134 get() {
3235 return getLoadingMutableStateFlow()
3336 }
3437
35-
36- private fun ViewModel.getLoadingMutableStateFlow (): MutableStateFlow <Boolean > {
38+ private fun <T > T.getLoadingMutableStateFlow (): MutableStateFlow <Boolean > where T : LoadingAware , T : ViewModel {
3739 val flow: MutableStateFlow <Boolean >? = getTag(LOADING_FLOW_KEY )
3840 return flow ? : setTagIfAbsent(LOADING_FLOW_KEY , MutableStateFlow (false ))
3941}
4042
41- private fun ViewModel .getErrorMutableSharedFlow (): MutableSharedFlow <ViewError > {
43+ private fun < T > T .getErrorMutableSharedFlow (): MutableSharedFlow <ViewError > where T : ViewErrorAware , T : ViewModel {
4244 val flow: MutableSharedFlow <ViewError >? = getTag(ERROR_FLOW_KEY )
4345 return flow ? : setTagIfAbsent(ERROR_FLOW_KEY , MutableSharedFlow ())
4446}
4547
46- fun <T > Flow<T >.bindLoading (viewModel : ViewModel ): Flow <T > {
48+ fun <F , T > Flow<F >.bindLoading (t : T ): Flow <F > where T : LoadingAware , T : ViewModel {
4749 return this
4850 .onStart {
49- viewModel .getLoadingMutableStateFlow().value = true
51+ t .getLoadingMutableStateFlow().value = true
5052 }
5153 .onCompletion {
52- viewModel .getLoadingMutableStateFlow().value = false
54+ t .getLoadingMutableStateFlow().value = false
5355 }
5456}
55- fun <T > Flow<UseCaseResult<T>>.bindError (viewModel : ViewModel ): Flow <UseCaseResult <T >> {
57+
58+ fun <F , T > Flow<UseCaseResult<F>>.bindError (t : T ): Flow <UseCaseResult <F >> where T : ViewErrorAware , T : ViewModel {
5659 return this
5760 .onError {
58- viewModel .emitViewError(it.mapToViewError())
61+ t .emitViewError(it.mapToViewError())
5962 }
6063}
64+
65+
66+
0 commit comments