@react-native-ohos/react-native-credit-card-input 1.0.1-rc.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/LICENSE +20 -0
- package/README.OpenSource +11 -0
- package/README.md +9 -0
- package/lib/commonjs/CreditCardInput.js +138 -0
- package/lib/commonjs/CreditCardInput.js.map +1 -0
- package/lib/commonjs/CreditCardView.js +175 -0
- package/lib/commonjs/CreditCardView.js.map +1 -0
- package/lib/commonjs/Icons.js +17 -0
- package/lib/commonjs/Icons.js.map +1 -0
- package/lib/commonjs/LiteCreditCardInput.js +189 -0
- package/lib/commonjs/LiteCreditCardInput.js.map +1 -0
- package/lib/commonjs/index.js +35 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/useCreditCardForm.js +95 -0
- package/lib/commonjs/useCreditCardForm.js.map +1 -0
- package/lib/module/CreditCardInput.js +134 -0
- package/lib/module/CreditCardInput.js.map +1 -0
- package/lib/module/CreditCardView.js +170 -0
- package/lib/module/CreditCardView.js.map +1 -0
- package/lib/module/Icons.js +13 -0
- package/lib/module/Icons.js.map +1 -0
- package/lib/module/LiteCreditCardInput.js +184 -0
- package/lib/module/LiteCreditCardInput.js.map +1 -0
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/useCreditCardForm.js +89 -0
- package/lib/module/useCreditCardForm.js.map +1 -0
- package/lib/typescript/commonjs/jest.setup.d.ts +2 -0
- package/lib/typescript/commonjs/jest.setup.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/src/CreditCardInput.d.ts +25 -0
- package/lib/typescript/commonjs/src/CreditCardInput.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/CreditCardView.d.ts +23 -0
- package/lib/typescript/commonjs/src/CreditCardView.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/Icons.d.ts +11 -0
- package/lib/typescript/commonjs/src/Icons.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiteCreditCardInput.d.ts +19 -0
- package/lib/typescript/commonjs/src/LiteCreditCardInput.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +5 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/useCreditCardForm.d.ts +25 -0
- package/lib/typescript/commonjs/src/useCreditCardForm.d.ts.map +1 -0
- package/lib/typescript/module/jest.setup.d.ts +2 -0
- package/lib/typescript/module/jest.setup.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/src/CreditCardInput.d.ts +25 -0
- package/lib/typescript/module/src/CreditCardInput.d.ts.map +1 -0
- package/lib/typescript/module/src/CreditCardView.d.ts +23 -0
- package/lib/typescript/module/src/CreditCardView.d.ts.map +1 -0
- package/lib/typescript/module/src/Icons.d.ts +11 -0
- package/lib/typescript/module/src/Icons.d.ts.map +1 -0
- package/lib/typescript/module/src/LiteCreditCardInput.d.ts +19 -0
- package/lib/typescript/module/src/LiteCreditCardInput.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +5 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -0
- package/lib/typescript/module/src/useCreditCardForm.d.ts +25 -0
- package/lib/typescript/module/src/useCreditCardForm.d.ts.map +1 -0
- package/package.json +145 -0
- package/src/CreditCardInput.tsx +163 -0
- package/src/CreditCardView.tsx +248 -0
- package/src/Icons.ts +18 -0
- package/src/LiteCreditCardInput.tsx +226 -0
- package/src/index.tsx +12 -0
- package/src/useCreditCardForm.tsx +161 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _Icons = _interopRequireDefault(require("./Icons.js"));
|
|
10
|
+
var _useCreditCardForm = require("./useCreditCardForm.js");
|
|
11
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
const s = _reactNative.StyleSheet.create({
|
|
14
|
+
container: {
|
|
15
|
+
paddingVertical: 10,
|
|
16
|
+
paddingHorizontal: 15,
|
|
17
|
+
flexDirection: 'row',
|
|
18
|
+
alignItems: 'center',
|
|
19
|
+
overflow: 'hidden'
|
|
20
|
+
},
|
|
21
|
+
icon: {
|
|
22
|
+
width: 48,
|
|
23
|
+
height: 40,
|
|
24
|
+
resizeMode: 'contain'
|
|
25
|
+
},
|
|
26
|
+
expanded: {
|
|
27
|
+
flex: 1
|
|
28
|
+
},
|
|
29
|
+
hidden: {
|
|
30
|
+
width: 0
|
|
31
|
+
},
|
|
32
|
+
leftPart: {
|
|
33
|
+
overflow: 'hidden'
|
|
34
|
+
},
|
|
35
|
+
rightPart: {
|
|
36
|
+
overflow: 'hidden',
|
|
37
|
+
flexDirection: 'row'
|
|
38
|
+
},
|
|
39
|
+
last4: {
|
|
40
|
+
flex: 1,
|
|
41
|
+
justifyContent: 'center'
|
|
42
|
+
},
|
|
43
|
+
numberInput: {
|
|
44
|
+
width: 1000
|
|
45
|
+
},
|
|
46
|
+
expiryInput: {
|
|
47
|
+
width: 80
|
|
48
|
+
},
|
|
49
|
+
cvcInput: {
|
|
50
|
+
width: 80
|
|
51
|
+
},
|
|
52
|
+
last4Input: {
|
|
53
|
+
width: 60,
|
|
54
|
+
marginLeft: 20
|
|
55
|
+
},
|
|
56
|
+
input: {
|
|
57
|
+
height: 40,
|
|
58
|
+
fontSize: 16,
|
|
59
|
+
// // @ts-expect-error outlineWidth is used to hide the text-input outline on react-native-web
|
|
60
|
+
outlineWidth: 0
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const LiteCreditCardInput = props => {
|
|
64
|
+
const {
|
|
65
|
+
autoFocus = false,
|
|
66
|
+
style,
|
|
67
|
+
inputStyle,
|
|
68
|
+
placeholderColor = 'darkgray',
|
|
69
|
+
placeholders = {
|
|
70
|
+
number: '1234 5678 1234 5678',
|
|
71
|
+
expiry: 'MM/YY',
|
|
72
|
+
cvc: 'CVC'
|
|
73
|
+
},
|
|
74
|
+
onChange = () => {},
|
|
75
|
+
onFocusField = () => {},
|
|
76
|
+
testID
|
|
77
|
+
} = props;
|
|
78
|
+
const _onChange = formData => {
|
|
79
|
+
// Focus next field when number/expiry field become valid
|
|
80
|
+
if (status.number !== 'valid' && formData.status.number === 'valid') {
|
|
81
|
+
toggleFormState();
|
|
82
|
+
expiryInput.current?.focus();
|
|
83
|
+
}
|
|
84
|
+
if (status.expiry !== 'valid' && formData.status.expiry === 'valid') {
|
|
85
|
+
cvcInput.current?.focus();
|
|
86
|
+
}
|
|
87
|
+
onChange(formData);
|
|
88
|
+
};
|
|
89
|
+
const {
|
|
90
|
+
values,
|
|
91
|
+
status,
|
|
92
|
+
onChangeValue
|
|
93
|
+
} = (0, _useCreditCardForm.useCreditCardForm)(_onChange);
|
|
94
|
+
const [showRightPart, setShowRightPart] = (0, _react.useState)(false);
|
|
95
|
+
const toggleFormState = (0, _react.useCallback)(() => {
|
|
96
|
+
_reactNative.LayoutAnimation.easeInEaseOut();
|
|
97
|
+
setShowRightPart(v => !v);
|
|
98
|
+
}, []);
|
|
99
|
+
const numberInput = (0, _react.useRef)(null);
|
|
100
|
+
const expiryInput = (0, _react.useRef)(null);
|
|
101
|
+
const cvcInput = (0, _react.useRef)(null);
|
|
102
|
+
(0, _react.useEffect)(() => {
|
|
103
|
+
if (autoFocus) numberInput.current?.focus();
|
|
104
|
+
}, [autoFocus]);
|
|
105
|
+
const cardIcon = (0, _react.useMemo)(() => {
|
|
106
|
+
if (values.type && _Icons.default[values.type]) return _Icons.default[values.type];
|
|
107
|
+
return _Icons.default.placeholder;
|
|
108
|
+
}, [values.type]);
|
|
109
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
110
|
+
style: [s.container, style],
|
|
111
|
+
testID: testID,
|
|
112
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
113
|
+
style: [s.leftPart, showRightPart ? s.hidden : s.expanded],
|
|
114
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
115
|
+
style: [s.numberInput],
|
|
116
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
|
|
117
|
+
ref: numberInput,
|
|
118
|
+
keyboardType: "default",
|
|
119
|
+
style: [s.input, inputStyle],
|
|
120
|
+
placeholderTextColor: placeholderColor,
|
|
121
|
+
placeholder: placeholders.number,
|
|
122
|
+
value: values.number,
|
|
123
|
+
onChangeText: v => onChangeValue('number', v),
|
|
124
|
+
onFocus: () => onFocusField('number'),
|
|
125
|
+
autoCorrect: false,
|
|
126
|
+
underlineColorAndroid: 'transparent',
|
|
127
|
+
testID: "CC_NUMBER"
|
|
128
|
+
})
|
|
129
|
+
})
|
|
130
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
131
|
+
activeOpacity: 0.8,
|
|
132
|
+
onPress: toggleFormState,
|
|
133
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
|
|
134
|
+
style: s.icon,
|
|
135
|
+
source: {
|
|
136
|
+
uri: cardIcon
|
|
137
|
+
}
|
|
138
|
+
})
|
|
139
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
140
|
+
style: [s.rightPart, showRightPart ? s.expanded : s.hidden],
|
|
141
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
142
|
+
activeOpacity: 0.8,
|
|
143
|
+
onPress: toggleFormState,
|
|
144
|
+
style: s.last4,
|
|
145
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
146
|
+
pointerEvents: 'none',
|
|
147
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
|
|
148
|
+
keyboardType: "default",
|
|
149
|
+
value: status.number === 'valid' ? values.number.slice(values.number.length - 4) : '',
|
|
150
|
+
style: [s.input, s.last4Input],
|
|
151
|
+
readOnly: true
|
|
152
|
+
})
|
|
153
|
+
})
|
|
154
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
155
|
+
style: s.expiryInput,
|
|
156
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
|
|
157
|
+
ref: expiryInput,
|
|
158
|
+
keyboardType: "default",
|
|
159
|
+
style: [s.input, inputStyle],
|
|
160
|
+
placeholderTextColor: placeholderColor,
|
|
161
|
+
placeholder: placeholders.expiry,
|
|
162
|
+
value: values.expiry,
|
|
163
|
+
onChangeText: v => onChangeValue('expiry', v),
|
|
164
|
+
onFocus: () => onFocusField('expiry'),
|
|
165
|
+
autoCorrect: false,
|
|
166
|
+
underlineColorAndroid: 'transparent',
|
|
167
|
+
testID: "CC_EXPIRY"
|
|
168
|
+
})
|
|
169
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
170
|
+
style: s.cvcInput,
|
|
171
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
|
|
172
|
+
ref: cvcInput,
|
|
173
|
+
keyboardType: "default",
|
|
174
|
+
style: [s.input, inputStyle],
|
|
175
|
+
placeholderTextColor: placeholderColor,
|
|
176
|
+
placeholder: placeholders.cvc,
|
|
177
|
+
value: values.cvc,
|
|
178
|
+
onChangeText: v => onChangeValue('cvc', v),
|
|
179
|
+
onFocus: () => onFocusField('cvc'),
|
|
180
|
+
autoCorrect: false,
|
|
181
|
+
underlineColorAndroid: 'transparent',
|
|
182
|
+
testID: "CC_CVC"
|
|
183
|
+
})
|
|
184
|
+
})]
|
|
185
|
+
})]
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
var _default = exports.default = LiteCreditCardInput;
|
|
189
|
+
//# sourceMappingURL=LiteCreditCardInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_Icons","_interopRequireDefault","_useCreditCardForm","_jsxRuntime","e","__esModule","default","s","StyleSheet","create","container","paddingVertical","paddingHorizontal","flexDirection","alignItems","overflow","icon","width","height","resizeMode","expanded","flex","hidden","leftPart","rightPart","last4","justifyContent","numberInput","expiryInput","cvcInput","last4Input","marginLeft","input","fontSize","outlineWidth","LiteCreditCardInput","props","autoFocus","style","inputStyle","placeholderColor","placeholders","number","expiry","cvc","onChange","onFocusField","testID","_onChange","formData","status","toggleFormState","current","focus","values","onChangeValue","useCreditCardForm","showRightPart","setShowRightPart","useState","useCallback","LayoutAnimation","easeInEaseOut","v","useRef","useEffect","cardIcon","useMemo","type","Icons","placeholder","jsxs","View","children","jsx","TextInput","ref","keyboardType","placeholderTextColor","value","onChangeText","onFocus","autoCorrect","underlineColorAndroid","TouchableOpacity","activeOpacity","onPress","Image","source","uri","pointerEvents","slice","length","readOnly","_default","exports"],"sourceRoot":"..\\..\\src","sources":["LiteCreditCardInput.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "CreditCardInput", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _CreditCardInput.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "CreditCardView", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _CreditCardView.default;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "LiteCreditCardInput", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _LiteCreditCardInput.default;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "useCreditCardForm", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _useCreditCardForm.useCreditCardForm;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
var _CreditCardView = _interopRequireDefault(require("./CreditCardView.js"));
|
|
31
|
+
var _CreditCardInput = _interopRequireDefault(require("./CreditCardInput.js"));
|
|
32
|
+
var _LiteCreditCardInput = _interopRequireDefault(require("./LiteCreditCardInput.js"));
|
|
33
|
+
var _useCreditCardForm = require("./useCreditCardForm.js");
|
|
34
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_CreditCardView","_interopRequireDefault","require","_CreditCardInput","_LiteCreditCardInput","_useCreditCardForm","e","__esModule","default"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,oBAAA,GAAAH,sBAAA,CAAAC,OAAA;AAEA,IAAAG,kBAAA,GAAAH,OAAA;AAO6B,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useCreditCardForm = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _cardValidator = _interopRequireDefault(require("card-validator"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
// --- Utilities
|
|
11
|
+
|
|
12
|
+
const toStatus = validation => {
|
|
13
|
+
return validation.isValid ? 'valid' : validation.isPotentiallyValid ? 'incomplete' : 'invalid';
|
|
14
|
+
};
|
|
15
|
+
const removeNonNumber = (string = '') => string.replace(/[^\d]/g, '');
|
|
16
|
+
const limitLength = (string = '', maxLength) => string.slice(0, maxLength);
|
|
17
|
+
const addGaps = (string = '', gaps) => {
|
|
18
|
+
const offsets = [0].concat(gaps).concat([string.length]);
|
|
19
|
+
return offsets.map((end, index) => {
|
|
20
|
+
if (index === 0) return '';
|
|
21
|
+
const start = offsets[index - 1] || 0;
|
|
22
|
+
return string.slice(start, end);
|
|
23
|
+
}).filter(part => part !== '').join(' ');
|
|
24
|
+
};
|
|
25
|
+
const formatCardNumber = (number, maxLength, gaps) => {
|
|
26
|
+
const numberSanitized = removeNonNumber(number);
|
|
27
|
+
const lengthSanitized = limitLength(numberSanitized, maxLength);
|
|
28
|
+
const formatted = addGaps(lengthSanitized, gaps);
|
|
29
|
+
return formatted;
|
|
30
|
+
};
|
|
31
|
+
const formatCardExpiry = expiry => {
|
|
32
|
+
const sanitized = limitLength(removeNonNumber(expiry), 4);
|
|
33
|
+
if (sanitized.match(/^[2-9]$/)) {
|
|
34
|
+
return `0${sanitized}`;
|
|
35
|
+
}
|
|
36
|
+
if (sanitized.length > 2) {
|
|
37
|
+
return `${sanitized.substr(0, 2)}/${sanitized.substr(2, sanitized.length)}`;
|
|
38
|
+
}
|
|
39
|
+
return sanitized;
|
|
40
|
+
};
|
|
41
|
+
const formatCardCVC = (cvc, cvcMaxLength) => {
|
|
42
|
+
return limitLength(removeNonNumber(cvc), cvcMaxLength);
|
|
43
|
+
};
|
|
44
|
+
const useCreditCardForm = onChange => {
|
|
45
|
+
const [formState, setFormState] = (0, _react.useState)({
|
|
46
|
+
number: 'incomplete',
|
|
47
|
+
expiry: 'incomplete',
|
|
48
|
+
cvc: 'incomplete'
|
|
49
|
+
});
|
|
50
|
+
const [values, setValues] = (0, _react.useState)({
|
|
51
|
+
number: '',
|
|
52
|
+
expiry: '',
|
|
53
|
+
cvc: '',
|
|
54
|
+
type: undefined
|
|
55
|
+
});
|
|
56
|
+
const onChangeValue = (0, _react.useCallback)((field, value) => {
|
|
57
|
+
const newValues = {
|
|
58
|
+
...values,
|
|
59
|
+
[field]: value
|
|
60
|
+
};
|
|
61
|
+
const numberValidation = _cardValidator.default.number(newValues.number);
|
|
62
|
+
|
|
63
|
+
// When card issuer cant be detected, use these default (3 digit CVC, 16 digit card number with spaces every 4 digit)
|
|
64
|
+
const cvcMaxLength = numberValidation.card?.code.size || 3;
|
|
65
|
+
const cardNumberGaps = numberValidation.card?.gaps || [4, 8, 12];
|
|
66
|
+
const cardNumberMaxLength =
|
|
67
|
+
// Credit card number can vary. Use the longest possible as maximum (otherwise fallback to 16)
|
|
68
|
+
Math.max(...(numberValidation.card?.lengths || [16]));
|
|
69
|
+
const newFormattedValues = {
|
|
70
|
+
number: formatCardNumber(newValues.number, cardNumberMaxLength, cardNumberGaps),
|
|
71
|
+
expiry: formatCardExpiry(newValues.expiry),
|
|
72
|
+
cvc: formatCardCVC(newValues.cvc, cvcMaxLength),
|
|
73
|
+
type: numberValidation.card?.type
|
|
74
|
+
};
|
|
75
|
+
const newFormState = {
|
|
76
|
+
number: toStatus(_cardValidator.default.number(newFormattedValues.number)),
|
|
77
|
+
expiry: toStatus(_cardValidator.default.expirationDate(newFormattedValues.expiry)),
|
|
78
|
+
cvc: toStatus(_cardValidator.default.cvv(newFormattedValues.cvc, cvcMaxLength))
|
|
79
|
+
};
|
|
80
|
+
setValues(newFormattedValues);
|
|
81
|
+
setFormState(newFormState);
|
|
82
|
+
onChange({
|
|
83
|
+
valid: newFormState.number === 'valid' && newFormState.expiry === 'valid' && newFormState.cvc === 'valid',
|
|
84
|
+
values: newFormattedValues,
|
|
85
|
+
status: newFormState
|
|
86
|
+
});
|
|
87
|
+
}, [values, onChange]);
|
|
88
|
+
return {
|
|
89
|
+
values,
|
|
90
|
+
status: formState,
|
|
91
|
+
onChangeValue
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
exports.useCreditCardForm = useCreditCardForm;
|
|
95
|
+
//# sourceMappingURL=useCreditCardForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_cardValidator","_interopRequireDefault","e","__esModule","default","toStatus","validation","isValid","isPotentiallyValid","removeNonNumber","string","replace","limitLength","maxLength","slice","addGaps","gaps","offsets","concat","length","map","end","index","start","filter","part","join","formatCardNumber","number","numberSanitized","lengthSanitized","formatted","formatCardExpiry","expiry","sanitized","match","substr","formatCardCVC","cvc","cvcMaxLength","useCreditCardForm","onChange","formState","setFormState","useState","values","setValues","type","undefined","onChangeValue","useCallback","field","value","newValues","numberValidation","cardValidator","card","code","size","cardNumberGaps","cardNumberMaxLength","Math","max","lengths","newFormattedValues","newFormState","expirationDate","cvv","valid","status","exports"],"sourceRoot":"..\\..\\src","sources":["useCreditCardForm.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
import { StyleSheet, Text, TextInput, View } from 'react-native';
|
|
5
|
+
import { useCreditCardForm } from "./useCreditCardForm.js";
|
|
6
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
|
+
const s = StyleSheet.create({
|
|
8
|
+
container: {
|
|
9
|
+
paddingVertical: 15,
|
|
10
|
+
paddingHorizontal: 15
|
|
11
|
+
},
|
|
12
|
+
icon: {
|
|
13
|
+
width: 48,
|
|
14
|
+
height: 40,
|
|
15
|
+
resizeMode: 'contain'
|
|
16
|
+
},
|
|
17
|
+
numberInput: {},
|
|
18
|
+
extraContainer: {
|
|
19
|
+
flexDirection: 'row',
|
|
20
|
+
marginTop: 15
|
|
21
|
+
},
|
|
22
|
+
expiryInputContainer: {
|
|
23
|
+
flex: 1,
|
|
24
|
+
marginRight: 5
|
|
25
|
+
},
|
|
26
|
+
cvcInputContainer: {
|
|
27
|
+
flex: 1,
|
|
28
|
+
marginLeft: 5
|
|
29
|
+
},
|
|
30
|
+
input: {
|
|
31
|
+
height: 40,
|
|
32
|
+
fontSize: 16,
|
|
33
|
+
borderBottomColor: 'darkgray',
|
|
34
|
+
borderBottomWidth: 1,
|
|
35
|
+
// // @ts-expect-error outlineWidth is used to hide the text-input outline on react-native-web
|
|
36
|
+
outlineWidth: 0
|
|
37
|
+
},
|
|
38
|
+
inputLabel: {
|
|
39
|
+
fontSize: 14,
|
|
40
|
+
fontWeight: 600
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const CreditCardInput = props => {
|
|
44
|
+
const {
|
|
45
|
+
autoFocus,
|
|
46
|
+
style,
|
|
47
|
+
labelStyle,
|
|
48
|
+
inputStyle,
|
|
49
|
+
placeholderColor = 'darkgray',
|
|
50
|
+
labels = {
|
|
51
|
+
number: 'CARD NUMBER',
|
|
52
|
+
expiry: 'EXPIRY',
|
|
53
|
+
cvc: 'CVC/CVV'
|
|
54
|
+
},
|
|
55
|
+
placeholders = {
|
|
56
|
+
number: '1234 5678 1234 5678',
|
|
57
|
+
expiry: 'MM/YY',
|
|
58
|
+
cvc: 'CVC'
|
|
59
|
+
},
|
|
60
|
+
onChange = () => {},
|
|
61
|
+
onFocusField = () => {},
|
|
62
|
+
testID
|
|
63
|
+
} = props;
|
|
64
|
+
const {
|
|
65
|
+
values,
|
|
66
|
+
onChangeValue
|
|
67
|
+
} = useCreditCardForm(onChange);
|
|
68
|
+
const numberInput = useRef(null);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (autoFocus) numberInput.current?.focus();
|
|
71
|
+
}, [autoFocus]);
|
|
72
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
73
|
+
style: [s.container, style],
|
|
74
|
+
testID: testID,
|
|
75
|
+
children: [/*#__PURE__*/_jsxs(View, {
|
|
76
|
+
style: [s.numberInput],
|
|
77
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
78
|
+
style: [s.inputLabel, labelStyle],
|
|
79
|
+
children: labels.number
|
|
80
|
+
}), /*#__PURE__*/_jsx(TextInput, {
|
|
81
|
+
ref: numberInput,
|
|
82
|
+
keyboardType: "default",
|
|
83
|
+
style: [s.input, inputStyle],
|
|
84
|
+
placeholderTextColor: placeholderColor,
|
|
85
|
+
placeholder: placeholders.number,
|
|
86
|
+
value: values.number,
|
|
87
|
+
onChangeText: v => onChangeValue('number', v),
|
|
88
|
+
onFocus: () => onFocusField('number'),
|
|
89
|
+
autoCorrect: false,
|
|
90
|
+
underlineColorAndroid: 'transparent',
|
|
91
|
+
testID: "CC_NUMBER"
|
|
92
|
+
})]
|
|
93
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
94
|
+
style: [s.extraContainer],
|
|
95
|
+
children: [/*#__PURE__*/_jsxs(View, {
|
|
96
|
+
style: s.expiryInputContainer,
|
|
97
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
98
|
+
style: [s.inputLabel, labelStyle],
|
|
99
|
+
children: labels.expiry
|
|
100
|
+
}), /*#__PURE__*/_jsx(TextInput, {
|
|
101
|
+
keyboardType: "default",
|
|
102
|
+
style: [s.input, inputStyle],
|
|
103
|
+
placeholderTextColor: placeholderColor,
|
|
104
|
+
placeholder: placeholders.expiry,
|
|
105
|
+
value: values.expiry,
|
|
106
|
+
onChangeText: v => onChangeValue('expiry', v),
|
|
107
|
+
onFocus: () => onFocusField('expiry'),
|
|
108
|
+
autoCorrect: false,
|
|
109
|
+
underlineColorAndroid: 'transparent',
|
|
110
|
+
testID: "CC_EXPIRY"
|
|
111
|
+
})]
|
|
112
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
113
|
+
style: s.cvcInputContainer,
|
|
114
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
115
|
+
style: [s.inputLabel, labelStyle],
|
|
116
|
+
children: labels.cvc
|
|
117
|
+
}), /*#__PURE__*/_jsx(TextInput, {
|
|
118
|
+
keyboardType: "default",
|
|
119
|
+
style: [s.input, inputStyle],
|
|
120
|
+
placeholderTextColor: placeholderColor,
|
|
121
|
+
placeholder: placeholders.cvc,
|
|
122
|
+
value: values.cvc,
|
|
123
|
+
onChangeText: v => onChangeValue('cvc', v),
|
|
124
|
+
onFocus: () => onFocusField('cvc'),
|
|
125
|
+
autoCorrect: false,
|
|
126
|
+
underlineColorAndroid: 'transparent',
|
|
127
|
+
testID: "CC_CVC"
|
|
128
|
+
})]
|
|
129
|
+
})]
|
|
130
|
+
})]
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
export default CreditCardInput;
|
|
134
|
+
//# sourceMappingURL=CreditCardInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","StyleSheet","Text","TextInput","View","useCreditCardForm","jsx","_jsx","jsxs","_jsxs","s","create","container","paddingVertical","paddingHorizontal","icon","width","height","resizeMode","numberInput","extraContainer","flexDirection","marginTop","expiryInputContainer","flex","marginRight","cvcInputContainer","marginLeft","input","fontSize","borderBottomColor","borderBottomWidth","outlineWidth","inputLabel","fontWeight","CreditCardInput","props","autoFocus","style","labelStyle","inputStyle","placeholderColor","labels","number","expiry","cvc","placeholders","onChange","onFocusField","testID","values","onChangeValue","current","focus","children","ref","keyboardType","placeholderTextColor","placeholder","value","onChangeText","v","onFocus","autoCorrect","underlineColorAndroid"],"sourceRoot":"..\\..\\src","sources":["CreditCardInput.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Image, ImageBackground, Platform, StyleSheet, Text, View } from 'react-native';
|
|
4
|
+
import FlipCard from 'react-native-flip-card';
|
|
5
|
+
import Icons from "./Icons.js";
|
|
6
|
+
import { useMemo } from 'react';
|
|
7
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
|
+
const CARD_SIZE = {
|
|
9
|
+
width: 300,
|
|
10
|
+
height: 190
|
|
11
|
+
};
|
|
12
|
+
const s = StyleSheet.create({
|
|
13
|
+
cardContainer: {},
|
|
14
|
+
cardFace: {
|
|
15
|
+
backgroundColor: '#444',
|
|
16
|
+
borderRadius: 10
|
|
17
|
+
},
|
|
18
|
+
cardMagneticStripe: {
|
|
19
|
+
position: 'absolute',
|
|
20
|
+
left: 0,
|
|
21
|
+
right: 0,
|
|
22
|
+
top: 30,
|
|
23
|
+
height: 40,
|
|
24
|
+
backgroundColor: '#000'
|
|
25
|
+
},
|
|
26
|
+
icon: {
|
|
27
|
+
position: 'absolute',
|
|
28
|
+
top: 15,
|
|
29
|
+
right: 15,
|
|
30
|
+
width: 60,
|
|
31
|
+
height: 40,
|
|
32
|
+
resizeMode: 'contain'
|
|
33
|
+
},
|
|
34
|
+
baseText: {
|
|
35
|
+
color: 'rgba(255, 255, 255, 0.5)',
|
|
36
|
+
backgroundColor: 'transparent'
|
|
37
|
+
},
|
|
38
|
+
placeholder: {
|
|
39
|
+
color: 'rgba(255, 255, 255, 0.5)'
|
|
40
|
+
},
|
|
41
|
+
focusedField: {
|
|
42
|
+
fontWeight: 'bold',
|
|
43
|
+
color: 'rgba(255, 255, 255, 1)'
|
|
44
|
+
},
|
|
45
|
+
number: {
|
|
46
|
+
fontSize: 21,
|
|
47
|
+
position: 'absolute',
|
|
48
|
+
top: 95,
|
|
49
|
+
left: 28
|
|
50
|
+
},
|
|
51
|
+
name: {
|
|
52
|
+
fontSize: 16,
|
|
53
|
+
position: 'absolute',
|
|
54
|
+
bottom: 20,
|
|
55
|
+
left: 25,
|
|
56
|
+
right: 100
|
|
57
|
+
},
|
|
58
|
+
expiryLabel: {
|
|
59
|
+
fontSize: 9,
|
|
60
|
+
position: 'absolute',
|
|
61
|
+
bottom: 40,
|
|
62
|
+
left: 218
|
|
63
|
+
},
|
|
64
|
+
expiry: {
|
|
65
|
+
fontSize: 16,
|
|
66
|
+
position: 'absolute',
|
|
67
|
+
bottom: 20,
|
|
68
|
+
left: 220
|
|
69
|
+
},
|
|
70
|
+
amexCVC: {
|
|
71
|
+
fontSize: 16,
|
|
72
|
+
position: 'absolute',
|
|
73
|
+
top: 73,
|
|
74
|
+
right: 30
|
|
75
|
+
},
|
|
76
|
+
cvc: {
|
|
77
|
+
fontSize: 16,
|
|
78
|
+
position: 'absolute',
|
|
79
|
+
top: 80,
|
|
80
|
+
right: 30
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
const CreditCardView = props => {
|
|
84
|
+
const {
|
|
85
|
+
focusedField,
|
|
86
|
+
type,
|
|
87
|
+
name,
|
|
88
|
+
number,
|
|
89
|
+
expiry,
|
|
90
|
+
cvc,
|
|
91
|
+
placeholders = {
|
|
92
|
+
number: '•••• •••• •••• ••••',
|
|
93
|
+
name: '',
|
|
94
|
+
expiry: '••/••',
|
|
95
|
+
cvc: '•••'
|
|
96
|
+
},
|
|
97
|
+
imageFront,
|
|
98
|
+
imageBack,
|
|
99
|
+
fontFamily = Platform.select({
|
|
100
|
+
ios: 'Courier',
|
|
101
|
+
android: 'monospace',
|
|
102
|
+
web: 'monospace'
|
|
103
|
+
}),
|
|
104
|
+
style
|
|
105
|
+
} = props;
|
|
106
|
+
const isAmex = type === 'american-express';
|
|
107
|
+
const shouldShowCardBack = !isAmex && focusedField === 'cvc';
|
|
108
|
+
const cardIcon = useMemo(() => {
|
|
109
|
+
if (type && Icons[type]) return Icons[type];
|
|
110
|
+
return null;
|
|
111
|
+
}, [type]);
|
|
112
|
+
return /*#__PURE__*/_jsx(View, {
|
|
113
|
+
style: [s.cardContainer, CARD_SIZE, style],
|
|
114
|
+
children: /*#__PURE__*/_jsxs(FlipCard, {
|
|
115
|
+
flipHorizontal: true,
|
|
116
|
+
flipVertical: false,
|
|
117
|
+
friction: 10,
|
|
118
|
+
perspective: 2000,
|
|
119
|
+
clickable: false,
|
|
120
|
+
flip: shouldShowCardBack,
|
|
121
|
+
children: [/*#__PURE__*/_jsxs(ImageBackground, {
|
|
122
|
+
style: [CARD_SIZE, s.cardFace],
|
|
123
|
+
source: imageFront,
|
|
124
|
+
children: [!!cardIcon && /*#__PURE__*/_jsx(Image, {
|
|
125
|
+
style: [s.icon],
|
|
126
|
+
source: {
|
|
127
|
+
uri: cardIcon
|
|
128
|
+
}
|
|
129
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
130
|
+
style: [s.baseText, {
|
|
131
|
+
fontFamily
|
|
132
|
+
}, s.number, !number && s.placeholder, focusedField === 'number' && s.focusedField],
|
|
133
|
+
children: !number ? placeholders.number : number
|
|
134
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
135
|
+
style: [s.baseText, {
|
|
136
|
+
fontFamily
|
|
137
|
+
}, s.name, !name && s.placeholder, focusedField === 'name' && s.focusedField],
|
|
138
|
+
numberOfLines: 1,
|
|
139
|
+
children: !name ? placeholders.name : name.toUpperCase()
|
|
140
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
141
|
+
style: [s.baseText, {
|
|
142
|
+
fontFamily
|
|
143
|
+
}, s.expiryLabel, s.placeholder, focusedField === 'expiry' && s.focusedField],
|
|
144
|
+
children: "MONTH/YEAR"
|
|
145
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
146
|
+
style: [s.baseText, {
|
|
147
|
+
fontFamily
|
|
148
|
+
}, s.expiry, !expiry && s.placeholder, focusedField === 'expiry' && s.focusedField],
|
|
149
|
+
children: !expiry ? placeholders.expiry : expiry
|
|
150
|
+
}), isAmex && /*#__PURE__*/_jsx(Text, {
|
|
151
|
+
style: [s.baseText, {
|
|
152
|
+
fontFamily
|
|
153
|
+
}, s.amexCVC, !cvc && s.placeholder, focusedField === 'cvc' && s.focusedField],
|
|
154
|
+
children: !cvc ? placeholders.cvc : cvc
|
|
155
|
+
})]
|
|
156
|
+
}), /*#__PURE__*/_jsxs(ImageBackground, {
|
|
157
|
+
style: [CARD_SIZE, s.cardFace],
|
|
158
|
+
source: imageBack,
|
|
159
|
+
children: [/*#__PURE__*/_jsx(View, {
|
|
160
|
+
style: s.cardMagneticStripe
|
|
161
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
162
|
+
style: [s.baseText, s.cvc, !cvc && s.placeholder, focusedField === 'cvc' && s.focusedField],
|
|
163
|
+
children: !cvc ? placeholders.cvc : cvc
|
|
164
|
+
})]
|
|
165
|
+
})]
|
|
166
|
+
})
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
export default CreditCardView;
|
|
170
|
+
//# sourceMappingURL=CreditCardView.js.map
|