mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-10-22 21:52:28 +00:00
core, ui: update member support chats list from events instead of reloading all members
This commit is contained in:
1 parent
93910b80e9
commit
84ed5a9a2b
14 files changed
+118
-58
No files matched your search
@@ -1311,12 +1311,12 @@ processChatCommand cxt nm = \case
|
||||
gInfo <- getGroupInfo db cxt user chatId
|
||||
pure (user, gInfo)
|
||||
chatScopeInfo <- mapM (getChatScopeInfo cxt user) scope
|
||||
(timedItems, gInfo') <- withFastStore $ \db -> do
|
||||
(timedItems, gInfo') <- updateGroupChatItemsReadList db cxt user gInfo chatScopeInfo itemIds
|
||||
(timedItems, gInfo', chatScopeInfo') <- withFastStore $ \db -> do
|
||||
(timedItems, gInfo', chatScopeInfo') <- updateGroupChatItemsReadList db cxt user gInfo chatScopeInfo itemIds
|
||||
timedItems' <- liftIO $ setGroupChatItemsDeleteAt db user chatId timedItems =<< getCurrentTime
|
||||
pure (timedItems', gInfo')
|
||||
pure (timedItems', gInfo', chatScopeInfo')
|
||||
forM_ timedItems $ \(itemId, deleteAt) -> startProximateTimedItemThread user (chatRef, itemId) deleteAt
|
||||
pure $ CRItemsReadForChat user (AChatInfo SCTGroup $ GroupChat gInfo' Nothing)
|
||||
pure $ CRItemsReadForChat user (AChatInfo SCTGroup $ GroupChat gInfo' chatScopeInfo')
|
||||
CTLocal -> throwCmdError "not supported"
|
||||
CTContactRequest -> throwCmdError "not supported"
|
||||
CTContactConnection -> throwCmdError "not supported"
|
||||
|
||||
@@ -566,8 +566,8 @@ deleteGroupCIs user gInfo chatScopeInfo items byGroupMember_ deletedTs = do
|
||||
Nothing -> pure deletions
|
||||
Just scopeInfo@GCSIMemberSupport {groupMember_} -> do
|
||||
let decStats = countDeletedUnreadItems groupMember_ deletions
|
||||
gInfo' <- withFastStore' $ \db -> updateGroupScopeUnreadStats db cxt user gInfo scopeInfo decStats
|
||||
pure $ map (updateDeletionGroupInfo gInfo') deletions
|
||||
(gInfo', scopeInfo') <- withFastStore' $ \db -> updateGroupScopeUnreadStats db cxt user gInfo scopeInfo decStats
|
||||
pure $ map (updateDeletionChatInfo gInfo' scopeInfo') deletions
|
||||
pure deletions'
|
||||
where
|
||||
deleteItem :: DB.Connection -> CChatItem 'CTGroup -> IO ChatItemDeletion
|
||||
@@ -590,12 +590,18 @@ deleteGroupCIs user gInfo chatScopeInfo items byGroupMember_ deletedTs = do
|
||||
mentions' = if isACIUserMention deletedChatItem then mentions + 1 else mentions
|
||||
in (unread', unanswered', mentions')
|
||||
| otherwise = (unread, unanswered, mentions)
|
||||
updateDeletionGroupInfo :: GroupInfo -> ChatItemDeletion -> ChatItemDeletion
|
||||
updateDeletionGroupInfo gInfo' ChatItemDeletion {deletedChatItem, toChatItem} =
|
||||
updateDeletionChatInfo :: GroupInfo -> GroupChatScopeInfo -> ChatItemDeletion -> ChatItemDeletion
|
||||
updateDeletionChatInfo gInfo' scopeInfo' ChatItemDeletion {deletedChatItem, toChatItem} =
|
||||
ChatItemDeletion
|
||||
{ deletedChatItem = updateACIGroupInfo gInfo' deletedChatItem,
|
||||
toChatItem = updateACIGroupInfo gInfo' <$> toChatItem
|
||||
{ deletedChatItem = updateACIChatInfo deletedChatItem,
|
||||
toChatItem = updateACIChatInfo <$> toChatItem
|
||||
}
|
||||
where
|
||||
updateACIChatInfo :: AChatItem -> AChatItem
|
||||
updateACIChatInfo = \case
|
||||
AChatItem SCTGroup dir (GroupChat _gInfo _scopeInfo) ci ->
|
||||
AChatItem SCTGroup dir (GroupChat gInfo' (Just scopeInfo')) ci
|
||||
aci -> aci
|
||||
|
||||
updateACIGroupInfo :: GroupInfo -> AChatItem -> AChatItem
|
||||
updateACIGroupInfo gInfo' = \case
|
||||
|
||||
@@ -148,7 +148,7 @@ import Control.Monad
|
||||
import Control.Monad.Except
|
||||
import Control.Monad.IO.Class
|
||||
import Crypto.Random (ChaChaDRG)
|
||||
import Data.Bifunctor (first)
|
||||
import Data.Bifunctor (first, second)
|
||||
import Data.ByteString.Char8 (ByteString)
|
||||
import Data.Char (toLower)
|
||||
import Data.Either (fromRight, rights)
|
||||
@@ -2171,18 +2171,18 @@ getGroupUnreadTimedItems db User {userId} groupId scope =
|
||||
|]
|
||||
(userId, groupId, GCSTMemberSupport_, groupMemberId_, CISRcvNew)
|
||||
|
||||
updateGroupChatItemsReadList :: DB.Connection -> StoreCxt -> User -> GroupInfo -> Maybe GroupChatScopeInfo -> NonEmpty ChatItemId -> ExceptT StoreError IO ([(ChatItemId, Int)], GroupInfo)
|
||||
updateGroupChatItemsReadList :: DB.Connection -> StoreCxt -> User -> GroupInfo -> Maybe GroupChatScopeInfo -> NonEmpty ChatItemId -> ExceptT StoreError IO ([(ChatItemId, Int)], GroupInfo, Maybe GroupChatScopeInfo)
|
||||
updateGroupChatItemsReadList db cxt user@User {userId} g@GroupInfo {groupId} scopeInfo_ itemIds = do
|
||||
currentTs <- liftIO getCurrentTime
|
||||
-- Possible improvement is to differentiate retrieval queries for each scope,
|
||||
-- but we rely on UI to not pass item IDs from incorrect scope.
|
||||
readItemsData <- liftIO $ catMaybes . L.toList <$> mapM (getUpdateGroupItem currentTs) itemIds
|
||||
g' <- case scopeInfo_ of
|
||||
Nothing -> pure g
|
||||
(g', scopeInfo') <- case scopeInfo_ of
|
||||
Nothing -> pure (g, Nothing)
|
||||
Just scopeInfo@GCSIMemberSupport {groupMember_} -> do
|
||||
let decStats = countReadItems groupMember_ readItemsData
|
||||
liftIO $ updateGroupScopeUnreadStats db cxt user g scopeInfo decStats
|
||||
pure (timedItems readItemsData, g')
|
||||
second Just <$> liftIO (updateGroupScopeUnreadStats db cxt user g scopeInfo decStats)
|
||||
pure (timedItems readItemsData, g', scopeInfo')
|
||||
where
|
||||
getUpdateGroupItem :: UTCTime -> ChatItemId -> IO (Maybe (ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt))
|
||||
getUpdateGroupItem currentTs itemId =
|
||||
@@ -2216,20 +2216,22 @@ updateGroupChatItemsReadList db cxt user@User {userId} g@GroupInfo {groupId} sco
|
||||
addTimedItem acc (itemId, Just ttl, Nothing, _, _) = (itemId, ttl) : acc
|
||||
addTimedItem acc _ = acc
|
||||
|
||||
updateGroupScopeUnreadStats :: DB.Connection -> StoreCxt -> User -> GroupInfo -> GroupChatScopeInfo -> (Int, Int, Int) -> IO GroupInfo
|
||||
updateGroupScopeUnreadStats :: DB.Connection -> StoreCxt -> User -> GroupInfo -> GroupChatScopeInfo -> (Int, Int, Int) -> IO (GroupInfo, GroupChatScopeInfo)
|
||||
updateGroupScopeUnreadStats db cxt user g@GroupInfo {membership} scopeInfo (unread, unanswered, mentions) =
|
||||
case scopeInfo of
|
||||
GCSIMemberSupport {groupMember_} -> case groupMember_ of
|
||||
Nothing -> do
|
||||
membership' <- updateGMStats membership
|
||||
pure g {membership = membership'}
|
||||
pure (g {membership = membership'}, scopeInfo)
|
||||
Just member -> do
|
||||
member' <- updateGMStats member
|
||||
let didRequire = gmRequiresAttention member
|
||||
nowRequires = gmRequiresAttention member'
|
||||
if (not nowRequires && didRequire)
|
||||
then decreaseGroupMembersRequireAttention db user g
|
||||
else pure g
|
||||
g' <-
|
||||
if (not nowRequires && didRequire)
|
||||
then decreaseGroupMembersRequireAttention db user g
|
||||
else pure g
|
||||
pure (g', GCSIMemberSupport (Just member'))
|
||||
where
|
||||
updateGMStats m@GroupMember {groupMemberId} = do
|
||||
currentTs <- getCurrentTime
|
||||
|
||||
Reference in new issue
Block a user