diff --git a/app/src/main/java/chat/stoat/composables/chat/MessageField.kt b/app/src/main/java/chat/stoat/composables/chat/MessageField.kt index 6e8984c9..bc917b6c 100644 --- a/app/src/main/java/chat/stoat/composables/chat/MessageField.kt +++ b/app/src/main/java/chat/stoat/composables/chat/MessageField.kt @@ -159,6 +159,7 @@ fun MessageField( channelId: String? = null, valueIsBlank: Boolean = false, editMode: Boolean = false, + sending: Boolean = false, initialValueDirtyMarker: Any = Unit, cancelEdit: () -> Unit = {}, onFocusChange: (Boolean) -> Unit = {}, @@ -624,12 +625,12 @@ fun MessageField( editMode -> painterResource(R.drawable.icn_edit_24dp) else -> painterResource(R.drawable.icn_send_24dp) }, - tint = MaterialTheme.colorScheme.primary, + tint = if (!sending) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.1f), contentDescription = stringResource(id = R.string.send_alt), modifier = Modifier .padding(end = 8.dp) .clip(CircleShape) - .clickable { onSendMessage() } + .clickable(enabled = !sending) { onSendMessage() } .size(32.dp) .padding(4.dp) .testTag("send_message") @@ -656,6 +657,7 @@ fun NativeMessageFieldPreview() { canAttach = true, disabled = false, editMode = false, + sending = false, cancelEdit = {}, onFocusChange = {}, ) diff --git a/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreen.kt b/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreen.kt index 5cd906b7..9a040af4 100644 --- a/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreen.kt +++ b/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreen.kt @@ -1092,7 +1092,8 @@ fun ChannelScreen( cancelEdit = { viewModel.editingMessage = null viewModel.putDraftContent("", true) - } + }, + sending = viewModel.sendingMessage ) DropdownMenu( diff --git a/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreenViewModel.kt b/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreenViewModel.kt index 5dd82f28..0cabf916 100644 --- a/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreenViewModel.kt +++ b/app/src/main/java/chat/stoat/screens/chat/views/channel/ChannelScreenViewModel.kt @@ -91,6 +91,7 @@ class ChannelScreenViewModel @Inject constructor( var draftAttachments = mutableStateListOf() var draftReplyTo = mutableStateListOf() var attachmentUploadProgress by mutableStateOf(0f) + var sendingMessage by mutableStateOf(false) var endOfChannel by mutableStateOf(false) var didInitialChannelFetch by mutableStateOf(false) @@ -338,6 +339,7 @@ class ChannelScreenViewModel @Inject constructor( // the original content val content = MessageProcessor.processOutgoing(draftContent, channel?.server) val replyTo = draftReplyTo.toList() + sendingMessage = true // First we upload (the next 5) attachments... viewModelScope.launch { @@ -362,6 +364,7 @@ class ChannelScreenViewModel @Inject constructor( } catch (e: Exception) { Log.e("ChannelScreenViewModel", "Failed to upload attachment", e) attachmentUploadProgress = 0f + sendingMessage = false // TODO show error message return@launch } @@ -408,6 +411,8 @@ class ChannelScreenViewModel @Inject constructor( } catch (e: Exception) { Log.e("ChannelScreenViewModel", "Failed to send message", e) updateItems(listOf(ChannelScreenItem.FailedMessage(prospectiveMessage)) + items.filter { it !is ChannelScreenItem.ProspectiveMessage }) + } finally { + sendingMessage = false } } }