@evervault/react-native 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/Card/Cvc.d.ts +9 -2
- package/build/Card/Cvc.d.ts.map +1 -1
- package/build/Card/Number.d.ts +9 -2
- package/build/Card/Number.d.ts.map +1 -1
- package/build/Card/index.d.ts +2 -2
- package/build/Input.d.ts +1 -0
- package/build/Input.d.ts.map +1 -1
- package/build/index.cjs.js +60 -79
- package/build/index.cjs.js.map +1 -1
- package/build/index.esm.js +60 -79
- package/package.json +1 -1
- package/src/Card/Cvc.tsx +10 -3
- package/src/Card/Number.test.tsx +24 -3
- package/src/Card/Number.tsx +11 -4
- package/src/Input.test.tsx +84 -0
- package/src/Input.tsx +73 -47
package/build/Card/Cvc.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { BaseEvervaultInputProps, EvervaultInput } from "../Input";
|
|
2
|
-
export
|
|
2
|
+
export interface CardCvcProps extends BaseEvervaultInputProps {
|
|
3
|
+
/**
|
|
4
|
+
* Whether to obfuscate the entire CVC value.
|
|
5
|
+
*
|
|
6
|
+
* If a string is provided, it will be used to obfuscate the value.
|
|
7
|
+
*/
|
|
8
|
+
obfuscateValue?: boolean | string;
|
|
9
|
+
}
|
|
3
10
|
export type CardCvc = EvervaultInput;
|
|
4
|
-
export declare const CardCvc: import("react").ForwardRefExoticComponent<
|
|
11
|
+
export declare const CardCvc: import("react").ForwardRefExoticComponent<CardCvcProps & import("react").RefAttributes<EvervaultInput>>;
|
|
5
12
|
//# sourceMappingURL=Cvc.d.ts.map
|
package/build/Card/Cvc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cvc.d.ts","sourceRoot":"","sources":["../../src/Card/Cvc.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAQ,MAAM,UAAU,CAAC;AAazE,MAAM,
|
|
1
|
+
{"version":3,"file":"Cvc.d.ts","sourceRoot":"","sources":["../../src/Card/Cvc.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAQ,MAAM,UAAU,CAAC;AAazE,MAAM,WAAW,YAAa,SAAQ,uBAAuB;IAC3D;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC;AAErC,eAAO,MAAM,OAAO,yGAgClB,CAAC"}
|
package/build/Card/Number.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { BaseEvervaultInputProps, EvervaultInput } from "../Input";
|
|
2
|
-
export
|
|
2
|
+
export interface CardNumberProps extends BaseEvervaultInputProps {
|
|
3
|
+
/**
|
|
4
|
+
* Whether to obfuscate the card number value (excluding the last 4 digits).
|
|
5
|
+
*
|
|
6
|
+
* If a string is provided, it will be used to obfuscate the value.
|
|
7
|
+
*/
|
|
8
|
+
obfuscateValue?: boolean | string;
|
|
9
|
+
}
|
|
3
10
|
export type CardNumber = EvervaultInput;
|
|
4
|
-
export declare const CardNumber: import("react").ForwardRefExoticComponent<
|
|
11
|
+
export declare const CardNumber: import("react").ForwardRefExoticComponent<CardNumberProps & import("react").RefAttributes<EvervaultInput>>;
|
|
5
12
|
//# sourceMappingURL=Number.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Number.d.ts","sourceRoot":"","sources":["../../src/Card/Number.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAQ,MAAM,UAAU,CAAC;AAazE,MAAM,
|
|
1
|
+
{"version":3,"file":"Number.d.ts","sourceRoot":"","sources":["../../src/Card/Number.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAQ,MAAM,UAAU,CAAC;AAazE,MAAM,WAAW,eAAgB,SAAQ,uBAAuB;IAC9D;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC;AAExC,eAAO,MAAM,UAAU,4GA4BtB,CAAC"}
|
package/build/Card/index.d.ts
CHANGED
|
@@ -8,8 +8,8 @@ export type Card = CardRef;
|
|
|
8
8
|
export declare const Card: import("react").ForwardRefExoticComponent<import("./Root").CardProps & import("react").RefAttributes<CardRoot>> & {
|
|
9
9
|
Holder: import("react").ForwardRefExoticComponent<import("..").EvervaultInputProps & import("react").RefAttributes<import("..").EvervaultInput>>;
|
|
10
10
|
Expiry: import("react").ForwardRefExoticComponent<import("..").EvervaultInputProps & import("react").RefAttributes<import("..").EvervaultInput>>;
|
|
11
|
-
Cvc: import("react").ForwardRefExoticComponent<import("
|
|
12
|
-
Number: import("react").ForwardRefExoticComponent<import("
|
|
11
|
+
Cvc: import("react").ForwardRefExoticComponent<import("./Cvc").CardCvcProps & import("react").RefAttributes<import("..").EvervaultInput>>;
|
|
12
|
+
Number: import("react").ForwardRefExoticComponent<import("./Number").CardNumberProps & import("react").RefAttributes<import("..").EvervaultInput>>;
|
|
13
13
|
};
|
|
14
14
|
export type { CardHolderProps } from "./Holder";
|
|
15
15
|
export { CardHolder };
|
package/build/Input.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare function mask(format: string): MaskArray;
|
|
|
11
11
|
export interface EvervaultInputProps<Values extends Record<string, unknown>> extends BaseEvervaultInputProps {
|
|
12
12
|
name: keyof Values;
|
|
13
13
|
mask?: Mask;
|
|
14
|
+
obfuscateValue?: boolean | string;
|
|
14
15
|
}
|
|
15
16
|
export declare const EvervaultInput: <Values extends Record<string, unknown>>(props: EvervaultInputProps<Values> & {
|
|
16
17
|
ref?: Ref<EvervaultInput>;
|
package/build/Input.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../src/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,SAAS,EACT,GAAG,
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../src/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,SAAS,EACT,GAAG,EAQJ,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;CAC7D;AAED,eAAO,MAAM,qBAAqB,qDAEhC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,SAAS,EACP,WAAW,GACX,OAAO,GACP,MAAM,GACN,OAAO,GACP,SAAS,GACT,iBAAiB,GACjB,eAAe,CAClB,CAAC;AA4CF,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,cAAc,EACd,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,cAAc,CACvD,CAAC;AAEF,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAqB9C;AAED,MAAM,WAAW,mBAAmB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACzE,SAAQ,uBAAuB;IAC/B,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,cAAc,EAgErB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3C,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAA;CAAE,KAC/D,SAAS,CAAC"}
|
package/build/index.cjs.js
CHANGED
|
@@ -608,50 +608,6 @@ function useController(props) {
|
|
|
608
608
|
}), [field, formState, fieldState]);
|
|
609
609
|
}
|
|
610
610
|
|
|
611
|
-
/**
|
|
612
|
-
* Component based on `useController` hook to work with controlled component.
|
|
613
|
-
*
|
|
614
|
-
* @remarks
|
|
615
|
-
* [API](https://react-hook-form.com/docs/usecontroller/controller) • [Demo](https://codesandbox.io/s/react-hook-form-v6-controller-ts-jwyzw) • [Video](https://www.youtube.com/watch?v=N2UNk_UCVyA)
|
|
616
|
-
*
|
|
617
|
-
* @param props - the path name to the form field value, and validation rules.
|
|
618
|
-
*
|
|
619
|
-
* @returns provide field handler functions, field and form state.
|
|
620
|
-
*
|
|
621
|
-
* @example
|
|
622
|
-
* ```tsx
|
|
623
|
-
* function App() {
|
|
624
|
-
* const { control } = useForm<FormValues>({
|
|
625
|
-
* defaultValues: {
|
|
626
|
-
* test: ""
|
|
627
|
-
* }
|
|
628
|
-
* });
|
|
629
|
-
*
|
|
630
|
-
* return (
|
|
631
|
-
* <form>
|
|
632
|
-
* <Controller
|
|
633
|
-
* control={control}
|
|
634
|
-
* name="test"
|
|
635
|
-
* render={({ field: { onChange, onBlur, value, ref }, formState, fieldState }) => (
|
|
636
|
-
* <>
|
|
637
|
-
* <input
|
|
638
|
-
* onChange={onChange} // send value to hook form
|
|
639
|
-
* onBlur={onBlur} // notify when input is touched
|
|
640
|
-
* value={value} // return updated value
|
|
641
|
-
* ref={ref} // set ref for focus management
|
|
642
|
-
* />
|
|
643
|
-
* <p>{formState.isSubmitted ? "submitted" : ""}</p>
|
|
644
|
-
* <p>{fieldState.isTouched ? "touched" : ""}</p>
|
|
645
|
-
* </>
|
|
646
|
-
* )}
|
|
647
|
-
* />
|
|
648
|
-
* </form>
|
|
649
|
-
* );
|
|
650
|
-
* }
|
|
651
|
-
* ```
|
|
652
|
-
*/
|
|
653
|
-
const Controller = (props) => props.render(useController(props));
|
|
654
|
-
|
|
655
611
|
var appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria
|
|
656
612
|
? {
|
|
657
613
|
...errors[name],
|
|
@@ -7428,44 +7384,69 @@ function useForwardedInputRef(ref) {
|
|
|
7428
7384
|
return inputRef;
|
|
7429
7385
|
}
|
|
7430
7386
|
function mask(format) {
|
|
7431
|
-
|
|
7387
|
+
const maskArray = [];
|
|
7388
|
+
let isObfuscated = false;
|
|
7389
|
+
format.split("").forEach((char) => {
|
|
7390
|
+
if (char === "[") {
|
|
7391
|
+
isObfuscated = true;
|
|
7392
|
+
return;
|
|
7393
|
+
}
|
|
7394
|
+
else if (char === "]") {
|
|
7395
|
+
isObfuscated = false;
|
|
7396
|
+
return;
|
|
7397
|
+
}
|
|
7398
|
+
let value = char;
|
|
7432
7399
|
if (char === "9") {
|
|
7433
|
-
|
|
7400
|
+
value = isObfuscated ? [/\d/] : /\d/;
|
|
7434
7401
|
}
|
|
7435
|
-
|
|
7402
|
+
maskArray.push(value);
|
|
7436
7403
|
});
|
|
7404
|
+
return maskArray;
|
|
7437
7405
|
}
|
|
7438
|
-
const EvervaultInput = React.forwardRef(function EvervaultInput({ name, mask, ...props }, ref) {
|
|
7406
|
+
const EvervaultInput = React.forwardRef(function EvervaultInput({ name, mask, obfuscateValue, ...props }, ref) {
|
|
7439
7407
|
const { validationMode } = React.useContext(EvervaultInputContext);
|
|
7440
7408
|
const inputRef = useForwardedInputRef(ref);
|
|
7441
7409
|
const methods = useFormContext();
|
|
7442
|
-
|
|
7410
|
+
const { field, fieldState } = useController({
|
|
7411
|
+
control: methods.control,
|
|
7412
|
+
name,
|
|
7413
|
+
shouldUnregister: true,
|
|
7414
|
+
});
|
|
7415
|
+
const obfuscationCharacter = React.useMemo(() => {
|
|
7416
|
+
if (typeof obfuscateValue === "string") {
|
|
7417
|
+
return obfuscateValue;
|
|
7418
|
+
}
|
|
7419
|
+
else {
|
|
7420
|
+
return "•";
|
|
7421
|
+
}
|
|
7422
|
+
}, [obfuscateValue]);
|
|
7423
|
+
return (jsxRuntime.jsx(MaskInput
|
|
7424
|
+
// Overridable props
|
|
7425
|
+
, {
|
|
7443
7426
|
// Overridable props
|
|
7444
|
-
,
|
|
7445
|
-
|
|
7446
|
-
|
|
7447
|
-
|
|
7448
|
-
|
|
7449
|
-
|
|
7450
|
-
|
|
7451
|
-
|
|
7452
|
-
|
|
7453
|
-
|
|
7454
|
-
|
|
7455
|
-
|
|
7456
|
-
|
|
7457
|
-
|
|
7458
|
-
|
|
7459
|
-
|
|
7460
|
-
|
|
7461
|
-
|
|
7462
|
-
|
|
7463
|
-
|
|
7464
|
-
|
|
7465
|
-
|
|
7466
|
-
|
|
7467
|
-
// Remove unwanted props
|
|
7468
|
-
defaultValue: undefined, onChange: undefined })) }));
|
|
7427
|
+
id: field.name, ...props,
|
|
7428
|
+
// Strict props
|
|
7429
|
+
ref: mergeRefs(inputRef, field.ref), editable: !field.disabled && (props.editable ?? true), onBlur: (evt) => {
|
|
7430
|
+
const shouldValidate = validationMode === "onBlur" ||
|
|
7431
|
+
validationMode === "onTouched" ||
|
|
7432
|
+
validationMode === "all";
|
|
7433
|
+
methods.setValue(field.name, field.value, {
|
|
7434
|
+
shouldDirty: true,
|
|
7435
|
+
shouldTouch: true,
|
|
7436
|
+
shouldValidate,
|
|
7437
|
+
});
|
|
7438
|
+
props.onBlur?.(evt);
|
|
7439
|
+
}, mask: mask, maskAutoComplete: !!mask, obfuscationCharacter: obfuscationCharacter, showObfuscatedValue: !!obfuscateValue, value: field.value, onChangeText: (masked, unmasked) => {
|
|
7440
|
+
const shouldValidate = (validationMode === "onTouched" && fieldState.isTouched) ||
|
|
7441
|
+
((validationMode === "onChange" || validationMode === "all") &&
|
|
7442
|
+
(!!fieldState.error || fieldState.isTouched));
|
|
7443
|
+
methods.setValue(field.name, unmasked, {
|
|
7444
|
+
shouldDirty: true,
|
|
7445
|
+
shouldValidate,
|
|
7446
|
+
});
|
|
7447
|
+
},
|
|
7448
|
+
// Remove unwanted props
|
|
7449
|
+
defaultValue: undefined, onChange: undefined }));
|
|
7469
7450
|
});
|
|
7470
7451
|
|
|
7471
7452
|
const DEFAULT_ACCEPTED_BRANDS = [];
|
|
@@ -7538,9 +7519,9 @@ const CardExpiry = React.forwardRef(function CardExpiry(props, ref) {
|
|
|
7538
7519
|
return (jsxRuntime.jsx(EvervaultInput, { placeholder: "MM / YY", ...props, ref: ref, name: "expiry", mask: CARD_EXPIRY_MASK, inputMode: "numeric", autoComplete: "cc-exp", keyboardType: "number-pad" }));
|
|
7539
7520
|
});
|
|
7540
7521
|
|
|
7541
|
-
const DEFAULT_CARD_CVC_MASK = mask("999");
|
|
7522
|
+
const DEFAULT_CARD_CVC_MASK = mask("[999]");
|
|
7542
7523
|
const CARD_CVC_MASKS = {
|
|
7543
|
-
"american-express": mask("9999"),
|
|
7524
|
+
"american-express": mask("[9999]"),
|
|
7544
7525
|
};
|
|
7545
7526
|
const CardCvc = React.forwardRef(function CardCvc(props, ref) {
|
|
7546
7527
|
const methods = useFormContext();
|
|
@@ -7558,10 +7539,10 @@ const CardCvc = React.forwardRef(function CardCvc(props, ref) {
|
|
|
7558
7539
|
return (jsxRuntime.jsx(EvervaultInput, { placeholder: "CVC", ...props, ref: ref, name: "cvc", mask: mask, inputMode: "numeric", autoComplete: "cc-csc", keyboardType: "number-pad" }));
|
|
7559
7540
|
});
|
|
7560
7541
|
|
|
7561
|
-
const DEFAULT_CARD_NUMBER_MASK = mask("9999
|
|
7542
|
+
const DEFAULT_CARD_NUMBER_MASK = mask("9999 99[99 9999 9999]");
|
|
7562
7543
|
const CARD_NUMBER_MASKS = {
|
|
7563
|
-
unionpay: mask("9999
|
|
7564
|
-
"american-express": mask("9999
|
|
7544
|
+
unionpay: mask("9999 99[99 9999 9999 999]"),
|
|
7545
|
+
"american-express": mask("9999 99[9999 99999]"),
|
|
7565
7546
|
};
|
|
7566
7547
|
const CardNumber = React.forwardRef(function CardNumber(props, ref) {
|
|
7567
7548
|
const mask = React.useCallback((text) => {
|