diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatItemInfoView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatItemInfoView.kt index 1b69f5c4c..8ef98933d 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatItemInfoView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ChatItemInfoView.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.simplex.app.R @@ -38,17 +39,30 @@ fun ChatItemInfoView(ci: ChatItem, ciInfo: ChatItemInfo, devTools: Boolean) { fun ItemVersionView(ciVersion: ChatItemVersion, current: Boolean) { val showMenu = remember { mutableStateOf(false) } val text = ciVersion.msgContent.text + + @Composable + fun VersionText() { + if (text != "") { + MarkdownText( + text, if (text.isEmpty()) emptyList() else ciVersion.formattedText, + linkMode = SimplexLinkMode.DESCRIPTION, uriHandler = uriHandler, + onLinkLongClick = { showMenu.value = true } + ) + } else { + Text( + generalGetString(R.string.item_info_no_text), + style = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.secondary, lineHeight = 22.sp, fontStyle = FontStyle.Italic) + ) + } + } + Column { Box( Modifier.clip(RoundedCornerShape(18.dp)).background(itemColor).padding(bottom = 3.dp) .combinedClickable(onLongClick = { showMenu.value = true }, onClick = {}) ) { Box(Modifier.padding(vertical = 6.dp, horizontal = 12.dp)) { - MarkdownText( - text, if (text.isEmpty()) emptyList() else ciVersion.formattedText, - linkMode = SimplexLinkMode.DESCRIPTION, uriHandler = uriHandler, - onLinkLongClick = { showMenu.value = true } - ) + VersionText() } } Row(Modifier.padding(start = 12.dp, top = 3.dp, bottom = 16.dp)) { @@ -66,15 +80,17 @@ fun ChatItemInfoView(ci: ChatItem, ciInfo: ChatItemInfo, devTools: Boolean) { ) } } - DefaultDropdownMenu(showMenu) { - ItemAction(stringResource(R.string.share_verb), painterResource(R.drawable.ic_share), onClick = { - shareText(context, text) - showMenu.value = false - }) - ItemAction(stringResource(R.string.copy_verb), painterResource(R.drawable.ic_content_copy), onClick = { - copyText(context, text) - showMenu.value = false - }) + if (text != "") { + DefaultDropdownMenu(showMenu) { + ItemAction(stringResource(R.string.share_verb), painterResource(R.drawable.ic_share), onClick = { + shareText(context, text) + showMenu.value = false + }) + ItemAction(stringResource(R.string.copy_verb), painterResource(R.drawable.ic_content_copy), onClick = { + copyText(context, text) + showMenu.value = false + }) + } } } } @@ -162,7 +178,8 @@ fun itemInfoShareText(ci: ChatItem, chatItemInfo: ChatItemInfo, devTools: Boolea localTimestamp(itemVersion.itemVersionTs) } ) - shareText.add(itemVersion.msgContent.text) + val t = itemVersion.msgContent.text + shareText.add(if (t != "") t else generalGetString(R.string.item_info_no_text)) } } return shareText.joinToString(separator = "\n") diff --git a/apps/android/app/src/main/res/values/strings.xml b/apps/android/app/src/main/res/values/strings.xml index 325f74656..6c6be6e76 100644 --- a/apps/android/app/src/main/res/values/strings.xml +++ b/apps/android/app/src/main/res/values/strings.xml @@ -1131,6 +1131,7 @@ Disappears at: %s (current) "%s (current)" + no text Remove member diff --git a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift index ce7f3e21f..d6d33c4a1 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift @@ -16,19 +16,15 @@ struct ChatItemInfoView: View { @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false var body: some View { - if let chatItemInfo = chatItemInfo { - NavigationView { - itemInfoView(chatItemInfo) - .toolbar { - ToolbarItem(placement: .navigationBarTrailing) { - Button { showShareSheet(items: [itemInfoShareText(chatItemInfo)]) } label: { - Image(systemName: "square.and.arrow.up") - } + NavigationView { + itemInfoView() + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button { showShareSheet(items: [itemInfoShareText()]) } label: { + Image(systemName: "square.and.arrow.up") } } - } - } else { - Text("No message details") + } } } @@ -38,7 +34,7 @@ struct ChatItemInfoView: View { : NSLocalizedString("Received message", comment: "message info title") } - @ViewBuilder private func itemInfoView(_ chatItemInfo: ChatItemInfo) -> some View { + @ViewBuilder private func itemInfoView() -> some View { let meta = ci.meta GeometryReader { g in ScrollView { @@ -72,7 +68,8 @@ struct ChatItemInfoView: View { infoRow("Record updated at", localTimestamp(meta.updatedAt)) } - if !chatItemInfo.itemVersions.isEmpty { + if let chatItemInfo = chatItemInfo, + !chatItemInfo.itemVersions.isEmpty { Divider().padding(.vertical) Text("History") @@ -93,22 +90,24 @@ struct ChatItemInfoView: View { @ViewBuilder private func itemVersionView(_ itemVersion: ChatItemVersion, _ maxWidth: CGFloat, current: Bool) -> some View { VStack(alignment: .leading, spacing: 4) { - messageText(itemVersion.msgContent.text, itemVersion.formattedText, nil) + versionText(itemVersion) .allowsHitTesting(false) .padding(.horizontal, 12) .padding(.vertical, 6) .background(chatItemFrameColor(ci, colorScheme)) .cornerRadius(18) .contextMenu { - Button { - showShareSheet(items: [itemVersion.msgContent.text]) - } label: { - Label("Share", systemImage: "square.and.arrow.up") - } - Button { - UIPasteboard.general.string = itemVersion.msgContent.text - } label: { - Label("Copy", systemImage: "doc.on.doc") + if itemVersion.msgContent.text != "" { + Button { + showShareSheet(items: [itemVersion.msgContent.text]) + } label: { + Label("Share", systemImage: "square.and.arrow.up") + } + Button { + UIPasteboard.general.string = itemVersion.msgContent.text + } label: { + Label("Copy", systemImage: "doc.on.doc") + } } } let ts = localTimestamp(itemVersion.itemVersionTs) @@ -120,7 +119,17 @@ struct ChatItemInfoView: View { .frame(maxWidth: maxWidth, alignment: .leading) } - private func itemInfoShareText(_ chatItemInfo: ChatItemInfo) -> String { + @ViewBuilder private func versionText(_ itemVersion: ChatItemVersion) -> some View { + if itemVersion.msgContent.text != "" { + messageText(itemVersion.msgContent.text, itemVersion.formattedText, nil) + } else { + Text("no text") + .italic() + .foregroundColor(.secondary) + } + } + + private func itemInfoShareText() -> String { let meta = ci.meta var shareText: [String] = [title, ""] shareText += [String.localizedStringWithFormat(NSLocalizedString("Sent at: %@", comment: "copied message info"), localTimestamp(meta.itemTs))] @@ -147,9 +156,11 @@ struct ChatItemInfoView: View { String.localizedStringWithFormat(NSLocalizedString("Record updated at: %@", comment: "copied message info"), localTimestamp(meta.updatedAt)) ] } - if !chatItemInfo.itemVersions.isEmpty { + if let chatItemInfo = chatItemInfo, + !chatItemInfo.itemVersions.isEmpty { shareText += ["", NSLocalizedString("History", comment: "copied message info")] for (index, itemVersion) in chatItemInfo.itemVersions.enumerated() { + let t = itemVersion.msgContent.text shareText += [ "", String.localizedStringWithFormat( @@ -158,7 +169,7 @@ struct ChatItemInfoView: View { : NSLocalizedString("%@:", comment: "copied message info"), localTimestamp(itemVersion.itemVersionTs) ), - itemVersion.msgContent.text + t != "" ? t : NSLocalizedString("no text", comment: "copied message info in history") ] } }