@@ -28,10 +28,12 @@ import dagger.assisted.AssistedInject
28
28
import im.vector.app.R
29
29
import im.vector.app.core.di.MavericksAssistedViewModelFactory
30
30
import im.vector.app.core.di.hiltMavericksViewModelFactory
31
+ import im.vector.app.core.extensions.exhaustive
31
32
import im.vector.app.core.mvrx.runCatchingToAsync
32
33
import im.vector.app.core.platform.VectorViewModel
33
34
import im.vector.app.core.resources.StringProvider
34
35
import im.vector.app.features.displayname.getBestName
36
+ import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider
35
37
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
36
38
import kotlinx.coroutines.Dispatchers
37
39
import kotlinx.coroutines.flow.combine
@@ -42,8 +44,10 @@ import kotlinx.coroutines.launch
42
44
import kotlinx.coroutines.withContext
43
45
import org.matrix.android.sdk.api.query.QueryStringValue
44
46
import org.matrix.android.sdk.api.session.Session
47
+ import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes
45
48
import org.matrix.android.sdk.api.session.events.model.EventType
46
49
import org.matrix.android.sdk.api.session.events.model.toContent
50
+ import org.matrix.android.sdk.api.session.events.model.toModel
47
51
import org.matrix.android.sdk.api.session.profile.ProfileService
48
52
import org.matrix.android.sdk.api.session.room.Room
49
53
import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams
@@ -57,10 +61,12 @@ import org.matrix.android.sdk.api.util.toOptional
57
61
import org.matrix.android.sdk.flow.flow
58
62
import org.matrix.android.sdk.flow.unwrap
59
63
60
- class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private val initialState : RoomMemberProfileViewState ,
61
- private val stringProvider : StringProvider ,
62
- private val session : Session ) :
63
- VectorViewModel <RoomMemberProfileViewState , RoomMemberProfileAction , RoomMemberProfileViewEvents >(initialState) {
64
+ class RoomMemberProfileViewModel @AssistedInject constructor(
65
+ @Assisted private val initialState : RoomMemberProfileViewState ,
66
+ private val stringProvider : StringProvider ,
67
+ private val matrixItemColorProvider : MatrixItemColorProvider ,
68
+ private val session : Session
69
+ ) : VectorViewModel<RoomMemberProfileViewState, RoomMemberProfileAction, RoomMemberProfileViewEvents>(initialState) {
64
70
65
71
@AssistedFactory
66
72
interface Factory : MavericksAssistedViewModelFactory <RoomMemberProfileViewModel , RoomMemberProfileViewState > {
@@ -85,6 +91,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v
85
91
)
86
92
}
87
93
observeIgnoredState()
94
+ observeAccountData()
88
95
viewModelScope.launch(Dispatchers .Main ) {
89
96
// Do we have a room member for this id.
90
97
val roomMember = withContext(Dispatchers .Default ) {
@@ -121,6 +128,21 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v
121
128
}
122
129
}
123
130
131
+ private fun observeAccountData () {
132
+ session.flow()
133
+ .liveUserAccountData(UserAccountDataTypes .TYPE_OVERRIDE_COLORS )
134
+ .unwrap()
135
+ .onEach {
136
+ val newUserColor = it.content.toModel<Map <String , String >>()?.get(initialState.userId)
137
+ setState {
138
+ copy(
139
+ userColorOverride = newUserColor
140
+ )
141
+ }
142
+ }
143
+ .launchIn(viewModelScope)
144
+ }
145
+
124
146
private fun observeIgnoredState () {
125
147
session.flow().liveIgnoredUsers()
126
148
.map { ignored ->
@@ -143,6 +165,31 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v
143
165
is RoomMemberProfileAction .BanOrUnbanUser -> handleBanOrUnbanAction(action)
144
166
is RoomMemberProfileAction .KickUser -> handleKickAction(action)
145
167
RoomMemberProfileAction .InviteUser -> handleInviteAction()
168
+ is RoomMemberProfileAction .SetUserColorOverride -> handleSetUserColorOverride(action)
169
+ }.exhaustive
170
+ }
171
+
172
+ private fun handleSetUserColorOverride (action : RoomMemberProfileAction .SetUserColorOverride ) {
173
+ val newOverrideColorSpecs = session.accountDataService()
174
+ .getUserAccountDataEvent(UserAccountDataTypes .TYPE_OVERRIDE_COLORS )
175
+ ?.content
176
+ ?.toModel<Map <String , String >>()
177
+ .orEmpty()
178
+ .toMutableMap()
179
+ if (matrixItemColorProvider.setOverrideColor(initialState.userId, action.newColorSpec)) {
180
+ newOverrideColorSpecs[initialState.userId] = action.newColorSpec
181
+ } else {
182
+ newOverrideColorSpecs.remove(initialState.userId)
183
+ }
184
+ viewModelScope.launch {
185
+ try {
186
+ session.accountDataService().updateUserAccountData(
187
+ type = UserAccountDataTypes .TYPE_OVERRIDE_COLORS ,
188
+ content = newOverrideColorSpecs
189
+ )
190
+ } catch (failure: Throwable ) {
191
+ _viewEvents .post(RoomMemberProfileViewEvents .Failure (failure))
192
+ }
146
193
}
147
194
}
148
195
0 commit comments