diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 7987ce9725..289cb3c6e9 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1631,6 +1631,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_delete_note" = "Delete Note"; "lng_info_bio_label" = "Bio"; "lng_info_link_label" = "Link"; +"lng_info_link_topic_label" = "This topic link will only work for group members"; "lng_info_location_label" = "Location"; "lng_info_about_label" = "Description"; "lng_info_work_open" = "Open"; diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp index bd22070cd9..62f95a48c3 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp @@ -1656,7 +1656,8 @@ object_ptr DetailsFiller::setupInfo( : QString(); auto linkText = LinkValue( _peer, - true + true, + topicRootId ) | rpl::map([=](const LinkWithUrl &link) { const auto text = link.text; return text.isEmpty() @@ -1669,7 +1670,7 @@ object_ptr DetailsFiller::setupInfo( }); const auto linkLine = addInfoOneLine( (topicRootId - ? tr::lng_info_link_label(Ui::Text::WithEntities) + ? tr::lng_info_link_topic_label(Ui::Text::WithEntities) : UsernamesSubtext(_peer, tr::lng_info_link_label())), std::move(linkText), QString()); @@ -1682,7 +1683,7 @@ object_ptr DetailsFiller::setupInfo( linkLine.subtext->overrideLinkClickHandler(linkCallback); linkLine.text->setContextMenuHook(lnkHook); linkLine.subtext->setContextMenuHook(lnkHook); - { + if (!topicRootId || !_peer->username().isEmpty()) { const auto qr = Ui::CreateChild( linkLine.text->parentWidget(), st::infoProfileLabeledButtonQr); diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.cpp b/Telegram/SourceFiles/info/profile/info_profile_values.cpp index b545585ec5..6f0bb4599c 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_values.cpp @@ -243,11 +243,42 @@ rpl::producer AboutValue(not_null peer) { }); } -rpl::producer LinkValue(not_null peer, bool primary) { +QString TopicLink(not_null topic, bool full) { + const auto channel = topic->channel(); + const auto id = topic->rootId(); + const auto base = channel->hasUsername() + ? channel->username() + : "c/" + QString::number(peerToChannel(channel->id).bare); + return channel->session().createInternalLinkFull(full + ? base + '/' + QString::number(id.bare) + : base); +} + +rpl::producer LinkValue( + not_null peer, + bool primary, + MsgId rootId) { return (primary ? PlainPrimaryUsernameValue(peer) : PlainUsernameValue(peer) | rpl::type_erased() ) | rpl::map([=](QString &&username) { + if (username.isEmpty()) { + if (const auto topic + = rootId ? peer->forumTopicFor(rootId) : nullptr) { + const auto link = TopicLink(topic, false); + return LinkWithUrl{ + .text = link, + .url = link, + }; + } else { + return LinkWithUrl{}; + } + } else { + return LinkWithUrl{ + .text = peer->session().createInternalLinkFull(username), + .url = UsernameUrl(peer, username, true), + }; + } return LinkWithUrl{ .text = (username.isEmpty() ? QString() diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.h b/Telegram/SourceFiles/info/profile/info_profile_values.h index 16e9ed5d64..220d93cd37 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.h +++ b/Telegram/SourceFiles/info/profile/info_profile_values.h @@ -75,9 +75,13 @@ struct LinkWithUrl { QString text; QString url; }; +[[nodiscard]] QString TopicLink( + not_null topic, + bool full); [[nodiscard]] rpl::producer LinkValue( not_null peer, - bool primary = false); + bool primary = false, + MsgId topicRootId = 0); [[nodiscard]] rpl::producer LocationValue( not_null channel); diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index fb909c9259..2e9ee3304d 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -1075,11 +1075,7 @@ void Filler::addTopicLink() { const auto id = _topic->rootId(); const auto controller = _controller; _addAction(tr::lng_context_copy_topic_link(tr::now), [=] { - const auto base = channel->hasUsername() - ? channel->username() - : "c/" + QString::number(peerToChannel(channel->id).bare); - const auto query = base + '/' + QString::number(id.bare); - const auto link = channel->session().createInternalLinkFull(query); + const auto link = Info::Profile::TopicLink(_topic, true); QGuiApplication::clipboard()->setText(link); controller->showToast(channel->hasUsername() ? tr::lng_channel_public_link_copied(tr::now)