diff --git a/packages/lib/src/components/Dropin/Dropin.tsx b/packages/lib/src/components/Dropin/Dropin.tsx index 3654962d8f..f61e29eb08 100644 --- a/packages/lib/src/components/Dropin/Dropin.tsx +++ b/packages/lib/src/components/Dropin/Dropin.tsx @@ -12,10 +12,11 @@ import { hasOwnProperty } from '../../utils/hasOwnProperty'; import SRPanelProvider from '../../core/Errors/SRPanelProvider'; import splitPaymentMethods from './elements/splitPaymentMethods'; import type { ICore } from '../../core/types'; +import { IDropin } from './types'; const SUPPORTED_INSTANT_PAYMENTS = ['paywithgoogle', 'googlepay', 'applepay']; -class DropinElement extends UIElement { +class DropinElement extends UIElement implements IDropin { protected static defaultProps = defaultProps; public dropinRef = null; diff --git a/packages/lib/src/components/Dropin/types.ts b/packages/lib/src/components/Dropin/types.ts index aa4700459f..4f2a0d9473 100644 --- a/packages/lib/src/components/Dropin/types.ts +++ b/packages/lib/src/components/Dropin/types.ts @@ -124,3 +124,8 @@ export interface DropinComponentState { isDisabling: boolean; orderStatus: OrderStatus; } + +export interface IDropin { + activePaymentMethod: () => null; + closeActivePaymentMethod: () => void; +} diff --git a/packages/lib/src/components/internal/UIElement/UIElement.tsx b/packages/lib/src/components/internal/UIElement/UIElement.tsx index 15684b56d9..09fb6eb803 100644 --- a/packages/lib/src/components/internal/UIElement/UIElement.tsx +++ b/packages/lib/src/components/internal/UIElement/UIElement.tsx @@ -1,7 +1,7 @@ import { h } from 'preact'; import BaseElement from '../BaseElement/BaseElement'; import PayButton from '../PayButton'; -import { cleanupFinalResult, sanitizeResponse, verifyPaymentDidNotFail } from './utils'; +import { assertIsDropin, cleanupFinalResult, getRegulatoryDefaults, sanitizeResponse, verifyPaymentDidNotFail } from './utils'; import AdyenCheckoutError from '../../../core/Errors/AdyenCheckoutError'; import { hasOwnProperty } from '../../../utils/hasOwnProperty'; import { Resources } from '../../../core/Context/Resources'; @@ -22,6 +22,7 @@ import type { } from '../../../types/global-types'; import { ANALYTICS_SUBMIT_STR } from '../../../core/Analytics/constants'; import { AnalyticsInitialEvent, SendAnalyticsObject } from '../../../core/Analytics/types'; +import { IDropin } from '../../Dropin/types'; import './UIElement.scss'; @@ -83,9 +84,11 @@ export abstract class UIElement

exten ...componentProps }; + const isDropin = assertIsDropin(this as unknown as IDropin); + this.props = this.formatProps({ ...this.constructor['defaultProps'], // component defaults - ...this.core.getRegulatoryDefaults(), // regulatory defaults + ...getRegulatoryDefaults(this.core.options.countryCode, isDropin), // regulatory defaults ...finalProps // the rest (inc. merchant defined config) }); } diff --git a/packages/lib/src/components/internal/UIElement/utils.ts b/packages/lib/src/components/internal/UIElement/utils.ts index a22461a00c..57ac261567 100644 --- a/packages/lib/src/components/internal/UIElement/utils.ts +++ b/packages/lib/src/components/internal/UIElement/utils.ts @@ -1,5 +1,6 @@ import { UIElementStatus } from './types'; import { RawPaymentResponse, PaymentResponseData } from '../../../types/global-types'; +import { IDropin } from '../../Dropin/types'; const ALLOWED_PROPERTIES = ['action', 'resultCode', 'sessionData', 'order', 'sessionResult', 'donationToken', 'error']; @@ -57,3 +58,25 @@ export function verifyPaymentDidNotFail(response: PaymentResponseData): Promise< return Promise.resolve(response); } + +export function assertIsDropin(dropin: IDropin) { + if (!dropin) return false; + + const isDropin = typeof dropin.activePaymentMethod === 'object' && typeof dropin.closeActivePaymentMethod === 'function'; + return isDropin; +} + +export function getRegulatoryDefaults(countryCode: string, isDropin: boolean): Record { + switch (countryCode) { + // Finnish regulations state that no payment method can be open by default + case 'FI': + return isDropin + ? { + openFirstPaymentMethod: false, + openFirstStoredPaymentMethod: false + } + : {}; + default: + return {}; + } +} diff --git a/packages/lib/src/core/core.ts b/packages/lib/src/core/core.ts index 492b7bbf94..0c3b6f8ad6 100644 --- a/packages/lib/src/core/core.ts +++ b/packages/lib/src/core/core.ts @@ -7,7 +7,7 @@ import { resolveEnvironment, resolveCDNEnvironment, resolveAnalyticsEnvironment import Analytics from './Analytics'; import { AdditionalDetailsStateData, PaymentAction, PaymentResponseData } from '../types/global-types'; import { CoreConfiguration, ICore } from './types'; -import { getDefaultPropsByCountryCode, processGlobalOptions } from './utils'; +import { processGlobalOptions } from './utils'; import Session from './CheckoutSession'; import { hasOwnProperty } from '../utils/hasOwnProperty'; import { Resources } from './Context/Resources'; @@ -264,10 +264,6 @@ class Core implements ICore { }; } - public getRegulatoryDefaults(): Record { - return getDefaultPropsByCountryCode(this.options.countryCode); - } - public storeElementReference(element: UIElement) { if (element) { this.components.push(element); diff --git a/packages/lib/src/core/types.ts b/packages/lib/src/core/types.ts index 707fa2bec3..6fdb80c4de 100644 --- a/packages/lib/src/core/types.ts +++ b/packages/lib/src/core/types.ts @@ -40,8 +40,6 @@ export interface ICore { storeElementReference(element: UIElement): void; - getRegulatoryDefaults(): Record; - options: CoreConfiguration; paymentMethodsResponse: PaymentMethods; session?: Session; diff --git a/packages/lib/src/core/utils.ts b/packages/lib/src/core/utils.ts index d484c8d5c2..79ab575eb1 100644 --- a/packages/lib/src/core/utils.ts +++ b/packages/lib/src/core/utils.ts @@ -11,16 +11,3 @@ export function processGlobalOptions(globalOptions) { return r; }, {}); } - -export function getDefaultPropsByCountryCode(countryCode: string): Record { - switch (countryCode) { - // Finnish regulations state that no payment method can be open by default - case 'FI': - return { - openFirstPaymentMethod: false, - openFirstStoredPaymentMethod: false - }; - default: - return {}; - } -}