Skip to content

Commit adf5f5d

Browse files
committed
Feat: MviViewModel 구현
1 parent ca99937 commit adf5f5d

4 files changed

Lines changed: 51 additions & 0 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.threegap.bitnagil.presentation.common.mviviewmodel
2+
3+
interface MviIntent
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.threegap.bitnagil.presentation.common.mviviewmodel
2+
3+
interface MviSideEffect
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.threegap.bitnagil.presentation.common.mviviewmodel
2+
3+
import android.os.Parcelable
4+
5+
interface MviState : Parcelable
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.threegap.bitnagil.presentation.common.mviviewmodel
2+
3+
import androidx.lifecycle.SavedStateHandle
4+
import androidx.lifecycle.ViewModel
5+
import kotlinx.coroutines.flow.Flow
6+
import kotlinx.coroutines.flow.StateFlow
7+
import org.orbitmvi.orbit.Container
8+
import org.orbitmvi.orbit.ContainerHost
9+
import org.orbitmvi.orbit.syntax.simple.intent
10+
import org.orbitmvi.orbit.syntax.simple.postSideEffect
11+
import org.orbitmvi.orbit.syntax.simple.reduce
12+
import org.orbitmvi.orbit.viewmodel.container
13+
14+
abstract class MviViewModel<STATE : MviState, SIDE_EFFECT : MviSideEffect, INTENT : MviIntent>(
15+
private val initState: STATE,
16+
private val savedStateHandle: SavedStateHandle,
17+
) : ContainerHost<STATE, SIDE_EFFECT>, ViewModel() {
18+
override val container: Container<STATE, SIDE_EFFECT>
19+
get() = container(initialState = initState, savedStateHandle = savedStateHandle)
20+
21+
val stateFlow: StateFlow<STATE> = container.stateFlow
22+
23+
val sideEffectFlow: Flow<SIDE_EFFECT> = container.sideEffectFlow
24+
25+
protected fun sendSideEffect(sideEffect: SIDE_EFFECT) =
26+
intent {
27+
postSideEffect(sideEffect)
28+
}
29+
30+
protected abstract fun reduceState(intent: INTENT): STATE?
31+
32+
protected fun sendIntent(intent: INTENT) =
33+
intent {
34+
val newState = reduceState(intent)
35+
36+
newState?.let {
37+
reduce { newState }
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)