@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.
@@ -1,5 +1,12 @@
1
1
  import { BaseEvervaultInputProps, EvervaultInput } from "../Input";
2
- export type CardCvcProps = BaseEvervaultInputProps;
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<BaseEvervaultInputProps & import("react").RefAttributes<EvervaultInput>>;
11
+ export declare const CardCvc: import("react").ForwardRefExoticComponent<CardCvcProps & import("react").RefAttributes<EvervaultInput>>;
5
12
  //# sourceMappingURL=Cvc.d.ts.map
@@ -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,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAEnD,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC;AAErC,eAAO,MAAM,OAAO,oHAgClB,CAAC"}
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"}
@@ -1,5 +1,12 @@
1
1
  import { BaseEvervaultInputProps, EvervaultInput } from "../Input";
2
- export type CardNumberProps = BaseEvervaultInputProps;
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<BaseEvervaultInputProps & import("react").RefAttributes<EvervaultInput>>;
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,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC;AAExC,eAAO,MAAM,UAAU,oHA4BtB,CAAC"}
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"}
@@ -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("..").EvervaultInputProps & import("react").RefAttributes<import("..").EvervaultInput>>;
12
- Number: import("react").ForwardRefExoticComponent<import("..").EvervaultInputProps & import("react").RefAttributes<import("..").EvervaultInput>>;
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>;
@@ -1 +1 @@
1
- {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../src/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,SAAS,EACT,GAAG,EAMJ,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,CAO9C;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;CACb;AAED,eAAO,MAAM,cAAc,EAuDrB,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"}
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"}
@@ -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
- return format.split("").map((char) => {
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
- return /\d/;
7400
+ value = isObfuscated ? [/\d/] : /\d/;
7434
7401
  }
7435
- return char;
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
- return (jsxRuntime.jsx(Controller, { control: methods.control, name: name, shouldUnregister: true, render: ({ field, fieldState }) => (jsxRuntime.jsx(MaskInput
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
- // Overridable props
7446
- id: field.name, ...props,
7447
- // Strict props
7448
- ref: mergeRefs(inputRef, field.ref), editable: !field.disabled && (props.editable ?? true), onBlur: (evt) => {
7449
- const shouldValidate = validationMode === "onBlur" ||
7450
- validationMode === "onTouched" ||
7451
- validationMode === "all";
7452
- methods.setValue(field.name, field.value, {
7453
- shouldDirty: true,
7454
- shouldTouch: true,
7455
- shouldValidate,
7456
- });
7457
- props.onBlur?.(evt);
7458
- }, mask: mask, maskAutoComplete: !!mask, value: field.value, onChangeText: (masked, unmasked) => {
7459
- const shouldValidate = (validationMode === "onTouched" && fieldState.isTouched) ||
7460
- ((validationMode === "onChange" || validationMode === "all") &&
7461
- (!!fieldState.error || fieldState.isTouched));
7462
- methods.setValue(field.name, unmasked, {
7463
- shouldDirty: true,
7464
- shouldValidate,
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 9999 9999 9999");
7542
+ const DEFAULT_CARD_NUMBER_MASK = mask("9999 99[99 9999 9999]");
7562
7543
  const CARD_NUMBER_MASKS = {
7563
- unionpay: mask("9999 9999 9999 9999 999"),
7564
- "american-express": mask("9999 999999 99999"),
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) => {