import { IntentMethods, intentMethodsFromJson } from './IntentMethods'; import { RenderStrategy, renderStrategyFromJson } from './RenderStrategy'; import type { TokenizeCardInfo } from './TokenizeCardInfo'; import { tokenizeCardInfoFromJson } from './TokenizeCardInfo'; import type { InputField } from './InputField'; import type { CardTokenData } from './CardTokenData'; import { inputFieldFromJson } from './InputField'; import { cardTokenDataFromJson } from './CardTokenData'; import type { NativePayData } from './NativePayData'; import { nativePayDataFromJson } from './NativePayData'; import { InstallmentPlan, installmentPlanFromJson } from './InstallmentPlans'; ///// this is to restrict the types, if you need, we can remove the type value from each class, it's useless and add it here export type IntentStateDetails = | MethodSelection | IntentForm | IntentProcessed | TransactionWaitingUserAction | TransactionFailed | Expired | Processing | Closed | FormFields | UrlToRender | SavedCardCVV | CardIntentSuccessful | CardIntentFailed | NativePay | InstallmentPlans; export class MethodSelection { type: 'method_selection' = 'method_selection'; methods: IntentMethods; constructor(methods: IntentMethods) { this.methods = methods; } } export class IntentForm { type: 'intent_form' = 'intent_form'; } export class IntentProcessed { type: 'intent_processed' = 'intent_processed'; } export class TransactionWaitingUserAction { type: 'transaction_waiting_user_action' = 'transaction_waiting_user_action'; } export class TransactionFailed { type: 'transaction_failed' = 'transaction_failed'; recommendedMethods?: IntentMethods; constructor(recommendedMethods?: IntentMethods) { this.recommendedMethods = recommendedMethods; } } export class Expired { type: 'expired' = 'expired'; } export class Processing { type: 'processing' = 'processing'; } export class Closed { type: 'closed' = 'closed'; } export class CardIntentFailed { type: 'card_intent_failed' = 'card_intent_failed'; } export class CardIntentSuccessful { type: 'card_intent_successful' = 'card_intent_successful'; } export class InstallmentPlans { type: 'installment_plans' = 'installment_plans'; plans?: InstallmentPlan[]; constructor(plans?: InstallmentPlan[]) { this.plans = plans; } } export class FormFields { type: 'form_fields' = 'form_fields'; tokenizeCardInfo?: TokenizeCardInfo; billingFields?: InputField[]; shippingFields?: InputField[]; constructor( tokenizeCardInfo?: TokenizeCardInfo, billingFields?: InputField[], shippingFields?: InputField[] ) { this.tokenizeCardInfo = tokenizeCardInfo; this.billingFields = billingFields; this.shippingFields = shippingFields; } } export class UrlToRender { type: 'url_to_render' = 'url_to_render'; url?: string; renderStrategy?: RenderStrategy; constructor(url?: string, renderStrategy?: RenderStrategy) { this.url = url; this.renderStrategy = renderStrategy; } } export class SavedCardCVV { type: 'saved_card_cvv' = 'saved_card_cvv'; cvvField: InputField; cardTokenData?: CardTokenData; constructor(cvvField: InputField, cardTokenData?: CardTokenData) { this.cvvField = cvvField; this.cardTokenData = cardTokenData; } } export class NativePay { type: 'native_pay' = 'native_pay'; nativePayData?: NativePayData; constructor(nativePayData?: NativePayData) { this.nativePayData = nativePayData; } } export function intentStateDetailsFromJson(data: any): IntentStateDetails { const json = data; // Assuming JSON is already parsed into an object switch (json.type) { case 'method_selection': return new MethodSelection(intentMethodsFromJson(json.methods)); case 'intent_form': return new IntentForm(); case 'intent_processed': return new IntentProcessed(); case 'transaction_waiting_user_action': return new TransactionWaitingUserAction(); case 'transaction_failed': return new TransactionFailed( json.recommendedMethods ? intentMethodsFromJson(json.recommendedMethods) : undefined ); case 'expired': return new Expired(); case 'processing': return new Processing(); case 'closed': return new Closed(); case 'card_intent_successful': return new CardIntentSuccessful(); case 'card_intent_failed': return new CardIntentFailed(); case 'form_fields': return new FormFields( json.tokenizeCardInfo ? tokenizeCardInfoFromJson(json.tokenizeCardInfo) : undefined, json.billingFields ? json.billingFields.map((e: any) => inputFieldFromJson(e)) : undefined, json.shippingFields ? json.shippingFields.map((e: any) => inputFieldFromJson(e)) : undefined ); case 'url_to_render': return new UrlToRender( json.url, json.renderStrategy ? renderStrategyFromJson(json.renderStrategy) : undefined ); case 'saved_card_cvv': return new SavedCardCVV( inputFieldFromJson(json.cvvField), json.cardTokenData ? cardTokenDataFromJson(json.cardTokenData) : undefined ); case 'native_pay': return new NativePay( json.nativePayData ? nativePayDataFromJson(json.nativePayData) : undefined ); case 'installment_plans': return new InstallmentPlans( Array.isArray(json.installmentPlans) ? json.installmentPlans.map((planData: any) => installmentPlanFromJson(planData) ) : undefined ); default: throw new Error(`Unknown type: ${json.type}`); } }