diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt index 51412d6f7..1443c4286 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt @@ -496,6 +496,14 @@ data class Chat ( else -> false } + val userIsObserver: Boolean get() = when(chatInfo) { + is ChatInfo.Group -> { + val m = chatInfo.groupInfo.membership + m.memberActive && m.memberRole == GroupMemberRole.Observer + } + else -> false + } + val id: String get() = chatInfo.id @Serializable diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt index 2222d50a8..8641b4a08 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt @@ -83,6 +83,7 @@ fun TerminalLayout( liveMessageAlertShown = SharedPreference(get = { false }, set = {}), needToAllowVoiceToContact = false, allowedVoiceByPrefs = false, + userIsObserver = false, userCanSend = true, allowVoiceToContact = {}, sendMessage = sendCommand, diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt index b4ea1ec0f..7d0ebe38c 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt @@ -648,6 +648,7 @@ fun ComposeView( } val userCanSend = rememberUpdatedState(chat.userCanSend) + val userIsObserver = rememberUpdatedState(chat.userIsObserver) Column { contextItemView() @@ -744,6 +745,7 @@ fun ComposeView( needToAllowVoiceToContact, allowedVoiceByPrefs, allowVoiceToContact = ::allowVoiceToContact, + userIsObserver = userIsObserver.value, userCanSend = userCanSend.value, sendMessage = { sendMessage() diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/SendMsgView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/SendMsgView.kt index 01bebb0ad..d213296a3 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/SendMsgView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/SendMsgView.kt @@ -60,6 +60,7 @@ fun SendMsgView( liveMessageAlertShown: SharedPreference, needToAllowVoiceToContact: Boolean, allowedVoiceByPrefs: Boolean, + userIsObserver: Boolean, userCanSend: Boolean, allowVoiceToContact: () -> Unit, sendMessage: () -> Unit, @@ -75,7 +76,7 @@ fun SendMsgView( val showVoiceButton = cs.message.isEmpty() && showVoiceRecordIcon && !composeState.value.editing && cs.liveMessage == null && (cs.preview is ComposePreview.NoPreview || recState.value is RecordingState.Started) val showDeleteTextButton = rememberSaveable { mutableStateOf(false) } - NativeKeyboard(composeState, textStyle, showDeleteTextButton, userCanSend, onMessageChange) + NativeKeyboard(composeState, textStyle, showDeleteTextButton, userIsObserver, onMessageChange) // Disable clicks on text field if (cs.preview is ComposePreview.VoicePreview || !userCanSend) { Box(Modifier @@ -182,7 +183,7 @@ private fun NativeKeyboard( composeState: MutableState, textStyle: MutableState, showDeleteTextButton: MutableState, - userCanSend: Boolean, + userIsObserver: Boolean, onMessageChange: (String) -> Unit ) { val cs = composeState.value @@ -262,16 +263,23 @@ private fun NativeKeyboard( } showDeleteTextButton.value = it.lineCount >= 4 } - if (composeState.value.preview is ComposePreview.VoicePreview || !userCanSend) { - Text( - if (composeState.value.preview is ComposePreview.VoicePreview) generalGetString(R.string.voice_message_send_text) else generalGetString(R.string.you_are_observer), - Modifier.padding(padding), - color = HighOrLowlight, - style = textStyle.value.copy(fontStyle = FontStyle.Italic) - ) + if (composeState.value.preview is ComposePreview.VoicePreview) { + ComposeOverlay(R.string.voice_message_send_text, textStyle, padding) + } else if (userIsObserver) { + ComposeOverlay(R.string.you_are_observer, textStyle, padding) } } +@Composable +private fun ComposeOverlay(textId: Int, textStyle: MutableState, padding: PaddingValues) { + Text( + generalGetString(textId), + Modifier.padding(padding), + color = HighOrLowlight, + style = textStyle.value.copy(fontStyle = FontStyle.Italic) + ) +} + @Composable private fun BoxScope.DeleteTextButton(composeState: MutableState) { IconButton( @@ -581,6 +589,7 @@ fun PreviewSendMsgView() { liveMessageAlertShown = SharedPreference(get = { true }, set = { }), needToAllowVoiceToContact = false, allowedVoiceByPrefs = true, + userIsObserver = false, userCanSend = true, allowVoiceToContact = {}, sendMessage = {}, @@ -610,6 +619,7 @@ fun PreviewSendMsgViewEditing() { liveMessageAlertShown = SharedPreference(get = { true }, set = { }), needToAllowVoiceToContact = false, allowedVoiceByPrefs = true, + userIsObserver = false, userCanSend = true, allowVoiceToContact = {}, sendMessage = {}, @@ -639,6 +649,7 @@ fun PreviewSendMsgViewInProgress() { liveMessageAlertShown = SharedPreference(get = { true }, set = { }), needToAllowVoiceToContact = false, allowedVoiceByPrefs = true, + userIsObserver = false, userCanSend = true, allowVoiceToContact = {}, sendMessage = {}, diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index ac00f6268..adec3f54f 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -555,6 +555,15 @@ final class Chat: ObservableObject, Identifiable { } } + var userIsObserver: Bool { + switch chatInfo { + case let .group(groupInfo): + let m = groupInfo.membership + return m.memberActive && m.memberRole == .observer + default: return false + } + } + var id: ChatId { get { chatInfo.id } } var viewId: String { get { "\(chatInfo.id) \(created.timeIntervalSince1970)" } } diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index d80402e15..6b3bb48ed 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -291,7 +291,7 @@ struct ComposeView: View { .background(.background) .disabled(!chat.userCanSend) - if (!chat.userCanSend) { + if chat.userIsObserver { Text("you are observer") .italic() .foregroundColor(.secondary)