Skip to content

Commit 76e6769

Browse files
committed
Fix chat permissions
Fix giveaway language string
1 parent 68b4f95 commit 76e6769

File tree

8 files changed

+95
-64
lines changed

8 files changed

+95
-64
lines changed

src/components/chat/giveaway.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ export async function onGiveawayClick(message: Message.message) {
114114
const title = i18n(
115115
isResults ? 'BoostingGiveawayHowItWorksTextEnd' : 'BoostingGiveawayHowItWorksText',
116116
[
117+
undefined,
117118
await wrapPeerTitle({peerId: giveawayPeerId}),
118119
quantity,
119120
duration

src/components/checkboxFields.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ export default class CheckboxFields<K extends CheckboxFieldsField = CheckboxFiel
6363
subtitleLangKey: info.description,
6464
clickable: info.nested ? (e) => {
6565
if(findUpAsChild(e.target as HTMLElement, row.checkboxField.label)) {
66-
row.checkboxField.checked = !row.checkboxField.checked;
66+
if(!row.checkboxField.input.disabled) {
67+
row.checkboxField.checked = !row.checkboxField.checked;
68+
}
69+
6770
return;
6871
}
6972

@@ -82,7 +85,7 @@ export default class CheckboxFields<K extends CheckboxFieldsField = CheckboxFiel
8285

8386
info.checkboxField.input.disabled = true;
8487

85-
attachClickEvent(info.row.container, (e) => {
88+
if(!info.nested) attachClickEvent(info.row.container, (e) => {
8689
toast(I18n.format(info.restrictionText, true));
8790
}, {listenerSetter: this.listenerSetter});
8891
}

src/components/sidebarRight/tabs/chatAdministrators.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import deferredPromise from '../../../helpers/cancellablePromise';
88
import {attachClickEvent} from '../../../helpers/dom/clickEvent';
99
import createParticipantContextMenu from '../../../helpers/dom/createParticipantContextMenu';
1010
import {ChannelParticipant, Chat, ChatFull, ChatParticipant} from '../../../layer';
11-
import getParticipantPeerId from '../../../lib/appManagers/utils/chats/getParticipantPeerId';
1211
import {i18n} from '../../../lib/langPack';
1312
import rootScope from '../../../lib/rootScope';
1413
import AppSelectPeers from '../../appSelectPeers';

src/components/sidebarRight/tabs/chatMembers.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export default class AppChatMembersTab extends SliderSuperTabEventable {
4242
private selector: AppSelectPeers;
4343

4444
public async init(chatId: ChatId) {
45-
const chat = await this.managers.appChatsManager.getChat(chatId);
45+
const chat = await this.managers.appChatsManager.getChat(chatId) as Chat.channel | Chat.chat;
4646
const isBroadcast = await this.managers.appChatsManager.isBroadcast(chatId);
4747
const channelFull = await this.managers.appProfileManager.getChannelFull(chatId).catch(() => undefined as ChatFull.channelFull);
4848
this.container.classList.add('edit-peer-container', 'chat-members-container');
@@ -60,7 +60,9 @@ export default class AppChatMembersTab extends SliderSuperTabEventable {
6060

6161
const participantsCount = (chat as Chat.chat).participants_count/* + (channelFull?.admins_count || 0) */;
6262
// const participantsCount = Infinity;
63-
const canHideMembers = !isBroadcast && participantsCount >= ((await this.managers.apiManager.getAppConfig()).hidden_members_group_size_min || 0);
63+
const canHideMembers = !isBroadcast &&
64+
participantsCount >= ((await this.managers.apiManager.getAppConfig()).hidden_members_group_size_min || 0) &&
65+
!!chat.admin_rights;
6466

6567
const {selector, loadPromise} = createSelectorForParticipants({
6668
appendTo: this.content,

src/components/sidebarRight/tabs/editChat.ts

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {Chat, ChatFull, ChatParticipants} from '../../../layer';
1414
import AppChatTypeTab from './chatType';
1515
import rootScope from '../../../lib/rootScope';
1616
import AppGroupPermissionsTab from './groupPermissions';
17-
import I18n, {i18n, LangPackKey} from '../../../lib/langPack';
17+
import {i18n, LangPackKey} from '../../../lib/langPack';
1818
import PopupDeleteDialog from '../../popups/deleteDialog';
1919
import {attachClickEvent} from '../../../helpers/dom/clickEvent';
2020
import toggleDisability from '../../../helpers/dom/toggleDisability';
@@ -35,7 +35,6 @@ import cancelEvent from '../../../helpers/dom/cancelEvent';
3535
import {toastNew} from '../../toast';
3636
import AppChatInviteLinksTab from './chatInviteLinks';
3737
import AppChatRequestsTab from './chatRequests';
38-
import {SliderSuperTabConstructable} from '../../sliderTab';
3938

4039
export default class AppEditChatTab extends SliderSuperTab {
4140
private chatNameInputField: InputField;
@@ -61,6 +60,9 @@ export default class AppEditChatTab extends SliderSuperTab {
6160
canManageAdmins,
6261
canChangeInfo,
6362
canDeleteChat,
63+
canPostMessages,
64+
canManageInviteLinks,
65+
canInviteUsers,
6466
appConfig,
6567
availableReactions
6668
] = await Promise.all([
@@ -74,6 +76,9 @@ export default class AppEditChatTab extends SliderSuperTab {
7476
this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions'),
7577
this.managers.appChatsManager.hasRights(this.chatId, 'change_info'),
7678
this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat'),
79+
this.managers.appChatsManager.hasRights(this.chatId, 'post_messages'),
80+
this.managers.appChatsManager.hasRights(this.chatId, 'invite_links'),
81+
this.managers.appChatsManager.hasRights(this.chatId, 'invite_users'),
7782
this.managers.apiManager.getAppConfig(),
7883
this.managers.appReactionsManager.getAvailableReactions()
7984
]);
@@ -102,6 +107,7 @@ export default class AppEditChatTab extends SliderSuperTab {
102107
});
103108

104109
const peerId = this.chatId.toPeerId(true);
110+
const isAdmin = !!chat.admin_rights;
105111

106112
{
107113
const section = new SettingSection({noDelimiter: true, caption: 'PeerInfo.SetAboutDescription'});
@@ -114,13 +120,15 @@ export default class AppEditChatTab extends SliderSuperTab {
114120
label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',
115121
name: 'chat-name',
116122
maxLength: 255,
117-
required: true
123+
required: true,
124+
canBeEdited: canChangeInfo
118125
});
119126
this.descriptionInputField = new InputField({
120127
label: 'DescriptionPlaceholder',
121128
name: 'chat-description',
122129
maxLength: 255,
123-
withLinebreaks: true
130+
withLinebreaks: true,
131+
canBeEdited: canChangeInfo
124132
});
125133

126134
this.chatNameInputField.setOriginalValue(chat.title);
@@ -139,6 +147,12 @@ export default class AppEditChatTab extends SliderSuperTab {
139147
});
140148
this.content.append(this.editPeer.nextBtn);
141149

150+
if(!canChangeInfo) {
151+
this.editPeer.avatarElem.node.classList.remove('avatar-placeholder');
152+
this.editPeer.avatarEdit.container.replaceChildren(this.editPeer.avatarElem.node);
153+
this.editPeer.avatarEdit.container.classList.add('disable-hover');
154+
}
155+
142156
section.content.append(this.editPeer.avatarEdit.container, inputWrapper);
143157
this.scrollable.append(section.container);
144158
}
@@ -176,7 +190,7 @@ export default class AppEditChatTab extends SliderSuperTab {
176190
section.content.append(chatTypeRow.container);
177191
}
178192

179-
{
193+
if(canManageInviteLinks) {
180194
const inviteLinksRow = new Row({
181195
titleLangKey: 'InviteLinks',
182196
navigationTab: {
@@ -202,7 +216,7 @@ export default class AppEditChatTab extends SliderSuperTab {
202216
section.content.append(inviteLinksRow.container);
203217
}
204218

205-
{
219+
if(canInviteUsers && isAdmin) {
206220
const requestsRow = new Row({
207221
titleLangKey: isBroadcast ? 'SubscribeRequests' : 'MemberRequests',
208222
navigationTab: {
@@ -227,7 +241,8 @@ export default class AppEditChatTab extends SliderSuperTab {
227241
section.content.append(requestsRow.container);
228242
}
229243

230-
if(canChangeType || canChangePermissions) {
244+
// if(canChangeType || canChangePermissions) {
245+
if(canChangeInfo && isAdmin) {
231246
const reactionsRow = new Row({
232247
titleLangKey: 'Reactions',
233248
icon: 'reactions',
@@ -262,7 +277,44 @@ export default class AppEditChatTab extends SliderSuperTab {
262277
section.content.append(reactionsRow.container);
263278
}
264279

265-
if(canChangeType) {
280+
if(canChangePermissions && !isBroadcast) {
281+
const flags = [
282+
'send_stickers',
283+
'send_polls',
284+
'send_photos',
285+
'send_videos',
286+
'send_roundvideos',
287+
'send_audios',
288+
'send_voices',
289+
'send_docs',
290+
'send_plain',
291+
'embed_links',
292+
'invite_users',
293+
'pin_messages',
294+
'change_info'
295+
] as ChatRights[];
296+
297+
const permissionsRow = new Row({
298+
titleLangKey: 'ChannelPermissions',
299+
clickable: () => {
300+
const tab = this.slider.createTab(AppGroupPermissionsTab);
301+
tab.chatId = this.chatId;
302+
tab.open();
303+
},
304+
icon: 'permissions',
305+
listenerSetter: this.listenerSetter
306+
});
307+
308+
const setPermissionsLength = () => {
309+
permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;
310+
};
311+
312+
setPermissionsLength();
313+
addChatUpdateListener(setPermissionsLength);
314+
section.content.append(permissionsRow.container);
315+
}
316+
317+
if(canChangeInfo && isAdmin) {
266318
const discussionRow = new Row({
267319
icon: 'comments',
268320
titleLangKey: isBroadcast ? 'PeerInfo.Discussion' : 'LinkedChannel',
@@ -302,43 +354,6 @@ export default class AppEditChatTab extends SliderSuperTab {
302354
section.content.append(discussionRow.container);
303355
}
304356

305-
if(canChangePermissions && !isBroadcast) {
306-
const flags = [
307-
'send_stickers',
308-
'send_polls',
309-
'send_photos',
310-
'send_videos',
311-
'send_roundvideos',
312-
'send_audios',
313-
'send_voices',
314-
'send_docs',
315-
'send_plain',
316-
'embed_links',
317-
'invite_users',
318-
'pin_messages',
319-
'change_info'
320-
] as ChatRights[];
321-
322-
const permissionsRow = new Row({
323-
titleLangKey: 'ChannelPermissions',
324-
clickable: () => {
325-
const tab = this.slider.createTab(AppGroupPermissionsTab);
326-
tab.chatId = this.chatId;
327-
tab.open();
328-
},
329-
icon: 'permissions',
330-
listenerSetter: this.listenerSetter
331-
});
332-
333-
const setPermissionsLength = () => {
334-
permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;
335-
};
336-
337-
setPermissionsLength();
338-
addChatUpdateListener(setPermissionsLength);
339-
section.content.append(permissionsRow.container);
340-
}
341-
342357
if(canManageTopics && (chat.participants_count >= appConfig.forum_upgrade_participants_min || (chat as Chat.channel).pFlags.forum) && !isBroadcast) {
343358
const topicsRow = new Row({
344359
checkboxField: new CheckboxField({toggle: true}),
@@ -499,7 +514,7 @@ export default class AppEditChatTab extends SliderSuperTab {
499514
this.scrollable.append(section.container);
500515
}
501516

502-
if(isBroadcast && canChangeInfo) {
517+
if(isBroadcast && canPostMessages) {
503518
const section = new SettingSection({caption: 'ChannelSignMessagesInfo'});
504519
const signMessagesCheckboxField = new CheckboxField({
505520
text: 'ChannelSignMessages',

src/components/sidebarRight/tabs/removedUsers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
* https://github.com/morethanwords/tweb/blob/master/LICENSE
55
*/
66

7-
import deferredPromise from '../../../helpers/cancellablePromise';
87
import {attachClickEvent} from '../../../helpers/dom/clickEvent';
98
import createParticipantContextMenu from '../../../helpers/dom/createParticipantContextMenu';
109
import {ChannelParticipant} from '../../../layer';
@@ -72,7 +71,8 @@ export default class AppRemovedUsersTab extends SliderSuperTabEventable {
7271
});
7372

7473
section.container.firstElementChild.remove();
75-
this.selector.scrollable.firstElementChild?.remove();
74+
const hr = this.selector.scrollable.container.querySelector('.gradient-delimiter');
75+
hr?.remove();
7676
this.selector.scrollable.append(section.container, this.selector.scrollable.container.lastElementChild);
7777

7878
createParticipantContextMenu({

src/components/sidebarRight/tabs/sharedMedia.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ import I18n, {i18n} from '../../../lib/langPack';
1616
import ButtonCorner from '../../buttonCorner';
1717
import {attachClickEvent} from '../../../helpers/dom/clickEvent';
1818
import PeerProfile from '../../peerProfile';
19-
import {Message} from '../../../layer';
19+
import {Chat, Message} from '../../../layer';
2020
import getMessageThreadId from '../../../lib/appManagers/utils/messages/getMessageThreadId';
2121
import AppEditTopicTab from './editTopic';
2222
import liteMode from '../../../helpers/liteMode';
2323
import AppEditBotTab from './editBot';
2424
import addChatUsers from '../../addChatUsers';
25+
import apiManagerProxy from '../../../lib/mtproto/mtprotoworker';
2526

2627
type SharedMediaHistoryStorage = Partial<{
2728
[type in SearchSuperType]: {mid: number, peerId: PeerId}[]
@@ -485,13 +486,19 @@ export default class AppSharedMediaTab extends SliderSuperTab {
485486
}
486487

487488
private async toggleEditBtn<T extends boolean>(manual?: T): Promise<T extends true ? () => void : void> {
489+
const {peerId} = this;
488490
let show: boolean;
489-
if(this.peerId.isUser()) {
490-
show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.canEdit(this.peerId.toUserId());
491+
if(peerId.isUser()) {
492+
show = peerId !== rootScope.myId && await this.managers.appUsersManager.canEdit(peerId.toUserId());
491493
} else {
492-
const chatId = this.peerId.toChatId();
493-
const isTopic = this.threadId && await this.managers.appChatsManager.isForum(chatId);
494-
show = await this.managers.appChatsManager.hasRights(chatId, isTopic ? 'manage_topics' : 'change_info');
494+
const chatId = peerId.toChatId();
495+
const isTopic = this.threadId && apiManagerProxy.isForum(peerId);
496+
if(isTopic) {
497+
show = await this.managers.appChatsManager.hasRights(chatId, 'manage_topics');
498+
} else {
499+
const chat = apiManagerProxy.getChat(chatId);
500+
show = !!(chat as Chat.channel).admin_rights || await this.managers.appChatsManager.hasRights(chatId, 'change_info');
501+
}
495502
}
496503

497504
const callback = () => {

src/lib/appManagers/utils/chats/hasRights.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,19 +115,23 @@ export default function hasRights(
115115
return isAdmin && !!myFlags['invite_users'];
116116
}
117117

118-
case 'change_info':
119-
case 'invite_users': {
120-
return isAdmin ? !!myFlags[action] : !myFlags[action];
121-
}
122-
123118
// * only creator can do that
124119
case 'change_type':
125120
case 'delete_chat': {
126121
return false;
127122
}
128123

124+
case 'change_info':
125+
case 'invite_users': {
126+
return isAdmin || (chat as Chat.channel).pFlags.broadcast ? !!myFlags[action] : !myFlags[action];
127+
}
128+
129+
case 'delete_stories':
130+
case 'edit_stories':
131+
case 'post_stories':
129132
case 'add_admins':
130133
case 'anonymous':
134+
case 'post_messages':
131135
case 'edit_messages':
132136
case 'manage_topics': {
133137
return isAdmin && !!myFlags[action];

0 commit comments

Comments
 (0)