4 ChargebeeSavedCardAuthorizationSuccess,
5 ChargebeeSubmitDirectDebitEventPayload,
6 ChargebeeSubmitEventPayload,
7 ChargebeeSubmitEventResponse,
8 ChargebeeVerifySavedCardEventPayload,
12 MessageBusResponseSuccess,
14 PaypalAuthorizedPayload,
15 SetPaypalPaymentIntentPayload,
16 ThreeDsChallengePayload,
17 } from '@proton/chargebee/lib';
18 import type { PaymentProcessorType } from '@proton/components/payments/react-extensions/interface';
19 import type { CheckSubscriptionData, PaymentsVersion } from '@proton/shared/lib/api/payments';
20 import type { SubscriptionCheckResponse } from '@proton/shared/lib/interfaces';
35 export interface CreateCardDetailsBackend {
44 export interface CardPayment {
45 Type: PAYMENT_METHOD_TYPES.CARD;
46 Details: CreateCardDetailsBackend;
49 export interface TokenPayment {
50 Type: PAYMENT_METHOD_TYPES.TOKEN;
56 export type WrappedPaymentsVersion = {
57 paymentsVersion: PaymentsVersion;
60 export type WrappedProcessorType = {
61 paymentProcessorType: PaymentProcessorType;
64 export type ExtendedTokenPayment = Partial<TokenPayment> & WrappedProcessorType & WrappedPaymentsVersion;
66 export interface PaypalPayment {
67 Type: PAYMENT_METHOD_TYPES.PAYPAL | PAYMENT_METHOD_TYPES.PAYPAL_CREDIT;
70 export interface WrappedPaypalPayment {
71 Payment: PaypalPayment;
74 export interface ExistingPayment {
75 PaymentMethodID: string;
78 export interface WrappedCardPayment {
82 export interface TokenPaymentMethod {
83 Payment: TokenPayment;
86 export type Currency = (typeof CURRENCIES)[number];
88 export interface AmountAndCurrency {
93 export interface PaymentTokenResult {
95 Status: PAYMENT_TOKEN_STATUS;
100 export type PlainPaymentMethodType = `${PAYMENT_METHOD_TYPES}`;
102 export type ChargeablePaymentParameters = Partial<V5PaymentToken> &
103 AmountAndCurrency & {
105 | PAYMENT_METHOD_TYPES.PAYPAL
106 | PAYMENT_METHOD_TYPES.PAYPAL_CREDIT
107 | PAYMENT_METHOD_TYPES.CARD
108 | PAYMENT_METHOD_TYPES.CHARGEBEE_CARD
109 | PAYMENT_METHOD_TYPES.CHARGEBEE_PAYPAL
110 | PAYMENT_METHOD_TYPES.BITCOIN
111 | PAYMENT_METHOD_TYPES.CHARGEBEE_BITCOIN
112 | PAYMENT_METHOD_TYPES.CHARGEBEE_SEPA_DIRECT_DEBIT;
116 export type ChargeablePaymentToken = V5PaymentToken &
117 AmountAndCurrency & {
119 | PAYMENT_METHOD_TYPES.PAYPAL
120 | PAYMENT_METHOD_TYPES.PAYPAL_CREDIT
121 | PAYMENT_METHOD_TYPES.CARD
122 | PAYMENT_METHOD_TYPES.CHARGEBEE_CARD
123 | PAYMENT_METHOD_TYPES.CHARGEBEE_PAYPAL
124 | PAYMENT_METHOD_TYPES.CHARGEBEE_SEPA_DIRECT_DEBIT;
128 export type NonChargeablePaymentToken = Omit<ChargeablePaymentToken, 'chargeable'> & {
130 status: PAYMENT_TOKEN_STATUS;
135 export interface PaymentMethodStatus {
143 export interface PaymentMethodStatusExtended {
145 State?: string | null;
146 VendorStates: PaymentMethodStatus;
149 export interface PayPalDetails {
150 BillingAgreementID: string;
155 export interface SavedCardDetails {
157 * Even though you can't add the name to the card, it's still returned from the API for old users who already
158 * have the card name.
160 Name?: string | null;
169 export type PaymentMethodCardDetails = {
172 Type: PAYMENT_METHOD_TYPES.CARD | PAYMENT_METHOD_TYPES.CHARGEBEE_CARD;
173 Details: SavedCardDetails;
175 External?: MethodStorage;
178 export type PaymentMethodCardDetailsInternal = {
179 Type: PAYMENT_METHOD_TYPES.CARD;
180 External?: MethodStorage.INTERNAL;
181 } & PaymentMethodCardDetails;
183 export type PaymentMethodCardDetailsExternal = {
184 Type: PAYMENT_METHOD_TYPES.CHARGEBEE_CARD;
185 External: MethodStorage.EXTERNAL;
186 } & PaymentMethodCardDetails;
188 export type PaymentMethodPaypal = {
191 Type: PAYMENT_METHOD_TYPES.PAYPAL | PAYMENT_METHOD_TYPES.CHARGEBEE_PAYPAL;
192 Details: PayPalDetails;
193 External?: MethodStorage;
196 export type PaymentMethodPaypalInternal = {
197 Type: PAYMENT_METHOD_TYPES.PAYPAL;
198 External?: MethodStorage.INTERNAL;
199 } & PaymentMethodPaypal;
201 export type PaymentMethodPaypalExternal = {
202 Type: PAYMENT_METHOD_TYPES.CHARGEBEE_PAYPAL;
203 External: MethodStorage.EXTERNAL;
204 } & PaymentMethodPaypal;
206 export type SepaDetails = {
212 export type PaymentMethodSepa = {
214 Type: PAYMENT_METHOD_TYPES.CHARGEBEE_SEPA_DIRECT_DEBIT;
217 External?: MethodStorage;
218 Details: SepaDetails;
221 export type SavedPaymentMethod = PaymentMethodPaypal | PaymentMethodCardDetails | PaymentMethodSepa;
222 export type SavedPaymentMethodInternal = PaymentMethodPaypalInternal | PaymentMethodCardDetailsInternal;
223 export type SavedPaymentMethodExternal = PaymentMethodPaypalExternal | PaymentMethodCardDetailsExternal;
225 export interface LatestSubscription {
226 LastSubscriptionEnd: number;
229 export type ExistingPaymentMethod = string;
231 export type PaymentMethodType = PlainPaymentMethodType | ExistingPaymentMethod;
233 export interface AvailablePaymentMethod {
234 readonly type: PlainPaymentMethodType;
235 readonly paymentMethodId?: string; // defined only for existing payment methods
236 readonly isExpired?: boolean; // defined only for existing credit cards
237 readonly value: PaymentMethodType;
238 readonly isSaved: boolean;
241 export type PaymentMethodFlows =
245 | 'signup-pass-upgrade'
247 | 'signup-v2-upgrade'
254 export type V5Payments = {
258 export type V5PaymentToken = {
259 PaymentToken: string;
262 export type ChargeableV5PaymentToken = ChargeablePaymentToken & {
264 | PAYMENT_METHOD_TYPES.CHARGEBEE_CARD
265 | PAYMENT_METHOD_TYPES.CHARGEBEE_PAYPAL
266 | PAYMENT_METHOD_TYPES.CHARGEBEE_SEPA_DIRECT_DEBIT;
269 export type NonChargeableV5PaymentToken = Omit<ChargeableV5PaymentToken, 'chargeable'> & {
273 export type AuthorizedV5PaymentToken = {
277 export type NonAuthorizedV5PaymentToken = {
282 export type ChargeableV5PaymentParameters = ChargeablePaymentParameters & {
284 | PAYMENT_METHOD_TYPES.CHARGEBEE_CARD
285 | PAYMENT_METHOD_TYPES.CHARGEBEE_PAYPAL
286 | PAYMENT_METHOD_TYPES.CHARGEBEE_BITCOIN
287 | PAYMENT_METHOD_TYPES.CHARGEBEE_SEPA_DIRECT_DEBIT;
290 export type ChargebeeFetchedPaymentToken = (ChargeableV5PaymentToken | NonChargeableV5PaymentToken) &
291 (AuthorizedV5PaymentToken | NonAuthorizedV5PaymentToken);
293 export type CheckWithAutomaticOptions = {
294 forcedVersion: PaymentsVersion;
299 export type MultiCheckSubscriptionData = CheckSubscriptionData & (CheckWithAutomaticOptions | {});
301 export type RequestOptions = {
302 signal?: AbortSignal;
306 export type MultiCheckOptions = {
310 export type GetPlansData = {
314 export interface PaymentsApi {
315 checkWithAutomaticVersion: (
316 data: CheckSubscriptionData,
317 requestOptions?: RequestOptions,
318 options?: CheckWithAutomaticOptions
319 ) => Promise<SubscriptionCheckResponse>;
322 data: MultiCheckSubscriptionData[],
323 options?: MultiCheckOptions
324 ) => Promise<SubscriptionCheckResponse[]>;
327 data: CheckSubscriptionData,
328 options: CheckWithAutomaticOptions | undefined,
329 result: SubscriptionCheckResponse
332 statusExtendedAutomatic: () => Promise<PaymentMethodStatusExtended>;
335 export type ChargebeeKillSwitchData = {
340 export type ChargebeeKillSwitch = (data?: ChargebeeKillSwitchData) => boolean;
341 export type ForceEnableChargebee = () => void;
343 export type RemoveEventListener = () => void;
345 export type InitializeCreditCardOptions = {
349 export type ChargebeeIframeHandles = {
351 payload: ChargebeeSubmitEventPayload
352 ) => Promise<MessageBusResponseSuccess<ChargebeeSubmitEventResponse>>;
353 initializeCreditCard: (props: InitializeCreditCardOptions) => Promise<any>;
354 initializeSavedCreditCard: () => Promise<any>;
355 validateSavedCreditCard: (
356 payload: ChargebeeVerifySavedCardEventPayload
357 ) => Promise<MessageBusResponseSuccess<ChargebeeSavedCardAuthorizationSuccess>>;
358 initializePaypal: () => Promise<any>;
359 setPaypalPaymentIntent: (payload: SetPaypalPaymentIntentPayload, abortSignal: AbortSignal) => Promise<any>;
360 getHeight: () => Promise<GetHeightResponse>;
361 getBin: () => Promise<MessageBusResponse<BinData | null>>;
362 validateCardForm: () => Promise<MessageBusResponse<FormValidationErrors>>;
363 changeRenderMode: (renderMode: CardFormRenderMode) => Promise<any>;
364 updateFields: () => Promise<any>;
365 initializeDirectDebit: () => Promise<any>;
366 submitDirectDebit: (payload: ChargebeeSubmitDirectDebitEventPayload) => Promise<MessageBusResponseSuccess<unknown>>;
369 export type ChargebeeIframeEvents = {
370 onPaypalAuthorized: (callback: (payload: PaypalAuthorizedPayload) => any) => RemoveEventListener;
371 onPaypalFailure: (callback: (error: any) => any) => RemoveEventListener;
372 onPaypalClicked: (callback: () => any) => RemoveEventListener;
373 onPaypalCancelled: (callback: () => any) => RemoveEventListener;
374 onThreeDsChallenge: (callback: (payload: ThreeDsChallengePayload) => any) => RemoveEventListener;
375 onThreeDsSuccess: (callback: (payload: PaymentIntent) => any) => RemoveEventListener;
376 onThreeDsFailure: (callback: (error: any) => any) => RemoveEventListener;
377 onCardVeririfcation3dsChallenge: (callback: (payload: ThreeDsChallengePayload) => any) => RemoveEventListener;
378 onCardVeririfcationSuccess: (
379 callback: (payload: ChargebeeSavedCardAuthorizationSuccess) => any
380 ) => RemoveEventListener;
381 onCardVeririfcationFailure: (callback: (error: any) => any) => RemoveEventListener;
383 callback: (error: any, rawError: any, messagePayload: any, checkpoints: any[]) => any
384 ) => RemoveEventListener;
387 export type CryptocurrencyType = 'bitcoin';
389 export interface CryptoPayment {
390 Type: 'cryptocurrency';
392 Coin: CryptocurrencyType;
396 export interface WrappedCryptoPayment {
397 Payment: CryptoPayment;
400 export interface Invoice {
403 State: INVOICE_STATE;
406 AmountCharged: number;
414 export interface InvoiceResponse {
420 type Quantity = number;
422 export type PlanIDs = Partial<{
423 [planName in PLANS | ADDON_NAMES]: Quantity;
426 export type MaxKeys =
433 | 'MaxIPs' // synthetic key, it does't exist in the API
434 | 'MaxAI'; // synthetic key, it does't exist in the API
436 export type FreeSubscription = typeof FREE_SUBSCRIPTION;