diff --git a/Telegram/SourceFiles/data/data_forum_topic.cpp b/Telegram/SourceFiles/data/data_forum_topic.cpp index d18a709b7..b69926a9f 100644 --- a/Telegram/SourceFiles/data/data_forum_topic.cpp +++ b/Telegram/SourceFiles/data/data_forum_topic.cpp @@ -153,6 +153,9 @@ ForumTopic::ForumTopic(not_null forum, MsgId rootId) _sendActionPainter->setTopic(this); _replies->unreadCountValue( + ) | rpl::map([=](std::optional value) { + return value ? _replies->displayedUnreadCount() : value; + }) | rpl::distinct_until_changed( ) | rpl::combine_previous( ) | rpl::filter([=] { return inChatList(); @@ -620,7 +623,7 @@ not_null ForumTopic::sendActionPainter() { Dialogs::UnreadState ForumTopic::chatListUnreadState() const { return unreadStateFor( - _replies->unreadCountCurrent(), + _replies->displayedUnreadCount(), _replies->unreadCountKnown()); } diff --git a/Telegram/SourceFiles/data/data_replies_list.cpp b/Telegram/SourceFiles/data/data_replies_list.cpp index 065e25284..8d038aac7 100644 --- a/Telegram/SourceFiles/data/data_replies_list.cpp +++ b/Telegram/SourceFiles/data/data_replies_list.cpp @@ -765,6 +765,10 @@ void RepliesList::setUnreadCount(std::optional count) { } } +int RepliesList::displayedUnreadCount() const { + return (_inboxReadTillId > 1) ? unreadCountCurrent() : 0; +} + bool RepliesList::isServerSideUnread( not_null item) const { const auto till = item->out() @@ -847,7 +851,7 @@ void RepliesList::requestUnreadCount() { const auto session = &_history->session(); const auto fullId = FullMsgId(_history->peer->id, _rootId); const auto apply = [weak, session, fullId]( - int readTill, + MsgId readTill, int unreadCount) { if (const auto strong = weak.get()) { strong->setInboxReadTill(readTill, unreadCount); diff --git a/Telegram/SourceFiles/data/data_replies_list.h b/Telegram/SourceFiles/data/data_replies_list.h index 2d5690c36..eef0ae454 100644 --- a/Telegram/SourceFiles/data/data_replies_list.h +++ b/Telegram/SourceFiles/data/data_replies_list.h @@ -34,6 +34,7 @@ public: [[nodiscard]] bool unreadCountKnown() const; [[nodiscard]] int unreadCountCurrent() const; + [[nodiscard]] int displayedUnreadCount() const; [[nodiscard]] rpl::producer> unreadCountValue() const; void setInboxReadTill(MsgId readTillId, std::optional unreadCount); diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 6b75f1370..0fbc24c94 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -1202,9 +1202,7 @@ void RepliesWidget::refreshJoinGroupButton() { } }; const auto channel = _history->peer->asChannel(); - if (channel->amIn() - || !channel->joinToWrite() - || (channel->amCreator() && channel->canWrite())) { + if (channel->amIn() || channel->canWrite()) { set(nullptr); } else { if (!_joinGroup) { diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index ef9d55be9..9527c4b92 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -42,6 +42,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_forum.h" #include "data/data_forum_topic.h" #include "data/data_chat_filters.h" +#include "data/data_replies_list.h" #include "data/data_peer_values.h" #include "passport/passport_form_controller.h" #include "chat_helpers/tabbed_selector.h" @@ -470,6 +471,18 @@ void SessionNavigation::showRepliesForMessage( MsgId rootId, MsgId commentId, const SectionShow ¶ms) { + if (const auto topic = history->peer->forumTopicFor(rootId)) { + auto replies = topic->replies(); + if (replies->unreadCountKnown()) { + auto memento = std::make_shared( + history, + rootId, + commentId); + memento->setReplies(std::move(replies)); + showSection(std::move(memento), params); + return; + } + } if (_showingRepliesRequestId && _showingRepliesHistory == history.get() && _showingRepliesRootId == rootId) { @@ -530,9 +543,14 @@ void SessionNavigation::showRepliesForMessage( } } if (deleted || item) { - auto memento = std::make_shared( - item, - commentId); + auto memento = item + ? std::make_shared( + item, + commentId) + : std::make_shared( + history, + rootId, + commentId); memento->setReadInformation( data.vread_inbox_max_id().value_or_empty(), data.vunread_count().v,