type PaymentSummaryStoreValueType = {
paymentId: string;
version: number;
};
const createPaymentSummaryStore = () => {
let value: PaymentSummaryStoreValueType = null;
return {
setValue(newValue: PaymentSummaryStoreValueType) {
value = newValue;
},
getValue() {
return value;
},
};
};
const paymentSummaryStore = createPaymentSummaryStore();
const useHandleShippingAddressChange = ({ setErrorMsg }) => {
const { cart } = useCartContext();
const updateFulfillmentAddress = useUpdateFulfillmentAddress({
buildFulfillmentAddress,
});
const buildShippingOptionParameters = useBuildShippingOptionParameters();
const getPaymentAmount = useGetPaymentAmount({
gatewayType: AdyenPaymentForm.TYPE,
});
const authState = usePaymentAuthState();
const paymentClient = usePaymentClient();
const { handleUpdatePaymentInfo } = useSubmitPaymentRequest({
authState,
// set "undefined" to prevent updating existing payments
payments: undefined,
ownerId: cart?.id,
owningUserEmailAddress: cart?.emailAddress,
paymentClient,
multiplePaymentsAllowed: false,
rejectOnError: true,
});
return useEventCallback(async (data, actions, component: PayPal) => {
const { fulfillmentOptions, cart } = await updateFulfillmentAddress(
get(data, 'shippingAddress')
);
const shippingOptions = buildShippingOptionParameters(
fulfillmentOptions,
cart
);
const paymentAmount = getPaymentAmount(cart);
const { paymentId, version } = paymentSummaryStore.getValue();
const paymentUpdateRequest = {
paymentId,
amount: paymentAmount,
taxTotal: cart.cartPricing.totalTax,
includedTaxTotal: cart.cartPricing.includedTaxAmount,
gatewayUpdateParams: {
paymentData: component.paymentData,
deliveryMethods: shippingOptions,
},
} as UpdatePaymentRequest;
try {
const paymentVersionToUpdate = getLatestPaymentVersionByPaymentId(
paymentId,
version,
cart.cartAlerts
);
const updatedPaymentSummary = await handleUpdatePaymentInfo(
paymentUpdateRequest,
paymentVersionToUpdate
);
paymentSummaryStore.setValue({
paymentId: updatedPaymentSummary.paymentId,
version: updatedPaymentSummary.version,
});
component.updatePaymentData(
get(updatedPaymentSummary.gatewayUpdateResponse, 'paymentData')
);
} catch (err) {
console.error('EXCEPTION FOR PAYMENT UPDATE:', err);
component.setStatus('error');
component.unmount();
}
}, []);
};
const getLatestPaymentVersionByPaymentId = (
paymentId: string,
currentVersion: number,
alerts?: CartAlert[]
): number => {
if (isEmpty(alerts)) {
return currentVersion;
}
let latestVersion = currentVersion;
for (const alert of alerts) {
const updates = alert.additionalAttributes?.['UPDATED_PAYMENTS'];
if (alert.type !== 'PRICING_CHANGE' || isEmpty(updates)) {
continue;
}
const updatedPayment = find(updates, update => {
return update.paymentId === paymentId;
});
if (updatedPayment?.version > latestVersion) {
latestVersion = updatedPayment.version;
}
}
return latestVersion;
};