feat: don't allow sending too long messages
Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
parent
c9e8185926
commit
72e16cf591
|
|
@ -158,6 +158,7 @@ fun NativeMessageField(
|
||||||
forceSendButton: Boolean = false,
|
forceSendButton: Boolean = false,
|
||||||
canAttach: Boolean = true,
|
canAttach: Boolean = true,
|
||||||
disabled: Boolean = false,
|
disabled: Boolean = false,
|
||||||
|
failedValidation: Boolean = false,
|
||||||
serverId: String? = null,
|
serverId: String? = null,
|
||||||
channelId: String? = null,
|
channelId: String? = null,
|
||||||
editMode: Boolean = false,
|
editMode: Boolean = false,
|
||||||
|
|
@ -176,7 +177,8 @@ fun NativeMessageField(
|
||||||
var requestFocus by remember { mutableStateOf({}) }
|
var requestFocus by remember { mutableStateOf({}) }
|
||||||
var clearFocus by remember { mutableStateOf({}) }
|
var clearFocus by remember { mutableStateOf({}) }
|
||||||
|
|
||||||
val sendButtonVisible = (value.isNotBlank() || forceSendButton) && !disabled
|
val sendButtonVisible =
|
||||||
|
(value.isNotBlank() || forceSendButton) && !disabled && !failedValidation
|
||||||
|
|
||||||
val density = LocalDensity.current
|
val density = LocalDensity.current
|
||||||
|
|
||||||
|
|
@ -184,6 +186,7 @@ fun NativeMessageField(
|
||||||
|
|
||||||
val selectionColour = MaterialTheme.colorScheme.primary.copy(alpha = 0.2f).toArgb()
|
val selectionColour = MaterialTheme.colorScheme.primary.copy(alpha = 0.2f).toArgb()
|
||||||
val cursorColour = MaterialTheme.colorScheme.primary.toArgb()
|
val cursorColour = MaterialTheme.colorScheme.primary.toArgb()
|
||||||
|
val failedValidationColour = MaterialTheme.colorScheme.error.toArgb()
|
||||||
val contentColour = LocalContentColor.current.toArgb()
|
val contentColour = LocalContentColor.current.toArgb()
|
||||||
val placeholderColour = LocalContentColor.current.copy(alpha = 0.5f).toArgb()
|
val placeholderColour = LocalContentColor.current.copy(alpha = 0.5f).toArgb()
|
||||||
|
|
||||||
|
|
@ -524,6 +527,11 @@ fun NativeMessageField(
|
||||||
}
|
}
|
||||||
it.hint = it.context.getString(placeholderResource, channelName)
|
it.hint = it.context.getString(placeholderResource, channelName)
|
||||||
it.serverId = serverId
|
it.serverId = serverId
|
||||||
|
if (failedValidation) {
|
||||||
|
it.setTextColor(failedValidationColour)
|
||||||
|
} else {
|
||||||
|
it.setTextColor(contentColour)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.weight(1f)
|
.weight(1f)
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import android.util.Log
|
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.compose.BackHandler
|
import androidx.activity.compose.BackHandler
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
|
|
@ -73,8 +72,6 @@ import chat.revolt.api.routes.channel.react
|
||||||
import chat.revolt.api.routes.microservices.autumn.FileArgs
|
import chat.revolt.api.routes.microservices.autumn.FileArgs
|
||||||
import chat.revolt.api.schemas.Channel
|
import chat.revolt.api.schemas.Channel
|
||||||
import chat.revolt.api.schemas.ChannelType
|
import chat.revolt.api.schemas.ChannelType
|
||||||
import chat.revolt.callbacks.Action
|
|
||||||
import chat.revolt.callbacks.ActionChannel
|
|
||||||
import chat.revolt.components.chat.Message
|
import chat.revolt.components.chat.Message
|
||||||
import chat.revolt.components.chat.NativeMessageField
|
import chat.revolt.components.chat.NativeMessageField
|
||||||
import chat.revolt.components.chat.SystemMessage
|
import chat.revolt.components.chat.SystemMessage
|
||||||
|
|
@ -288,6 +285,12 @@ fun ChannelScreen(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val isMessageTooLong by remember(viewModel.pendingMessageContent) {
|
||||||
|
derivedStateOf {
|
||||||
|
viewModel.pendingMessageContent.length > MAX_MESSAGE_LENGTH
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LaunchedEffect(isScrolledToTop) {
|
LaunchedEffect(isScrolledToTop) {
|
||||||
snapshotFlow { isScrolledToTop.value }
|
snapshotFlow { isScrolledToTop.value }
|
||||||
.distinctUntilChanged()
|
.distinctUntilChanged()
|
||||||
|
|
@ -530,6 +533,7 @@ fun ChannelScreen(
|
||||||
serverId = channel?.server,
|
serverId = channel?.server,
|
||||||
editMode = viewModel.editingMessage != null,
|
editMode = viewModel.editingMessage != null,
|
||||||
cancelEdit = viewModel::cancelEditingMessage,
|
cancelEdit = viewModel::cancelEditingMessage,
|
||||||
|
failedValidation = isMessageTooLong,
|
||||||
onFocusChange = { nowFocused ->
|
onFocusChange = { nowFocused ->
|
||||||
if (nowFocused && viewModel.currentBottomPane != BottomPane.None) {
|
if (nowFocused && viewModel.currentBottomPane != BottomPane.None) {
|
||||||
viewModel.currentBottomPane = BottomPane.None
|
viewModel.currentBottomPane = BottomPane.None
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,8 @@ import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kotlinx.datetime.Instant
|
import kotlinx.datetime.Instant
|
||||||
|
|
||||||
|
const val MAX_MESSAGE_LENGTH = 2000
|
||||||
|
|
||||||
sealed class BottomPane {
|
sealed class BottomPane {
|
||||||
data object None : BottomPane()
|
data object None : BottomPane()
|
||||||
data object InbuiltMediaPicker : BottomPane()
|
data object InbuiltMediaPicker : BottomPane()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue