@evervault/evervault-react-native 1.0.0 → 1.1.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.
Files changed (74) hide show
  1. package/README.md +34 -39
  2. package/dist/commonjs/components/Card/Card.js +13 -13
  3. package/dist/commonjs/components/Card/Card.js.map +1 -1
  4. package/dist/commonjs/components/Card/CardCVC.js +11 -8
  5. package/dist/commonjs/components/Card/CardCVC.js.map +1 -1
  6. package/dist/commonjs/components/Card/CardExpiry.js +10 -7
  7. package/dist/commonjs/components/Card/CardExpiry.js.map +1 -1
  8. package/dist/commonjs/components/Card/CardHolder.js +9 -6
  9. package/dist/commonjs/components/Card/CardHolder.js.map +1 -1
  10. package/dist/commonjs/components/Card/CardNumber.js +10 -7
  11. package/dist/commonjs/components/Card/CardNumber.js.map +1 -1
  12. package/dist/commonjs/components/Card/context.js +5 -5
  13. package/dist/commonjs/components/Card/utilities.js +5 -5
  14. package/dist/commonjs/components/EvervaultProvider.js +62 -0
  15. package/dist/commonjs/components/EvervaultProvider.js.map +1 -0
  16. package/dist/commonjs/index.js +8 -0
  17. package/dist/commonjs/index.js.map +1 -1
  18. package/dist/commonjs/native.js +2 -2
  19. package/dist/commonjs/sdk.js +10 -3
  20. package/dist/commonjs/sdk.js.map +1 -1
  21. package/dist/module/components/Card/Card.js +25 -25
  22. package/dist/module/components/Card/Card.js.map +1 -1
  23. package/dist/module/components/Card/CardCVC.js +16 -13
  24. package/dist/module/components/Card/CardCVC.js.map +1 -1
  25. package/dist/module/components/Card/CardExpiry.js +14 -11
  26. package/dist/module/components/Card/CardExpiry.js.map +1 -1
  27. package/dist/module/components/Card/CardHolder.js +13 -10
  28. package/dist/module/components/Card/CardHolder.js.map +1 -1
  29. package/dist/module/components/Card/CardNumber.js +15 -12
  30. package/dist/module/components/Card/CardNumber.js.map +1 -1
  31. package/dist/module/components/Card/context.js +6 -6
  32. package/dist/module/components/Card/index.js +1 -1
  33. package/dist/module/components/Card/utilities.js +6 -6
  34. package/dist/module/components/EvervaultProvider.js +53 -0
  35. package/dist/module/components/EvervaultProvider.js.map +1 -0
  36. package/dist/module/index.js +3 -2
  37. package/dist/module/index.js.map +1 -1
  38. package/dist/module/native.js +3 -3
  39. package/dist/module/sdk.js +13 -5
  40. package/dist/module/sdk.js.map +1 -1
  41. package/dist/typescript/src/components/Card/Card.d.ts +8 -8
  42. package/dist/typescript/src/components/Card/Card.d.ts.map +1 -1
  43. package/dist/typescript/src/components/Card/CardCVC.d.ts +2 -2
  44. package/dist/typescript/src/components/Card/CardCVC.d.ts.map +1 -1
  45. package/dist/typescript/src/components/Card/CardExpiry.d.ts +2 -2
  46. package/dist/typescript/src/components/Card/CardExpiry.d.ts.map +1 -1
  47. package/dist/typescript/src/components/Card/CardHolder.d.ts +2 -2
  48. package/dist/typescript/src/components/Card/CardHolder.d.ts.map +1 -1
  49. package/dist/typescript/src/components/Card/CardNumber.d.ts +2 -2
  50. package/dist/typescript/src/components/Card/CardNumber.d.ts.map +1 -1
  51. package/dist/typescript/src/components/Card/context.d.ts +4 -4
  52. package/dist/typescript/src/components/Card/index.d.ts +1 -1
  53. package/dist/typescript/src/components/Card/types.d.ts +2 -2
  54. package/dist/typescript/src/components/Card/utilities.d.ts +3 -3
  55. package/dist/typescript/src/components/EvervaultProvider.d.ts +29 -0
  56. package/dist/typescript/src/components/EvervaultProvider.d.ts.map +1 -0
  57. package/dist/typescript/src/index.d.ts +4 -3
  58. package/dist/typescript/src/index.d.ts.map +1 -1
  59. package/dist/typescript/src/sdk.d.ts +7 -0
  60. package/dist/typescript/src/sdk.d.ts.map +1 -1
  61. package/package.json +4 -79
  62. package/src/components/Card/Card.tsx +27 -32
  63. package/src/components/Card/CardCVC.tsx +17 -14
  64. package/src/components/Card/CardExpiry.tsx +15 -12
  65. package/src/components/Card/CardHolder.tsx +14 -11
  66. package/src/components/Card/CardNumber.tsx +16 -13
  67. package/src/components/Card/context.tsx +9 -9
  68. package/src/components/Card/index.ts +1 -1
  69. package/src/components/Card/types.ts +14 -14
  70. package/src/components/Card/utilities.ts +8 -8
  71. package/src/components/EvervaultProvider.tsx +64 -0
  72. package/src/index.tsx +4 -3
  73. package/src/native.ts +4 -4
  74. package/src/sdk.ts +12 -5
@@ -1 +1 @@
1
- {"version":3,"file":"CardHolder.d.ts","sourceRoot":"","sources":["../../../../../src/components/Card/CardHolder.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,MAAM,WAAW,eAAgB,SAAQ,SAAS;CAAG;AAErD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,qBAyBhD"}
1
+ {"version":3,"file":"CardHolder.d.ts","sourceRoot":"","sources":["../../../../../src/components/Card/CardHolder.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,MAAM,WAAW,eAAgB,SAAQ,SAAS;CAAG;AAErD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,qBA4BhD"}
@@ -1,5 +1,5 @@
1
- import * as React from 'react';
2
- import { BaseProps } from './Card';
1
+ import * as React from "react";
2
+ import { BaseProps } from "./Card";
3
3
  interface CardNumberProps extends BaseProps {
4
4
  }
5
5
  export declare function CardNumber(props: CardNumberProps): React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"CardNumber.d.ts","sourceRoot":"","sources":["../../../../../src/components/Card/CardNumber.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,UAAU,eAAgB,SAAQ,SAAS;CAAG;AAE9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,qBA6ChD"}
1
+ {"version":3,"file":"CardNumber.d.ts","sourceRoot":"","sources":["../../../../../src/components/Card/CardNumber.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,UAAU,eAAgB,SAAQ,SAAS;CAAG;AAE9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,qBAgDhD"}
@@ -1,9 +1,9 @@
1
- import { UseFormReturn } from '../useForm';
2
- import { Dispatch, SetStateAction } from 'react';
3
- import { CardForm, CardField } from './types';
1
+ import { UseFormReturn } from "../useForm";
2
+ import { Dispatch, SetStateAction } from "react";
3
+ import { CardForm, CardField } from "./types";
4
4
  type Context<T> = {
5
5
  values: CardForm;
6
- register: UseFormReturn<T>['register'];
6
+ register: UseFormReturn<T>["register"];
7
7
  setRegisteredFields: Dispatch<SetStateAction<Set<CardField>>>;
8
8
  };
9
9
  export declare const removeFieldFromSet: (prev: Set<CardField>, field: CardField) => Set<CardField>;
@@ -1,2 +1,2 @@
1
- export { Card, type CardProps } from './Card';
1
+ export { Card, type CardProps } from "./Card";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- export type CardBrandName = 'american-express' | 'visa' | 'mastercard' | 'discover' | 'jcb' | 'diners-club' | 'unionpay' | 'maestro' | 'mir' | 'elo' | 'hipercard' | 'hiper' | 'szep';
1
+ export type CardBrandName = "american-express" | "visa" | "mastercard" | "discover" | "jcb" | "diners-club" | "unionpay" | "maestro" | "mir" | "elo" | "hipercard" | "hiper" | "szep";
2
2
  export interface CardConfig {
3
3
  acceptedBrands?: CardBrandName[];
4
4
  }
@@ -8,7 +8,7 @@ export interface CardForm {
8
8
  cvc: string;
9
9
  expiry: string;
10
10
  }
11
- export type CardField = 'name' | 'number' | 'expiry' | 'cvc';
11
+ export type CardField = "name" | "number" | "expiry" | "cvc";
12
12
  export interface CardExpiry {
13
13
  month: string | null;
14
14
  year: string | null;
@@ -1,6 +1,6 @@
1
- import { CardNumberValidationResult } from '@evervault/card-validator';
2
- import type { CardForm, CardBrandName, CardField, CardPayload } from './types';
3
- import { UseFormReturn } from '../useForm';
1
+ import { CardNumberValidationResult } from "@evervault/card-validator";
2
+ import type { CardForm, CardBrandName, CardField, CardPayload } from "./types";
3
+ import { UseFormReturn } from "../useForm";
4
4
  export declare function changePayload(encrypt: (value: string) => Promise<string>, form: UseFormReturn<CardForm>, fields: CardField[]): Promise<CardPayload>;
5
5
  export declare function isComplete(form: UseFormReturn<CardForm>, fields: CardField[]): boolean;
6
6
  export declare function isAcceptedBrand(acceptedBrands: CardBrandName[] | undefined, cardNumberValidationResult: CardNumberValidationResult): boolean;
@@ -0,0 +1,29 @@
1
+ import { ReactNode } from "react";
2
+ import * as React from "react";
3
+ export interface EvervaultContext {
4
+ teamUuid?: string;
5
+ appUuid?: string;
6
+ }
7
+ export declare const useEvervault: () => EvervaultContext;
8
+ interface EvervaultProps {
9
+ appId: string;
10
+ teamId: string;
11
+ children: ReactNode;
12
+ }
13
+ /**
14
+ * @example
15
+ * ```tsx
16
+ * function App() {
17
+ * return (
18
+ * <EvervaultProvider teamId="team_123" appId="app_123">
19
+ * <Card onChange={(card) => console.log(card)}>
20
+ * <Card.Number />
21
+ * </Card>
22
+ * </EvervaultProvider>
23
+ * );
24
+ * }
25
+ * ```
26
+ */
27
+ declare const EvervaultProvider: ({ teamId, appId, children }: EvervaultProps) => React.JSX.Element;
28
+ export default EvervaultProvider;
29
+ //# sourceMappingURL=EvervaultProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvervaultProvider.d.ts","sourceRoot":"","sources":["../../../../src/components/EvervaultProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,iBAAiB,gCAAiC,cAAc,sBAwBrE,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -1,4 +1,5 @@
1
- export { type CardProps, Card } from './components/Card';
2
- export { init, encrypt } from './sdk';
3
- export type { CardPayload, CardExpiry, CardBrandName, CardConfig, CardForm, CardField, } from './components/Card/types';
1
+ export { type CardProps, Card } from "./components/Card";
2
+ export { init, encrypt } from "./sdk";
3
+ export type { CardPayload, CardExpiry, CardBrandName, CardConfig, CardForm, CardField, } from "./components/Card/types";
4
+ export { default as EvervaultProvider } from "./components/EvervaultProvider";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACtC,YAAY,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,UAAU,EACV,QAAQ,EACR,SAAS,GACV,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACtC,YAAY,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,UAAU,EACV,QAAQ,EACR,SAAS,GACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * @deprecated Deprecated since version 1.1.0. Use `EvervaultProvider` instead.
3
+ * @see `EvervaultProvider` instead
4
+ * ```tsx
5
+ * import { EvervaultProvider } from "@evervault/evervault-react-native";
6
+ * ```
7
+ */
1
8
  export declare function init(teamUuid: string, appUuid: string): Promise<void>;
2
9
  export declare function encrypt(data: any): Promise<string>;
3
10
  //# sourceMappingURL=sdk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/sdk.ts"],"names":[],"mappings":"AAGA,wBAAsB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CASxD"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/sdk.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CASxD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evervault/evervault-react-native",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Evervault react native sdk",
5
5
  "main": "./dist/commonjs/index.js",
6
6
  "module": "./dist/module/index.js",
@@ -45,6 +45,7 @@
45
45
  "access": "public"
46
46
  },
47
47
  "dependencies": {
48
+ "nodemon": "^3.1.4",
48
49
  "react-native-masked-text": "^1.13.0",
49
50
  "@evervault/card-validator": "1.0.5"
50
51
  },
@@ -77,87 +78,11 @@
77
78
  "engines": {
78
79
  "node": ">= 18.0.0"
79
80
  },
80
- "jest": {
81
- "preset": "react-native",
82
- "modulePathIgnorePatterns": [
83
- "<rootDir>/dist/"
84
- ]
85
- },
86
- "commitlint": {
87
- "extends": [
88
- "@commitlint/config-conventional"
89
- ]
90
- },
91
- "release-it": {
92
- "git": {
93
- "commitMessage": "chore: release ${version}",
94
- "tagName": "v${version}"
95
- },
96
- "npm": {
97
- "publish": true
98
- },
99
- "github": {
100
- "release": true
101
- },
102
- "plugins": {
103
- "@release-it/conventional-changelog": {
104
- "preset": "angular"
105
- }
106
- }
107
- },
108
- "eslintConfig": {
109
- "root": true,
110
- "extends": [
111
- "@react-native",
112
- "prettier"
113
- ],
114
- "rules": {
115
- "prettier/prettier": [
116
- "error",
117
- {
118
- "quoteProps": "consistent",
119
- "singleQuote": true,
120
- "tabWidth": 2,
121
- "trailingComma": "es5",
122
- "useTabs": false
123
- }
124
- ]
125
- }
126
- },
127
- "eslintIgnore": [
128
- "node_modules/",
129
- "dist/"
130
- ],
131
- "prettier": {
132
- "quoteProps": "consistent",
133
- "singleQuote": true,
134
- "tabWidth": 2,
135
- "trailingComma": "es5",
136
- "useTabs": false
137
- },
138
- "react-native-builder-bob": {
139
- "source": "src",
140
- "output": "dist",
141
- "typescript": [
142
- {
143
- "project": "tsconfig.build.json"
144
- }
145
- ],
146
- "targets": [
147
- "module",
148
- "commonjs",
149
- [
150
- "typescript",
151
- {
152
- "project": "tsconfig.build.json"
153
- }
154
- ]
155
- ]
156
- },
157
81
  "scripts": {
82
+ "dev": "nodemon --watch ./src --exec 'bob build' --ext ts,tsx",
158
83
  "build": "bob build",
159
84
  "typecheck": "tsc --noEmit",
160
85
  "clean": "del-cli android/build dist",
161
- "release": "release-it"
86
+ "format": "prettier --write ."
162
87
  }
163
88
  }
@@ -2,29 +2,24 @@ import {
2
2
  validateNumber,
3
3
  validateCVC,
4
4
  validateExpiry,
5
- } from '@evervault/card-validator';
6
- import * as React from 'react';
7
- import { ReactNode, useEffect, useState } from 'react';
8
- import { useForm } from '../useForm';
9
- import { changePayload, isAcceptedBrand, isComplete } from './utilities';
10
- import type { CardForm, CardConfig, CardField, CardPayload } from './types';
11
- import { CardNumber } from './CardNumber';
12
- import { CardContext } from './context';
13
- import { encrypt } from '../../sdk';
14
- import { CardCVC } from './CardCVC';
15
- import { CardHolder } from './CardHolder';
16
- import { CardExpiry } from './CardExpiry';
17
- import { StyleProp, TextInputProps, TextStyle, View } from 'react-native';
5
+ } from "@evervault/card-validator";
6
+ import * as React from "react";
7
+ import { ReactNode, useState } from "react";
8
+ import { useForm } from "../useForm";
9
+ import { changePayload, isAcceptedBrand, isComplete } from "./utilities";
10
+ import type { CardForm, CardConfig, CardField, CardPayload } from "./types";
11
+ import { CardNumber } from "./CardNumber";
12
+ import { CardContext } from "./context";
13
+ import { encrypt } from "../../sdk";
14
+ import { CardCVC } from "./CardCVC";
15
+ import { CardHolder } from "./CardHolder";
16
+ import { CardExpiry } from "./CardExpiry";
17
+ import { StyleProp, TextInputProps, TextStyle, View } from "react-native";
18
18
 
19
19
  export interface BaseProps
20
20
  extends Omit<
21
21
  TextInputProps,
22
- | 'onChange'
23
- | 'onBlur'
24
- | 'onChangeText'
25
- | 'inputMode'
26
- | 'autoComplete'
27
- | 'value'
22
+ "onChange" | "onChangeText" | "inputMode" | "autoComplete" | "value"
28
23
  > {}
29
24
 
30
25
  export interface CardProps {
@@ -42,56 +37,56 @@ function Card({ initialValue, config, children, onChange, style }: CardProps) {
42
37
 
43
38
  const form = useForm<CardForm>({
44
39
  initialValues: initialValue ?? {
45
- cvc: '',
46
- expiry: '',
47
- number: '',
48
- name: '',
40
+ cvc: "",
41
+ expiry: "",
42
+ number: "",
43
+ name: "",
49
44
  },
50
45
  validate: {
51
46
  name: (values) => {
52
- if (!registeredFields.has('name')) {
47
+ if (!registeredFields.has("name")) {
53
48
  return undefined;
54
49
  }
55
50
 
56
51
  if (values.name.length === 0) {
57
- return 'invalid';
52
+ return "invalid";
58
53
  }
59
54
 
60
55
  return undefined;
61
56
  },
62
57
  number: (values) => {
63
- if (!registeredFields.has('number')) {
58
+ if (!registeredFields.has("number")) {
64
59
  return undefined;
65
60
  }
66
61
  const cardValidation = validateNumber(values.number);
67
62
  if (!cardValidation.isValid) {
68
- return 'invalid';
63
+ return "invalid";
69
64
  }
70
65
 
71
66
  if (!isAcceptedBrand(config?.acceptedBrands, cardValidation)) {
72
- return 'unsupportedBrand';
67
+ return "unsupportedBrand";
73
68
  }
74
69
 
75
70
  return undefined;
76
71
  },
77
72
  expiry: (values) => {
78
- if (!registeredFields.has('expiry')) {
73
+ if (!registeredFields.has("expiry")) {
79
74
  return undefined;
80
75
  }
81
76
  const expiryValidation = validateExpiry(values.expiry);
82
77
  if (!expiryValidation.isValid) {
83
- return 'invalid';
78
+ return "invalid";
84
79
  }
85
80
 
86
81
  return undefined;
87
82
  },
88
83
  cvc: (values) => {
89
- if (!registeredFields.has('cvc')) {
84
+ if (!registeredFields.has("cvc")) {
90
85
  return undefined;
91
86
  }
92
87
  const cvcValidation = validateCVC(values.cvc, values.number);
93
88
  if (!cvcValidation.isValid) {
94
- return 'invalid';
89
+ return "invalid";
95
90
  }
96
91
 
97
92
  return undefined;
@@ -1,9 +1,9 @@
1
- import { validateNumber } from '@evervault/card-validator';
2
- import * as React from 'react';
3
- import { useEffect, useMemo } from 'react';
4
- import { TextInputMask } from 'react-native-masked-text';
5
- import { removeFieldFromSet, useCardContext } from './context';
6
- import { BaseProps } from './Card';
1
+ import { validateNumber } from "@evervault/card-validator";
2
+ import * as React from "react";
3
+ import { useEffect, useMemo } from "react";
4
+ import { TextInputMask } from "react-native-masked-text";
5
+ import { removeFieldFromSet, useCardContext } from "./context";
6
+ import { BaseProps } from "./Card";
7
7
 
8
8
  export interface CVCProps extends BaseProps {}
9
9
 
@@ -11,21 +11,21 @@ export const CardCVC = (props: CVCProps) => {
11
11
  const context = useCardContext();
12
12
  const mask = useMemo(() => {
13
13
  if (!context.values.number) {
14
- return '9999';
14
+ return "9999";
15
15
  }
16
16
  const type = validateNumber(context.values.number).brand;
17
- if (type === 'american-express') {
18
- return '9999';
17
+ if (type === "american-express") {
18
+ return "9999";
19
19
  }
20
- return '999';
20
+ return "999";
21
21
  }, [context.values.number]);
22
22
 
23
- const { onChange, onBlur } = context.register('cvc');
23
+ const { onChange, onBlur } = context.register("cvc");
24
24
 
25
25
  useEffect(() => {
26
- context.setRegisteredFields((prev) => new Set(prev).add('cvc'));
26
+ context.setRegisteredFields((prev) => new Set(prev).add("cvc"));
27
27
  return () =>
28
- context.setRegisteredFields((prev) => removeFieldFromSet(prev, 'cvc'));
28
+ context.setRegisteredFields((prev) => removeFieldFromSet(prev, "cvc"));
29
29
  // eslint-disable-next-line react-hooks/exhaustive-deps
30
30
  }, []);
31
31
 
@@ -37,7 +37,10 @@ export const CardCVC = (props: CVCProps) => {
37
37
  value={context.values.cvc}
38
38
  onChangeText={(t) => onChange(t)}
39
39
  id="cvc"
40
- onBlur={onBlur}
40
+ onBlur={(e) => {
41
+ onBlur(e);
42
+ props.onBlur?.(e);
43
+ }}
41
44
  inputMode="numeric"
42
45
  autoComplete="cc-csc"
43
46
  />
@@ -1,20 +1,20 @@
1
- import { TextInputMask } from 'react-native-masked-text';
2
- import { removeFieldFromSet, useCardContext } from './context';
3
- import * as React from 'react';
4
- import { useEffect } from 'react';
5
- import { BaseProps } from './Card';
1
+ import { TextInputMask } from "react-native-masked-text";
2
+ import { removeFieldFromSet, useCardContext } from "./context";
3
+ import * as React from "react";
4
+ import { useEffect } from "react";
5
+ import { BaseProps } from "./Card";
6
6
 
7
7
  export interface CardExpiryProps extends BaseProps {}
8
8
 
9
9
  export function CardExpiry(props: CardExpiryProps) {
10
10
  const context = useCardContext();
11
11
 
12
- const { onBlur, onChange } = context.register('expiry');
12
+ const { onBlur, onChange } = context.register("expiry");
13
13
 
14
14
  useEffect(() => {
15
- context.setRegisteredFields((prev) => new Set(prev).add('expiry'));
15
+ context.setRegisteredFields((prev) => new Set(prev).add("expiry"));
16
16
  return () =>
17
- context.setRegisteredFields((prev) => removeFieldFromSet(prev, 'expiry'));
17
+ context.setRegisteredFields((prev) => removeFieldFromSet(prev, "expiry"));
18
18
  // eslint-disable-next-line react-hooks/exhaustive-deps
19
19
  }, []);
20
20
 
@@ -24,13 +24,16 @@ export function CardExpiry(props: CardExpiryProps) {
24
24
  type="datetime"
25
25
  value={context.values.expiry}
26
26
  // store the expiry as MMYY not MM / YY
27
- onChangeText={(rawExpiry) => onChange(rawExpiry.replace(' / ', ''))}
27
+ onChangeText={(rawExpiry) => onChange(rawExpiry.replace(" / ", ""))}
28
28
  options={{
29
- format: '99 / 99',
29
+ format: "99 / 99",
30
30
  }}
31
31
  id="expiry"
32
- onBlur={onBlur}
33
- placeholder={props.placeholder ?? 'MM / YY'}
32
+ onBlur={(e) => {
33
+ onBlur(e);
34
+ props.onBlur?.(e);
35
+ }}
36
+ placeholder={props.placeholder ?? "MM / YY"}
34
37
  inputMode="numeric"
35
38
  autoComplete="cc-exp"
36
39
  />
@@ -1,20 +1,20 @@
1
- import { useEffect } from 'react';
2
- import * as React from 'react';
3
- import { Platform, TextInput } from 'react-native';
4
- import { removeFieldFromSet, useCardContext } from './context';
5
- import { BaseProps } from './Card';
1
+ import { useEffect } from "react";
2
+ import * as React from "react";
3
+ import { Platform, TextInput } from "react-native";
4
+ import { removeFieldFromSet, useCardContext } from "./context";
5
+ import { BaseProps } from "./Card";
6
6
 
7
7
  export interface CardHolderProps extends BaseProps {}
8
8
 
9
9
  export function CardHolder(props: CardHolderProps) {
10
10
  const context = useCardContext();
11
11
 
12
- const { onBlur, onChange } = context.register('name');
12
+ const { onBlur, onChange } = context.register("name");
13
13
 
14
14
  useEffect(() => {
15
- context.setRegisteredFields((prev) => new Set(prev).add('name'));
15
+ context.setRegisteredFields((prev) => new Set(prev).add("name"));
16
16
  return () =>
17
- context.setRegisteredFields((prev) => removeFieldFromSet(prev, 'name'));
17
+ context.setRegisteredFields((prev) => removeFieldFromSet(prev, "name"));
18
18
  // eslint-disable-next-line react-hooks/exhaustive-deps
19
19
  }, []);
20
20
 
@@ -23,10 +23,13 @@ export function CardHolder(props: CardHolderProps) {
23
23
  {...props}
24
24
  id="name"
25
25
  value={context.values.name}
26
- onBlur={onBlur}
26
+ onBlur={(e) => {
27
+ onBlur(e);
28
+ props.onBlur?.(e);
29
+ }}
27
30
  autoComplete={Platform.select({
28
- ios: 'cc-name',
29
- android: 'name',
31
+ ios: "cc-name",
32
+ android: "name",
30
33
  })}
31
34
  onChangeText={(v) => onChange(v)}
32
35
  />
@@ -1,9 +1,9 @@
1
- import { validateNumber } from '@evervault/card-validator';
2
- import * as React from 'react';
3
- import { useEffect, useMemo, useRef } from 'react';
4
- import { TextInputMask } from 'react-native-masked-text';
5
- import { removeFieldFromSet, useCardContext } from './context';
6
- import { BaseProps } from './Card';
1
+ import { validateNumber } from "@evervault/card-validator";
2
+ import * as React from "react";
3
+ import { useEffect, useMemo, useRef } from "react";
4
+ import { TextInputMask } from "react-native-masked-text";
5
+ import { removeFieldFromSet, useCardContext } from "./context";
6
+ import { BaseProps } from "./Card";
7
7
 
8
8
  interface CardNumberProps extends BaseProps {}
9
9
 
@@ -17,9 +17,9 @@ export function CardNumber(props: CardNumberProps) {
17
17
  const { brand } = validateNumber(value);
18
18
 
19
19
  const masks = {
20
- 'default': '9999 9999 9999 9999',
21
- 'unionpay': '9999 9999 9999 9999 999',
22
- 'american-express': '9999 999999 99999',
20
+ default: "9999 9999 9999 9999",
21
+ unionpay: "9999 9999 9999 9999 999",
22
+ "american-express": "9999 999999 99999",
23
23
  } as Record<string, string>;
24
24
 
25
25
  if (brand && !!masks[brand]) {
@@ -28,13 +28,13 @@ export function CardNumber(props: CardNumberProps) {
28
28
  return [value, masks.default];
29
29
  }, [context.values.number]);
30
30
 
31
- const { onBlur, onChange } = context.register('number');
31
+ const { onBlur, onChange } = context.register("number");
32
32
 
33
33
  useEffect(() => {
34
- context.setRegisteredFields((prev) => new Set(prev).add('number'));
34
+ context.setRegisteredFields((prev) => new Set(prev).add("number"));
35
35
 
36
36
  return () =>
37
- context.setRegisteredFields((prev) => removeFieldFromSet(prev, 'number'));
37
+ context.setRegisteredFields((prev) => removeFieldFromSet(prev, "number"));
38
38
  // eslint-disable-next-line react-hooks/exhaustive-deps
39
39
  }, []);
40
40
 
@@ -47,7 +47,10 @@ export function CardNumber(props: CardNumberProps) {
47
47
  id="number"
48
48
  value={innerValue}
49
49
  onChangeText={onChange}
50
- onBlur={onBlur}
50
+ onBlur={(e) => {
51
+ onBlur(e);
52
+ props.onBlur?.(e);
53
+ }}
51
54
  inputMode="numeric"
52
55
  autoComplete="cc-number"
53
56
  />
@@ -1,25 +1,25 @@
1
- import { UseFormReturn } from '../useForm';
2
- import { Dispatch, SetStateAction, createContext, useContext } from 'react';
3
- import { CardForm, CardField } from './types';
1
+ import { UseFormReturn } from "../useForm";
2
+ import { Dispatch, SetStateAction, createContext, useContext } from "react";
3
+ import { CardForm, CardField } from "./types";
4
4
 
5
5
  type Context<T> = {
6
6
  values: CardForm;
7
- register: UseFormReturn<T>['register'];
7
+ register: UseFormReturn<T>["register"];
8
8
  setRegisteredFields: Dispatch<SetStateAction<Set<CardField>>>;
9
9
  };
10
10
 
11
11
  export const removeFieldFromSet = (prev: Set<CardField>, field: CardField) => {
12
12
  const next = new Set(prev);
13
- next.delete('name');
13
+ next.delete("name");
14
14
  return next;
15
15
  };
16
16
 
17
17
  export const CardContext = createContext<Context<CardForm>>({
18
18
  values: {
19
- name: '',
20
- number: '',
21
- cvc: '',
22
- expiry: '',
19
+ name: "",
20
+ number: "",
21
+ cvc: "",
22
+ expiry: "",
23
23
  },
24
24
  register: () => ({
25
25
  onChange: () => {},
@@ -1 +1 @@
1
- export { Card, type CardProps } from './Card';
1
+ export { Card, type CardProps } from "./Card";
@@ -1,17 +1,17 @@
1
1
  export type CardBrandName =
2
- | 'american-express'
3
- | 'visa'
4
- | 'mastercard'
5
- | 'discover'
6
- | 'jcb'
7
- | 'diners-club'
8
- | 'unionpay'
9
- | 'maestro'
10
- | 'mir'
11
- | 'elo'
12
- | 'hipercard'
13
- | 'hiper'
14
- | 'szep';
2
+ | "american-express"
3
+ | "visa"
4
+ | "mastercard"
5
+ | "discover"
6
+ | "jcb"
7
+ | "diners-club"
8
+ | "unionpay"
9
+ | "maestro"
10
+ | "mir"
11
+ | "elo"
12
+ | "hipercard"
13
+ | "hiper"
14
+ | "szep";
15
15
 
16
16
  export interface CardConfig {
17
17
  acceptedBrands?: CardBrandName[];
@@ -24,7 +24,7 @@ export interface CardForm {
24
24
  expiry: string;
25
25
  }
26
26
 
27
- export type CardField = 'name' | 'number' | 'expiry' | 'cvc';
27
+ export type CardField = "name" | "number" | "expiry" | "cvc";
28
28
 
29
29
  export interface CardExpiry {
30
30
  month: string | null;