From c1eed474636d6397534cc9c8fd44f390fe27155b Mon Sep 17 00:00:00 2001
From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
Date: Fri, 13 May 2022 09:38:14 +0100
Subject: [PATCH 1/7] core: mark chat as read without specifying the items
range, closes #647 (#648)
* core: mark chat as read without specifying the items range, closes #647
* moar tests
---
src/Simplex/Chat.hs | 2 +-
src/Simplex/Chat/Controller.hs | 2 +-
src/Simplex/Chat/Store.hs | 56 +++++++++++++++++++++++-----------
tests/ChatTests.hs | 5 +++
4 files changed, 45 insertions(+), 20 deletions(-)
diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs
index bbc8000c28..bc8716891a 100644
--- a/src/Simplex/Chat.hs
+++ b/src/Simplex/Chat.hs
@@ -2122,7 +2122,7 @@ chatCommandP =
<|> "/_send " *> (APISendMessage <$> chatRefP <*> (" json " *> jsonP <|> " text " *> (ComposedMessage Nothing Nothing <$> mcTextP)))
<|> "/_update item " *> (APIUpdateChatItem <$> chatRefP <* A.space <*> A.decimal <* A.space <*> msgContentP)
<|> "/_delete item " *> (APIDeleteChatItem <$> chatRefP <* A.space <*> A.decimal <* A.space <*> ciDeleteMode)
- <|> "/_read chat " *> (APIChatRead <$> chatRefP <* A.space <*> ((,) <$> ("from=" *> A.decimal) <* A.space <*> ("to=" *> A.decimal)))
+ <|> "/_read chat " *> (APIChatRead <$> chatRefP <*> optional (A.space *> ((,) <$> ("from=" *> A.decimal) <* A.space <*> ("to=" *> A.decimal))))
<|> "/_delete " *> (APIDeleteChat <$> chatRefP)
<|> "/_accept " *> (APIAcceptContact <$> A.decimal)
<|> "/_reject " *> (APIRejectContact <$> A.decimal)
diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs
index 9eca5c606a..1de9da5371 100644
--- a/src/Simplex/Chat/Controller.hs
+++ b/src/Simplex/Chat/Controller.hs
@@ -107,7 +107,7 @@ data ChatCommand
| APISendMessage ChatRef ComposedMessage
| APIUpdateChatItem ChatRef ChatItemId MsgContent
| APIDeleteChatItem ChatRef ChatItemId CIDeleteMode
- | APIChatRead ChatRef (ChatItemId, ChatItemId)
+ | APIChatRead ChatRef (Maybe (ChatItemId, ChatItemId))
| APIDeleteChat ChatRef
| APIAcceptContact Int64
| APIRejectContact Int64
diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs
index c08406646a..f8a0cebc02 100644
--- a/src/Simplex/Chat/Store.hs
+++ b/src/Simplex/Chat/Store.hs
@@ -3562,29 +3562,49 @@ toChatItemRef = \case
(itemId, Nothing, Just groupId) -> Right (itemId, ChatRef CTGroup groupId)
(itemId, _, _) -> Left $ SEBadChatItem itemId
-updateDirectChatItemsRead :: (StoreMonad m) => SQLiteStore -> Int64 -> (ChatItemId, ChatItemId) -> m ()
-updateDirectChatItemsRead st contactId (fromItemId, toItemId) = do
+updateDirectChatItemsRead :: (StoreMonad m) => SQLiteStore -> Int64 -> Maybe (ChatItemId, ChatItemId) -> m ()
+updateDirectChatItemsRead st contactId itemsRange_ = do
currentTs <- liftIO getCurrentTime
liftIO . withTransaction st $ \db ->
- DB.execute
- db
- [sql|
- UPDATE chat_items SET item_status = ?, updated_at = ?
- WHERE contact_id = ? AND chat_item_id >= ? AND chat_item_id <= ? AND item_status = ?
- |]
- (CISRcvRead, currentTs, contactId, fromItemId, toItemId, CISRcvNew)
+ case itemsRange_ of
+ Just (fromItemId, toItemId) ->
+ DB.execute
+ db
+ [sql|
+ UPDATE chat_items SET item_status = ?, updated_at = ?
+ WHERE contact_id = ? AND chat_item_id >= ? AND chat_item_id <= ? AND item_status = ?
+ |]
+ (CISRcvRead, currentTs, contactId, fromItemId, toItemId, CISRcvNew)
+ _ ->
+ DB.execute
+ db
+ [sql|
+ UPDATE chat_items SET item_status = ?, updated_at = ?
+ WHERE contact_id = ? AND item_status = ?
+ |]
+ (CISRcvRead, currentTs, contactId, CISRcvNew)
-updateGroupChatItemsRead :: (StoreMonad m) => SQLiteStore -> Int64 -> (ChatItemId, ChatItemId) -> m ()
-updateGroupChatItemsRead st groupId (fromItemId, toItemId) = do
+updateGroupChatItemsRead :: (StoreMonad m) => SQLiteStore -> Int64 -> Maybe (ChatItemId, ChatItemId) -> m ()
+updateGroupChatItemsRead st groupId itemsRange_ = do
currentTs <- liftIO getCurrentTime
liftIO . withTransaction st $ \db ->
- DB.execute
- db
- [sql|
- UPDATE chat_items SET item_status = ?, updated_at = ?
- WHERE group_id = ? AND chat_item_id >= ? AND chat_item_id <= ? AND item_status = ?
- |]
- (CISRcvRead, currentTs, groupId, fromItemId, toItemId, CISRcvNew)
+ case itemsRange_ of
+ Just (fromItemId, toItemId) ->
+ DB.execute
+ db
+ [sql|
+ UPDATE chat_items SET item_status = ?, updated_at = ?
+ WHERE group_id = ? AND chat_item_id >= ? AND chat_item_id <= ? AND item_status = ?
+ |]
+ (CISRcvRead, currentTs, groupId, fromItemId, toItemId, CISRcvNew)
+ _ ->
+ DB.execute
+ db
+ [sql|
+ UPDATE chat_items SET item_status = ?, updated_at = ?
+ WHERE group_id = ? AND item_status = ?
+ |]
+ (CISRcvRead, currentTs, groupId, CISRcvNew)
type ChatStatsRow = (Int, ChatItemId)
diff --git a/tests/ChatTests.hs b/tests/ChatTests.hs
index 9a6f0b7be8..f3ad49831c 100644
--- a/tests/ChatTests.hs
+++ b/tests/ChatTests.hs
@@ -152,6 +152,8 @@ testAddContact =
-- read messages
alice #$> ("/_read chat @2 from=1 to=100", id, "ok")
bob #$> ("/_read chat @2 from=1 to=100", id, "ok")
+ alice #$> ("/_read chat @2", id, "ok")
+ bob #$> ("/_read chat @2", id, "ok")
testDirectMessageQuotedReply :: IO ()
testDirectMessageQuotedReply =
@@ -383,6 +385,9 @@ testGroup =
alice #$> ("/_read chat #1 from=1 to=100", id, "ok")
bob #$> ("/_read chat #1 from=1 to=100", id, "ok")
cath #$> ("/_read chat #1 from=1 to=100", id, "ok")
+ alice #$> ("/_read chat #1", id, "ok")
+ bob #$> ("/_read chat #1", id, "ok")
+ cath #$> ("/_read chat #1", id, "ok")
testGroup2 :: IO ()
testGroup2 =
From 9f5ea4967673c3fd5031ae34a742b238e7c9a120 Mon Sep 17 00:00:00 2001
From: JRoberts <8711996+jr-simplex@users.noreply.github.com>
Date: Fri, 13 May 2022 12:57:30 +0400
Subject: [PATCH 2/7] mobile: show markdown in quotes and context items; ios:
fix markdown help (#649)
---
.../simplex/app/views/chat/ContextItemView.kt | 21 ++++---------------
.../app/views/chat/item/FramedItemView.kt | 2 +-
.../Views/Chat/ChatItem/FramedItemView.swift | 5 +++--
.../Views/Chat/ChatItem/MsgContentView.swift | 6 +++---
.../Chat/ComposeMessage/ContextItemView.swift | 15 ++++++-------
.../en.xcloc/Localized Contents/en.xliff | 8 +++----
apps/ios/en.lproj/Localizable.strings | 12 +++++++++++
7 files changed, 33 insertions(+), 36 deletions(-)
diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ContextItemView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ContextItemView.kt
index 2b969b1ee5..00e5ab894f 100644
--- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ContextItemView.kt
+++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ContextItemView.kt
@@ -11,8 +11,6 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.text.buildAnnotatedString
-import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import chat.simplex.app.R
@@ -52,7 +50,10 @@ fun ContextItemView(
contentDescription = stringResource(R.string.icon_descr_context),
tint = HighOrLowlight,
)
- ContextItemText(contextItem)
+ MarkdownText(
+ contextItem.text, contextItem.formattedText,
+ sender = contextItem.memberDisplayName, senderBold = true, maxLines = 3
+ )
}
IconButton(onClick = cancelContextItem) {
Icon(
@@ -65,20 +66,6 @@ fun ContextItemView(
}
}
-@Composable
-private fun ContextItemText(cxtItem: ChatItem) {
- val member = cxtItem.memberDisplayName
- if (member == null) {
- Text(cxtItem.text, maxLines = 3)
- } else {
- val annotatedText = buildAnnotatedString {
- withStyle(boldFont) { append(member) }
- append(": ${cxtItem.text}")
- }
- Text(annotatedText, maxLines = 3)
- }
-}
-
@Preview
@Composable
fun PreviewContextItemView() {
diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/item/FramedItemView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/item/FramedItemView.kt
index bf59756968..2ebd299f92 100644
--- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/item/FramedItemView.kt
+++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/item/FramedItemView.kt
@@ -50,7 +50,7 @@ fun FramedItemView(
contentAlignment = Alignment.TopStart
) {
MarkdownText(
- qi.text, sender = qi.sender(user), senderBold = true, maxLines = 3,
+ qi.text, qi.formattedText, sender = qi.sender(user), senderBold = true, maxLines = 3,
style = TextStyle(fontSize = 15.sp, color = MaterialTheme.colors.onSurface)
)
}
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
index 80aa7dd830..e720ab7416 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
@@ -139,7 +139,7 @@ struct FramedItemView: View {
@ViewBuilder private func ciMsgContentView(_ ci: ChatItem, _ showMember: Bool = false) -> some View {
let v = MsgContentView(
- content: ci.content,
+ text: ci.text,
formattedText: ci.formattedText,
sender: showMember ? ci.memberDisplayName : nil,
metaText: ci.timestampText,
@@ -168,7 +168,8 @@ private struct MetaColorPreferenceKey: PreferenceKey {
private func ciQuotedMsgView(_ qi: CIQuote) -> some View {
MsgContentView(
- content: qi,
+ text: qi.text,
+ formattedText: qi.formattedText,
sender: qi.getSender(ChatModel.shared.currentUser)
)
.lineLimit(3)
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift b/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift
index 52b4d806f8..b0b9928c98 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift
@@ -12,14 +12,14 @@ private let uiLinkColor = UIColor(red: 0, green: 0.533, blue: 1, alpha: 1)
private let linkColor = Color(uiColor: uiLinkColor)
struct MsgContentView: View {
- var content: ItemContent
+ var text: String
var formattedText: [FormattedText]? = nil
var sender: String? = nil
var metaText: Text? = nil
var edited = false
var body: some View {
- let v = messageText(content.text, formattedText, sender)
+ let v = messageText(text, formattedText, sender)
if let mt = metaText {
return v + reserveSpaceForMeta(mt, edited)
} else {
@@ -90,7 +90,7 @@ struct MsgContentView_Previews: PreviewProvider {
static var previews: some View {
let chatItem = ChatItem.getSample(1, .directSnd, .now, "hello")
return MsgContentView(
- content: chatItem.content,
+ text: chatItem.text,
formattedText: chatItem.formattedText,
sender: chatItem.memberDisplayName,
metaText: chatItem.timestampText
diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift
index e59d7bfeef..c1245633c3 100644
--- a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift
+++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift
@@ -21,7 +21,12 @@ struct ContextItemView: View {
.aspectRatio(contentMode: .fit)
.frame(width: 16, height: 16)
.foregroundColor(.secondary)
- contextText(contextItem).lineLimit(3)
+ MsgContentView(
+ text: contextItem.text,
+ formattedText: contextItem.formattedText,
+ sender: contextItem.memberDisplayName
+ )
+ .lineLimit(3)
Spacer()
Button {
withAnimation {
@@ -37,14 +42,6 @@ struct ContextItemView: View {
.background(chatItemFrameColor(contextItem, colorScheme))
.padding(.top, 8)
}
-
- func contextText(_ cxtItem: ChatItem) -> some View {
- if let s = cxtItem.memberDisplayName {
- return (Text(s).fontWeight(.medium) + Text(": \(cxtItem.text)"))
- } else {
- return Text(cxtItem.text)
- }
- }
}
struct ContextItemView_Previews: PreviewProvider {
diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
index f4bd247669..06cf5fea4e 100644
--- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
+++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
@@ -77,7 +77,7 @@
*bold*
- *bold*
+ \*bold*
No comment provided by engineer.
@@ -1030,12 +1030,12 @@ SimpleX servers cannot see your profile.
_italic_
- _italic_
+ \_italic_
No comment provided by engineer.
`a + b`
- `a + b`
+ \`a + b`
No comment provided by engineer.
@@ -1201,7 +1201,7 @@ SimpleX servers cannot see your profile.
~strike~
- ~strike~
+ \~strike~
No comment provided by engineer.