core, kotlin: open support chat with any member (#5904)

This commit is contained in:
spaced4ndy authored and GitHub committed 2025-05-13 16:29:47 +00:00
1 parent b81e5b13b3
commit e29a9371b6
4 files changed
+31 -14

No files matched your search

@@ -483,7 +483,10 @@ fun ModalData.GroupChatInfoLayout(
}
}
}
if (groupInfo.membership.supportChat != null) {
if (
groupInfo.membership.memberActive &&
(groupInfo.membership.memberRole < GroupMemberRole.Moderator || groupInfo.membership.supportChat != null)
) {
anyTopSectionRowShow = true
UserSupportChatButton(groupInfo, scrollToItemId)
}
@@ -439,10 +439,11 @@ fun GroupMemberInfoLayout(
if (member.memberActive) {
SectionView {
// TODO [knocking] allow creating support chat with members that don't have it (currently doesn't work)
// groupInfo.membership.memberRole >= GroupMemberRole.Moderator &&
// (member.memberRole <= GroupMemberRole.Moderator || member.supportChat != null)
if (groupInfo.membership.memberRole >= GroupMemberRole.Moderator && member.supportChat != null) {
if (
groupInfo.membership.memberRole >= GroupMemberRole.Moderator &&
member.memberActive &&
(member.memberRole < GroupMemberRole.Moderator || member.supportChat != null)
) {
SupportChatButton()
}
if (connectionCode != null) {
+20 -6
View File
@@ -150,7 +150,7 @@ import Data.List.NonEmpty (NonEmpty)
import qualified Data.List.NonEmpty as L
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
import Data.Maybe (catMaybes, fromMaybe, isJust, mapMaybe)
import Data.Maybe (catMaybes, fromMaybe, isJust, isNothing, mapMaybe)
import Data.Ord (Down (..), comparing)
import Data.Text (Text)
import qualified Data.Text as T
@@ -1352,7 +1352,7 @@ getGroupChat :: DB.Connection -> VersionRangeChat -> User -> Int64 -> Maybe Grou
getGroupChat db vr user groupId scope_ contentFilter pagination search_ = do
let search = fromMaybe "" search_
g <- getGroupInfo db vr user groupId
scopeInfo <- mapM (getGroupChatScopeInfo db vr user g) scope_
scopeInfo <- mapM (getCreateGroupChatScopeInfo db vr user g) scope_
case pagination of
CPLast count -> (,Nothing) <$> getGroupChatLast_ db user g scopeInfo contentFilter count search emptyChatStats
CPAfter afterId count -> (,Nothing) <$> getGroupChatAfter_ db user g scopeInfo contentFilter afterId count search
@@ -1362,6 +1362,24 @@ getGroupChat db vr user groupId scope_ contentFilter pagination search_ = do
unless (null search) $ throwError $ SEInternalError "initial chat pagination doesn't support search"
getGroupChatInitial_ db user g scopeInfo contentFilter count
getCreateGroupChatScopeInfo :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> GroupChatScope -> ExceptT StoreError IO GroupChatScopeInfo
getCreateGroupChatScopeInfo db vr user GroupInfo {membership} = \case
GCSMemberSupport Nothing -> do
when (isNothing $ supportChat membership) $ do
ts <- liftIO getCurrentTime
liftIO $ setSupportChatTs db (groupMemberId' membership) ts
pure $ GCSIMemberSupport {groupMember_ = Nothing}
GCSMemberSupport (Just gmId) -> do
m <- getGroupMemberById db vr user gmId
when (isNothing $ supportChat m) $ do
ts <- liftIO getCurrentTime
liftIO $ setSupportChatTs db gmId ts
pure GCSIMemberSupport {groupMember_ = Just m}
getGroupChatScopeInfoForItem :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> ChatItemId -> ExceptT StoreError IO (Maybe GroupChatScopeInfo)
getGroupChatScopeInfoForItem db vr user g itemId =
getGroupChatScopeForItem_ db itemId >>= mapM (getGroupChatScopeInfo db vr user g)
getGroupChatScopeInfo :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> GroupChatScope -> ExceptT StoreError IO GroupChatScopeInfo
getGroupChatScopeInfo db vr user GroupInfo {membership} = \case
GCSMemberSupport Nothing -> case supportChat membership of
@@ -1373,10 +1391,6 @@ getGroupChatScopeInfo db vr user GroupInfo {membership} = \case
Nothing -> throwError $ SEInternalError "no support chat"
Just _supportChat -> pure GCSIMemberSupport {groupMember_ = Just m}
getGroupChatScopeInfoForItem :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> ChatItemId -> ExceptT StoreError IO (Maybe GroupChatScopeInfo)
getGroupChatScopeInfoForItem db vr user g itemId =
getGroupChatScopeForItem_ db itemId >>= mapM (getGroupChatScopeInfo db vr user g)
getGroupChatScopeForItem_ :: DB.Connection -> ChatItemId -> ExceptT StoreError IO (Maybe GroupChatScope)
getGroupChatScopeForItem_ db itemId =
ExceptT . firstRow toScope (SEChatItemNotFound itemId) $
+2 -3
View File
@@ -6969,8 +6969,7 @@ testScopedSupportManyModerators =
dan #$> ("/_get chat #1 count=3", chat, [(0, "connected"), (0, "1"), (0, "2")])
dan #$> ("/_get chat #1(_support:3) count=100", chat, [(0, "3"), (0, "4"), (1, "5")])
cath #$> ("/_get chat #1 count=3", chat, [(0, "connected"), (0, "1"), (0, "2")])
cath ##> "/_get chat #1(_support:3) count=100"
cath <## "chat db error: SEInternalError {message = \"no support chat\"}"
cath #$> ("/_get chat #1(_support:3) count=100", chat, [])
alice ##> "/member support chats #team"
alice <## "bob (Bob) (id 2): unread: 0, require attention: 0, mentions: 0"
@@ -6979,7 +6978,7 @@ testScopedSupportManyModerators =
bob ##> "/member support chats #team"
bob <## "support: unread: 0, require attention: 0, mentions: 0"
cath ##> "/member support chats #team"
cath <// 50000
cath <## "bob (Bob) (id 3): unread: 0, require attention: 0, mentions: 0"
testScopedSupportUnreadStats :: HasCallStack => TestParams -> IO ()
testScopedSupportUnreadStats =