diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index e2e3d2eda..3acae163d 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -192,6 +192,8 @@ void SaveSlowmodeSeconds( api->registerModifyRequest(key, requestId); } +} // namespace + void ShowEditPermissions(not_null peer) { const auto box = Ui::show( Box(peer), @@ -233,8 +235,6 @@ void ShowEditPermissions(not_null peer) { }, box->lifetime()); } -} // namespace - namespace { constexpr auto kMaxGroupChannelTitle = 128; // See also add_contact_box. diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.h b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.h index 11ffd36ec..2231aa0e5 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.h +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.h @@ -23,6 +23,8 @@ class VerticalLayout; class SettingsButton; } // namespace Ui +void ShowEditPermissions(not_null peer); + class EditPeerInfoBox : public Ui::BoxContent { public: EditPeerInfoBox( diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp index a0372a173..8adc48186 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_folder.h" #include "data/data_channel.h" +#include "data/data_chat.h" #include "data/data_user.h" #include "ui/wrap/vertical_layout.h" #include "ui/wrap/padding_wrap.h" @@ -23,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/toast/toast.h" #include "ui/text/text_utilities.h" // Ui::Text::ToUpper #include "history/history_location_manager.h" // LocationClickHandler. +#include "history/admin_log/history_admin_log_section.h" #include "boxes/abstract_box.h" #include "boxes/confirm_box.h" #include "boxes/peer_list_box.h" @@ -30,6 +32,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/add_contact_box.h" #include "boxes/report_box.h" #include "boxes/peers/edit_contact_box.h" +#include "boxes/peers/edit_peer_info_box.h" +#include "boxes/peers/edit_participants_box.h" #include "lang/lang_keys.h" #include "info/info_controller.h" #include "info/info_memento.h" @@ -209,6 +213,30 @@ private: // //}; +class ManageFiller { +public: + ManageFiller( + not_null controller, + not_null parent, + not_null peer); + + object_ptr fill(); + +private: + void addPeerPermissions(not_null peer); + void addPeerAdmins(not_null peer); + void addChannelBlockedUsers(not_null channel); + void addChannelRecentActions(not_null channel); + + void fillChatActions(not_null chat); + void fillChannelActions(not_null channel); + + not_null _controller; + not_null _parent; + not_null _peer; + object_ptr _wrap = { nullptr }; +}; + DetailsFiller::DetailsFiller( not_null controller, not_null parent, @@ -902,6 +930,139 @@ object_ptr ActionsFiller::fill() { // return result; //} +ManageFiller::ManageFiller( + not_null controller, + not_null parent, + not_null peer) +: _controller(controller) +, _parent(parent) +, _peer(peer) { +} + +void ManageFiller::addPeerPermissions( + not_null peer) { + if (peer->isUser() || (peer->isChannel() && !peer->isMegagroup())) return; + + const auto canEditPermissions = [&] { + return peer->isChannel() + ? peer->asChannel()->canEditPermissions() + : peer->asChat()->canEditPermissions(); + }(); + + if (canEditPermissions) { + auto button = AddActionButton( + _wrap, + tr::lng_manage_peer_permissions(), + rpl::single(true), + [=] { ShowEditPermissions(peer); } + ); + object_ptr( + button, + st::infoIconPermissions, + st::infoSharedMediaButtonIconPosition); + } +} + +void ManageFiller::addPeerAdmins( + not_null peer) { + if (peer->isUser()) return; + + const auto canViewAdmins = [&] { + return peer->isChannel() + ? peer->asChannel()->canViewAdmins() + : peer->asChat()->amIn(); + }(); + if (canViewAdmins) { + const auto controller = _controller; + auto button = AddActionButton( + _wrap, + tr::lng_manage_peer_administrators(), + rpl::single(true), + [=] { ParticipantsBoxController::Start( + controller, + peer, + ParticipantsBoxController::Role::Admins);} + ); + object_ptr( + button, + st::infoIconAdministrators, + st::infoSharedMediaButtonIconPosition); + } +} + +void ManageFiller::addChannelBlockedUsers( + not_null channel) { + if (channel->hasAdminRights() || channel->amCreator()) { + const auto controller = _controller; + auto button = AddActionButton( + _wrap, + tr::lng_manage_peer_removed_users(), + rpl::single(true), + [=] { ParticipantsBoxController::Start( + controller, + channel, + ParticipantsBoxController::Role::Kicked);} + ); + object_ptr( + button, + st::infoIconBlacklist, + st::infoSharedMediaButtonIconPosition); + } +} + +void ManageFiller::addChannelRecentActions( + not_null channel) { + if (channel->hasAdminRights() || channel->amCreator()) { + const auto controller = _controller; + auto button = AddActionButton( + _wrap, + tr::lng_manage_peer_recent_actions(), + rpl::single(true), + [=] { controller->showSection(AdminLog::SectionMemento(channel)); } + ); + object_ptr( + button, + st::infoIconRecentActions, + st::infoSharedMediaButtonIconPosition); + } +} + +void ManageFiller::fillChatActions( + not_null chat) { + addPeerPermissions(chat); + addPeerAdmins(chat); +} + +void ManageFiller::fillChannelActions( + not_null channel) { + addPeerPermissions(channel); + addPeerAdmins(channel); + addChannelBlockedUsers(channel); + addChannelRecentActions(channel); +} + +object_ptr ManageFiller::fill() { + auto wrapResult = [=](auto &&callback) { + _wrap = object_ptr(_parent); + _wrap->add(CreateSkipWidget(_wrap)); + callback(); + _wrap->add(CreateSkipWidget(_wrap)); + return std::move(_wrap); + }; + if (auto chat = _peer->asChat()) { + return wrapResult([=] { + fillChatActions(chat); + }); + } else if (auto channel = _peer->asChannel()) { + if (channel->isMegagroup() || channel->hasAdminRights() || channel->amCreator()) { + return wrapResult([=] { + fillChannelActions(channel); + }); + } + } + return { nullptr }; +} + } // namespace object_ptr SetupDetails( @@ -912,6 +1073,14 @@ object_ptr SetupDetails( return filler.fill(); } +object_ptr SetupManage( + not_null controller, + not_null parent, + not_null peer) { + ManageFiller filler(controller, parent, peer); + return filler.fill(); +} + object_ptr SetupActions( not_null controller, not_null parent, diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.h b/Telegram/SourceFiles/info/profile/info_profile_actions.h index f36b8a9d1..cef4b7383 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.h +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.h @@ -24,6 +24,11 @@ object_ptr SetupDetails( not_null parent, not_null peer); +object_ptr SetupManage( + not_null controller, + not_null parent, + not_null peer); + object_ptr SetupActions( not_null controller, not_null parent, diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index 63c020972..f3f722292 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -98,6 +98,10 @@ object_ptr InnerWidget::setupContent( } else { result->add(std::move(details)); } + if (auto manage = SetupManage(_controller, result.data(), _peer)) { + result->add(object_ptr(result)); + result->add(std::move(manage)); + } result->add(setupSharedMedia(result.data())); if (auto members = SetupChannelMembers(_controller, result.data(), _peer)) { result->add(std::move(members));