@@ -10,6 +10,7 @@ import com.hoc.flowmvi.mvi_base.MviIntent
1010import com.hoc.flowmvi.mvi_base.MviSingleEvent
1111import com.hoc.flowmvi.mvi_base.MviViewState
1212import kotlinx.collections.immutable.PersistentSet
13+ import kotlinx.collections.immutable.mutate
1314import kotlinx.collections.immutable.persistentHashSetOf
1415import kotlinx.parcelize.Parceler
1516import kotlinx.parcelize.Parcelize
@@ -18,9 +19,9 @@ import kotlinx.parcelize.TypeParceler
1819internal object UserValidationErrorPersistentSetParceler :
1920 Parceler <PersistentSet <UserValidationError >> {
2021 override fun create (parcel : Parcel ) =
21- persistentHashSetOf<UserValidationError >().apply {
22+ persistentHashSetOf<UserValidationError >().mutate { errors ->
2223 repeat(parcel.readInt()) {
23- add(UserValidationError .valueOf(parcel.readString()!! ))
24+ errors. add(UserValidationError .valueOf(parcel.readString()!! ))
2425 }
2526 }
2627
@@ -59,6 +60,7 @@ data class ViewState(
5960 }
6061}
6162
63+ @Immutable
6264sealed interface ViewIntent : MviIntent {
6365 data class EmailChanged (val email : String ) : ViewIntent
6466 data class FirstNameChanged (val firstName : String ) : ViewIntent
@@ -76,10 +78,10 @@ internal sealed interface PartialStateChange {
7678 else viewState.copy(errors = errors)
7779 }
7880
79- sealed class AddUser : PartialStateChange {
80- object Loading : AddUser()
81- data class AddUserSuccess (val user : User ) : AddUser()
82- data class AddUserFailure (val user : User , val error : UserError ) : AddUser()
81+ sealed interface AddUser : PartialStateChange {
82+ object Loading : AddUser
83+ data class AddUserSuccess (val user : User ) : AddUser
84+ data class AddUserFailure (val user : User , val error : UserError ) : AddUser
8385
8486 override fun reduce (viewState : ViewState ): ViewState {
8587 return when (this ) {
@@ -90,21 +92,30 @@ internal sealed interface PartialStateChange {
9092 }
9193 }
9294
93- sealed class FirstChange : PartialStateChange {
94- object EmailChangedFirstTime : FirstChange()
95- object FirstNameChangedFirstTime : FirstChange()
96- object LastNameChangedFirstTime : FirstChange()
95+ sealed interface FirstChange : PartialStateChange {
96+ object EmailChangedFirstTime : FirstChange
97+ object FirstNameChangedFirstTime : FirstChange
98+ object LastNameChangedFirstTime : FirstChange
9799
98100 override fun reduce (viewState : ViewState ): ViewState {
99101 return when (this ) {
100- EmailChangedFirstTime -> viewState.copy(emailChanged = true )
101- FirstNameChangedFirstTime -> viewState.copy(firstNameChanged = true )
102- LastNameChangedFirstTime -> viewState.copy(lastNameChanged = true )
102+ EmailChangedFirstTime -> {
103+ if (viewState.emailChanged) viewState
104+ else viewState.copy(emailChanged = true )
105+ }
106+ FirstNameChangedFirstTime -> {
107+ if (viewState.firstNameChanged) viewState
108+ else viewState.copy(firstNameChanged = true )
109+ }
110+ LastNameChangedFirstTime -> {
111+ if (viewState.lastNameChanged) viewState
112+ else viewState.copy(lastNameChanged = true )
113+ }
103114 }
104115 }
105116 }
106117
107- sealed class FormValue : PartialStateChange {
118+ sealed interface FormValue : PartialStateChange {
108119 override fun reduce (viewState : ViewState ): ViewState {
109120 return when (this ) {
110121 is EmailChanged -> {
@@ -122,9 +133,9 @@ internal sealed interface PartialStateChange {
122133 }
123134 }
124135
125- data class EmailChanged (val email : String? ) : FormValue()
126- data class FirstNameChanged (val firstName : String? ) : FormValue()
127- data class LastNameChanged (val lastName : String? ) : FormValue()
136+ data class EmailChanged (val email : String? ) : FormValue
137+ data class FirstNameChanged (val firstName : String? ) : FormValue
138+ data class LastNameChanged (val lastName : String? ) : FormValue
128139 }
129140}
130141
0 commit comments