Empty composer when message is sent
This commit is contained in:
parent
e27d55115d
commit
dccb83fe76
5 changed files with 48 additions and 3 deletions
|
|
@ -34,6 +34,7 @@ import androidx.compose.ui.zIndex
|
||||||
import com.airbnb.mvrx.compose.collectAsState
|
import com.airbnb.mvrx.compose.collectAsState
|
||||||
import com.airbnb.mvrx.compose.mavericksViewModel
|
import com.airbnb.mvrx.compose.mavericksViewModel
|
||||||
import io.element.android.x.core.data.LogCompositions
|
import io.element.android.x.core.data.LogCompositions
|
||||||
|
import io.element.android.x.core.data.StableCharSequence
|
||||||
import io.element.android.x.designsystem.components.avatar.AvatarData
|
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
|
||||||
|
|
@ -58,6 +59,8 @@ fun MessagesScreen(
|
||||||
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 composerViewModel.collectAsState(MessageComposerViewState::isFullScreen)
|
val composerFullScreen by composerViewModel.collectAsState(MessageComposerViewState::isFullScreen)
|
||||||
|
val composerCanSendMessage by composerViewModel.collectAsState(MessageComposerViewState::isSendButtonVisible)
|
||||||
|
val composerText by composerViewModel.collectAsState(MessageComposerViewState::text)
|
||||||
MessagesContent(
|
MessagesContent(
|
||||||
roomTitle = roomTitle,
|
roomTitle = roomTitle,
|
||||||
roomAvatar = roomAvatar,
|
roomAvatar = roomAvatar,
|
||||||
|
|
@ -65,9 +68,15 @@ fun MessagesScreen(
|
||||||
hasMoreToLoad = hasMoreToLoad,
|
hasMoreToLoad = hasMoreToLoad,
|
||||||
onReachedLoadMore = viewModel::loadMore,
|
onReachedLoadMore = viewModel::loadMore,
|
||||||
onBackPressed = onBackPressed,
|
onBackPressed = onBackPressed,
|
||||||
onSendMessage = viewModel::sendMessage,
|
onSendMessage = {
|
||||||
|
viewModel.sendMessage(it)
|
||||||
|
composerViewModel.updateText("")
|
||||||
|
},
|
||||||
composerFullScreen = composerFullScreen,
|
composerFullScreen = composerFullScreen,
|
||||||
onComposerFullScreenChange = composerViewModel::onComposerFullScreenChange,
|
onComposerFullScreenChange = composerViewModel::onComposerFullScreenChange,
|
||||||
|
onComposerTextChange = composerViewModel::updateText,
|
||||||
|
composerCanSendMessage = composerCanSendMessage,
|
||||||
|
composerText = composerText,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,6 +91,9 @@ fun MessagesContent(
|
||||||
onSendMessage: (CharSequence) -> Unit,
|
onSendMessage: (CharSequence) -> Unit,
|
||||||
composerFullScreen: Boolean,
|
composerFullScreen: Boolean,
|
||||||
onComposerFullScreenChange: () -> Unit,
|
onComposerFullScreenChange: () -> Unit,
|
||||||
|
onComposerTextChange: (CharSequence) -> Unit,
|
||||||
|
composerCanSendMessage: Boolean,
|
||||||
|
composerText: StableCharSequence?,
|
||||||
) {
|
) {
|
||||||
LogCompositions(tag = "MessagesScreen", msg = "Content")
|
LogCompositions(tag = "MessagesScreen", msg = "Content")
|
||||||
val lazyListState = rememberLazyListState()
|
val lazyListState = rememberLazyListState()
|
||||||
|
|
@ -133,6 +145,9 @@ fun MessagesContent(
|
||||||
onSendMessage = onSendMessage,
|
onSendMessage = onSendMessage,
|
||||||
fullscreen = composerFullScreen,
|
fullscreen = composerFullScreen,
|
||||||
onFullscreenToggle = onComposerFullScreenChange,
|
onFullscreenToggle = onComposerFullScreenChange,
|
||||||
|
onComposerTextChange = onComposerTextChange,
|
||||||
|
composerCanSendMessage = composerCanSendMessage,
|
||||||
|
composerText = composerText?.charSequence,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.let {
|
.let {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package io.element.android.x.features.messages.textcomposer
|
||||||
import com.airbnb.mvrx.MavericksViewModel
|
import com.airbnb.mvrx.MavericksViewModel
|
||||||
import com.airbnb.mvrx.MavericksViewModelFactory
|
import com.airbnb.mvrx.MavericksViewModelFactory
|
||||||
import com.airbnb.mvrx.ViewModelContext
|
import com.airbnb.mvrx.ViewModelContext
|
||||||
|
import io.element.android.x.core.data.StableCharSequence
|
||||||
import io.element.android.x.matrix.MatrixClient
|
import io.element.android.x.matrix.MatrixClient
|
||||||
import io.element.android.x.matrix.MatrixInstance
|
import io.element.android.x.matrix.MatrixInstance
|
||||||
|
|
||||||
|
|
@ -35,4 +36,13 @@ class MessageComposerViewModel(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun updateText(newText: CharSequence) {
|
||||||
|
setState {
|
||||||
|
copy(
|
||||||
|
text = StableCharSequence(newText),
|
||||||
|
isSendButtonVisible = newText.isNotEmpty(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package io.element.android.x.features.messages.textcomposer
|
package io.element.android.x.features.messages.textcomposer
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Stable
|
||||||
import com.airbnb.mvrx.MavericksState
|
import com.airbnb.mvrx.MavericksState
|
||||||
|
import io.element.android.x.core.data.StableCharSequence
|
||||||
|
|
||||||
|
@Stable
|
||||||
data class MessageComposerViewState(
|
data class MessageComposerViewState(
|
||||||
// val roomId: String,
|
// val roomId: String,
|
||||||
// val canSendMessage: CanSendStatus = CanSendStatus.Allowed,
|
// val canSendMessage: CanSendStatus = CanSendStatus.Allowed,
|
||||||
|
|
@ -11,6 +14,6 @@ data class MessageComposerViewState(
|
||||||
// val sendMode: SendMode = SendMode.Regular("", false),
|
// val sendMode: SendMode = SendMode.Regular("", false),
|
||||||
// val voiceRecordingUiState: VoiceMessageRecorderView.RecordingUiState = VoiceMessageRecorderView.RecordingUiState.Idle,
|
// val voiceRecordingUiState: VoiceMessageRecorderView.RecordingUiState = VoiceMessageRecorderView.RecordingUiState.Idle,
|
||||||
// val voiceBroadcastState: VoiceBroadcastState? = null,
|
// val voiceBroadcastState: VoiceBroadcastState? = null,
|
||||||
val text: CharSequence? = null,
|
val text: StableCharSequence? = null,
|
||||||
val isFullScreen: Boolean = false,
|
val isFullScreen: Boolean = false,
|
||||||
) : MavericksState
|
) : MavericksState
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package io.element.android.x.core.data
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper for a CharSequence, which support mutation of the CharSequence.
|
||||||
|
*/
|
||||||
|
class StableCharSequence(val charSequence: CharSequence) {
|
||||||
|
private val hash = charSequence.toString().hashCode()
|
||||||
|
|
||||||
|
override fun hashCode() = hash
|
||||||
|
override fun equals(other: Any?) = other is StableCharSequence && other.hash == hash
|
||||||
|
}
|
||||||
|
|
@ -4,6 +4,7 @@ import android.net.Uri
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.viewinterop.AndroidView
|
import androidx.compose.ui.viewinterop.AndroidView
|
||||||
|
import androidx.core.view.isInvisible
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import io.element.android.x.element.resources.R as ElementR
|
import io.element.android.x.element.resources.R as ElementR
|
||||||
|
|
||||||
|
|
@ -13,6 +14,9 @@ fun TextComposer(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
fullscreen: Boolean,
|
fullscreen: Boolean,
|
||||||
onFullscreenToggle: () -> Unit,
|
onFullscreenToggle: () -> Unit,
|
||||||
|
onComposerTextChange: (CharSequence) -> Unit,
|
||||||
|
composerCanSendMessage: Boolean,
|
||||||
|
composerText: CharSequence?,
|
||||||
) {
|
) {
|
||||||
AndroidView(
|
AndroidView(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -25,6 +29,7 @@ fun TextComposer(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onTextChanged(text: CharSequence) {
|
override fun onTextChanged(text: CharSequence) {
|
||||||
|
onComposerTextChange(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCloseRelatedMessage() {
|
override fun onCloseRelatedMessage() {
|
||||||
|
|
@ -59,7 +64,8 @@ fun TextComposer(
|
||||||
// Example of Compose -> View communication
|
// Example of Compose -> View communication
|
||||||
val messageComposerView = (view as MessageComposerView)
|
val messageComposerView = (view as MessageComposerView)
|
||||||
messageComposerView.toggleFullScreen(fullscreen)
|
messageComposerView.toggleFullScreen(fullscreen)
|
||||||
messageComposerView.sendButton.isVisible = true
|
messageComposerView.sendButton.isInvisible = !composerCanSendMessage
|
||||||
|
messageComposerView.setTextIfDifferent(composerText ?: "")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue