| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- /*
- This file is part of Telegram Desktop,
- the official desktop application for the Telegram messaging service.
- For license and copyright information please follow this link:
- https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
- */
- #pragma once
- #include "payments/ui/payments_panel_data.h"
- #include "base/weak_ptr.h"
- #include "mtproto/sender.h"
- class Image;
- class QJsonObject;
- namespace Core {
- struct CloudPasswordResult;
- } // namespace Core
- namespace Stripe {
- class APIClient;
- } // namespace Stripe
- namespace SmartGlocal {
- class APIClient;
- } // namespace SmartGlocal
- namespace Main {
- class Session;
- } // namespace Main
- namespace Data {
- class PhotoMedia;
- } // namespace Data
- namespace Payments {
- enum class Mode;
- struct FormDetails {
- uint64 formId = 0;
- QString url;
- QString nativeProvider;
- QString termsBotUsername;
- QByteArray nativeParamsJson;
- UserId botId = 0;
- UserId providerId = 0;
- bool canSaveCredentials = false;
- bool passwordMissing = false;
- bool termsAccepted = false;
- [[nodiscard]] bool valid() const {
- return !url.isEmpty();
- }
- [[nodiscard]] explicit operator bool() const {
- return valid();
- }
- };
- struct ThumbnailLoadProcess {
- std::shared_ptr<Data::PhotoMedia> view;
- bool blurredSet = false;
- rpl::lifetime lifetime;
- };
- struct SavedCredentials {
- QString id;
- QString title;
- [[nodiscard]] bool valid() const {
- return !id.isEmpty();
- }
- [[nodiscard]] explicit operator bool() const {
- return valid();
- }
- };
- struct NewCredentials {
- QString title;
- QByteArray data;
- bool saveOnServer = false;
- [[nodiscard]] bool empty() const {
- return data.isEmpty();
- }
- [[nodiscard]] explicit operator bool() const {
- return !empty();
- }
- };
- struct StripePaymentMethod {
- QString publishableKey;
- };
- struct SmartGlocalPaymentMethod {
- QString publicToken;
- QString tokenizeUrl;
- };
- struct NativePaymentMethod {
- std::variant<
- v::null_t,
- StripePaymentMethod,
- SmartGlocalPaymentMethod> data;
- [[nodiscard]] bool valid() const {
- return !v::is_null(data);
- }
- [[nodiscard]] explicit operator bool() const {
- return valid();
- }
- };
- struct PaymentMethod {
- NativePaymentMethod native;
- std::vector<SavedCredentials> savedCredentials;
- int savedCredentialsIndex = 0;
- NewCredentials newCredentials;
- Ui::PaymentMethodDetails ui;
- };
- struct InvoiceMessage {
- not_null<PeerData*> peer;
- MsgId itemId = 0;
- };
- struct InvoiceSlug {
- not_null<Main::Session*> session;
- QString slug;
- };
- struct InvoicePremiumGiftCodeGiveaway {
- not_null<ChannelData*> boostPeer;
- std::vector<not_null<ChannelData*>> additionalChannels;
- std::vector<QString> countries;
- QString additionalPrize;
- TimeId untilDate = 0;
- bool onlyNewSubscribers = false;
- bool showWinners = false;
- };
- struct InvoicePremiumGiftCodeUsers {
- std::vector<not_null<UserData*>> users;
- ChannelData *boostPeer = nullptr;
- TextWithEntities message;
- };
- struct InvoicePremiumGiftCode {
- std::variant<
- InvoicePremiumGiftCodeUsers,
- InvoicePremiumGiftCodeGiveaway> purpose;
- QString currency;
- QString storeProduct;
- std::optional<uint64> giveawayCredits;
- uint64 randomId = 0;
- uint64 amount = 0;
- int storeQuantity = 0;
- int users = 0;
- int months = 0;
- };
- struct InvoiceCredits {
- not_null<Main::Session*> session;
- uint64 randomId = 0;
- uint64 credits = 0;
- QString product;
- QString currency;
- uint64 amount = 0;
- bool extended = false;
- PeerId giftPeerId = PeerId(0);
- int subscriptionPeriod = 0;
- };
- struct InvoiceStarGift {
- uint64 giftId = 0;
- uint64 randomId = 0;
- TextWithEntities message;
- not_null<PeerData*> recipient;
- int limitedCount = 0;
- bool anonymous = false;
- bool upgraded = false;
- };
- struct InvoiceId {
- std::variant<
- InvoiceMessage,
- InvoiceSlug,
- InvoicePremiumGiftCode,
- InvoiceCredits,
- InvoiceStarGift> value;
- };
- struct CreditsFormData {
- InvoiceId id;
- uint64 formId = 0;
- uint64 botId = 0;
- QString title;
- QString description;
- PhotoData *photo = nullptr;
- InvoiceCredits invoice;
- MTPInputInvoice inputInvoice;
- int starGiftLimitedCount = 0;
- bool starGiftForm = false;
- };
- struct CreditsReceiptData {
- QString id;
- QString title;
- QString description;
- PhotoData *photo = nullptr;
- PeerId peerId = PeerId(0);
- StarsAmount credits;
- TimeId date = 0;
- };
- struct ToggleProgress {
- bool shown = true;
- };
- struct FormReady {};
- struct ThumbnailUpdated {
- QImage thumbnail;
- };
- struct ValidateFinished {};
- struct PaymentMethodUpdate {
- bool requestNewPassword = false;
- };
- struct VerificationNeeded {
- QString url;
- };
- struct TmpPasswordRequired {};
- struct BotTrustRequired {
- not_null<UserData*> bot;
- not_null<UserData*> provider;
- };
- struct PaymentFinished {
- MTPUpdates updates;
- };
- struct CreditsPaymentStarted {
- CreditsFormData data;
- };
- struct CreditsReceiptReady {
- CreditsReceiptData data;
- };
- struct Error {
- enum class Type {
- None,
- Form,
- Validate,
- Stripe,
- SmartGlocal,
- TmpPassword,
- Send,
- };
- Type type = Type::None;
- QString id;
- [[nodiscard]] bool empty() const {
- return (type == Type::None);
- }
- [[nodiscard]] explicit operator bool() const {
- return !empty();
- }
- };
- struct FormUpdate : std::variant<
- ToggleProgress,
- FormReady,
- ThumbnailUpdated,
- ValidateFinished,
- PaymentMethodUpdate,
- VerificationNeeded,
- TmpPasswordRequired,
- BotTrustRequired,
- PaymentFinished,
- CreditsPaymentStarted,
- CreditsReceiptReady,
- Error> {
- using variant::variant;
- };
- [[nodiscard]] not_null<Main::Session*> SessionFromId(const InvoiceId &id);
- [[nodiscard]] MTPinputStorePaymentPurpose InvoicePremiumGiftCodeGiveawayToTL(
- const InvoicePremiumGiftCode &invoice);
- [[nodiscard]] MTPinputStorePaymentPurpose InvoiceCreditsGiveawayToTL(
- const InvoicePremiumGiftCode &invoice);
- [[nodiscard]] bool IsPremiumForStarsInvoice(const InvoiceId &id);
- class Form final : public base::has_weak_ptr {
- public:
- Form(InvoiceId id, bool receipt);
- ~Form();
- [[nodiscard]] const Ui::Invoice &invoice() const {
- return _invoice;
- }
- [[nodiscard]] const FormDetails &details() const {
- return _details;
- }
- [[nodiscard]] const Ui::RequestedInformation &information() const {
- return _information;
- }
- [[nodiscard]] const PaymentMethod &paymentMethod() const {
- return _paymentMethod;
- }
- [[nodiscard]] const Ui::ShippingOptions &shippingOptions() const {
- return _shippingOptions;
- }
- [[nodiscard]] bool hasChanges() const;
- [[nodiscard]] rpl::producer<FormUpdate> updates() const {
- return _updates.events();
- }
- [[nodiscard]] std::optional<QDate> overrideExpireDateThreshold() const;
- void validateInformation(const Ui::RequestedInformation &information);
- void validateCard(
- const Ui::UncheckedCardDetails &details,
- bool saveInformation);
- void setPaymentCredentials(const NewCredentials &credentials);
- void chooseSavedMethod(const QString &id);
- void setHasPassword(bool has);
- void setShippingOption(const QString &id);
- void setTips(int64 value);
- void acceptTerms();
- void trustBot();
- void submit();
- void submit(const Core::CloudPasswordResult &result);
- private:
- void fillInvoiceFromMessage();
- void showProgress();
- void hideProgress();
- [[nodiscard]] Data::FileOrigin thumbnailFileOrigin() const;
- void loadThumbnail(not_null<PhotoData*> photo);
- [[nodiscard]] QImage prepareGoodThumbnail(
- const std::shared_ptr<Data::PhotoMedia> &view) const;
- [[nodiscard]] QImage prepareBlurredThumbnail(
- const std::shared_ptr<Data::PhotoMedia> &view) const;
- [[nodiscard]] QImage prepareThumbnail(
- not_null<const Image*> image,
- bool blurred = false) const;
- [[nodiscard]] QImage prepareEmptyThumbnail() const;
- void requestForm();
- void requestReceipt();
- void processForm(const MTPDpayments_paymentForm &data);
- void processReceipt(const MTPDpayments_paymentReceipt &data);
- void processReceipt(const MTPDpayments_paymentReceiptStars &data);
- void processInvoice(const MTPDinvoice &data);
- void processDetails(const MTPDpayments_paymentForm &data);
- void processDetails(const MTPDpayments_paymentReceipt &data);
- void processDetails(const MTPDpayments_paymentReceiptStars &data);
- void processSavedInformation(const MTPDpaymentRequestedInfo &data);
- void processAdditionalPaymentMethods(
- const QVector<MTPPaymentFormMethod> &list);
- void processShippingOptions(const QVector<MTPShippingOption> &data);
- void fillPaymentMethodInformation();
- void fillStripeNativeMethod(QJsonObject object);
- void fillSmartGlocalNativeMethod(QJsonObject object);
- void refreshPaymentMethodDetails();
- void refreshSavedPaymentMethodDetails();
- [[nodiscard]] QString defaultPhone() const;
- [[nodiscard]] QString defaultCountry() const;
- [[nodiscard]] MTPInputInvoice inputInvoice() const;
- void validateCard(
- const StripePaymentMethod &method,
- const Ui::UncheckedCardDetails &details,
- bool saveInformation);
- void validateCard(
- const SmartGlocalPaymentMethod &method,
- const Ui::UncheckedCardDetails &details,
- bool saveInformation);
- bool validateInformationLocal(
- const Ui::RequestedInformation &information) const;
- [[nodiscard]] Error informationErrorLocal(
- const Ui::RequestedInformation &information) const;
- bool validateCardLocal(
- const Ui::UncheckedCardDetails &details,
- const std::optional<QDate> &overrideExpireDateThreshold) const;
- [[nodiscard]] Error cardErrorLocal(
- const Ui::UncheckedCardDetails &details,
- const std::optional<QDate> &overrideExpireDateThreshold) const;
- const InvoiceId _id;
- const not_null<Main::Session*> _session;
- MTP::Sender _api;
- bool _receiptMode = false;
- Ui::Invoice _invoice;
- std::unique_ptr<ThumbnailLoadProcess> _thumbnailLoadProcess;
- FormDetails _details;
- Ui::RequestedInformation _savedInformation;
- Ui::RequestedInformation _information;
- PaymentMethod _paymentMethod;
- Ui::RequestedInformation _validatedInformation;
- mtpRequestId _validateRequestId = 0;
- mtpRequestId _passwordRequestId = 0;
- std::unique_ptr<Stripe::APIClient> _stripe;
- std::unique_ptr<SmartGlocal::APIClient> _smartglocal;
- Ui::ShippingOptions _shippingOptions;
- QString _requestedInformationId;
- rpl::event_stream<FormUpdate> _updates;
- };
- } // namespace Payments
|