From 7324bf85e58eb0b5d06398cb22b444987e82e441 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Thu, 15 Apr 2021 10:33:20 +0300 Subject: [PATCH] Management: Respect `changeInfo` and `inviteUsers` permissions (#1006) --- src/components/right/ChatExtra.tsx | 17 +++++++++++++---- .../right/management/ManageChannel.tsx | 16 +++++++++++++--- src/components/right/management/ManageGroup.tsx | 14 ++++++++++++-- src/components/ui/AvatarEditable.scss | 8 ++++++++ 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/components/right/ChatExtra.tsx b/src/components/right/ChatExtra.tsx index 31a0c52ff..48793d7f1 100644 --- a/src/components/right/ChatExtra.tsx +++ b/src/components/right/ChatExtra.tsx @@ -4,7 +4,9 @@ import { withGlobal } from '../../lib/teact/teactn'; import { ApiChat } from '../../api/types'; import { selectChat } from '../../modules/selectors'; -import { getChatDescription, getChatLink } from '../../modules/helpers'; +import { + getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isUserRightBanned, +} from '../../modules/helpers'; import renderText from '../common/helpers/renderText'; import useLang from '../../hooks/useLang'; @@ -16,9 +18,10 @@ type OwnProps = { type StateProps = { chat?: ApiChat; + canInviteUsers?: boolean; }; -const ChatExtra: FC = ({ chat }) => { +const ChatExtra: FC = ({ chat, canInviteUsers }) => { const lang = useLang(); if (!chat || chat.isRestricted) { @@ -40,7 +43,7 @@ const ChatExtra: FC = ({ chat }) => { )} - {!!link.length && ( + {canInviteUsers && !!link.length && (
@@ -57,6 +60,12 @@ export default memo(withGlobal( (global, { chatId }): StateProps => { const chat = selectChat(global, chatId); - return { chat }; + + const canInviteUsers = chat && ( + (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers')) + || getHasAdminRight(chat, 'inviteUsers') + ); + + return { chat, canInviteUsers }; }, )(ChatExtra)); diff --git a/src/components/right/management/ManageChannel.tsx b/src/components/right/management/ManageChannel.tsx index a916e2747..7380ff0da 100644 --- a/src/components/right/management/ManageChannel.tsx +++ b/src/components/right/management/ManageChannel.tsx @@ -9,7 +9,7 @@ import { ManagementScreens, ManagementProgress } from '../../../types'; import { ApiChat, ApiMediaFormat } from '../../../api/types'; import { pick } from '../../../util/iteratees'; -import { getChatAvatarHash } from '../../../modules/helpers'; +import { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers'; import useMedia from '../../../hooks/useMedia'; import useLang from '../../../hooks/useLang'; import { selectChat } from '../../../modules/selectors'; @@ -34,6 +34,7 @@ type StateProps = { chat: ApiChat; progress?: ManagementProgress; isSignaturesShown: boolean; + canChangeInfo?: boolean; }; type DispatchProps = Pick = ({ chat, progress, isSignaturesShown, + canChangeInfo, onScreenSelect, updateChat, toggleSignatures, @@ -156,6 +158,7 @@ const ManageChannel: FC = ({ = ({ onChange={handleTitleChange} value={title} error={error === CHANNEL_TITLE_EMPTY ? error : undefined} + disabled={!canChangeInfo} /> = ({ label={lang('DescriptionPlaceholder')} onChange={handleAboutChange} value={about} + disabled={!canChangeInfo} /> {chat.isCreator && ( @@ -179,7 +184,7 @@ const ManageChannel: FC = ({
)} - +
{lang('Discussion')} {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')} @@ -243,7 +248,12 @@ export default memo(withGlobal( const { progress } = global.management; const isSignaturesShown = Boolean(chat && chat.isSignaturesShown); - return { chat, progress, isSignaturesShown }; + return { + chat, + progress, + isSignaturesShown, + canChangeInfo: getHasAdminRight(chat, 'changeInfo'), + }; }, (setGlobal, actions): DispatchProps => pick(actions, [ 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat', diff --git a/src/components/right/management/ManageGroup.tsx b/src/components/right/management/ManageGroup.tsx index 60e0bffd5..c027dd04d 100644 --- a/src/components/right/management/ManageGroup.tsx +++ b/src/components/right/management/ManageGroup.tsx @@ -8,7 +8,7 @@ import { ManagementScreens, ManagementProgress } from '../../../types'; import { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types'; import { GlobalActions } from '../../../global/types'; -import { getChatAvatarHash, isChatBasicGroup } from '../../../modules/helpers'; +import { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers'; import useMedia from '../../../hooks/useMedia'; import useLang from '../../../hooks/useLang'; import useFlag from '../../../hooks/useFlag'; @@ -37,6 +37,8 @@ type StateProps = { progress?: ManagementProgress; isBasicGroup: boolean; hasLinkedChannel: boolean; + canChangeInfo?: boolean; + canBanUsers?: boolean; }; type DispatchProps = Pick = ({ progress, isBasicGroup, hasLinkedChannel, + canChangeInfo, + canBanUsers, onScreenSelect, togglePreHistoryHidden, updateChat, @@ -205,6 +209,7 @@ const ManageGroup: FC = ({ = ({ onChange={handleTitleChange} value={title} error={error === GROUP_TITLE_EMPTY ? error : undefined} + disabled={!canChangeInfo} /> = ({ label={lang('DescriptionPlaceholder')} onChange={handleAboutChange} value={about} + disabled={!canChangeInfo} /> {chat.isCreator && ( @@ -236,7 +243,7 @@ const ManageGroup: FC = ({
)} - +
{lang('ChannelPermissions')} {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT} @@ -263,6 +270,7 @@ const ManageGroup: FC = ({ checked={!chat.fullInfo.isPreHistoryHidden} label={lang('ChatHistory')} onChange={handleTogglePreHistory} + disabled={!canBanUsers} />
)} @@ -313,6 +321,8 @@ export default memo(withGlobal( progress, isBasicGroup: isChatBasicGroup(chat), hasLinkedChannel, + canChangeInfo: getHasAdminRight(chat, 'changeInfo'), + canBanUsers: getHasAdminRight(chat, 'banUsers'), }; }, (setGlobal, actions): DispatchProps => pick(actions, [ diff --git a/src/components/ui/AvatarEditable.scss b/src/components/ui/AvatarEditable.scss index c4ed3a652..e8f7266e7 100644 --- a/src/components/ui/AvatarEditable.scss +++ b/src/components/ui/AvatarEditable.scss @@ -71,6 +71,14 @@ &.disabled { pointer-events: none; + + i { + display: none; + } + + &::after { + display: none; + } } } }