mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-16 14:17:12 +02:00
Added channel list controller to giveaway box for channel selecting.
This commit is contained in:
parent
3ecf3f7c55
commit
3c8188e0b4
3 changed files with 144 additions and 0 deletions
|
@ -2114,6 +2114,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
"lng_giveaway_maximum_countries_error#other" = "You can select maximum {count} countries.";
|
||||
"lng_giveaway_maximum_channels_error#one" = "You can select maximum {count} channel.";
|
||||
"lng_giveaway_maximum_channels_error#other" = "You can select maximum {count} channels.";
|
||||
"lng_giveaway_channels_confirm_title" = "Channel is Private";
|
||||
"lng_giveaway_channels_confirm_about" = "Are you sure you want to add a private channel? Users won't be able to join it without an invite link.";
|
||||
|
||||
"lng_prize_title" = "Congratulations!";
|
||||
"lng_prize_about" = "You won a prize in a giveaway organized by {channel}.";
|
||||
|
|
|
@ -7,8 +7,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
*/
|
||||
#include "info/boosts/giveaway/giveaway_list_controllers.h"
|
||||
|
||||
#include "apiwrap.h"
|
||||
#include "data/data_channel.h"
|
||||
#include "data/data_peer.h"
|
||||
#include "data/data_session.h"
|
||||
#include "data/data_user.h"
|
||||
#include "main/main_session.h"
|
||||
#include "ui/boxes/confirm_box.h"
|
||||
#include "lang/lang_keys.h"
|
||||
|
||||
namespace Giveaway {
|
||||
|
@ -38,4 +43,111 @@ base::unique_qptr<Ui::PopupMenu> AwardMembersListController::rowContextMenu(
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
MyChannelsListController::MyChannelsListController(
|
||||
not_null<PeerData*> peer,
|
||||
std::shared_ptr<Ui::Show> show,
|
||||
std::vector<not_null<PeerData*>> selected)
|
||||
: PeerListController(
|
||||
std::make_unique<PeerListGlobalSearchController>(&peer->session()))
|
||||
, _peer(peer)
|
||||
, _show(show)
|
||||
, _selected(std::move(selected)) {
|
||||
}
|
||||
|
||||
std::unique_ptr<PeerListRow> MyChannelsListController::createSearchRow(
|
||||
not_null<PeerData*> peer) {
|
||||
if (const auto channel = peer->asChannel()) {
|
||||
return createRow(channel);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<PeerListRow> MyChannelsListController::createRestoredRow(
|
||||
not_null<PeerData*> peer) {
|
||||
if (const auto channel = peer->asChannel()) {
|
||||
return createRow(channel);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void MyChannelsListController::rowClicked(not_null<PeerListRow*> row) {
|
||||
const auto channel = row->peer()->asChannel();
|
||||
const auto checked = !row->checked();
|
||||
if (checked && channel && channel->username().isEmpty()) {
|
||||
_show->showBox(Box(Ui::ConfirmBox, Ui::ConfirmBoxArgs{
|
||||
.text = tr::lng_giveaway_channels_confirm_about(),
|
||||
.confirmed = [=](Fn<void()> close) {
|
||||
delegate()->peerListSetRowChecked(row, checked);
|
||||
close();
|
||||
},
|
||||
.confirmText = tr::lng_filters_recommended_add(),
|
||||
.title = tr::lng_giveaway_channels_confirm_title(),
|
||||
}));
|
||||
} else {
|
||||
delegate()->peerListSetRowChecked(row, checked);
|
||||
}
|
||||
}
|
||||
|
||||
Main::Session &MyChannelsListController::session() const {
|
||||
return _peer->session();
|
||||
}
|
||||
|
||||
void MyChannelsListController::prepare() {
|
||||
delegate()->peerListSetSearchMode(PeerListSearchMode::Enabled);
|
||||
const auto api = _apiLifetime.make_state<MTP::Sender>(
|
||||
&session().api().instance());
|
||||
api->request(
|
||||
MTPstories_GetChatsToSend()
|
||||
).done([=](const MTPmessages_Chats &result) {
|
||||
_apiLifetime.destroy();
|
||||
const auto &chats = result.match([](const auto &data) {
|
||||
return data.vchats().v;
|
||||
});
|
||||
auto &owner = session().data();
|
||||
for (const auto &chat : chats) {
|
||||
if (const auto peer = owner.processChat(chat)) {
|
||||
if (!peer->isChannel() || (peer == _peer)) {
|
||||
continue;
|
||||
}
|
||||
if (!delegate()->peerListFindRow(peer->id.value)) {
|
||||
if (const auto channel = peer->asChannel()) {
|
||||
auto row = createRow(channel);
|
||||
const auto raw = row.get();
|
||||
delegate()->peerListAppendRow(std::move(row));
|
||||
if (ranges::contains(_selected, peer)) {
|
||||
delegate()->peerListSetRowChecked(raw, true);
|
||||
_selected.erase(
|
||||
ranges::remove(_selected, peer),
|
||||
end(_selected));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const auto &selected : _selected) {
|
||||
if (const auto channel = selected->asChannel()) {
|
||||
auto row = createRow(channel);
|
||||
const auto raw = row.get();
|
||||
delegate()->peerListAppendRow(std::move(row));
|
||||
delegate()->peerListSetRowChecked(raw, true);
|
||||
}
|
||||
}
|
||||
delegate()->peerListRefreshRows();
|
||||
_selected.clear();
|
||||
}).send();
|
||||
}
|
||||
|
||||
std::unique_ptr<PeerListRow> MyChannelsListController::createRow(
|
||||
not_null<ChannelData*> channel) const {
|
||||
if (channel->isMegagroup()) {
|
||||
return nullptr;
|
||||
}
|
||||
auto row = std::make_unique<PeerListRow>(channel);
|
||||
row->setCustomStatus(tr::lng_chat_status_subscribers(
|
||||
tr::now,
|
||||
lt_count,
|
||||
channel->membersCount()));
|
||||
return row;
|
||||
}
|
||||
|
||||
} // namespace Giveaway
|
||||
|
|
|
@ -14,6 +14,7 @@ class PeerListRow;
|
|||
|
||||
namespace Ui {
|
||||
class PopupMenu;
|
||||
class Show;
|
||||
} // namespace Ui
|
||||
|
||||
namespace Window {
|
||||
|
@ -37,4 +38,33 @@ public:
|
|||
|
||||
};
|
||||
|
||||
class MyChannelsListController : public PeerListController {
|
||||
public:
|
||||
MyChannelsListController(
|
||||
not_null<PeerData*> peer,
|
||||
std::shared_ptr<Ui::Show> show,
|
||||
std::vector<not_null<PeerData*>> selected);
|
||||
|
||||
Main::Session &session() const override;
|
||||
void prepare() override;
|
||||
void rowClicked(not_null<PeerListRow*> row) override;
|
||||
|
||||
std::unique_ptr<PeerListRow> createSearchRow(
|
||||
not_null<PeerData*> peer) override;
|
||||
std::unique_ptr<PeerListRow> createRestoredRow(
|
||||
not_null<PeerData*> peer) override;
|
||||
|
||||
private:
|
||||
std::unique_ptr<PeerListRow> createRow(
|
||||
not_null<ChannelData*> channel) const;
|
||||
|
||||
const not_null<PeerData*> _peer;
|
||||
const std::shared_ptr<Ui::Show> _show;
|
||||
|
||||
std::vector<not_null<PeerData*>> _selected;
|
||||
|
||||
rpl::lifetime _apiLifetime;
|
||||
|
||||
};
|
||||
|
||||
} // namespace Giveaway
|
||||
|
|
Loading…
Add table
Reference in a new issue