Added box for small balance of credits.
This commit is contained in:
parent
5defb9fb17
commit
7d75c25214
8 changed files with 133 additions and 3 deletions
|
@ -2324,6 +2324,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
"lng_credits_box_history_entry_id_copied" = "Transaction ID copied to clipboard.";
|
"lng_credits_box_history_entry_id_copied" = "Transaction ID copied to clipboard.";
|
||||||
"lng_credits_box_history_entry_about" = "You can dispute this transaction {link}.";
|
"lng_credits_box_history_entry_about" = "You can dispute this transaction {link}.";
|
||||||
"lng_credits_box_history_entry_about_link" = "here";
|
"lng_credits_box_history_entry_about_link" = "here";
|
||||||
|
"lng_credits_small_balance_title#one" = "{count} Star Needed";
|
||||||
|
"lng_credits_small_balance_title#other" = "{count} Stars Needed";
|
||||||
|
"lng_credits_small_balance_about" = "Buy **Stars** and use them on **{bot}** and other miniapps.";
|
||||||
|
|
||||||
"lng_location_title" = "Location";
|
"lng_location_title" = "Location";
|
||||||
"lng_location_about" = "Display the location of your business on your account.";
|
"lng_location_about" = "Display the location of your business on your account.";
|
||||||
|
|
|
@ -868,7 +868,7 @@ CreditsController::CreditsController(CreditsDescriptor d)
|
||||||
, _premiumBot(d.premiumBot)
|
, _premiumBot(d.premiumBot)
|
||||||
, _entryClickedCallback(std::move(d.entryClickedCallback))
|
, _entryClickedCallback(std::move(d.entryClickedCallback))
|
||||||
, _creditIcon(d.creditIcon)
|
, _creditIcon(d.creditIcon)
|
||||||
, _api(d.premiumBot, d.in, d.out)
|
, _api(d.premiumBot->session().user(), d.in, d.out)
|
||||||
, _firstSlice(std::move(d.firstSlice)) {
|
, _firstSlice(std::move(d.firstSlice)) {
|
||||||
PeerListController::setStyleOverrides(&st::boostsListBox);
|
PeerListController::setStyleOverrides(&st::boostsListBox);
|
||||||
}
|
}
|
||||||
|
|
|
@ -414,11 +414,13 @@ void CheckoutProcess::handleFormUpdate(const FormUpdate &update) {
|
||||||
if (_nonPanelPaymentFormProcess) {
|
if (_nonPanelPaymentFormProcess) {
|
||||||
_nonPanelPaymentFormProcess(
|
_nonPanelPaymentFormProcess(
|
||||||
std::make_shared<CreditsFormData>(data.data));
|
std::make_shared<CreditsFormData>(data.data));
|
||||||
|
close();
|
||||||
}
|
}
|
||||||
}, [&](const CreditsReceiptReady &data) {
|
}, [&](const CreditsReceiptReady &data) {
|
||||||
if (_nonPanelPaymentFormProcess) {
|
if (_nonPanelPaymentFormProcess) {
|
||||||
_nonPanelPaymentFormProcess(
|
_nonPanelPaymentFormProcess(
|
||||||
std::make_shared<CreditsReceiptData>(data.data));
|
std::make_shared<CreditsReceiptData>(data.data));
|
||||||
|
close();
|
||||||
}
|
}
|
||||||
}, [&](const Error &error) {
|
}, [&](const Error &error) {
|
||||||
handleError(error);
|
handleError(error);
|
||||||
|
|
|
@ -7,12 +7,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#include "payments/payments_non_panel_process.h"
|
#include "payments/payments_non_panel_process.h"
|
||||||
|
|
||||||
|
#include "api/api_credits.h"
|
||||||
#include "base/unixtime.h"
|
#include "base/unixtime.h"
|
||||||
#include "boxes/send_credits_box.h"
|
#include "boxes/send_credits_box.h"
|
||||||
#include "data/data_credits.h"
|
#include "data/data_credits.h"
|
||||||
#include "data/data_photo.h"
|
#include "data/data_photo.h"
|
||||||
|
#include "data/data_user.h"
|
||||||
#include "history/history_item.h"
|
#include "history/history_item.h"
|
||||||
#include "history/history_item_components.h"
|
#include "history/history_item_components.h"
|
||||||
|
#include "main/main_session.h"
|
||||||
#include "payments/payments_checkout_process.h" // NonPanelPaymentForm.
|
#include "payments/payments_checkout_process.h" // NonPanelPaymentForm.
|
||||||
#include "payments/payments_form.h"
|
#include "payments/payments_form.h"
|
||||||
#include "settings/settings_credits_graphics.h"
|
#include "settings/settings_credits_graphics.h"
|
||||||
|
@ -40,7 +43,34 @@ Fn<void(NonPanelPaymentForm)> ProcessNonPanelPaymentFormFactory(
|
||||||
using CreditsFormDataPtr = std::shared_ptr<CreditsFormData>;
|
using CreditsFormDataPtr = std::shared_ptr<CreditsFormData>;
|
||||||
using CreditsReceiptPtr = std::shared_ptr<CreditsReceiptData>;
|
using CreditsReceiptPtr = std::shared_ptr<CreditsReceiptData>;
|
||||||
if (const auto creditsData = std::get_if<CreditsFormDataPtr>(&form)) {
|
if (const auto creditsData = std::get_if<CreditsFormDataPtr>(&form)) {
|
||||||
controller->uiShow()->show(Box(Ui::SendCreditsBox, *creditsData));
|
const auto form = *creditsData;
|
||||||
|
const auto lifetime = std::make_shared<rpl::lifetime>();
|
||||||
|
const auto api = lifetime->make_state<Api::CreditsStatus>(
|
||||||
|
controller->session().user());
|
||||||
|
const auto sendBox = [=, weak = base::make_weak(controller)] {
|
||||||
|
if (const auto strong = weak.get()) {
|
||||||
|
controller->uiShow()->show(Box(Ui::SendCreditsBox, form));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const auto weak = base::make_weak(controller);
|
||||||
|
api->request({}, [=](Data::CreditsStatusSlice slice) {
|
||||||
|
if (const auto strong = weak.get()) {
|
||||||
|
strong->session().setCredits(slice.balance);
|
||||||
|
const auto creditsNeeded = int64(form->invoice.credits)
|
||||||
|
- int64(slice.balance);
|
||||||
|
if (creditsNeeded <= 0) {
|
||||||
|
sendBox();
|
||||||
|
} else {
|
||||||
|
strong->uiShow()->show(Box(
|
||||||
|
Settings::SmallBalanceBox,
|
||||||
|
strong,
|
||||||
|
creditsNeeded,
|
||||||
|
form->botId,
|
||||||
|
sendBox));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lifetime->destroy();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (const auto r = std::get_if<CreditsReceiptPtr>(&form)) {
|
if (const auto r = std::get_if<CreditsReceiptPtr>(&form)) {
|
||||||
const auto receipt = *r;
|
const auto receipt = *r;
|
||||||
|
|
|
@ -298,7 +298,7 @@ void Credits::setupContent() {
|
||||||
Ui::StartFireworks(_parent);
|
Ui::StartFireworks(_parent);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
FillCreditOptions(_controller, content, paid);
|
FillCreditOptions(_controller, content, 0, paid);
|
||||||
setupHistory(content);
|
setupHistory(content);
|
||||||
|
|
||||||
Ui::ResizeFitChild(this, content);
|
Ui::ResizeFitChild(this, content);
|
||||||
|
|
|
@ -166,6 +166,7 @@ QImage GenerateStars(int height, int count) {
|
||||||
void FillCreditOptions(
|
void FillCreditOptions(
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
not_null<Ui::VerticalLayout*> container,
|
not_null<Ui::VerticalLayout*> container,
|
||||||
|
int minCredits,
|
||||||
Fn<void()> paid) {
|
Fn<void()> paid) {
|
||||||
const auto options = container->add(
|
const auto options = container->add(
|
||||||
object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
|
object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
|
||||||
|
@ -193,6 +194,9 @@ void FillCreditOptions(
|
||||||
const auto buttonHeight = st.height + rect::m::sum::v(st.padding);
|
const auto buttonHeight = st.height + rect::m::sum::v(st.padding);
|
||||||
for (auto i = 0; i < options.size(); i++) {
|
for (auto i = 0; i < options.size(); i++) {
|
||||||
const auto &option = options[i];
|
const auto &option = options[i];
|
||||||
|
if (option.credits < minCredits) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const auto button = content->add(object_ptr<Ui::SettingsButton>(
|
const auto button = content->add(object_ptr<Ui::SettingsButton>(
|
||||||
content,
|
content,
|
||||||
rpl::never<QString>(),
|
rpl::never<QString>(),
|
||||||
|
@ -536,4 +540,82 @@ object_ptr<Ui::RpWidget> HistoryEntryPhoto(
|
||||||
return owned;
|
return owned;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SmallBalanceBox(
|
||||||
|
not_null<Ui::GenericBox*> box,
|
||||||
|
not_null<Window::SessionController*> controller,
|
||||||
|
int creditsNeeded,
|
||||||
|
UserId botId,
|
||||||
|
Fn<void()> paid) {
|
||||||
|
box->setWidth(st::boxWideWidth);
|
||||||
|
box->addButton(tr::lng_close(), [=] { box->closeBox(); });
|
||||||
|
const auto done = [=] {
|
||||||
|
box->closeBox();
|
||||||
|
paid();
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto bot = controller->session().data().user(botId).get();
|
||||||
|
|
||||||
|
const auto content = [&]() -> Ui::Premium::TopBarAbstract* {
|
||||||
|
const auto weak = base::make_weak(controller);
|
||||||
|
const auto clickContextOther = [=] {
|
||||||
|
return QVariant::fromValue(ClickHandlerContext{
|
||||||
|
.sessionWindow = weak,
|
||||||
|
.botStartAutoSubmit = true,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return box->setPinnedToTopContent(object_ptr<Ui::Premium::TopBar>(
|
||||||
|
box,
|
||||||
|
st::creditsLowBalancePremiumCover,
|
||||||
|
Ui::Premium::TopBarDescriptor{
|
||||||
|
.clickContextOther = clickContextOther,
|
||||||
|
.title = tr::lng_credits_small_balance_title(
|
||||||
|
lt_count,
|
||||||
|
rpl::single(creditsNeeded) | tr::to_count()),
|
||||||
|
.about = tr::lng_credits_small_balance_about(
|
||||||
|
lt_bot,
|
||||||
|
rpl::single(TextWithEntities{ bot->name() }),
|
||||||
|
Ui::Text::RichLangValue),
|
||||||
|
.light = true,
|
||||||
|
.gradientStops = Ui::Premium::CreditsIconGradientStops(),
|
||||||
|
}));
|
||||||
|
}();
|
||||||
|
|
||||||
|
FillCreditOptions(controller, box->verticalLayout(), creditsNeeded, done);
|
||||||
|
|
||||||
|
content->setMaximumHeight(st::creditsLowBalancePremiumCoverHeight);
|
||||||
|
content->setMinimumHeight(st::infoLayerTopBarHeight);
|
||||||
|
|
||||||
|
content->resize(content->width(), content->maximumHeight());
|
||||||
|
content->additionalHeight(
|
||||||
|
) | rpl::start_with_next([=](int additionalHeight) {
|
||||||
|
const auto wasMax = (content->height() == content->maximumHeight());
|
||||||
|
content->setMaximumHeight(st::creditsLowBalancePremiumCoverHeight
|
||||||
|
+ additionalHeight);
|
||||||
|
if (wasMax) {
|
||||||
|
content->resize(content->width(), content->maximumHeight());
|
||||||
|
}
|
||||||
|
}, content->lifetime());
|
||||||
|
|
||||||
|
{
|
||||||
|
const auto balance = AddBalanceWidget(
|
||||||
|
content,
|
||||||
|
controller->session().creditsValue(),
|
||||||
|
true);
|
||||||
|
const auto api = balance->lifetime().make_state<Api::CreditsStatus>(
|
||||||
|
controller->session().user());
|
||||||
|
api->request({}, [=](Data::CreditsStatusSlice slice) {
|
||||||
|
controller->session().setCredits(slice.balance);
|
||||||
|
});
|
||||||
|
rpl::combine(
|
||||||
|
balance->sizeValue(),
|
||||||
|
content->sizeValue()
|
||||||
|
) | rpl::start_with_next([=](const QSize &, const QSize &) {
|
||||||
|
balance->moveToRight(
|
||||||
|
st::creditsHistoryRightSkip * 2,
|
||||||
|
st::creditsHistoryRightSkip);
|
||||||
|
balance->update();
|
||||||
|
}, balance->lifetime());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Settings
|
} // namespace Settings
|
||||||
|
|
|
@ -33,6 +33,7 @@ namespace Settings {
|
||||||
void FillCreditOptions(
|
void FillCreditOptions(
|
||||||
not_null<Window::SessionController*> controller,
|
not_null<Window::SessionController*> controller,
|
||||||
not_null<Ui::VerticalLayout*> container,
|
not_null<Ui::VerticalLayout*> container,
|
||||||
|
int minCredits,
|
||||||
Fn<void()> paid);
|
Fn<void()> paid);
|
||||||
|
|
||||||
[[nodiscard]] not_null<Ui::RpWidget*> AddBalanceWidget(
|
[[nodiscard]] not_null<Ui::RpWidget*> AddBalanceWidget(
|
||||||
|
@ -51,5 +52,12 @@ void ReceiptCreditsBox(
|
||||||
not_null<PhotoData*> photo,
|
not_null<PhotoData*> photo,
|
||||||
int photoSize);
|
int photoSize);
|
||||||
|
|
||||||
|
void SmallBalanceBox(
|
||||||
|
not_null<Ui::GenericBox*> box,
|
||||||
|
not_null<Window::SessionController*> controller,
|
||||||
|
int creditsNeeded,
|
||||||
|
UserId botId,
|
||||||
|
Fn<void()> paid);
|
||||||
|
|
||||||
} // namespace Settings
|
} // namespace Settings
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,11 @@ creditsPremiumCover: PremiumCover(defaultPremiumCover) {
|
||||||
textFg: boxTitleFg;
|
textFg: boxTitleFg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
creditsLowBalancePremiumCover: PremiumCover(creditsPremiumCover) {
|
||||||
|
starSize: size(64px, 62px);
|
||||||
|
starTopSkip: 30px;
|
||||||
|
}
|
||||||
|
creditsLowBalancePremiumCoverHeight: 180px;
|
||||||
creditsTopupButton: SettingsButton(settingsButton) {
|
creditsTopupButton: SettingsButton(settingsButton) {
|
||||||
style: semiboldTextStyle;
|
style: semiboldTextStyle;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue