diff --git a/src/api/gramjs/apiBuilders/chats.ts b/src/api/gramjs/apiBuilders/chats.ts index 700337152..f86feeca8 100644 --- a/src/api/gramjs/apiBuilders/chats.ts +++ b/src/api/gramjs/apiBuilders/chats.ts @@ -112,10 +112,17 @@ function buildApiChatPermissions(peerEntity: GramJs.TypeUser | GramJs.TypeChat): function buildApiChatRestrictions(peerEntity: GramJs.TypeUser | GramJs.TypeChat): { isNotJoined?: boolean; + isForbidden?: boolean; isRestricted?: boolean; restrictionReason?: ApiRestrictionReason; } { - if (peerEntity instanceof GramJs.ChatForbidden || peerEntity instanceof GramJs.ChannelForbidden) { + if (peerEntity instanceof GramJs.ChatForbidden) { + return { + isForbidden: true, + }; + } + + if (peerEntity instanceof GramJs.ChannelForbidden) { return { isRestricted: true, }; @@ -139,7 +146,7 @@ function buildApiChatRestrictions(peerEntity: GramJs.TypeUser | GramJs.TypeChat) if (peerEntity instanceof GramJs.Chat) { Object.assign(restrictions, { isNotJoined: peerEntity.left, - isRestricted: peerEntity.kicked, + isForbidden: peerEntity.kicked, }); } diff --git a/src/api/gramjs/updater.ts b/src/api/gramjs/updater.ts index 211ba1b2d..7b99ec2e7 100644 --- a/src/api/gramjs/updater.ts +++ b/src/api/gramjs/updater.ts @@ -241,14 +241,10 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) { '@type': 'updateChat', id: message.chatId, chat: { - isRestricted: true, + isForbidden: true, + isNotJoined: true, }, }); - - onUpdate({ - '@type': 'updateChatLeave', - id: message.chatId, - }); } } else if (action instanceof GramJs.MessageActionChatAddUser) { // eslint-disable-next-line no-underscore-dangle diff --git a/src/api/types/chats.ts b/src/api/types/chats.ts index d6289a0b3..110b4a29a 100644 --- a/src/api/types/chats.ts +++ b/src/api/types/chats.ts @@ -42,7 +42,8 @@ export interface ApiChat { isNotJoined?: boolean; isListed?: boolean; isCreator?: boolean; - isRestricted?: boolean; + isForbidden?: boolean; // Forbidden - can't send messages (user was kicked, for example) + isRestricted?: boolean; // Restricted - can't access the chat (user was banned or chat is violating rules) restrictionReason?: ApiRestrictionReason; adminRights?: ApiChatAdminRights; currentUserBannedRights?: ApiChatBannedRights; diff --git a/src/components/middle/message/ContextMenuContainer.tsx b/src/components/middle/message/ContextMenuContainer.tsx index 1a30ff58b..e0c60e8f8 100644 --- a/src/components/middle/message/ContextMenuContainer.tsx +++ b/src/components/middle/message/ContextMenuContainer.tsx @@ -486,7 +486,7 @@ export default memo(withGlobal( canSaveGif: !isProtected && canSaveGif, activeDownloads, canShowSeenBy, - enabledReactions: chat?.fullInfo?.enabledReactions, + enabledReactions: chat?.isForbidden ? undefined : chat?.fullInfo?.enabledReactions, isPrivate, hasFullInfo: Boolean(chat?.fullInfo), canShowReactionsCount, diff --git a/src/components/right/Profile.tsx b/src/components/right/Profile.tsx index 88705fce2..f2b46a271 100644 --- a/src/components/right/Profile.tsx +++ b/src/components/right/Profile.tsx @@ -289,10 +289,12 @@ const Profile: FC = ({ function renderContent() { if (!viewportIds || !canRenderContent || !chatMessages) { const noSpinner = isFirstTab && !canRenderContent; + const forceRenderHiddenMembers = Boolean(resultType === 'members' && areMembersHidden); return (
- {!noSpinner && } + {!noSpinner && !forceRenderHiddenMembers && } + {forceRenderHiddenMembers && }
); } @@ -518,7 +520,8 @@ export default memo(withGlobal( const isChannel = chat && isChatChannel(chat); const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!)); const members = chat?.fullInfo?.members; - const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers; + const areMembersHidden = hasMembersTab && chat + && (chat.isForbidden || (chat.fullInfo && !chat.fullInfo.canViewMembers)); const canAddMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'inviteUsers') || chat.isCreator); const canDeleteMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'banUsers') || chat.isCreator); const activeDownloadIds = selectActiveDownloadIds(global, chatId); diff --git a/src/components/right/management/ManageChannel.tsx b/src/components/right/management/ManageChannel.tsx index 19b8ddbff..065281c0e 100644 --- a/src/components/right/management/ManageChannel.tsx +++ b/src/components/right/management/ManageChannel.tsx @@ -186,7 +186,7 @@ const ManageChannel: FC = ({ const enabledReactionsCount = chat.fullInfo?.enabledReactions?.length || 0; - if (chat.isRestricted) { + if (chat.isRestricted || chat.isForbidden) { return undefined; } diff --git a/src/components/right/management/ManageGroup.tsx b/src/components/right/management/ManageGroup.tsx index c595f8c11..723fc38eb 100644 --- a/src/components/right/management/ManageGroup.tsx +++ b/src/components/right/management/ManageGroup.tsx @@ -234,7 +234,7 @@ const ManageGroup: FC = ({ closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, deleteChat, openChat, ]); - if (chat.isRestricted) { + if (chat.isRestricted || chat.isForbidden) { return undefined; } diff --git a/src/global/actions/api/calls.async.ts b/src/global/actions/api/calls.async.ts index 43e23cdca..1cfb8c894 100644 --- a/src/global/actions/api/calls.async.ts +++ b/src/global/actions/api/calls.async.ts @@ -312,6 +312,7 @@ addActionHandler('inviteToCallFallback', async (global, actions, payload) => { channel.title === fallbackChannelTitle && channel.isCreator && !channel.isRestricted + && !channel.isForbidden ); }); if (!fallbackChannel) { diff --git a/src/global/helpers/chats.ts b/src/global/helpers/chats.ts index bc124f81a..39a5e4593 100644 --- a/src/global/helpers/chats.ts +++ b/src/global/helpers/chats.ts @@ -141,7 +141,7 @@ export function getCanPostInChat(chat: ApiChat, threadId: number) { return true; } - if (chat.isRestricted || chat.migratedTo || chat.isNotJoined || isChatWithRepliesBot(chat.id)) { + if (chat.isRestricted || chat.isForbidden || chat.migratedTo || chat.isNotJoined || isChatWithRepliesBot(chat.id)) { return false; } diff --git a/src/global/selectors/messages.ts b/src/global/selectors/messages.ts index 923e042d3..c6f1ea8cb 100644 --- a/src/global/selectors/messages.ts +++ b/src/global/selectors/messages.ts @@ -380,9 +380,10 @@ export function selectAllowedMessageActions(global: GlobalState, message: ApiMes ) && !isForwardedMessage(message) && !message.viaBotId + && !chat.isForbidden ); - const canReply = !isLocal && !isServiceNotification && getCanPostInChat(chat, threadId); + const canReply = !isLocal && !isServiceNotification && !chat.isForbidden && getCanPostInChat(chat, threadId); const hasPinPermission = isPrivate || ( chat.isCreator @@ -410,7 +411,7 @@ export function selectAllowedMessageActions(global: GlobalState, message: ApiMes const canReport = !isPrivate && !isOwn; - const canDeleteForAll = canDelete && ( + const canDeleteForAll = canDelete && !chat.isForbidden && ( (isPrivate && !isChatWithSelf) || (isBasicGroup && ( isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator