mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +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_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#one" = "You can select maximum {count} channel.";
|
||||||
"lng_giveaway_maximum_channels_error#other" = "You can select maximum {count} channels.";
|
"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_title" = "Congratulations!";
|
||||||
"lng_prize_about" = "You won a prize in a giveaway organized by {channel}.";
|
"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 "info/boosts/giveaway/giveaway_list_controllers.h"
|
||||||
|
|
||||||
|
#include "apiwrap.h"
|
||||||
|
#include "data/data_channel.h"
|
||||||
#include "data/data_peer.h"
|
#include "data/data_peer.h"
|
||||||
|
#include "data/data_session.h"
|
||||||
#include "data/data_user.h"
|
#include "data/data_user.h"
|
||||||
|
#include "main/main_session.h"
|
||||||
|
#include "ui/boxes/confirm_box.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
|
|
||||||
namespace Giveaway {
|
namespace Giveaway {
|
||||||
|
@ -38,4 +43,111 @@ base::unique_qptr<Ui::PopupMenu> AwardMembersListController::rowContextMenu(
|
||||||
return nullptr;
|
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
|
} // namespace Giveaway
|
||||||
|
|
|
@ -14,6 +14,7 @@ class PeerListRow;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class PopupMenu;
|
class PopupMenu;
|
||||||
|
class Show;
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
||||||
namespace Window {
|
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
|
} // namespace Giveaway
|
||||||
|
|
Loading…
Add table
Reference in a new issue