diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt index 60d8cc473e..72aa94529c 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt @@ -1833,13 +1833,15 @@ sealed class ChatError { @Serializable sealed class ChatErrorType { val string: String get() = when (this) { + is NoActiveUser -> "noActiveUser" is InvalidConnReq -> "invalidConnReq" is ContactGroups -> "groupNames $groupNames" - is NoActiveUser -> "noActiveUser" + is СommandError -> "commandError $message" } @Serializable @SerialName("noActiveUser") class NoActiveUser: ChatErrorType() @Serializable @SerialName("invalidConnReq") class InvalidConnReq: ChatErrorType() @Serializable @SerialName("contactGroups") class ContactGroups(val contact: Contact, val groupNames: List): ChatErrorType() + @Serializable @SerialName("commandError") class СommandError(val message: String): ChatErrorType() } @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 f55b234571..608cbb2bfc 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 @@ -46,14 +46,7 @@ fun TerminalView(chatModel: ChatModel, close: () -> Unit) { TerminalLayout( chatModel.terminalItems, composeState, - sendCommand = { - withApi { - // show "in progress" - chatModel.controller.sendCmd(CC.Console(composeState.value.message)) - composeState.value = ComposeState(useLinkPreviews = false) - // hide "in progress" - } - }, + sendCommand = { sendCommand(chatModel, composeState) }, close ) } else { @@ -91,6 +84,25 @@ private fun runAuth(authorized: MutableState, context: Context) { ) } +private fun sendCommand(chatModel: ChatModel, composeState: MutableState) { + val developerTools = chatModel.controller.appPrefs.developerTools.get() + val prefPerformLA = chatModel.controller.appPrefs.performLA.get() + val s = composeState.value.message + if (s.startsWith("/sql") && (!prefPerformLA || !developerTools)) { + val resp = CR.ChatCmdError(ChatError.ChatErrorChat(ChatErrorType.СommandError("Failed reading: empty"))) + chatModel.terminalItems.add(TerminalItem.cmd(CC.Console(s))) + chatModel.terminalItems.add(TerminalItem.resp(resp)) + composeState.value = ComposeState(useLinkPreviews = false) + } else { + withApi { + // show "in progress" + chatModel.controller.sendCmd(CC.Console(s)) + composeState.value = ComposeState(useLinkPreviews = false) + // hide "in progress" + } + } +} + @Composable fun TerminalLayout( terminalItems: List, diff --git a/apps/ios/Shared/Views/TerminalView.swift b/apps/ios/Shared/Views/TerminalView.swift index 488602dda6..e563cdc3f2 100644 --- a/apps/ios/Shared/Views/TerminalView.swift +++ b/apps/ios/Shared/Views/TerminalView.swift @@ -15,6 +15,8 @@ private let maxItemSize: Int = 50000 struct TerminalView: View { @EnvironmentObject var chatModel: ChatModel + @AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false + @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false @State var composeState: ComposeState = ComposeState() @FocusState private var keyboardVisible: Bool @State var authorized = !UserDefaults.standard.bool(forKey: DEFAULT_PERFORM_LA) @@ -103,11 +105,19 @@ struct TerminalView: View { func sendMessage() { let cmd = ChatCommand.string(composeState.message) - DispatchQueue.global().async { - Task { - composeState.inProgress = true - _ = await chatSendCmd(cmd) - composeState.inProgress = false + if composeState.message.starts(with: "/sql") && (!prefPerformLA || !developerTools) { + let resp = ChatResponse.chatCmdError(chatError: ChatError.error(errorType: ChatErrorType.commandError(message: "Failed reading: empty"))) + DispatchQueue.main.async { + ChatModel.shared.terminalItems.append(.cmd(.now, cmd)) + ChatModel.shared.terminalItems.append(.resp(.now, resp)) + } + } else { + DispatchQueue.global().async { + Task { + composeState.inProgress = true + _ = await chatSendCmd(cmd) + composeState.inProgress = false + } } } composeState = ComposeState()