From 7addcf2d25907f2ae193b301c48087882d3e9748 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 26 Apr 2024 19:20:43 +0400 Subject: [PATCH] Add IV footer. --- Telegram/Resources/iv_html/page.css | 28 ++++++++++++++++++++++- Telegram/Resources/iv_html/page.js | 16 +++++++------ Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/iv/iv_controller.cpp | 22 +++++++++++------- Telegram/SourceFiles/iv/iv_controller.h | 2 ++ Telegram/SourceFiles/iv/iv_data.h | 1 + Telegram/SourceFiles/iv/iv_instance.cpp | 15 +++++++++--- Telegram/SourceFiles/iv/iv_prepare.cpp | 28 ++++++++++++++++++++++- 8 files changed, 93 insertions(+), 20 deletions(-) diff --git a/Telegram/Resources/iv_html/page.css b/Telegram/Resources/iv_html/page.css index 2763760f2..00a3302bd 100644 --- a/Telegram/Resources/iv_html/page.css +++ b/Telegram/Resources/iv_html/page.css @@ -134,9 +134,32 @@ html.custom_scroll ::-webkit-scrollbar-thumb:hover { .page-slide { position: relative; width: 100%; + min-height: 100%; margin-left: 0%; transition: margin 240ms ease-in-out; } +.page-footer { + height: 32px; + margin-top: -32px; + background: var(--td-window-bg-over); +} +.page-footer .content { + padding: 3px 18px; + font-size: 15px; + color: var(--td-window-sub-text-fg); + text-align: center; +} +.page-footer .wrong { + position: relative; + padding: 5px; + margin: -5px; + color: var(--td-window-sub-text-fg); + text-decoration: none; + cursor: pointer; +} +.page-footer .wrong:hover { + text-decoration: underline; +} .hidden-left, .hidden-right { pointer-events: none; @@ -148,7 +171,7 @@ html.custom_scroll ::-webkit-scrollbar-thumb:hover { margin-left: 100%; } article { - padding-bottom: 12px; + padding-bottom: 40px; overflow-y: hidden; overflow-x: auto; white-space: pre-wrap; @@ -893,6 +916,9 @@ section.related a.related-link:after { right: 0; bottom: 0; } +section.related a.related-link:last-child:after { + border-bottom: 0px; +} section.related .related-link-url { display: block; font-size: 15px; diff --git a/Telegram/Resources/iv_html/page.js b/Telegram/Resources/iv_html/page.js index 053a6a0ab..bae02fe48 100644 --- a/Telegram/Resources/iv_html/page.js +++ b/Telegram/Resources/iv_html/page.js @@ -26,7 +26,7 @@ var IV = { } target = target.parentNode; } - if (!target || !target.hasAttribute('href')) { + if (!target || (context === '' && !target.hasAttribute('href'))) { return; } var base = document.createElement('A'); @@ -413,9 +413,12 @@ var IV = { var article = function (el) { return el.getElementsByTagName('article')[0]; }; - var from = article(IV.findPageScroll()); - var to = article(IV.makeScrolledContent(data.html)); - morphdom(from, to, { + var footer = function (el) { + return el.getElementsByClassName('page-footer')[0]; + }; + var from = IV.findPageScroll(); + var to = IV.makeScrolledContent(data.html); + morphdom(article(from), article(to), { onBeforeElUpdated: function (fromEl, toEl) { if (fromEl.classList.contains('video') && toEl.classList.contains('video') @@ -439,6 +442,7 @@ var IV = { return !fromEl.isEqualNode(toEl); } }); + morphdom(footer(from), footer(to)); IV.initMedia(); eval(data.js); }, @@ -477,9 +481,7 @@ var IV = { var result = document.createElement('div'); result.className = 'page-scroll'; result.tabIndex = '-1'; - result.innerHTML = '
' - + html - + '
'; + result.innerHTML = html.trim(); result.onscroll = IV.frameScrolled; return result; }, diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index eb3f33fc7..52c9ed8d3 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -5111,6 +5111,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_iv_share" = "Share"; "lng_iv_join_channel" = "Join"; "lng_iv_window_title" = "Instant View"; +"lng_iv_wrong_layout" = "Wrong layout?"; "lng_limit_download_title" = "Download speed limited"; "lng_limit_download_subscribe" = "Subscribe to {link} and increase download speed {increase}."; diff --git a/Telegram/SourceFiles/iv/iv_controller.cpp b/Telegram/SourceFiles/iv/iv_controller.cpp index a2a701d84..cc9d727fe 100644 --- a/Telegram/SourceFiles/iv/iv_controller.cpp +++ b/Telegram/SourceFiles/iv/iv_controller.cpp @@ -155,10 +155,6 @@ namespace { + "IV.init();" + page.script; - const auto contentAttributes = page.rtl - ? " dir=\"rtl\" class=\"rtl\""_q - : QByteArray(); - return R"( -
- "_q + page.content + R"( -
+
)"_q + page.content.trimmed() + R"(
@@ -646,7 +640,12 @@ void Controller::processLink(const QString &url, const QString &context) { const auto joinPrefix = u"join_link"_q; const auto webpagePrefix = u"webpage"_q; const auto viewerPrefix = u"viewer"_q; - if (context.startsWith(channelPrefix)) { + if (context == u"report-iv") { + _events.fire({ + .type = Event::Type::Report, + .context = QString::number(compuseCurrentPageId()), + }); + } else if (context.startsWith(channelPrefix)) { _events.fire({ .type = Event::Type::OpenChannel, .context = context.mid(channelPrefix.size()), @@ -701,6 +700,13 @@ QString Controller::composeCurrentUrl() const { + (_hash.isEmpty() ? u""_q : ('#' + _hash)); } +uint64 Controller::compuseCurrentPageId() const { + const auto index = _index.current(); + Assert(index >= 0 && index < _pages.size()); + + return _pages[index].pageId; +} + void Controller::showMenu() { const auto index = _index.current(); if (_menu || index < 0 || index > _pages.size()) { diff --git a/Telegram/SourceFiles/iv/iv_controller.h b/Telegram/SourceFiles/iv/iv_controller.h index d3363d67e..473813fca 100644 --- a/Telegram/SourceFiles/iv/iv_controller.h +++ b/Telegram/SourceFiles/iv/iv_controller.h @@ -63,6 +63,7 @@ public: OpenLink, OpenLinkExternal, OpenMedia, + Report, }; Type type = Type::Close; QString url; @@ -116,6 +117,7 @@ private: void quit(); [[nodiscard]] QString composeCurrentUrl() const; + [[nodiscard]] uint64 compuseCurrentPageId() const; void showShareMenu(); void destroyShareMenu(); diff --git a/Telegram/SourceFiles/iv/iv_data.h b/Telegram/SourceFiles/iv/iv_data.h index c33fe1b18..87900bce3 100644 --- a/Telegram/SourceFiles/iv/iv_data.h +++ b/Telegram/SourceFiles/iv/iv_data.h @@ -15,6 +15,7 @@ struct Options { }; struct Prepared { + uint64 pageId = 0; QString name; QByteArray content; QByteArray script; diff --git a/Telegram/SourceFiles/iv/iv_instance.cpp b/Telegram/SourceFiles/iv/iv_instance.cpp index 49ae8c144..babce1d6c 100644 --- a/Telegram/SourceFiles/iv/iv_instance.cpp +++ b/Telegram/SourceFiles/iv/iv_instance.cpp @@ -742,9 +742,7 @@ void Instance::show( not_null data, QString hash) { const auto guard = gsl::finally([&] { - if (data->partial()) { - requestFull(session, data->id()); - } + requestFull(session, data->id()); }); if (_shown && _shownSession == session) { _shown->moveTo(data, hash); @@ -834,6 +832,17 @@ void Instance::show( UrlClickHandler::Open(event.url); }).send(); break; + case Type::Report: + if (const auto controller = _shownSession->tryResolveWindow()) { + controller->window().activate(); + controller->showPeerByLink(Window::PeerByLinkInfo{ + .usernameOrId = "previews", + .resolveType = Window::ResolveType::BotStart, + .startToken = ("webpage" + + QString::number(event.context.toULongLong())), + }); + } + break; } }, _shown->lifetime()); diff --git a/Telegram/SourceFiles/iv/iv_prepare.cpp b/Telegram/SourceFiles/iv/iv_prepare.cpp index f0c823676..699f44677 100644 --- a/Telegram/SourceFiles/iv/iv_prepare.cpp +++ b/Telegram/SourceFiles/iv/iv_prepare.cpp @@ -142,6 +142,8 @@ private: [[nodiscard]] QByteArray block( const MTPDpageListOrderedItemBlocks &data); + [[nodiscard]] QByteArray wrap(const QByteArray &content, int views); + [[nodiscard]] QByteArray tag( const QByteArray &name, const QByteArray &body = {}); @@ -223,9 +225,13 @@ Parser::Parser(const Source &source, const Options &options) : /*_options(options) , */_fileOriginPostfix('/' + Number(source.pageId)) { process(source); + _result.pageId = source.pageId; _result.name = source.name; _result.rtl = source.page.data().is_rtl(); - _result.content = list(source.page.data().vblocks()); + + const auto views = source.page.data().vviews().value_or_empty(); + const auto content = list(source.page.data().vblocks()); + _result.content = wrap(content, views); } Prepared Parser::result() { @@ -925,6 +931,26 @@ QByteArray Parser::utf(const tl::conditional &text) { return text ? utf(*text) : QByteArray(); } +QByteArray Parser::wrap(const QByteArray &content, int views) { + const auto sep = " \xE2\x80\xA2 "; + const auto viewsText = views + ? (tr::lng_stories_views(tr::now, lt_count_decimal, views) + sep) + : QString(); + return R"( +
+
)"_q + content + R"(
+
+)"_q; +} + QByteArray Parser::tag( const QByteArray &name, const QByteArray &body) {