@cashfreepayments/react-native-cashfree-cn-sdk 1.0.0-dev.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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/android/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  4. package/android/.gradle/7.2/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/7.2/executionHistory/executionHistory.lock +0 -0
  6. package/android/.gradle/7.2/fileChanges/last-build.bin +0 -0
  7. package/android/.gradle/7.2/fileHashes/fileHashes.bin +0 -0
  8. package/android/.gradle/7.2/fileHashes/fileHashes.lock +0 -0
  9. package/android/.gradle/7.2/fileHashes/resourceHashesCache.bin +0 -0
  10. package/android/.gradle/7.2/gc.properties +0 -0
  11. package/android/.gradle/7.5/checksums/checksums.lock +0 -0
  12. package/android/.gradle/7.5/checksums/md5-checksums.bin +0 -0
  13. package/android/.gradle/7.5/checksums/sha1-checksums.bin +0 -0
  14. package/android/.gradle/7.5/dependencies-accessors/dependencies-accessors.lock +0 -0
  15. package/android/.gradle/7.5/dependencies-accessors/gc.properties +0 -0
  16. package/android/.gradle/7.5/executionHistory/executionHistory.lock +0 -0
  17. package/android/.gradle/7.5/fileChanges/last-build.bin +0 -0
  18. package/android/.gradle/7.5/fileHashes/fileHashes.bin +0 -0
  19. package/android/.gradle/7.5/fileHashes/fileHashes.lock +0 -0
  20. package/android/.gradle/7.5/fileHashes/resourceHashesCache.bin +0 -0
  21. package/android/.gradle/7.5/gc.properties +0 -0
  22. package/android/.gradle/8.5/checksums/checksums.lock +0 -0
  23. package/android/.gradle/8.5/checksums/md5-checksums.bin +0 -0
  24. package/android/.gradle/8.5/checksums/sha1-checksums.bin +0 -0
  25. package/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock +0 -0
  26. package/android/.gradle/8.5/dependencies-accessors/gc.properties +0 -0
  27. package/android/.gradle/8.5/fileChanges/last-build.bin +0 -0
  28. package/android/.gradle/8.5/fileHashes/fileHashes.lock +0 -0
  29. package/android/.gradle/8.5/gc.properties +0 -0
  30. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  31. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  32. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  33. package/android/.gradle/checksums/checksums.lock +0 -0
  34. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  35. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  36. package/android/.gradle/config.properties +2 -0
  37. package/android/.gradle/nb-cache/trust/5D9F4D2F872AE83553369BAEF9EF62F30CBE0A19F76FE265082C658DB033E1DA +1 -0
  38. package/android/.gradle/nb-cache/trust/811DB8418F399FDF2AFA5CB6893343C7013E03D6360FA7A8FBFC8B0C8A38EE77 +1 -0
  39. package/android/.gradle/vcs-1/gc.properties +0 -0
  40. package/android/.idea/compiler.xml +6 -0
  41. package/android/.idea/gradle.xml +18 -0
  42. package/android/.idea/migrations.xml +10 -0
  43. package/android/.idea/misc.xml +9 -0
  44. package/android/.idea/other.xml +549 -0
  45. package/android/.idea/vcs.xml +6 -0
  46. package/android/build.gradle +77 -0
  47. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  48. package/android/local.properties +8 -0
  49. package/android/src/main/AndroidManifest.xml +4 -0
  50. package/android/src/main/java/com/reactnativecashfreecnsdk/CashfreePgApiModule.java +319 -0
  51. package/android/src/main/java/com/reactnativecashfreecnsdk/CashfreePgApiPackage.java +28 -0
  52. package/ios/CashfreeEmitter.swift +36 -0
  53. package/ios/CashfreeEventEmitter.m +16 -0
  54. package/ios/CashfreeEventEmitter.swift +28 -0
  55. package/ios/CashfreePgApi-Bridging-Header.h +5 -0
  56. package/ios/CashfreePgApi.m +21 -0
  57. package/ios/CashfreePgApi.swift +410 -0
  58. package/ios/CashfreePgApi.xcodeproj/project.pbxproj +293 -0
  59. package/ios/CashfreePgApi.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  60. package/ios/CashfreePgApi.xcodeproj/project.xcworkspace/xcuserdata/nikhil.kushwah.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  61. package/ios/CashfreePgApi.xcodeproj/xcuserdata/nikhil.kushwah.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  62. package/lib/commonjs/Card/CFCardComponent.js +287 -0
  63. package/lib/commonjs/Card/CFCardComponent.js.map +1 -0
  64. package/lib/commonjs/Card/index.js +14 -0
  65. package/lib/commonjs/Card/index.js.map +1 -0
  66. package/lib/commonjs/index.js +168 -0
  67. package/lib/commonjs/index.js.map +1 -0
  68. package/lib/module/Card/CFCardComponent.js +279 -0
  69. package/lib/module/Card/CFCardComponent.js.map +1 -0
  70. package/lib/module/Card/index.js +2 -0
  71. package/lib/module/Card/index.js.map +1 -0
  72. package/lib/module/index.js +159 -0
  73. package/lib/module/index.js.map +1 -0
  74. package/lib/typescript/src/Card/CFCardComponent.d.ts +12 -0
  75. package/lib/typescript/src/Card/index.d.ts +1 -0
  76. package/lib/typescript/src/index.d.ts +43 -0
  77. package/package.json +157 -0
  78. package/react-native-cashfree-cn-sdk.podspec +20 -0
  79. package/src/Card/CFCardComponent.js +238 -0
  80. package/src/Card/CFCardComponent.tsx +323 -0
  81. package/src/Card/index.js +1 -0
  82. package/src/Card/index.ts +1 -0
  83. package/src/index.js +167 -0
  84. package/src/index.ts +219 -0
package/package.json ADDED
@@ -0,0 +1,157 @@
1
+ {
2
+ "name": "@cashfreepayments/react-native-cashfree-cn-sdk",
3
+ "version": "1.0.0-dev.0",
4
+ "description": "Cashfree PG Plugin for React Native",
5
+ "main": "lib/commonjs/index.js",
6
+ "module": "lib/module/index.js",
7
+ "types": "lib/typescript/src/index.d.ts",
8
+ "react-native": "src/index",
9
+ "source": "src/index",
10
+ "files": [
11
+ "src",
12
+ "lib",
13
+ "android",
14
+ "ios",
15
+ "cpp",
16
+ "react-native-cashfree-cn-sdk.podspec",
17
+ "!lib/typescript/example",
18
+ "!android/build",
19
+ "!ios/build",
20
+ "!**/__tests__",
21
+ "!**/__fixtures__",
22
+ "!**/__mocks__"
23
+ ],
24
+ "scripts": {
25
+ "test": "jest",
26
+ "typescript": "tsc --noEmit",
27
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
28
+ "prepare": "bob build",
29
+ "release": "release-it",
30
+ "example": "yarn --cwd example",
31
+ "pods": "cd example && pod-install --quiet",
32
+ "bootstrap": "yarn example && yarn && yarn pods"
33
+ },
34
+ "keywords": [
35
+ "react-native",
36
+ "ios",
37
+ "android",
38
+ "cashfree",
39
+ "react-native-android",
40
+ "react-native-ios",
41
+ "cashfree react-native sdk",
42
+ "react-native payment gateway",
43
+ "payment gateway",
44
+ "react-native-cashfree-cn-sdk"
45
+ ],
46
+ "repository": "https://github.com/cashfree/react-native-cashfree-cn-sdk",
47
+ "author": "cashfree-payments <developers@cashfree.com> (https://www.cashfree.com/)",
48
+ "license": "MIT",
49
+ "bugs": {
50
+ "url": "https://github.com/cashfree/react-native-cashfree-cn-sdk/issues"
51
+ },
52
+ "homepage": "https://docs.cashfree.com/docs/react-native-integration",
53
+ "publishConfig": {
54
+ "registry": "https://registry.npmjs.org/"
55
+ },
56
+ "devDependencies": {
57
+ "@commitlint/config-conventional": "^11.0.0",
58
+ "@react-native-community/eslint-config": "^2.0.0",
59
+ "@release-it/conventional-changelog": "^2.0.0",
60
+ "@types/jest": "^26.0.0",
61
+ "@types/react": "^16.9.19",
62
+ "@types/react-native": "0.62.13",
63
+ "commitlint": "^11.0.0",
64
+ "eslint": "^7.2.0",
65
+ "eslint-config-prettier": "^7.0.0",
66
+ "eslint-plugin-prettier": "^3.1.3",
67
+ "husky": "^6.0.0",
68
+ "jest": "^26.0.1",
69
+ "pod-install": "^0.1.0",
70
+ "prettier": "^2.0.5",
71
+ "react": "16.13.1",
72
+ "react-native": "0.63.4",
73
+ "react-native-builder-bob": "^0.18.0",
74
+ "release-it": "^14.2.2",
75
+ "typescript": "^4.1.3"
76
+ },
77
+ "peerDependencies": {
78
+ "react": "*",
79
+ "react-native": "*"
80
+ },
81
+ "jest": {
82
+ "preset": "react-native",
83
+ "modulePathIgnorePatterns": [
84
+ "<rootDir>/example/node_modules",
85
+ "<rootDir>/lib/"
86
+ ]
87
+ },
88
+ "commitlint": {
89
+ "extends": [
90
+ "@commitlint/config-conventional"
91
+ ]
92
+ },
93
+ "release-it": {
94
+ "git": {
95
+ "commitMessage": "chore: release ${version}",
96
+ "tagName": "v${version}"
97
+ },
98
+ "npm": {
99
+ "publish": true
100
+ },
101
+ "github": {
102
+ "release": true
103
+ },
104
+ "plugins": {
105
+ "@release-it/conventional-changelog": {
106
+ "preset": "angular"
107
+ }
108
+ }
109
+ },
110
+ "eslintConfig": {
111
+ "root": true,
112
+ "extends": [
113
+ "@react-native-community",
114
+ "prettier"
115
+ ],
116
+ "rules": {
117
+ "prettier/prettier": [
118
+ "error",
119
+ {
120
+ "quoteProps": "consistent",
121
+ "singleQuote": true,
122
+ "tabWidth": 2,
123
+ "trailingComma": "es5",
124
+ "useTabs": false
125
+ }
126
+ ]
127
+ }
128
+ },
129
+ "eslintIgnore": [
130
+ "node_modules/",
131
+ "lib/"
132
+ ],
133
+ "prettier": {
134
+ "quoteProps": "consistent",
135
+ "singleQuote": true,
136
+ "tabWidth": 2,
137
+ "trailingComma": "es5",
138
+ "useTabs": false
139
+ },
140
+ "react-native-builder-bob": {
141
+ "source": "src",
142
+ "output": "lib",
143
+ "targets": [
144
+ "commonjs",
145
+ "module",
146
+ [
147
+ "typescript",
148
+ {
149
+ "project": "tsconfig.build.json"
150
+ }
151
+ ]
152
+ ]
153
+ },
154
+ "dependencies": {
155
+ "cashfree-pg-api-contract": "^2.0.7"
156
+ }
157
+ }
@@ -0,0 +1,20 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "react-native-cashfree-cn-sdk"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => "10.0" }
14
+ s.source = { :git => "https://www.cashfree.com/.git", :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
17
+
18
+ s.dependency "React-Core"
19
+ s.dependency "CashfreePG", "2.0.19"
20
+ end
@@ -0,0 +1,238 @@
1
+ import { TextInput } from 'react-native';
2
+ import React, { forwardRef } from 'react';
3
+ import { CFCardPayment, CFEnvironment, } from 'cashfree-pg-api-contract';
4
+ import { CFPaymentGatewayService } from '../index';
5
+ function luhnCheck(cardNumber) {
6
+ if (cardNumber.length === 0) {
7
+ return false;
8
+ }
9
+ cardNumber = cardNumber.replace(/\s/g, ''); // Remove spaces
10
+ let sum = 0;
11
+ let isAlternate = false;
12
+ for (let i = cardNumber.length - 1; i >= 0; i--) {
13
+ let digit = parseInt(cardNumber[i], 10);
14
+ if (isAlternate) {
15
+ digit *= 2;
16
+ if (digit > 9) {
17
+ digit -= 9;
18
+ }
19
+ }
20
+ sum += digit;
21
+ isAlternate = !isAlternate;
22
+ }
23
+ return sum % 10 === 0;
24
+ }
25
+ function getInputValidationDetails(cardBinResponse) {
26
+ if (!cardBinResponse || !cardBinResponse.scheme) {
27
+ return null;
28
+ }
29
+ let schemeType = cardBinResponse.scheme.toLowerCase();
30
+ let inputValidationDetails;
31
+ switch (schemeType) {
32
+ case 'amex':
33
+ inputValidationDetails = { max_input_length: 15, cvv_length: 4 };
34
+ break;
35
+ case 'diners':
36
+ inputValidationDetails = { max_input_length: 14, cvv_length: 3 };
37
+ break;
38
+ default: // Covers visa, mastercard, rupay, jcb, discover, and unknown schemes
39
+ inputValidationDetails = { max_input_length: 16, cvv_length: 3 };
40
+ }
41
+ return inputValidationDetails;
42
+ }
43
+ /**
44
+ * Fetching Tdr info with card bin data & cfSession object
45
+ * @param session : for payment sessionId & env
46
+ * @param bin : for card number
47
+ */
48
+ async function getTDR(session, bin) {
49
+ const route = `/pg/sdk/js/${session.payment_session_id}/v2/tdr`;
50
+ const body = JSON.stringify({ code: bin, code_type: 'bin' });
51
+ return await getInfo(session.environment, route, body);
52
+ }
53
+ /**
54
+ * Fetching CardBin info with card bin data & cfSession object
55
+ * @param session : for payment sessionId & env
56
+ * @param bin : for card number
57
+ */
58
+ async function getCardBin(session, bin) {
59
+ const route = `/pg/sdk/js/${session.payment_session_id}/cardBin`;
60
+ const body = JSON.stringify({ card_number: bin });
61
+ return await getInfo(session.environment, route, body);
62
+ }
63
+ async function getInfo(env, route, bodyData) {
64
+ let baseUrl = 'https://api.cashfree.com';
65
+ if (env === CFEnvironment.SANDBOX) {
66
+ baseUrl = 'https://sandbox.cashfree.com';
67
+ }
68
+ const url = baseUrl + route;
69
+ try {
70
+ const response = await fetch(url, {
71
+ method: 'POST',
72
+ headers: {
73
+ 'Content-Type': 'application/json',
74
+ },
75
+ body: bodyData,
76
+ });
77
+ if (!response.ok) {
78
+ return null;
79
+ }
80
+ return await response.json();
81
+ }
82
+ catch (error) {
83
+ return null;
84
+ }
85
+ }
86
+ const CardInput = forwardRef(({ cfSession, cardListener, style, ...props }, ref) => {
87
+ const [inputNumber, setInputNumber] = React.useState('');
88
+ const inputNumberRef = React.useRef('');
89
+ const sessionRef = React.useRef(cfSession);
90
+ React.useImperativeHandle(ref, () => ({
91
+ doPayment,
92
+ doPaymentWithPaymentSessionId,
93
+ }));
94
+ const tdrJsonRef = React.useRef(null);
95
+ const cardBinJsonRef = React.useRef(null);
96
+ const firstEightDigitsRef = React.useRef('');
97
+ const handleChange = React.useCallback(async (cardNumber) => {
98
+ let completeResponse = {};
99
+ const textWithoutSpaces = cardNumber.replaceAll(' ', '');
100
+ if (textWithoutSpaces.length === 0)
101
+ setInputNumber('');
102
+ let formattedText = '';
103
+ /**
104
+ * Code to format card input number & set to input box
105
+ */
106
+ for (let i = 0; i < textWithoutSpaces.length; i += 4) {
107
+ let end = i + 4;
108
+ if (end > textWithoutSpaces.length) {
109
+ end = textWithoutSpaces.length;
110
+ }
111
+ formattedText += textWithoutSpaces.substring(i, end);
112
+ if (end !== textWithoutSpaces.length) {
113
+ formattedText += ' ';
114
+ }
115
+ inputNumberRef.current = formattedText;
116
+ setInputNumber((prev) => prev === formattedText ? prev : formattedText);
117
+ }
118
+ let tdrResponse = null;
119
+ let cardBinResponse = null;
120
+ /**
121
+ * Fetch Tdr & CardBin data & set to local variable
122
+ */
123
+ async function fetchDataAndSet() {
124
+ await getTDR(cfSession, textWithoutSpaces)
125
+ .then((response) => {
126
+ tdrResponse = response;
127
+ firstEightDigitsRef.current = textWithoutSpaces.substring(0, 8);
128
+ })
129
+ .catch(() => {
130
+ tdrResponse = null;
131
+ });
132
+ await getCardBin(cfSession, textWithoutSpaces)
133
+ .then((response) => {
134
+ cardBinResponse = response;
135
+ firstEightDigitsRef.current = textWithoutSpaces.substring(0, 8);
136
+ })
137
+ .catch(() => {
138
+ cardBinResponse = null;
139
+ });
140
+ if (tdrResponse) {
141
+ tdrJsonRef.current = tdrResponse;
142
+ completeResponse.tdr_info = tdrJsonRef.current;
143
+ }
144
+ if (cardBinResponse) {
145
+ cardBinJsonRef.current = cardBinResponse;
146
+ completeResponse.card_bin_info = cardBinJsonRef.current;
147
+ completeResponse.input_validation = getInputValidationDetails(cardBinJsonRef.current);
148
+ }
149
+ }
150
+ if (textWithoutSpaces.length === 8) {
151
+ await fetchDataAndSet();
152
+ }
153
+ else if (textWithoutSpaces.length > 8) {
154
+ if (firstEightDigitsRef.current === textWithoutSpaces.substring(0, 8)) {
155
+ completeResponse.tdr_info = tdrJsonRef.current;
156
+ completeResponse.card_bin_info = cardBinJsonRef.current;
157
+ completeResponse.input_validation = getInputValidationDetails(cardBinJsonRef.current);
158
+ }
159
+ else {
160
+ tdrJsonRef.current = null;
161
+ cardBinJsonRef.current = null;
162
+ await fetchDataAndSet();
163
+ }
164
+ }
165
+ if (textWithoutSpaces.length < 8) {
166
+ tdrJsonRef.current = null;
167
+ cardBinJsonRef.current = null;
168
+ firstEightDigitsRef.current = '';
169
+ }
170
+ if (cardBinJsonRef.current !== null) {
171
+ completeResponse.card_network = cardBinJsonRef.current.scheme;
172
+ }
173
+ let luhnStatus = luhnCheck(textWithoutSpaces);
174
+ if (luhnStatus) {
175
+ completeResponse.luhn_check_info = 'SUCCESS';
176
+ if (textWithoutSpaces && textWithoutSpaces.length > 4) {
177
+ completeResponse.last_four_digit = textWithoutSpaces.substring(textWithoutSpaces.length - 4);
178
+ }
179
+ }
180
+ else {
181
+ completeResponse.luhn_check_info = 'FAIL';
182
+ }
183
+ completeResponse.card_length = textWithoutSpaces.length;
184
+ return cardListener(JSON.stringify(completeResponse));
185
+ }, [cfSession, cardListener]);
186
+ const doPayment = (cardInfo) => {
187
+ try {
188
+ let cfCardNumber = inputNumberRef.current;
189
+ cardInfo.cardNumber = cfCardNumber.replaceAll(' ', '');
190
+ const cardPayment = new CFCardPayment(sessionRef.current, cardInfo);
191
+ CFPaymentGatewayService.makePayment(cardPayment, "https://65da-163-116-214-55.ngrok-free.app");
192
+ }
193
+ catch (e) {
194
+ console.log(e.message);
195
+ }
196
+ };
197
+ const doPaymentWithPaymentSessionId = (cardInfo, session) => {
198
+ try {
199
+ sessionRef.current = session;
200
+ doPayment(cardInfo);
201
+ }
202
+ catch (e) {
203
+ console.log(e.message);
204
+ }
205
+ };
206
+ const handleSubmitEditingEvent = (event) => {
207
+ const newEvent = { ...event };
208
+ delete newEvent.nativeEvent.text;
209
+ if (onSubmitEditing) {
210
+ onSubmitEditing(newEvent);
211
+ }
212
+ };
213
+ const handleEndEditingEvent = (event) => {
214
+ const newEvent = { ...event };
215
+ delete newEvent.nativeEvent.text;
216
+ if (onEndEditing) {
217
+ onEndEditing(newEvent);
218
+ }
219
+ };
220
+ const handleFocusEvent = (event) => {
221
+ const newEvent = { ...event };
222
+ delete newEvent.nativeEvent.text;
223
+ if (onFocus) {
224
+ onFocus(newEvent);
225
+ }
226
+ };
227
+ const handleBlurEvent = (event) => {
228
+ const newEvent = { ...event };
229
+ delete newEvent.nativeEvent.text;
230
+ if (onBlur) {
231
+ onBlur(newEvent);
232
+ }
233
+ };
234
+ const InputComponent = TextInput;
235
+ const { onChangeText, onChange, onSubmitEditing, onEndEditing, onFocus, onBlur, ...otherProps } = props;
236
+ return (React.createElement(InputComponent, { keyboardType: "numeric", inputMode: 'numeric', value: inputNumber, onChangeText: handleChange, onSubmitEditing: handleSubmitEditingEvent, onEndEditing: handleEndEditingEvent, onFocus: handleFocusEvent, onBlur: handleBlurEvent, style: style, ...otherProps }));
237
+ });
238
+ export default CardInput;