Skip to content

Commit 542448f

Browse files
authored
Improve types for CustomCard (#3068)
* Improve types for CustomCard * Renaming SF callback data objects in line with naming elsewhere in the core types * Fully export SecuredField callback data types * Added changeset file
1 parent 952a5c7 commit 542448f

28 files changed

+368
-207
lines changed

.changeset/sharp-worms-rescue.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@adyen/adyen-web': patch
3+
---
4+
5+
Improve types for CustomCard

packages/lib/src/components/Card/Card.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { CoreProvider } from '../../core/Context/CoreProvider';
44
import collectBrowserInfo from '../../utils/browserInfo';
55
import { BinLookupResponse, CardElementData, CardConfiguration } from './types';
66
import triggerBinLookUp from '../internal/SecuredFields/binLookup/triggerBinLookUp';
7-
import { CbObjOnBinLookup, CbObjOnConfigSuccess, CbObjOnFocus } from '../internal/SecuredFields/lib/types';
7+
import { CardBinLookupData, CardConfigSuccessData, CardFocusData } from '../internal/SecuredFields/lib/types';
88
import { fieldTypeToSnakeCase } from '../internal/SecuredFields/utils';
99
import { reject } from '../../utils/commonUtils';
1010
import { hasValidInstallmentsObject } from './components/CardInput/utils';
@@ -194,7 +194,7 @@ export class CardElement extends UIElement<CardConfiguration> {
194194
this.submit();
195195
};
196196

197-
onBinLookup(obj: CbObjOnBinLookup) {
197+
onBinLookup(obj: CardBinLookupData) {
198198
// Handler for regular card comp doesn't need this 'raw' data or to know about 'resets'
199199
if (!obj.isReset) {
200200
const nuObj = reject('supportedBrandsRaw').from(obj);
@@ -218,7 +218,7 @@ export class CardElement extends UIElement<CardConfiguration> {
218218
super.submitAnalytics(analyticsObj, this.props);
219219
}
220220

221-
private onConfigSuccess = (obj: CbObjOnConfigSuccess) => {
221+
private onConfigSuccess = (obj: CardConfigSuccessData) => {
222222
this.submitAnalytics({
223223
type: ANALYTICS_CONFIGURED_STR
224224
});
@@ -234,7 +234,7 @@ export class CardElement extends UIElement<CardConfiguration> {
234234

235235
// Call merchant defined callback
236236
if (ALL_SECURED_FIELDS.includes(obj.fieldType)) {
237-
this.props.onFocus?.(obj.event as CbObjOnFocus);
237+
this.props.onFocus?.(obj.event as CardFocusData);
238238
} else {
239239
this.props.onFocus?.(obj);
240240
}
@@ -248,7 +248,7 @@ export class CardElement extends UIElement<CardConfiguration> {
248248

249249
// Call merchant defined callback
250250
if (ALL_SECURED_FIELDS.includes(obj.fieldType)) {
251-
this.props.onBlur?.(obj.event as CbObjOnFocus);
251+
this.props.onBlur?.(obj.event as CardFocusData);
252252
} else {
253253
this.props.onBlur?.(obj);
254254
}

packages/lib/src/components/Card/components/CardInput/CardInput.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import useImage from '../../../../core/Context/useImage';
2424
import { getArrayDifferences } from '../../../../utils/arrayUtils';
2525
import FormInstruction from '../../../internal/FormInstruction';
2626
import { AddressData } from '../../../../types/global-types';
27-
import { CbObjOnBrand, CbObjOnFocus } from '../../../internal/SecuredFields/lib/types';
27+
import { CardBrandData, CardFocusData } from '../../../internal/SecuredFields/lib/types';
2828
import { FieldErrorAnalyticsObject } from '../../../../core/Analytics/types';
2929
import { PREFIX } from '../../../internal/Icon/constants';
3030
import useSRPanelForCardInputErrors from './useSRPanelForCardInputErrors';
@@ -136,14 +136,14 @@ const CardInput = (props: CardInputProps) => {
136136
* HANDLERS
137137
*/
138138
// Handlers for focus & blur on all fields. Can be renamed to onFieldFocus once the onFocusField is renamed in Field.tsx
139-
const onFieldFocusAnalytics = (who: string, e: Event | CbObjOnFocus) => {
139+
const onFieldFocusAnalytics = (who: string, e: Event | CardFocusData) => {
140140
props.onFocus({ fieldType: who, event: e });
141141
};
142-
const onFieldBlurAnalytics = (who: string, e: Event | CbObjOnFocus) => {
142+
const onFieldBlurAnalytics = (who: string, e: Event | CardFocusData) => {
143143
props.onBlur({ fieldType: who, event: e });
144144
};
145145

146-
const onBrand = useCallback((obj: CbObjOnBrand) => {
146+
const onBrand = useCallback((obj: CardBrandData) => {
147147
setInternallyDetectedBrand(obj.brand);
148148
props.onBrand(obj);
149149
}, []);

packages/lib/src/components/Card/components/CardInput/handlers.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ENCRYPTED_CARD_NUMBER, CREDIT_CARD_SF_FIELDS } from '../../../internal/SecuredFields/lib/constants';
22
import { selectOne } from '../../../internal/SecuredFields/lib/utilities/dom';
3-
import { CbObjOnFocus } from '../../../internal/SecuredFields/lib/types';
3+
import { CardFocusData } from '../../../internal/SecuredFields/lib/types';
44

55
/**
66
* Helper for CardInput - gets a field name and sets focus on it
@@ -28,7 +28,7 @@ export const getAddressHandler = (setFormData, setFormValid, setFormErrors) => {
2828

2929
export const getFocusHandler = (setFocusedElement, onFocus, onBlur) => {
3030
// Return Handler fn:
31-
return (e: CbObjOnFocus) => {
31+
return (e: CardFocusData) => {
3232
setFocusedElement(e.currentFocusObject);
3333
e.focus === true ? onFocus(e.fieldType, e) : onBlur(e.fieldType, e);
3434
};

packages/lib/src/components/Card/components/CardInput/types.ts

+16-16
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ import { BinLookupResponse, BrandConfiguration, CardBrandsConfiguration, CardBac
33
import { InstallmentOptions } from './components/types';
44
import { ValidationResult } from '../../../internal/PersonalDetails/types';
55
import {
6-
CbObjOnAllValid,
7-
CbObjOnAutoComplete,
8-
CbObjOnBinValue,
9-
CbObjOnBrand,
10-
CbObjOnConfigSuccess,
11-
CbObjOnFieldValid,
12-
CbObjOnLoad,
6+
CardAllValidData,
7+
CardAutoCompleteData,
8+
CardBinValueData,
9+
CardBrandData,
10+
CardConfigSuccessData,
11+
CardFieldValidData,
12+
CardLoadData,
1313
CVCPolicyType,
1414
DatePolicyType
1515
} from '../../../internal/SecuredFields/lib/types';
1616
import Specifications from '../../../internal/Address/Specifications';
1717
import { AddressSchema } from '../../../internal/Address/types';
18-
import { CbObjOnError, StylesObject } from '../../../internal/SecuredFields/lib/types';
18+
import { CardErrorData, StylesObject } from '../../../internal/SecuredFields/lib/types';
1919
import { Resources } from '../../../../core/Context/Resources';
2020
import { SRPanel } from '../../../../core/Errors/SRPanel';
2121
import RiskElement from '../../../../core/RiskModule';
@@ -114,17 +114,17 @@ export interface CardInputProps {
114114
};
115115
onAdditionalSFConfig?: () => {};
116116
onAdditionalSFRemoved?: () => {};
117-
onAllValid?: (o: CbObjOnAllValid) => {};
118-
onAutoComplete?: (o: CbObjOnAutoComplete) => {};
119-
onBinValue?: (o: CbObjOnBinValue) => {};
117+
onAllValid?: (o: CardAllValidData) => {};
118+
onAutoComplete?: (o: CardAutoCompleteData) => {};
119+
onBinValue?: (o: CardBinValueData) => {};
120120
onBlur?: (e) => {};
121-
onBrand?: (o: CbObjOnBrand) => {};
122-
onConfigSuccess?: (O: CbObjOnConfigSuccess) => {};
121+
onBrand?: (o: CardBrandData) => {};
122+
onConfigSuccess?: (O: CardConfigSuccessData) => {};
123123
onChange?: (state) => {};
124124
onError?: () => {};
125-
onFieldValid?: (o: CbObjOnFieldValid) => {};
125+
onFieldValid?: (o: CardFieldValidData) => {};
126126
onFocus?: (e) => {};
127-
onLoad?: (o: CbObjOnLoad) => {};
127+
onLoad?: (o: CardLoadData) => {};
128128
handleKeyPress?: (obj: KeyboardEvent) => void;
129129
onAddressLookup?: OnAddressLookupType;
130130
onAddressSelected?: OnAddressSelectedType;
@@ -174,7 +174,7 @@ export interface CardInputRef extends ComponentMethodsRef {
174174
setFocusOn?: (who) => void;
175175
processBinLookupResponse?: (binLookupResponse: BinLookupResponse, isReset: boolean) => void;
176176
updateStyles?: (stylesObj: StylesObject) => void;
177-
handleUnsupportedCard?: (errObj: CbObjOnError) => boolean;
177+
handleUnsupportedCard?: (errObj: CardErrorData) => boolean;
178178
}
179179

180180
export interface FieldError {

packages/lib/src/components/Card/types.ts

+17-17
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { ComponentFocusObject, AddressData, BrowserInfo } from '../../types/global-types';
22
import {
3-
CbObjOnBinValue,
4-
CbObjOnBrand,
5-
CbObjOnConfigSuccess,
6-
CbObjOnFieldValid,
7-
CbObjOnFocus,
8-
CbObjOnLoad,
9-
CbObjOnBinLookup,
3+
CardBinValueData,
4+
CardBrandData,
5+
CardConfigSuccessData,
6+
CardFieldValidData,
7+
CardFocusData,
8+
CardLoadData,
9+
CardBinLookupData,
1010
StylesObject
1111
} from '../internal/SecuredFields/lib/types';
12-
import { CVCPolicyType, DatePolicyType, CbObjOnAllValid } from '../internal/SecuredFields/lib/types';
12+
import { CVCPolicyType, DatePolicyType, CardAllValidData } from '../internal/SecuredFields/lib/types';
1313
import { ClickToPayProps } from '../internal/ClickToPay/types';
1414
import { InstallmentOptions } from './components/CardInput/components/types';
1515
import { DisclaimerMsgObject } from '../internal/DisclaimerMessage/DisclaimerMessage';
@@ -274,56 +274,56 @@ export interface CardConfiguration extends UIElementProps {
274274
* After binLookup call - provides the brand(s) we detect the user is entering, and if we support the brand(s)
275275
* - merchant set config option
276276
*/
277-
onBinLookup?: (event: CbObjOnBinLookup) => void;
277+
onBinLookup?: (event: CardBinLookupData) => void;
278278

279279
/**
280280
* Provides the BIN Number of the card (up to 6 digits), called as the user types in the PAN.
281281
* - merchant set config option
282282
*/
283-
onBinValue?: (event: CbObjOnBinValue) => void;
283+
onBinValue?: (event: CardBinValueData) => void;
284284

285285
/**
286286
* Called when a field loses focus.
287287
* - merchant set config option
288288
*/
289-
onBlur?: (event: CbObjOnFocus | ComponentFocusObject) => void;
289+
onBlur?: (event: CardFocusData | ComponentFocusObject) => void;
290290

291291
/**
292292
* Called once we detect the card brand.
293293
* - merchant set config option
294294
*/
295-
onBrand?: (event: CbObjOnBrand) => void;
295+
onBrand?: (event: CardBrandData) => void;
296296

297297
/**
298298
* Called once the card input fields are ready to use.
299299
* - merchant set config option
300300
*/
301-
onConfigSuccess?: (event: CbObjOnConfigSuccess) => void;
301+
onConfigSuccess?: (event: CardConfigSuccessData) => void;
302302

303303
/**
304304
* Called when *all* the securedFields becomes valid
305305
* Also called again if one of the fields moves out of validity.
306306
*/
307-
onAllValid?: (event: CbObjOnAllValid) => void;
307+
onAllValid?: (event: CardAllValidData) => void;
308308

309309
/**
310310
* Called when a field becomes valid and also if a valid field changes and becomes invalid.
311311
* For the card number field, it returns the last 4 digits of the card number.
312312
* - merchant set config option
313313
*/
314-
onFieldValid?: (event: CbObjOnFieldValid) => void;
314+
onFieldValid?: (event: CardFieldValidData) => void;
315315

316316
/**
317317
* Called when a field gains focus.
318318
* - merchant set config option
319319
*/
320-
onFocus?: (event: CbObjOnFocus | ComponentFocusObject) => void;
320+
onFocus?: (event: CardFocusData | ComponentFocusObject) => void;
321321

322322
/**
323323
* Called once all the card input fields have been created but are not yet ready to use.
324324
* - merchant set config option
325325
*/
326-
onLoad?: (event: CbObjOnLoad) => void;
326+
onLoad?: (event: CardLoadData) => void;
327327

328328
/**
329329
* Configure placeholder text for holderName, cardNumber, expirationDate, securityCode and password.

packages/lib/src/components/CustomCard/CustomCard.tsx

+7-11
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,14 @@ import CustomCardInput from './CustomCardInput';
44
import { CoreProvider } from '../../core/Context/CoreProvider';
55
import collectBrowserInfo from '../../utils/browserInfo';
66
import triggerBinLookUp from '../internal/SecuredFields/binLookup/triggerBinLookUp';
7-
import { CbObjOnBinLookup, CbObjOnFocus } from '../internal/SecuredFields/lib/types';
7+
import { CardBinLookupData, CardFocusData } from '../internal/SecuredFields/lib/types';
88
import { BrandObject } from '../Card/types';
99
import { getCardImageUrl, fieldTypeToSnakeCase } from '../internal/SecuredFields/utils';
1010
import { TxVariants } from '../tx-variants';
1111
import { CustomCardConfiguration } from './types';
1212
import { ANALYTICS_FOCUS_STR, ANALYTICS_UNFOCUS_STR } from '../../core/Analytics/constants';
1313
import { SendAnalyticsObject } from '../../core/Analytics/types';
1414

15-
// TODO questions about
16-
// brand - does a merchant ever make a custom stored card?
17-
// type
18-
// countryCode
19-
2015
export class CustomCard extends UIElement<CustomCardConfiguration> {
2116
public static type = TxVariants.customCard;
2217

@@ -27,11 +22,12 @@ export class CustomCard extends UIElement<CustomCardConfiguration> {
2722
brandsConfiguration: {}
2823
};
2924

25+
private brand = TxVariants.card;
26+
3027
formatProps(props: CustomCardConfiguration) {
3128
return {
3229
...props,
33-
type: TxVariants.customCard,
34-
brand: TxVariants.card
30+
type: TxVariants.customCard
3531
};
3632
}
3733

@@ -80,7 +76,7 @@ export class CustomCard extends UIElement<CustomCardConfiguration> {
8076
return this;
8177
}
8278

83-
onBinLookup(obj: CbObjOnBinLookup) {
79+
onBinLookup(obj: CardBinLookupData) {
8480
const nuObj = { ...obj };
8581
nuObj.rootNode = this._node;
8682

@@ -105,7 +101,7 @@ export class CustomCard extends UIElement<CustomCardConfiguration> {
105101
return collectBrowserInfo();
106102
}
107103

108-
private onFocus = (obj: CbObjOnFocus) => {
104+
private onFocus = (obj: CardFocusData) => {
109105
this.submitAnalytics({
110106
type: obj.focus === true ? ANALYTICS_FOCUS_STR : ANALYTICS_UNFOCUS_STR,
111107
target: fieldTypeToSnakeCase(obj.fieldType)
@@ -134,7 +130,7 @@ export class CustomCard extends UIElement<CustomCardConfiguration> {
134130
onBinValue={this.onBinValue}
135131
implementationType={'custom'}
136132
resources={this.resources}
137-
brand={this.props.brand}
133+
brand={this.brand}
138134
onFocus={this.onFocus}
139135
/>
140136
</CoreProvider>

packages/lib/src/components/CustomCard/CustomCardInput/CustomCardInput.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ interface SecuredFieldsProps {
1717
brandsConfiguration?: CardBrandsConfiguration;
1818
clientKey?: string;
1919
countryCode?: string;
20+
forceCompat?: boolean;
2021
i18n: Language;
2122
implementationType?: string;
2223
keypadFix?: boolean;
@@ -164,6 +165,7 @@ const extractPropsForSFP = (props: SecuredFieldsProps) => {
164165
brands: props.brands,
165166
brandsConfiguration: props.brandsConfiguration,
166167
clientKey: props.clientKey,
168+
forceCompat: props.forceCompat,
167169
// countryCode: props.countryCode, // only used for korean cards when koreanAuthenticationRequired is true
168170
i18n: props.i18n,
169171
implementationType: props.implementationType,

0 commit comments

Comments
 (0)