Replaced raw DocumentId with full star gift data in api recent gifts.

This commit is contained in:
23rd
2025-10-10 10:15:24 +03:00
parent 1ea9be9877
commit 130176fd7e
4 changed files with 24 additions and 26 deletions
@@ -30,14 +30,14 @@ RecentSharedMediaGifts::RecentSharedMediaGifts(
RecentSharedMediaGifts::~RecentSharedMediaGifts() = default;
std::vector<DocumentId> RecentSharedMediaGifts::filterGifts(
const std::deque<GiftItem> &gifts,
std::vector<Data::SavedStarGift> RecentSharedMediaGifts::filterGifts(
const std::deque<Data::SavedStarGift> &gifts,
bool onlyPinnedToTop) {
auto result = std::vector<DocumentId>();
auto result = std::vector<Data::SavedStarGift>();
const auto maxCount = onlyPinnedToTop ? kMaxPinnedGifts : kMaxGifts;
for (const auto &gift : gifts) {
if (!onlyPinnedToTop || gift.pinned) {
result.push_back(gift.id);
result.push_back(gift);
if (result.size() >= maxCount) {
break;
}
@@ -48,7 +48,7 @@ std::vector<DocumentId> RecentSharedMediaGifts::filterGifts(
void RecentSharedMediaGifts::request(
not_null<PeerData*> peer,
Fn<void(std::vector<DocumentId>)> done,
Fn<void(std::vector<SavedStarGift>)> done,
bool onlyPinnedToTop) {
const auto it = _recent.find(peer->id);
if (it != _recent.end()) {
@@ -88,10 +88,7 @@ void RecentSharedMediaGifts::request(
for (const auto &gift : data.vgifts().v) {
if (auto parsed = Api::FromTL(peer, gift)) {
entry.gifts.push_back({
.id = parsed->info.document->id,
.pinned = parsed->pinned
});
entry.gifts.push_back(std::move(*parsed));
}
}
@@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "data/data_star_gift.h"
namespace Main {
class Session;
} // namespace Main
@@ -20,21 +22,16 @@ public:
void request(
not_null<PeerData*> peer,
Fn<void(std::vector<DocumentId>)> done,
Fn<void(std::vector<Data::SavedStarGift>)> done,
bool onlyPinnedToTop = false);
private:
struct GiftItem {
DocumentId id;
bool pinned = false;
};
[[nodiscard]] std::vector<DocumentId> filterGifts(
const std::deque<GiftItem> &gifts,
[[nodiscard]] std::vector<Data::SavedStarGift> filterGifts(
const std::deque<SavedStarGift> &gifts,
bool onlyPinnedToTop);
struct Entry {
std::deque<GiftItem> gifts;
std::deque<SavedStarGift> gifts;
crl::time lastRequestTime = 0;
mtpRequestId requestId = 0;
std::vector<Fn<void()>> pendingCallbacks;
@@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "core/ui_integration.h"
#include "data/components/recent_shared_media_gifts.h"
#include "data/data_channel.h"
#include "data/data_document.h"
#include "data/data_saved_messages.h"
#include "data/data_saved_sublist.h"
#include "data/data_session.h"
@@ -371,11 +372,13 @@ not_null<Ui::SettingsButton*> AddPeerGiftsButton(
) | rpl::start_with_next([=] {
state->appearedLifetime.destroy();
const auto requestDone = crl::guard(wrap, [=](
std::vector<DocumentId> ids) {
std::vector<Data::SavedStarGift> gifts) {
state->emojiList.clear();
for (const auto &id : ids) {
for (const auto &gift : gifts) {
state->emojiList.push_back(
peer->owner().customEmojiManager().create(id, refresh));
peer->owner().customEmojiManager().create(
gift.info.document->id,
refresh));
}
state->textRefreshed.fire({});
});
@@ -1098,11 +1098,11 @@ void TopBar::paintAnimatedPattern(QPainter &p, const QRect &rect) {
void TopBar::setupPinnedToTopGifts() {
const auto requestDone = crl::guard(this, [=](
std::vector<DocumentId> ids) {
std::vector<Data::SavedStarGift> gifts) {
_pinnedToTopGifts.clear();
_pinnedToTopGifts.reserve(ids.size());
_pinnedToTopGifts.reserve(gifts.size());
_giftsLoadingLifetime.destroy();
if (ids.empty()) {
if (gifts.empty()) {
_lottiePlayer = nullptr;
} else if (!_lottiePlayer) {
_lottiePlayer = std::make_unique<Lottie::MultiPlayer>(
@@ -1119,8 +1119,9 @@ void TopBar::setupPinnedToTopGifts() {
kMaxPinnedToTopGifts) | ranges::to_vector;
ranges::shuffle(positions);
for (auto i = 0; i < ids.size() && i < kMaxPinnedToTopGifts; ++i) {
const auto document = _peer->owner().document(ids[i]);
for (auto i = 0; i < gifts.size() && i < kMaxPinnedToTopGifts; ++i) {
const auto document = _peer->owner().document(
gifts[i].info.document->id);
auto entry = PinnedToTopGiftEntry();
entry.media = document->createMediaView();
entry.media->checkStickerSmall();