2
2
3
3
package androidx.lifecycle
4
4
5
+ import com.monstarlab.arch.extensions.LoadingAware
5
6
import com.monstarlab.arch.extensions.UseCaseResult
7
+ import com.monstarlab.arch.extensions.ViewErrorAware
6
8
import com.monstarlab.arch.extensions.onError
7
9
import com.monstarlab.core.sharedui.errorhandling.ViewError
8
10
import com.monstarlab.core.sharedui.errorhandling.mapToViewError
@@ -12,49 +14,53 @@ import kotlinx.coroutines.launch
12
14
private const val ERROR_FLOW_KEY = " androidx.lifecycle.ErrorFlow"
13
15
private const val LOADING_FLOW_KEY = " androidx.lifecycle.LoadingFlow"
14
16
15
- fun ViewModel .sendViewError (viewError : ViewError ) {
17
+ fun < T > T .sendViewError (viewError : ViewError ) where T : ViewErrorAware, T : ViewModel {
16
18
viewModelScope.launch {
17
19
getErrorMutableSharedFlow().emit(viewError)
18
20
}
19
21
}
20
22
21
- suspend fun ViewModel .emitViewError (viewError : ViewError ) {
23
+ suspend fun < T > T .emitViewError (viewError : ViewError ) where T : ViewErrorAware, T : ViewModel {
22
24
getErrorMutableSharedFlow().emit(viewError)
23
25
}
24
26
25
- val ViewModel .viewErrorFlow: SharedFlow <ViewError >
27
+ val < T > T .viewErrorFlow: SharedFlow <ViewError > where T : ViewErrorAware , T : ViewModel
26
28
get() {
27
29
return getErrorMutableSharedFlow()
28
30
}
29
31
30
- val ViewModel .loadingFlow: StateFlow <Boolean >
32
+
33
+ val <T > T .loadingFlow: StateFlow <Boolean > where T : LoadingAware , T : ViewModel
31
34
get() {
32
35
return getLoadingMutableStateFlow()
33
36
}
34
37
35
-
36
- private fun ViewModel.getLoadingMutableStateFlow (): MutableStateFlow <Boolean > {
38
+ private fun <T > T.getLoadingMutableStateFlow (): MutableStateFlow <Boolean > where T : LoadingAware , T : ViewModel {
37
39
val flow: MutableStateFlow <Boolean >? = getTag(LOADING_FLOW_KEY )
38
40
return flow ? : setTagIfAbsent(LOADING_FLOW_KEY , MutableStateFlow (false ))
39
41
}
40
42
41
- private fun ViewModel .getErrorMutableSharedFlow (): MutableSharedFlow <ViewError > {
43
+ private fun < T > T .getErrorMutableSharedFlow (): MutableSharedFlow <ViewError > where T : ViewErrorAware , T : ViewModel {
42
44
val flow: MutableSharedFlow <ViewError >? = getTag(ERROR_FLOW_KEY )
43
45
return flow ? : setTagIfAbsent(ERROR_FLOW_KEY , MutableSharedFlow ())
44
46
}
45
47
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 {
47
49
return this
48
50
.onStart {
49
- viewModel .getLoadingMutableStateFlow().value = true
51
+ t .getLoadingMutableStateFlow().value = true
50
52
}
51
53
.onCompletion {
52
- viewModel .getLoadingMutableStateFlow().value = false
54
+ t .getLoadingMutableStateFlow().value = false
53
55
}
54
56
}
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 {
56
59
return this
57
60
.onError {
58
- viewModel .emitViewError(it.mapToViewError())
61
+ t .emitViewError(it.mapToViewError())
59
62
}
60
63
}
64
+
65
+
66
+
0 commit comments