Skip to content

Commit

Permalink
refactor: change handle order, adds onPaymentMethodsRequest
Browse files Browse the repository at this point in the history
  • Loading branch information
m1aw committed Dec 6, 2023
1 parent b5c8862 commit 62f4518
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 32 deletions.
16 changes: 0 additions & 16 deletions packages/lib/src/components/ANCV/ANCV.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import SRPanelProvider from '../../core/Errors/SRPanelProvider';
import AdyenCheckoutError from '../../core/Errors/AdyenCheckoutError';
import PayButton from '../internal/PayButton';
import { ANCVConfiguration } from './types';
import { PaymentResponseData } from '../../types/global-types';

export class ANCVElement extends UIElement<ANCVConfiguration> {
public static type = 'ancv';

Expand All @@ -36,20 +34,6 @@ export class ANCVElement extends UIElement<ANCVConfiguration> {
}
};

/**
* Called when the /paymentDetails endpoint returns PartiallyAuthorised. The /paymentDetails happens once the /status
* returns PartiallyAuthorised
*
* @param order
*/
protected handleOrder = ({ order }: PaymentResponseData) => {
this.updateParent({ order });

if (this.props.session && this.props.onOrderCreated) {
return this.props.onOrderCreated(order);
}
};

public createOrder = () => {
if (!this.isValid) {
this.showValidation();
Expand Down
9 changes: 1 addition & 8 deletions packages/lib/src/components/Giftcard/Giftcard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import GiftcardComponent from './components/GiftcardComponent';
import CoreProvider from '../../core/Context/CoreProvider';
import PayButton from '../internal/PayButton';
import AdyenCheckoutError from '../../core/Errors/AdyenCheckoutError';
import { PaymentAmount, PaymentResponseData } from '../../types//global-types';
import { PaymentAmount } from '../../types//global-types';
import { GiftCardElementData, GiftCardConfiguration } from './types';
import { TxVariants } from '../tx-variants';

Expand Down Expand Up @@ -68,13 +68,6 @@ export class GiftcardElement extends UIElement<GiftCardConfiguration> {
}
};

protected handleOrder = ({ order }: PaymentResponseData) => {
this.updateParent({ order });
if (this.props.session && this.props.onOrderCreated) {
return this.props.onOrderCreated(order);
}
};

public balanceCheck() {
return this.onBalanceCheck();
}
Expand Down
39 changes: 35 additions & 4 deletions packages/lib/src/components/internal/UIElement/UIElement.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ import {
PaymentData,
RawPaymentResponse,
PaymentResponseAdvancedFlow,
OnPaymentFailedData
OnPaymentFailedData,
PaymentMethodsResponse,
Order
} from '../../../types/global-types';
import './UIElement.scss';
import { CheckoutSessionPaymentResponse } from '../../../core/CheckoutSession/types';
Expand Down Expand Up @@ -286,9 +288,16 @@ export abstract class UIElement<P extends UIElementProps = UIElementProps> exten
}

protected handleOrder = (response: PaymentResponseData): void => {
this.updateParent({ order: response.order });
// in case we receive an order in any other component then a GiftCard trigger handleFinalResult
if (this.props.onPaymentCompleted) this.props.onPaymentCompleted(response, this.elementRef);
const { order } = response;

const updateCorePromise =
!this.props.session && this.props.onPaymentMethodsRequest
? this.handleAdvanceFlowPaymentMethodsUpdate(order)
: this.core.update({ order });

updateCorePromise.then(() => {
this.props.onOrderCreated?.({ order });
});
};

protected handleSuccessResult = (result: PaymentResponseData) => {
Expand Down Expand Up @@ -384,6 +393,28 @@ export abstract class UIElement<P extends UIElementProps = UIElementProps> exten
protected payButton = (props: PayButtonFunctionProps) => {
return <PayButton {...props} amount={this.props.amount} secondaryAmount={this.props.secondaryAmount} onClick={this.submit} />;
};

private async handleAdvanceFlowPaymentMethodsUpdate(order: Order) {
return new Promise<PaymentMethodsResponse>((resolve, reject) => {
const data = {
order: {
orderData: order.orderData,
pspReference: order.pspReference
},
amount: this.props.amount,
locale: this.core.options.locale
};
this.props.onPaymentMethodsRequest(resolve, reject, data);
})
.then(paymentMethodsResponse => {
return this.core.update({ paymentMethodsResponse, order, amount: order.remainingAmount });
})
.catch(error => {
this.handleError(
new AdyenCheckoutError('IMPLEMENTATION_ERROR', 'Payment methods be updated after partial payment.', { cause: error })
);
});
}
}

export default UIElement;
2 changes: 1 addition & 1 deletion packages/lib/src/components/internal/UIElement/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { CoreConfiguration, ICore } from '../../../core/types';
export type PayButtonFunctionProps = Omit<PayButtonProps, 'amount'>;

// TODO add onPaymentCompleted
type CoreCallbacks = Pick<CoreConfiguration, 'onSubmit' | 'onPaymentFailed'>;
type CoreCallbacks = Pick<CoreConfiguration, 'onSubmit' | 'onPaymentFailed' | 'onOrderCreated' | 'onPaymentMethodsRequest'>;

export type UIElementProps = BaseElementProps &
CoreCallbacks & {
Expand Down
3 changes: 2 additions & 1 deletion packages/lib/src/core/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ export const GENERIC_OPTIONS = [
'onBalanceCheck',
'onOrderRequest',
'onOrderCreated',
'setStatusAutomatically'
'setStatusAutomatically',
'onPaymentMethodsRequest'
];

export default {
Expand Down
16 changes: 14 additions & 2 deletions packages/lib/src/core/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import {
OnPaymentCompletedData,
PaymentData,
PaymentResponseAdvancedFlow,
OnPaymentFailedData
OnPaymentFailedData,
PaymentMethodsRequestData
} from '../types/global-types';
import { AnalyticsOptions } from './Analytics/types';
import { RiskModuleOptions } from './RiskModule/RiskModule';
Expand All @@ -26,14 +27,23 @@ type PromiseReject = typeof Promise.reject;

export interface ICore {
initialize(): Promise<ICore>;

register(...items: NewableComponent[]): void;
update({ order }: { order?: Order }): Promise<ICore>;

update(options: CoreConfiguration): Promise<ICore>;

remove(component): ICore;

submitDetails(details: any): void;

getCorePropsForComponent(): any;

getComponent(txVariant: string): NewableComponent | undefined;

createFromAction(action: PaymentAction, options: any): any;

storeElementReference(element: UIElement): void;

options: CoreConfiguration;
paymentMethodsResponse: PaymentMethods;
session?: Session;
Expand Down Expand Up @@ -189,6 +199,8 @@ export interface CoreConfiguration {

onOrderRequest?(resolve: PromiseResolve, reject: PromiseReject, data: PaymentData): Promise<void>;

onPaymentMethodsRequest?(resolve: (response: PaymentMethodsResponse) => void, reject: () => void, data: PaymentMethodsRequestData): void;

onOrderCancel?(order: Order): void;

/**
Expand Down
8 changes: 8 additions & 0 deletions packages/lib/src/types/global-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,14 @@ export type OnPaymentFailedData =
resultCode: ResultCode;
});

//TODO double check these values
export interface PaymentMethodsRequestData {
order: Order;
amount: PaymentAmount;
locale: string;
countryCode?: string;
}

export interface PaymentResponseAdvancedFlow {
resultCode: ResultCode;
action?: PaymentAction;
Expand Down

0 comments on commit 62f4518

Please sign in to comment.