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")
]
}
}