@@ -137,6 +137,7 @@ function PaymentCardForm({
137
137
138
138
const [ isCurrencyModalVisible , setIsCurrencyModalVisible ] = useState ( false ) ;
139
139
const [ currency , setCurrency ] = useState < keyof typeof CONST . CURRENCY > ( CONST . CURRENCY . USD ) ;
140
+ const [ cardNumber , setCardNumber ] = useState ( '' ) ;
140
141
141
142
const validate = ( values : FormOnyxValues < typeof ONYXKEYS . FORMS . ADD_DEBIT_CARD_FORM > ) : FormInputErrors < typeof ONYXKEYS . FORMS . ADD_DEBIT_CARD_FORM > => {
142
143
const errors = ValidationUtils . getFieldRequiredErrors ( values , REQUIRED_FIELDS ) ;
@@ -181,6 +182,23 @@ function PaymentCardForm({
181
182
setIsCurrencyModalVisible ( false ) ;
182
183
} , [ ] ) ;
183
184
185
+ const onChangeCardNumber = useCallback ( ( newValue : string ) => {
186
+ // replace all characters that are not spaces or digits
187
+ let validCardNumber = newValue . replace ( / [ ^ \d ] / g, '' ) ;
188
+
189
+ // gets only the first 16 digits if the inputted number have more digits than that
190
+ validCardNumber = validCardNumber . match ( / (?: \d * ) { 1 , 16 } / ) ?. [ 0 ] ?? '' ;
191
+
192
+ // add the spacing between every 4 digits
193
+ validCardNumber =
194
+ validCardNumber
195
+ . replace ( / / g, '' )
196
+ . match ( / .{ 1 , 4 } / g)
197
+ ?. join ( ' ' ) ?? '' ;
198
+
199
+ setCardNumber ( validCardNumber ) ;
200
+ } , [ ] ) ;
201
+
184
202
if ( ! shouldShowPaymentCardForm ) {
185
203
return null ;
186
204
}
@@ -204,6 +222,8 @@ function PaymentCardForm({
204
222
role = { CONST . ROLE . PRESENTATION }
205
223
ref = { cardNumberRef }
206
224
inputMode = { CONST . INPUT_MODE . NUMERIC }
225
+ onChangeText = { onChangeCardNumber }
226
+ value = { cardNumber }
207
227
/>
208
228
< InputWrapper
209
229
InputComponent = { TextInput }
0 commit comments