diff --git a/Telegram/Resources/icons/info/edit/links_delete.png b/Telegram/Resources/icons/info/edit/links_delete.png new file mode 100644 index 000000000..f20b3d135 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/links_delete.png differ diff --git a/Telegram/Resources/icons/info/edit/links_delete@2x.png b/Telegram/Resources/icons/info/edit/links_delete@2x.png new file mode 100644 index 000000000..94e5b4a0e Binary files /dev/null and b/Telegram/Resources/icons/info/edit/links_delete@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/links_delete@3x.png b/Telegram/Resources/icons/info/edit/links_delete@3x.png new file mode 100644 index 000000000..28df4fad1 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/links_delete@3x.png differ diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 1ad35512b..ec29b886a 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1188,6 +1188,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_invite_share" = "Share Link"; "lng_group_invite_revoke" = "Revoke Link"; "lng_group_invite_reactivate" = "Reactivate Link"; +"lng_group_invite_delete" = "Delete Link"; "lng_group_invite_no_joined" = "No one joined yet"; "lng_group_invite_joined#one" = "{count} joined"; "lng_group_invite_joined#other" = "{count} joined"; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp index 0868a58ea..fa624b79e 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp @@ -137,6 +137,7 @@ void Controller::addHeaderBlock(not_null container) { using namespace Settings; const auto current = _data.current(); + const auto revoked = current.revoked; const auto link = current.link; const auto admin = current.admin; const auto weak = Ui::MakeWeak(container); @@ -152,21 +153,30 @@ void Controller::addHeaderBlock(not_null container) { const auto editLink = crl::guard(weak, [=] { EditLink(_peer, _data.current()); }); + const auto deleteLink = [=] { + DeleteLink(_peer, admin, link); + }; const auto createMenu = [=] { auto result = base::make_unique_q(container); - result->addAction( - tr::lng_group_invite_context_copy(tr::now), - copyLink); - result->addAction( - tr::lng_group_invite_context_share(tr::now), - shareLink); - result->addAction( - tr::lng_group_invite_context_edit(tr::now), - editLink); - result->addAction( - tr::lng_group_invite_context_revoke(tr::now), - revokeLink); + if (revoked) { + result->addAction( + tr::lng_group_invite_context_delete(tr::now), + deleteLink); + } else { + result->addAction( + tr::lng_group_invite_context_copy(tr::now), + copyLink); + result->addAction( + tr::lng_group_invite_context_share(tr::now), + shareLink); + result->addAction( + tr::lng_group_invite_context_edit(tr::now), + editLink); + result->addAction( + tr::lng_group_invite_context_revoke(tr::now), + revokeLink); + } return result; }; @@ -197,6 +207,9 @@ void Controller::addHeaderBlock(not_null container) { AddReactivateLinkButton(reactivateWrap->entity(), editLink); AddCopyShareLinkButtons(copyShareWrap->entity(), copyLink, shareLink); + if (revoked) { + AddDeleteLinkButton(container, deleteLink); + } AddSkip(container, st::inviteLinkJoinedRowPadding.bottom() * 2); @@ -242,19 +255,19 @@ void Controller::addHeaderBlock(not_null container) { ) | rpl::start_with_next([=](const LinkData &data) { const auto now = base::unixtime::now(); const auto expired = IsExpiredLink(data, now); - reactivateWrap->toggle(expired, anim::type::instant); - copyShareWrap->toggle(!expired, anim::type::instant); + reactivateWrap->toggle(!revoked && expired, anim::type::instant); + copyShareWrap->toggle(!revoked && !expired, anim::type::instant); const auto timeExpired = (data.expireDate > 0) && (data.expireDate <= now); const auto usageExpired = (data.usageLimit > 0) && (data.usageLimit <= data.usage); - redLabelWrap->toggle(timeExpired, anim::type::instant); + redLabelWrap->toggle(!revoked && timeExpired, anim::type::instant); grayLabelWrap->toggle( - !timeExpired && (data.expireDate > 0 || usageExpired), + !revoked && !timeExpired && (data.expireDate > 0 || usageExpired), anim::type::instant); justDividerWrap->toggle( - !data.expireDate && !expired, + revoked || (!data.expireDate && !expired), anim::type::instant); }, lifetime()); } @@ -266,7 +279,8 @@ void Controller::prepare() { const auto container = header.data(); const auto current = _data.current(); - if (!current.revoked && !current.permanent) { + const auto revoked = current.revoked; + if (revoked || !current.permanent) { addHeaderBlock(container); } AddSubsectionTitle( @@ -296,7 +310,7 @@ void Controller::prepare() { const auto now = base::unixtime::now(); const auto timeExpired = (data.expireDate > 0) && (data.expireDate <= now); - if (!data.usage && data.usageLimit > 0 && !timeExpired) { + if (!revoked && !data.usage && data.usageLimit > 0 && !timeExpired) { auto description = object_ptr( nullptr, tr::lng_group_invite_can_join_via_link( @@ -320,7 +334,7 @@ void Controller::prepare() { delegate()->peerListSetDescription(nullptr); } listHeaderWrap->toggle( - data.usage || (data.usageLimit > 0 && !timeExpired), + !revoked && (data.usage || (data.usageLimit > 0 && !timeExpired)), anim::type::instant); delegate()->peerListRefreshRows(); return data.usage @@ -351,7 +365,7 @@ void Controller::prepare() { (data.usageLimit && (data.usageLimit <= data.usage) ? std::make_optional(st::boxTextFgError->c) : std::nullopt)); - if (!data.usage && data.usageLimit > 0) { + if (revoked || (!data.usage && data.usageLimit > 0)) { remaining->hide(); } else { remaining->show(); @@ -836,6 +850,28 @@ void RevokeLink( Ui::LayerOption::KeepOther); } +void DeleteLink( + not_null peer, + not_null admin, + const QString &link) { + const auto box = std::make_shared>(); + const auto sure = [=] { + const auto finish = [=] { + if (*box) { + (*box)->closeBox(); + } + }; + peer->session().api().inviteLinks().destroy( + peer, + admin, + link, + finish); + }; + *box = Ui::show( + Box(tr::lng_group_invite_delete_sure(tr::now), sure), + Ui::LayerOption::KeepOther); +} + void ShowInviteLinkBox( not_null peer, const Api::InviteLink &link) { @@ -851,9 +887,7 @@ void ShowInviteLinkBox( }) | rpl::map([=](const Api::InviteLinkUpdate &update) { return update.now ? *update.now : LinkData{ .admin = admin }; }); - auto data = revoked - ? rpl::single(link) | rpl::type_erased() - : rpl::single(link) | rpl::then(std::move(updates)); + auto data = rpl::single(link) | rpl::then(std::move(updates)); auto initBox = [=, data = rpl::duplicate(data)]( not_null box) { diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.h b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.h index 1543504f6..c8825e10f 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.h +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.h @@ -41,6 +41,10 @@ void RevokeLink( void EditLink( not_null peer, const Api::InviteLink &data); +void DeleteLink( + not_null peer, + not_null admin, + const QString &link); void ShowInviteLinkBox( not_null peer, diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp index 9b31ab49b..49c82ddb5 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp @@ -195,28 +195,6 @@ private: return result; } -void DeleteLink( - not_null peer, - not_null admin, - const QString &link) { - const auto box = std::make_shared>(); - const auto sure = [=] { - const auto finish = [=] { - if (*box) { - (*box)->closeBox(); - } - }; - peer->session().api().inviteLinks().destroy( - peer, - admin, - link, - finish); - }; - *box = Ui::show( - Box(tr::lng_group_invite_delete_sure(tr::now), sure), - Ui::LayerOption::KeepOther); -} - void DeleteAllRevoked( not_null peer, not_null admin) { diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index 720bdf1b5..ec076f378 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -872,6 +872,10 @@ inviteLinkReactivate: RoundButton(inviteLinkCopy) { icon: icon {{ "info/edit/links_reactivate", activeButtonFg }}; iconOver: icon {{ "info/edit/links_reactivate", activeButtonFgOver }}; } +inviteLinkDelete: RoundButton(inviteLinkCopy) { + icon: icon {{ "info/edit/links_delete", activeButtonFg }}; + iconOver: icon {{ "info/edit/links_delete", activeButtonFgOver }}; +} inviteLinkUserpics: GroupCallUserpics { size: 28px; shift: 6px; diff --git a/Telegram/SourceFiles/ui/controls/invite_link_buttons.cpp b/Telegram/SourceFiles/ui/controls/invite_link_buttons.cpp index d050524ae..ec0760378 100644 --- a/Telegram/SourceFiles/ui/controls/invite_link_buttons.cpp +++ b/Telegram/SourceFiles/ui/controls/invite_link_buttons.cpp @@ -75,6 +75,19 @@ void AddReactivateLinkButton( button->setClickedCallback(editLink); } +void AddDeleteLinkButton( + not_null container, + Fn deleteLink) { + const auto button = container->add( + object_ptr( + container, + tr::lng_group_invite_delete(), + st::inviteLinkDelete), + st::inviteLinkButtonsPadding); + button->setTextTransform(RoundButton::TextTransform::NoTransform); + button->setClickedCallback(deleteLink); +} + not_null AddJoinedCountButton( not_null container, rpl::producer content, diff --git a/Telegram/SourceFiles/ui/controls/invite_link_buttons.h b/Telegram/SourceFiles/ui/controls/invite_link_buttons.h index 5b4af472c..7059054cd 100644 --- a/Telegram/SourceFiles/ui/controls/invite_link_buttons.h +++ b/Telegram/SourceFiles/ui/controls/invite_link_buttons.h @@ -21,6 +21,10 @@ void AddReactivateLinkButton( not_null container, Fn editLink); +void AddDeleteLinkButton( + not_null container, + Fn deleteLink); + struct JoinedCountContent { int count = 0; QImage userpics;