From bc2449c3f971f85200abae9fd861a28c14517542 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 19 Nov 2025 17:11:58 +0300 Subject: [PATCH] Fixed update of local state after reorder stories in albums. --- Telegram/SourceFiles/data/data_stories.cpp | 52 +++++++++++++++++++ Telegram/SourceFiles/data/data_stories.h | 9 ++++ .../stories/info_stories_inner_widget.cpp | 51 +----------------- .../info/stories/info_stories_inner_widget.h | 8 --- 4 files changed, 63 insertions(+), 57 deletions(-) diff --git a/Telegram/SourceFiles/data/data_stories.cpp b/Telegram/SourceFiles/data/data_stories.cpp index 7d7518970d..6f69b9538e 100644 --- a/Telegram/SourceFiles/data/data_stories.cpp +++ b/Telegram/SourceFiles/data/data_stories.cpp @@ -2006,6 +2006,58 @@ void Stories::albumDelete(not_null peer, int id) { } } +void Stories::albumReorderStories( + not_null peer, + int albumId, + int oldPosition, + int newPosition, + Fn done, + Fn fail) { + const auto ids = albumIds(peer->id, albumId); + const auto list = RespectingPinned(ids); + + if (oldPosition < 0 || newPosition < 0 + || oldPosition >= list.size() || newPosition >= list.size()) { + fail(); + return; + } + + if (_reorderStoriesRequestId) { + _owner->session().api().request( + base::take(_reorderStoriesRequestId)).cancel(); + } + + auto reorderedList = list; + base::reorder(reorderedList, oldPosition, newPosition); + + auto order = QVector(); + order.reserve(reorderedList.size()); + for (const auto id : reorderedList) { + order.push_back(MTP_int(id)); + } + + _reorderStoriesRequestId = _owner->session().api().request( + MTPstories_UpdateAlbum( + MTP_flags(MTPstories_UpdateAlbum::Flag::f_order), + peer->input, + MTP_int(albumId), + MTPstring(), + MTPVector(), + MTPVector(), + MTP_vector(order) + )).done([=](const MTPStoryAlbum &result) { + _reorderStoriesRequestId = 0; + if (const auto set = albumIdsSet(peer->id, albumId)) { + set->ids.list = reorderedList; + _albumIdsChanged.fire({ peer->id, albumId }); + } + done(); + }).fail([=] { + _reorderStoriesRequestId = 0; + fail(); + }).send(); +} + void Stories::notifyAlbumUpdate(StoryAlbumUpdate &&update) { const auto peerId = update.peer->id; const auto i = _albums.find(peerId); diff --git a/Telegram/SourceFiles/data/data_stories.h b/Telegram/SourceFiles/data/data_stories.h index b7ffd9fe13..e6648fa02f 100644 --- a/Telegram/SourceFiles/data/data_stories.h +++ b/Telegram/SourceFiles/data/data_stories.h @@ -242,6 +242,13 @@ public: Fn done, Fn fail); void albumDelete(not_null peer, int id); + void albumReorderStories( + not_null peer, + int albumId, + int oldPosition, + int newPosition, + Fn done, + Fn fail); void notifyAlbumUpdate(StoryAlbumUpdate &&update); [[nodiscard]] rpl::producer albumUpdates() const; @@ -477,6 +484,8 @@ private: base::Timer _pollingTimer; base::Timer _pollingViewsTimer; + mtpRequestId _reorderStoriesRequestId = 0; + rpl::variable _stealthMode; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp index 751badcad5..4de4838f58 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp +++ b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.cpp @@ -609,7 +609,8 @@ void InnerWidget::setupList() { int newPosition, Fn done, Fn fail) { - reorderAlbumStories( + _peer->owner().stories().albumReorderStories( + _peer, albumId, oldPosition, newPosition, @@ -1122,52 +1123,4 @@ void InnerWidget::flushAlbumReorder() { _pendingAlbumReorder = false; } -void InnerWidget::reorderAlbumStories( - int albumId, - int oldPosition, - int newPosition, - Fn done, - Fn fail) { - const auto &stories = _controller->session().data().stories(); - const auto ids = stories.albumIds(_peer->id, albumId); - const auto list = Data::RespectingPinned(ids); - - if (oldPosition < 0 || newPosition < 0 - || oldPosition >= list.size() || newPosition >= list.size()) { - fail(); - return; - } - - if (_reorderStoriesRequestId) { - _controller->session().api().request( - base::take(_reorderStoriesRequestId)).cancel(); - } - - auto reorderedList = list; - base::reorder(reorderedList, oldPosition, newPosition); - - auto order = QVector(); - order.reserve(reorderedList.size()); - for (const auto id : reorderedList) { - order.push_back(MTP_int(id)); - } - - _reorderStoriesRequestId = _controller->session().api().request( - MTPstories_UpdateAlbum( - MTP_flags(MTPstories_UpdateAlbum::Flag::f_order), - _peer->input, - MTP_int(albumId), - MTPstring(), - MTPVector(), - MTPVector(), - MTP_vector(order) - )).done([=](const MTPStoryAlbum &result) { - _reorderStoriesRequestId = 0; - done(); - }).fail([=] { - _reorderStoriesRequestId = 0; - fail(); - }).send(); -} - } // namespace Info::Stories diff --git a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.h b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.h index 92d1f92bd6..a9e20f53ef 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_inner_widget.h +++ b/Telegram/SourceFiles/info/stories/info_stories_inner_widget.h @@ -132,13 +132,6 @@ private: void reorderAlbumsLocally(const Ui::SubTabsReorderUpdate &update); void flushAlbumReorder(); - void reorderAlbumStories( - int albumId, - int oldPosition, - int newPosition, - Fn done, - Fn fail); - const not_null _controller; const not_null _peer; const int _addingToAlbumId = 0; @@ -154,7 +147,6 @@ private: base::unique_qptr _menu; std::unique_ptr _api; mtpRequestId _reorderRequestId = 0; - mtpRequestId _reorderStoriesRequestId = 0; object_ptr _top = { nullptr }; object_ptr _list = { nullptr };