Create a dedicated ViewModel for the composer
This commit is contained in:
parent
26c12d7bb4
commit
e27d55115d
5 changed files with 59 additions and 16 deletions
|
|
@ -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.MessagesItemGroupPosition
|
||||||
import io.element.android.x.features.messages.model.MessagesTimelineItemState
|
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.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
|
import io.element.android.x.textcomposer.TextComposer
|
||||||
|
|
||||||
private val BUBBLE_RADIUS = 16.dp
|
private val BUBBLE_RADIUS = 16.dp
|
||||||
|
|
@ -49,12 +51,13 @@ fun MessagesScreen(
|
||||||
onBackPressed: () -> Unit
|
onBackPressed: () -> Unit
|
||||||
) {
|
) {
|
||||||
val viewModel: MessagesViewModel = mavericksViewModel(argsFactory = { roomId })
|
val viewModel: MessagesViewModel = mavericksViewModel(argsFactory = { roomId })
|
||||||
|
val composerViewModel: MessageComposerViewModel = mavericksViewModel(argsFactory = { roomId })
|
||||||
LogCompositions(tag = "MessagesScreen", msg = "Root")
|
LogCompositions(tag = "MessagesScreen", msg = "Root")
|
||||||
val roomTitle by viewModel.collectAsState(MessagesViewState::roomName)
|
val roomTitle by viewModel.collectAsState(MessagesViewState::roomName)
|
||||||
val roomAvatar by viewModel.collectAsState(MessagesViewState::roomAvatar)
|
val roomAvatar by viewModel.collectAsState(MessagesViewState::roomAvatar)
|
||||||
val timelineItems by viewModel.collectAsState(MessagesViewState::timelineItems)
|
val timelineItems by viewModel.collectAsState(MessagesViewState::timelineItems)
|
||||||
val hasMoreToLoad by viewModel.collectAsState(MessagesViewState::hasMoreToLoad)
|
val hasMoreToLoad by viewModel.collectAsState(MessagesViewState::hasMoreToLoad)
|
||||||
val composerFullScreen by viewModel.collectAsState(MessagesViewState::composerFullScreen)
|
val composerFullScreen by composerViewModel.collectAsState(MessageComposerViewState::isFullScreen)
|
||||||
MessagesContent(
|
MessagesContent(
|
||||||
roomTitle = roomTitle,
|
roomTitle = roomTitle,
|
||||||
roomAvatar = roomAvatar,
|
roomAvatar = roomAvatar,
|
||||||
|
|
@ -64,7 +67,7 @@ fun MessagesScreen(
|
||||||
onBackPressed = onBackPressed,
|
onBackPressed = onBackPressed,
|
||||||
onSendMessage = viewModel::sendMessage,
|
onSendMessage = viewModel::sendMessage,
|
||||||
composerFullScreen = composerFullScreen,
|
composerFullScreen = composerFullScreen,
|
||||||
onComposerFullScreenChange = viewModel::onComposerFullScreenChange,
|
onComposerFullScreenChange = composerViewModel::onComposerFullScreenChange,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,19 +64,6 @@ class MessagesViewModel(
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
timeline.sendMessage(text.toString())
|
timeline.sendMessage(text.toString())
|
||||||
}
|
}
|
||||||
setState {
|
|
||||||
copy(
|
|
||||||
composerFullScreen = false
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onComposerFullScreenChange() {
|
|
||||||
setState {
|
|
||||||
copy(
|
|
||||||
composerFullScreen = !composerFullScreen
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleInit() {
|
private fun handleInit() {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ data class MessagesViewState(
|
||||||
val roomAvatar: AvatarData? = null,
|
val roomAvatar: AvatarData? = null,
|
||||||
val timelineItems: Async<List<MessagesTimelineItemState>> = Uninitialized,
|
val timelineItems: Async<List<MessagesTimelineItemState>> = Uninitialized,
|
||||||
val hasMoreToLoad: Boolean = true,
|
val hasMoreToLoad: Boolean = true,
|
||||||
val composerFullScreen: Boolean = false,
|
|
||||||
) : MavericksState {
|
) : MavericksState {
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue