From c7ab2dd105e73fea2912d94c3319cc024c13335f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 8 Nov 2022 18:13:37 +0100 Subject: [PATCH] Create a dedicated ViewModel for the composer --- .../x/features/messages/MessagesScreen.kt | 7 +++- .../x/features/messages/MessagesViewModel.kt | 13 ------- .../messages/model/MessagesViewState.kt | 1 - .../textcomposer/MessageComposerViewModel.kt | 38 +++++++++++++++++++ .../textcomposer/MessageComposerViewState.kt | 16 ++++++++ 5 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 features/messages/src/main/java/io/element/android/x/features/messages/textcomposer/MessageComposerViewModel.kt create mode 100644 features/messages/src/main/java/io/element/android/x/features/messages/textcomposer/MessageComposerViewState.kt diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt index 5779ec930c..373f044158 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesScreen.kt @@ -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, ) } diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt index 6cc1f7b6da..8543e8d0c0 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt @@ -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() { diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesViewState.kt b/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesViewState.kt index 8b5fd946e3..031775552c 100644 --- a/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesViewState.kt +++ b/features/messages/src/main/java/io/element/android/x/features/messages/model/MessagesViewState.kt @@ -11,7 +11,6 @@ data class MessagesViewState( val roomAvatar: AvatarData? = null, val timelineItems: Async> = Uninitialized, val hasMoreToLoad: Boolean = true, - val composerFullScreen: Boolean = false, ) : MavericksState { @Suppress("unused") diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/textcomposer/MessageComposerViewModel.kt b/features/messages/src/main/java/io/element/android/x/features/messages/textcomposer/MessageComposerViewModel.kt new file mode 100644 index 0000000000..0383de64d3 --- /dev/null +++ b/features/messages/src/main/java/io/element/android/x/features/messages/textcomposer/MessageComposerViewModel.kt @@ -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(initialState) { + + companion object : + MavericksViewModelFactory { + + 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 + ) + } + } +} \ No newline at end of file diff --git a/features/messages/src/main/java/io/element/android/x/features/messages/textcomposer/MessageComposerViewState.kt b/features/messages/src/main/java/io/element/android/x/features/messages/textcomposer/MessageComposerViewState.kt new file mode 100644 index 0000000000..a6cd890437 --- /dev/null +++ b/features/messages/src/main/java/io/element/android/x/features/messages/textcomposer/MessageComposerViewState.kt @@ -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 \ No newline at end of file