Skip to content

Commit e829985

Browse files
author
Lucas Sales
committed
Extracting ViewModel extensions to interfaces using kotlin where
1 parent fa2a820 commit e829985

File tree

3 files changed

+28
-18
lines changed

3 files changed

+28
-18
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.monstarlab.arch.extensions
2+
3+
interface ViewErrorAware
4+
5+
interface LoadingAware

app/src/main/java/com/monstarlab/arch/extensions/ViewModelEx.kt

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
package androidx.lifecycle
44

5+
import com.monstarlab.arch.extensions.LoadingAware
56
import com.monstarlab.arch.extensions.UseCaseResult
7+
import com.monstarlab.arch.extensions.ViewErrorAware
68
import com.monstarlab.arch.extensions.onError
79
import com.monstarlab.core.sharedui.errorhandling.ViewError
810
import com.monstarlab.core.sharedui.errorhandling.mapToViewError
@@ -12,49 +14,53 @@ import kotlinx.coroutines.launch
1214
private const val ERROR_FLOW_KEY = "androidx.lifecycle.ErrorFlow"
1315
private 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+

app/src/main/java/com/monstarlab/features/login/LoginViewModel.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package com.monstarlab.features.login
22

3-
import androidx.lifecycle.ViewModel
4-
import androidx.lifecycle.bindError
5-
import androidx.lifecycle.bindLoading
6-
import androidx.lifecycle.viewModelScope
3+
import androidx.lifecycle.*
4+
import com.monstarlab.arch.extensions.LoadingAware
5+
import com.monstarlab.arch.extensions.ViewErrorAware
76
import com.monstarlab.arch.extensions.onSuccess
87
import com.monstarlab.core.usecases.user.LoginUseCase
98
import kotlinx.coroutines.flow.MutableSharedFlow
109
import kotlinx.coroutines.flow.launchIn
1110
import javax.inject.Inject
1211

1312
class LoginViewModel @Inject constructor(
14-
private val loginUseCase: LoginUseCase
15-
) : ViewModel() {
13+
private val loginUseCase: LoginUseCase,
14+
) : ViewModel(), ViewErrorAware, LoadingAware {
1615
val loginResultFlow: MutableSharedFlow<Boolean> = MutableSharedFlow()
1716

1817
fun login(email: String, password: String) {

0 commit comments

Comments
 (0)