@test-glide/payment-react-native 0.1.0 → 0.1.1
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/lib/module/core/Collector.js +28 -18
- package/lib/module/core/Collector.js.map +1 -1
- package/lib/module/utils/fetch.js +47 -0
- package/lib/module/utils/fetch.js.map +1 -0
- package/lib/typescript/src/core/Collector.d.ts +9 -1
- package/lib/typescript/src/core/Collector.d.ts.map +1 -1
- package/lib/typescript/src/utils/fetch.d.ts +13 -0
- package/lib/typescript/src/utils/fetch.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/core/Collector.ts +22 -16
- package/src/utils/fetch.ts +58 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { fetchData } from "../utils/fetch.js";
|
|
3
4
|
import { formatCardYear, formatString } from "../utils/utils.js";
|
|
4
5
|
export class BivoCollect {
|
|
5
6
|
form = {};
|
|
@@ -39,20 +40,20 @@ export class BivoCollect {
|
|
|
39
40
|
|
|
40
41
|
// Default validations
|
|
41
42
|
switch (fieldName) {
|
|
42
|
-
case "
|
|
43
|
+
case "card":
|
|
43
44
|
{
|
|
44
45
|
const digits = trimmedValue.replace(/\D/g, "");
|
|
45
46
|
if (digits.length < 12) return "Invalid card number";
|
|
46
47
|
break;
|
|
47
48
|
}
|
|
48
|
-
case "
|
|
49
|
+
case "cvv":
|
|
49
50
|
{
|
|
50
51
|
if (!/^\d{3,4}$/.test(trimmedValue)) {
|
|
51
|
-
return "Invalid
|
|
52
|
+
return "Invalid CVV";
|
|
52
53
|
}
|
|
53
54
|
break;
|
|
54
55
|
}
|
|
55
|
-
case "
|
|
56
|
+
case "exp":
|
|
56
57
|
{
|
|
57
58
|
// Format check MM/YY
|
|
58
59
|
if (!/^\d{2}\/\d{2}$/.test(trimmedValue)) {
|
|
@@ -93,24 +94,33 @@ export class BivoCollect {
|
|
|
93
94
|
async submit(endpoint, token) {
|
|
94
95
|
console.log("Submitting form:", this.form, this.errors);
|
|
95
96
|
const expiry = this.form.expiryDate?.split("/") || [];
|
|
96
|
-
const payload = {
|
|
97
|
-
token,
|
|
98
|
-
pan: formatString(this.form.cardNumber || ""),
|
|
99
|
-
expiry_month: Number(expiry[0] || 0),
|
|
100
|
-
expiry_year: formatCardYear(expiry[1] || ""),
|
|
101
|
-
cvv: this.form.cvc ? formatString(this.form.cvc) : null,
|
|
102
|
-
name: this.form.cardHolderName || null
|
|
103
|
-
};
|
|
104
97
|
|
|
105
98
|
// Replace fetchData with your API call
|
|
106
|
-
const response = await
|
|
99
|
+
const response = await fetchData(endpoint, {
|
|
107
100
|
method: "POST",
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
101
|
+
body: {
|
|
102
|
+
token,
|
|
103
|
+
pan: formatString(this.form.cardNumber || ""),
|
|
104
|
+
expiry_month: Number(expiry[0] || 0) || null,
|
|
105
|
+
expiry_year: formatCardYear(expiry[1] || "") || null,
|
|
106
|
+
cvv: this.form.cvc ? formatString(this.form.cvc) : null,
|
|
107
|
+
address: {
|
|
108
|
+
postal_code: this.form.zipCode ? formatString(this.form.zipCode) : null
|
|
109
|
+
}
|
|
110
|
+
}
|
|
112
111
|
});
|
|
113
|
-
|
|
112
|
+
if (response.error) {
|
|
113
|
+
return {
|
|
114
|
+
success: false,
|
|
115
|
+
error: response.error
|
|
116
|
+
};
|
|
117
|
+
} else {
|
|
118
|
+
return {
|
|
119
|
+
success: true,
|
|
120
|
+
data: response.data
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
// return response.json();
|
|
114
124
|
}
|
|
115
125
|
}
|
|
116
126
|
//# sourceMappingURL=Collector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["formatCardYear","formatString","BivoCollect","form","errors","fieldConfig","constructor","vaultId","environment","setField","fieldName","value","onStateChange","required","regex","errorMsg","error","validateField","trimmedValue","trim","test","digits","replace","length","monthStr","yearStr","split","month","parseInt","year","fullYear","now","Date","currentMonth","getMonth","currentYear","getFullYear","isSubmitDisabled","fieldNames","some","submit","endpoint","token","console","log","expiry","expiryDate","
|
|
1
|
+
{"version":3,"names":["fetchData","formatCardYear","formatString","BivoCollect","form","errors","fieldConfig","constructor","vaultId","environment","setField","fieldName","value","onStateChange","required","regex","errorMsg","error","validateField","trimmedValue","trim","test","digits","replace","length","monthStr","yearStr","split","month","parseInt","year","fullYear","now","Date","currentMonth","getMonth","currentYear","getFullYear","isSubmitDisabled","fieldNames","some","submit","endpoint","token","console","log","expiry","expiryDate","response","method","body","pan","cardNumber","expiry_month","Number","expiry_year","cvv","cvc","address","postal_code","zipCode","success","data"],"sourceRoot":"../../../src","sources":["core/Collector.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export const fetchData = async (url, payload = {}) => {
|
|
4
|
+
const {
|
|
5
|
+
method = "GET",
|
|
6
|
+
headers = {},
|
|
7
|
+
body = null,
|
|
8
|
+
...options
|
|
9
|
+
} = payload;
|
|
10
|
+
try {
|
|
11
|
+
const config = {
|
|
12
|
+
method,
|
|
13
|
+
headers: {
|
|
14
|
+
Accept: "*/*",
|
|
15
|
+
"Content-Type": "application/json",
|
|
16
|
+
...headers
|
|
17
|
+
},
|
|
18
|
+
...options
|
|
19
|
+
};
|
|
20
|
+
if (body && ["POST", "PUT", "PATCH", "DELETE"].includes(method.toUpperCase())) {
|
|
21
|
+
config.body = typeof body === "string" ? body : JSON.stringify(body);
|
|
22
|
+
}
|
|
23
|
+
const response = await fetch(url, config);
|
|
24
|
+
const contentType = response.headers.get("content-type");
|
|
25
|
+
let responseData;
|
|
26
|
+
if (contentType?.includes("application/json")) {
|
|
27
|
+
responseData = await response.json();
|
|
28
|
+
} else {
|
|
29
|
+
responseData = await response.text();
|
|
30
|
+
}
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const errData = responseData;
|
|
33
|
+
throw new Error(errData?.message || `HTTP error! status: ${response.status}`);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
data: responseData,
|
|
37
|
+
error: null
|
|
38
|
+
};
|
|
39
|
+
} catch (err) {
|
|
40
|
+
const errorMessage = err instanceof Error ? err.message : "An error occurred";
|
|
41
|
+
return {
|
|
42
|
+
data: null,
|
|
43
|
+
error: errorMessage
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["fetchData","url","payload","method","headers","body","options","config","Accept","includes","toUpperCase","JSON","stringify","response","fetch","contentType","get","responseData","json","text","ok","errData","Error","message","status","data","error","err","errorMessage"],"sourceRoot":"../../../src","sources":["utils/fetch.ts"],"mappings":";;AAaA,OAAO,MAAMA,SAAS,GAAG,MAAAA,CACvBC,GAAW,EACXC,OAAqB,GAAG,CAAC,CAAC,KACE;EAC5B,MAAM;IAAEC,MAAM,GAAG,KAAK;IAAEC,OAAO,GAAG,CAAC,CAAC;IAAEC,IAAI,GAAG,IAAI;IAAE,GAAGC;EAAQ,CAAC,GAAGJ,OAAO;EAEzE,IAAI;IACF,MAAMK,MAAmB,GAAG;MAC1BJ,MAAM;MACNC,OAAO,EAAE;QACPI,MAAM,EAAE,KAAK;QACb,cAAc,EAAE,kBAAkB;QAClC,GAAGJ;MACL,CAAC;MACD,GAAGE;IACL,CAAC;IAED,IAAID,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAACI,QAAQ,CAACN,MAAM,CAACO,WAAW,CAAC,CAAC,CAAC,EAAE;MAC7EH,MAAM,CAACF,IAAI,GAAG,OAAOA,IAAI,KAAK,QAAQ,GAAGA,IAAI,GAAGM,IAAI,CAACC,SAAS,CAACP,IAAI,CAAC;IACtE;IAEA,MAAMQ,QAAQ,GAAG,MAAMC,KAAK,CAACb,GAAG,EAAEM,MAAM,CAAC;IAEzC,MAAMQ,WAAW,GAAGF,QAAQ,CAACT,OAAO,CAACY,GAAG,CAAC,cAAc,CAAC;IACxD,IAAIC,YAAe;IAEnB,IAAIF,WAAW,EAAEN,QAAQ,CAAC,kBAAkB,CAAC,EAAE;MAC7CQ,YAAY,GAAG,MAAMJ,QAAQ,CAACK,IAAI,CAAC,CAAM;IAC3C,CAAC,MAAM;MACLD,YAAY,GAAG,MAAMJ,QAAQ,CAACM,IAAI,CAAC,CAAM;IAC3C;IAEA,IAAI,CAACN,QAAQ,CAACO,EAAE,EAAE;MAChB,MAAMC,OAAO,GAAGJ,YAAuC;MACvD,MAAM,IAAIK,KAAK,CACZD,OAAO,EAAEE,OAAO,IAAe,uBAAuBV,QAAQ,CAACW,MAAM,EACxE,CAAC;IACH;IAEA,OAAO;MAAEC,IAAI,EAAER,YAAY;MAAES,KAAK,EAAE;IAAK,CAAC;EAC5C,CAAC,CAAC,OAAOC,GAAG,EAAE;IACZ,MAAMC,YAAY,GAAGD,GAAG,YAAYL,KAAK,GAAGK,GAAG,CAACJ,OAAO,GAAG,mBAAmB;IAC7E,OAAO;MAAEE,IAAI,EAAE,IAAI;MAAEC,KAAK,EAAEE;IAAa,CAAC;EAC5C;AACF,CAAC","ignoreList":[]}
|
|
@@ -16,7 +16,15 @@ export declare class BivoCollect {
|
|
|
16
16
|
setField(fieldName: string, value: string, onStateChange?: (state: FieldState) => void, required?: boolean, regex?: RegExp, errorMsg?: string): void;
|
|
17
17
|
validateField(fieldName: string, value: string, required?: boolean, regex?: RegExp, errorMsg?: string): string;
|
|
18
18
|
isSubmitDisabled(fieldNames: string[]): boolean;
|
|
19
|
-
submit(endpoint: string, token: string): Promise<
|
|
19
|
+
submit(endpoint: string, token: string): Promise<{
|
|
20
|
+
success: boolean;
|
|
21
|
+
error: string;
|
|
22
|
+
data?: undefined;
|
|
23
|
+
} | {
|
|
24
|
+
success: boolean;
|
|
25
|
+
data: unknown;
|
|
26
|
+
error?: undefined;
|
|
27
|
+
}>;
|
|
20
28
|
}
|
|
21
29
|
export {};
|
|
22
30
|
//# sourceMappingURL=Collector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collector.d.ts","sourceRoot":"","sources":["../../../../src/core/Collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Collector.d.ts","sourceRoot":"","sources":["../../../../src/core/Collector.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,qBAAa,WAAW;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IACpC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;gBAEhF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,GAAG,MAAM;IAK5D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EAAE,QAAQ,GAAE,OAAe,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAUpJ,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAoErG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE;IAQ/B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;;;;;CAyB7C"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
2
|
+
interface FetchPayload extends Omit<RequestInit, "method" | "headers" | "body"> {
|
|
3
|
+
method?: HttpMethod;
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
body?: Record<string, unknown> | string | null;
|
|
6
|
+
}
|
|
7
|
+
interface FetchResult<T> {
|
|
8
|
+
data: T | null;
|
|
9
|
+
error: string | null;
|
|
10
|
+
}
|
|
11
|
+
export declare const fetchData: <T = unknown>(url: string, payload?: FetchPayload) => Promise<FetchResult<T>>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9D,UAAU,YAAa,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC7E,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;CAChD;AAED,UAAU,WAAW,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,SAAS,GAAU,CAAC,GAAG,OAAO,EACzC,KAAK,MAAM,EACX,UAAS,YAAiB,KACzB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAyCxB,CAAC"}
|
package/package.json
CHANGED
package/src/core/Collector.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { fetchData } from "../utils/fetch";
|
|
1
2
|
import { formatCardYear, formatString } from "../utils/utils";
|
|
2
3
|
|
|
3
4
|
|
|
@@ -41,20 +42,20 @@ export class BivoCollect {
|
|
|
41
42
|
|
|
42
43
|
// Default validations
|
|
43
44
|
switch (fieldName) {
|
|
44
|
-
case "
|
|
45
|
+
case "card": {
|
|
45
46
|
const digits = trimmedValue.replace(/\D/g, "");
|
|
46
47
|
if (digits.length < 12) return "Invalid card number";
|
|
47
48
|
break;
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
case "
|
|
51
|
+
case "cvv": {
|
|
51
52
|
if (!/^\d{3,4}$/.test(trimmedValue)) {
|
|
52
|
-
return "Invalid
|
|
53
|
+
return "Invalid CVV";
|
|
53
54
|
}
|
|
54
55
|
break;
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
case "
|
|
58
|
+
case "exp": {
|
|
58
59
|
// Format check MM/YY
|
|
59
60
|
if (!/^\d{2}\/\d{2}$/.test(trimmedValue)) {
|
|
60
61
|
return "Invalid expiry";
|
|
@@ -104,21 +105,26 @@ export class BivoCollect {
|
|
|
104
105
|
async submit(endpoint: string, token: string) {
|
|
105
106
|
console.log("Submitting form:", this.form, this.errors);
|
|
106
107
|
const expiry = this.form.expiryDate?.split("/") || [];
|
|
107
|
-
const payload = {
|
|
108
|
-
token,
|
|
109
|
-
pan: formatString(this.form.cardNumber || ""),
|
|
110
|
-
expiry_month: Number(expiry[0] || 0),
|
|
111
|
-
expiry_year: formatCardYear(expiry[1] || ""),
|
|
112
|
-
cvv: this.form.cvc ? formatString(this.form.cvc) : null,
|
|
113
|
-
name: this.form.cardHolderName || null,
|
|
114
|
-
};
|
|
115
108
|
|
|
116
109
|
// Replace fetchData with your API call
|
|
117
|
-
const response = await
|
|
110
|
+
const response = await fetchData(endpoint, {
|
|
118
111
|
method: "POST",
|
|
119
|
-
|
|
120
|
-
|
|
112
|
+
body: {
|
|
113
|
+
token,
|
|
114
|
+
pan:formatString(this.form.cardNumber || ""),
|
|
115
|
+
expiry_month: Number(expiry[0] || 0) || null,
|
|
116
|
+
expiry_year: formatCardYear(expiry[1] || "") || null,
|
|
117
|
+
cvv: this.form.cvc ? formatString(this.form.cvc) : null,
|
|
118
|
+
address: {
|
|
119
|
+
postal_code: this.form.zipCode ? formatString(this.form.zipCode) : null,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
121
122
|
});
|
|
122
|
-
|
|
123
|
+
if (response.error) {
|
|
124
|
+
return{ success: false, error: response.error };
|
|
125
|
+
} else {
|
|
126
|
+
return{ success: true, data: response.data };
|
|
127
|
+
}
|
|
128
|
+
// return response.json();
|
|
123
129
|
}
|
|
124
130
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
2
|
+
|
|
3
|
+
interface FetchPayload extends Omit<RequestInit, "method" | "headers" | "body"> {
|
|
4
|
+
method?: HttpMethod;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
body?: Record<string, unknown> | string | null;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface FetchResult<T> {
|
|
10
|
+
data: T | null;
|
|
11
|
+
error: string | null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const fetchData = async <T = unknown>(
|
|
15
|
+
url: string,
|
|
16
|
+
payload: FetchPayload = {}
|
|
17
|
+
): Promise<FetchResult<T>> => {
|
|
18
|
+
const { method = "GET", headers = {}, body = null, ...options } = payload;
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const config: RequestInit = {
|
|
22
|
+
method,
|
|
23
|
+
headers: {
|
|
24
|
+
Accept: "*/*",
|
|
25
|
+
"Content-Type": "application/json",
|
|
26
|
+
...headers,
|
|
27
|
+
},
|
|
28
|
+
...options,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
if (body && ["POST", "PUT", "PATCH", "DELETE"].includes(method.toUpperCase())) {
|
|
32
|
+
config.body = typeof body === "string" ? body : JSON.stringify(body);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const response = await fetch(url, config);
|
|
36
|
+
|
|
37
|
+
const contentType = response.headers.get("content-type");
|
|
38
|
+
let responseData: T;
|
|
39
|
+
|
|
40
|
+
if (contentType?.includes("application/json")) {
|
|
41
|
+
responseData = await response.json() as T;
|
|
42
|
+
} else {
|
|
43
|
+
responseData = await response.text() as T;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const errData = responseData as Record<string, unknown>;
|
|
48
|
+
throw new Error(
|
|
49
|
+
(errData?.message as string) || `HTTP error! status: ${response.status}`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return { data: responseData, error: null };
|
|
54
|
+
} catch (err) {
|
|
55
|
+
const errorMessage = err instanceof Error ? err.message : "An error occurred";
|
|
56
|
+
return { data: null, error: errorMessage };
|
|
57
|
+
}
|
|
58
|
+
};
|