Create a dedicated ViewModel for the composer

This commit is contained in:
Benoit Marty 2022-11-08 18:13:37 +01:00 committed by Benoit Marty
parent cbab671866
commit c7ab2dd105
5 changed files with 59 additions and 16 deletions

View file

@ -38,6 +38,8 @@ import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.features.messages.model.MessagesItemGroupPosition
import io.element.android.x.features.messages.model.MessagesTimelineItemState
import io.element.android.x.features.messages.model.MessagesViewState
import io.element.android.x.features.messages.textcomposer.MessageComposerViewModel
import io.element.android.x.features.messages.textcomposer.MessageComposerViewState
import io.element.android.x.textcomposer.TextComposer
private val BUBBLE_RADIUS = 16.dp
@ -49,12 +51,13 @@ fun MessagesScreen(
onBackPressed: () -> Unit
) {
val viewModel: MessagesViewModel = mavericksViewModel(argsFactory = { roomId })
val composerViewModel: MessageComposerViewModel = mavericksViewModel(argsFactory = { roomId })
LogCompositions(tag = "MessagesScreen", msg = "Root")
val roomTitle by viewModel.collectAsState(MessagesViewState::roomName)
val roomAvatar by viewModel.collectAsState(MessagesViewState::roomAvatar)
val timelineItems by viewModel.collectAsState(MessagesViewState::timelineItems)
val hasMoreToLoad by viewModel.collectAsState(MessagesViewState::hasMoreToLoad)
val composerFullScreen by viewModel.collectAsState(MessagesViewState::composerFullScreen)
val composerFullScreen by composerViewModel.collectAsState(MessageComposerViewState::isFullScreen)
MessagesContent(
roomTitle = roomTitle,
roomAvatar = roomAvatar,
@ -64,7 +67,7 @@ fun MessagesScreen(
onBackPressed = onBackPressed,
onSendMessage = viewModel::sendMessage,
composerFullScreen = composerFullScreen,
onComposerFullScreenChange = viewModel::onComposerFullScreenChange,
onComposerFullScreenChange = composerViewModel::onComposerFullScreenChange,
)
}

View file

@ -64,19 +64,6 @@ class MessagesViewModel(
viewModelScope.launch {
timeline.sendMessage(text.toString())
}
setState {
copy(
composerFullScreen = false
)
}
}
fun onComposerFullScreenChange() {
setState {
copy(
composerFullScreen = !composerFullScreen
)
}
}
private fun handleInit() {

View file

@ -11,7 +11,6 @@ data class MessagesViewState(
val roomAvatar: AvatarData? = null,
val timelineItems: Async<List<MessagesTimelineItemState>> = Uninitialized,
val hasMoreToLoad: Boolean = true,
val composerFullScreen: Boolean = false,
) : MavericksState {
@Suppress("unused")

View file

@ -0,0 +1,38 @@
package io.element.android.x.features.messages.textcomposer
import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.ViewModelContext
import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.MatrixInstance
class MessageComposerViewModel(
private val client: MatrixClient,
private val initialState: MessageComposerViewState
) : MavericksViewModel<MessageComposerViewState>(initialState) {
companion object :
MavericksViewModelFactory<MessageComposerViewModel, MessageComposerViewState> {
override fun create(
viewModelContext: ViewModelContext,
state: MessageComposerViewState
): MessageComposerViewModel? {
val matrix = MatrixInstance.getInstance()
val client = matrix.activeClient()
return MessageComposerViewModel(
client,
state
)
}
}
fun onComposerFullScreenChange() {
setState {
copy(
isFullScreen = !isFullScreen
)
}
}
}

View file

@ -0,0 +1,16 @@
package io.element.android.x.features.messages.textcomposer
import com.airbnb.mvrx.MavericksState
data class MessageComposerViewState(
// val roomId: String,
// val canSendMessage: CanSendStatus = CanSendStatus.Allowed,
val isSendButtonVisible: Boolean = false,
val rootThreadEventId: String? = null,
val startsThread: Boolean = false,
// val sendMode: SendMode = SendMode.Regular("", false),
// val voiceRecordingUiState: VoiceMessageRecorderView.RecordingUiState = VoiceMessageRecorderView.RecordingUiState.Idle,
// val voiceBroadcastState: VoiceBroadcastState? = null,
val text: CharSequence? = null,
val isFullScreen: Boolean = false,
) : MavericksState