@@ -4,97 +4,92 @@ import { __ } from '@wordpress/i18n';
44import { getSetting } from '@woocommerce/settings' ;
55import MaskedInput from './MaskedInput' ;
66import InstallmentsOptions from './InstallmentsOptions' ;
7+ const { useSelect } = window . wp . data ;
8+ const { checkoutStore } = window . wc . wcBlocksData ;
79const PaymentInstructions = ( ) => {
810 const settings = getSetting ( 'rm-pagbank-cc_data' , { } ) ;
911 const defaultInstallments = settings . defaultInstallments || [ ] ;
10- const [ creditCardNumber , setCreditCardNumber ] = useState ( '' ) ;
12+ const [ creditCardNumber , setCreditCardNumber ] = useState ( '555566 ' ) ;
1113 const [ ccBin , setCcBin ] = useState ( '' ) ;
1214 const [ cardBrand , setCardBrand ] = useState ( '' ) ;
1315 const prevCcBinRef = useRef ( ) ;
1416 const [ installments , setInstallments ] = useState ( defaultInstallments ) ;
1517 window . ps_cc_installments = installments ;
1618
17- useEffect ( ( ) => {
18- prevCcBinRef . current = ccBin ;
19- } , [ ccBin ] ) ;
20-
21- const prevCcBin = prevCcBinRef . current ;
22-
23- useEffect ( ( ) => {
24- // Detect card brand
25- const detectCardBrand = ( number ) => {
26- const visaRegex = / ^ 4 [ 0 - 9 ] { 0 , } $ / ;
27- const mastercardRegex = / ^ (?: 5 [ 1 - 5 ] [ 0 - 9 ] { 2 } | 2 2 2 [ 1 - 9 ] | 2 2 [ 3 - 9 ] [ 0 - 9 ] | 2 [ 3 - 6 ] [ 0 - 9 ] { 2 } | 2 7 [ 0 1 ] [ 0 - 9 ] | 2 7 2 0 ) [ 0 - 9 ] { 12 } $ / ;
28- const amexRegex = / ^ 3 ( [ 4 7 ] \d * ) ? $ / ;
29- const dinersRegex = / ^ ( 3 ( 0 [ 0 - 5 ] | 0 9 5 | 6 | [ 8 - 9 ] ) ) \d * $ / ;
30- const jcbRegex = / ^ (?: 2 1 3 1 | 1 8 0 0 | 3 5 \d { 3 } ) \d { 0 , } $ / ;
31- const auraRegex = / ^ 5 0 7 8 \d * $ / ;
32- const hiperRegex = / ^ ( ( 6 0 6 2 8 2 ) | ( 6 3 7 0 9 5 ) | ( 6 3 7 5 6 8 ) | ( 6 3 7 5 9 9 ) | ( 6 3 7 6 0 9 ) | ( 6 3 7 6 1 2 ) ) \d * $ / ;
33- const eloRegex = new RegExp (
34- '^((451416)|(509091)|(636368)|(636297)|(504175)|(438935)|(40117[8-9])|(45763[1-2])|' +
35- '(457393)|(431274)|(50990[0-2])|(5099[7-9][0-9])|(50996[4-9])|(509[1-8][0-9][0-9])|' +
36- '(5090(0[0-2]|0[4-9]|1[2-9]|[24589][0-9]|3[1-9]|6[0-46-9]|7[0-24-9]))|' +
37- '(5067(0[0-24-8]|1[0-24-9]|2[014-9]|3[0-379]|4[0-9]|5[0-3]|6[0-5]|7[0-8]))|' +
38- '(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))|' +
39- '(6504(8[5-9]|9[0-9])|6505(0[0-9]|1[0-9]|2[0-9]|3[0-8]))|' +
40- '(6505(4[1-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))|' +
41- '(6507(0[0-9]|1[0-8]))|(65072[0-7])|(6509(0[1-9]|1[0-9]|20))|' +
42- '(6516(5[2-9]|6[0-9]|7[0-9]))|(6550(0[0-9]|1[0-9]))|' +
43- '(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8])))\\d*$'
44- ) ;
45-
46- if ( mastercardRegex . test ( number ) ) return 'mastercard' ;
47- if ( amexRegex . test ( number ) ) return 'amex' ;
48- if ( dinersRegex . test ( number ) ) return 'diners' ;
49- if ( jcbRegex . test ( number ) ) return 'jcb' ;
50- if ( auraRegex . test ( number ) ) return 'aura' ;
51- if ( hiperRegex . test ( number ) ) return 'hipercard' ;
52- if ( eloRegex . test ( number ) ) return 'elo' ;
53- if ( visaRegex . test ( number ) ) return 'visa' ;
54-
55- return '' ;
56- } ;
57-
58- setCardBrand ( detectCardBrand ( creditCardNumber . replace ( / \D / g, '' ) ) ) ;
59-
60- if ( settings . isCartRecurring === true ) {
61- return ;
62- }
63-
64- if ( creditCardNumber . replace ( / \D / g, '' ) . length < 6 ) {
65- return ;
66- }
67-
68- let ccBinNew = creditCardNumber . replace ( / \D / g, '' ) . substring ( 0 , 6 ) ;
69- if ( ccBinNew === prevCcBin ) {
70- return ;
71- }
72-
73- setCcBin ( ccBinNew ) ;
74-
75- let url = settings . ajax_url ;
76-
77- jQuery . ajax ( {
78- url : url ,
79- method : 'POST' ,
80- data : {
81- cc_bin : ccBinNew ,
82- nonce : settings . rm_pagbank_nonce ,
83- action : 'ps_get_installments' ,
84- } ,
85- success : ( response ) => {
86- window . ps_cc_installments = response ;
87- setInstallments ( response ) ;
88- } ,
89- error : ( response ) => {
90- alert ( 'Erro ao calcular parcelas. Verifique os dados do cartão e tente novamente.' ) ;
91- console . info ( 'Lojista: Verifique os logs em WooCommerce > Status > Logs ' +
92- 'para ver os possíveis problemas na obtenção das parcelas. Note que cartões de teste falharão ' +
93- 'na maioria dos casos.' ) ;
94- }
95- } ) ;
96-
97- } , [ creditCardNumber ] ) ;
19+ const isCalculating = useSelect ( ( select ) => select ( checkoutStore ) . isCalculating ( ) ) ;
20+ const detectCardBrand = ( number ) => {
21+ const visaRegex = / ^ 4 [ 0 - 9 ] { 0 , } $ / ;
22+ const mastercardRegex = / ^ (?: 5 [ 1 - 5 ] [ 0 - 9 ] { 2 } | 2 2 2 [ 1 - 9 ] | 2 2 [ 3 - 9 ] [ 0 - 9 ] | 2 [ 3 - 6 ] [ 0 - 9 ] { 2 } | 2 7 [ 0 1 ] [ 0 - 9 ] | 2 7 2 0 ) [ 0 - 9 ] { 12 } $ / ;
23+ const amexRegex = / ^ 3 ( [ 4 7 ] \d * ) ? $ / ;
24+ const dinersRegex = / ^ ( 3 ( 0 [ 0 - 5 ] | 0 9 5 | 6 | [ 8 - 9 ] ) ) \d * $ / ;
25+ const jcbRegex = / ^ (?: 2 1 3 1 | 1 8 0 0 | 3 5 \d { 3 } ) \d { 0 , } $ / ;
26+ const auraRegex = / ^ 5 0 7 8 \d * $ / ;
27+ const hiperRegex = / ^ ( ( 6 0 6 2 8 2 ) | ( 6 3 7 0 9 5 ) | ( 6 3 7 5 6 8 ) | ( 6 3 7 5 9 9 ) | ( 6 3 7 6 0 9 ) | ( 6 3 7 6 1 2 ) ) \d * $ / ;
28+ const eloRegex = new RegExp (
29+ '^((451416)|(509091)|(636368)|(636297)|(504175)|(438935)|(40117[8-9])|(45763[1-2])|' +
30+ '(457393)|(431274)|(50990[0-2])|(5099[7-9][0-9])|(50996[4-9])|(509[1-8][0-9][0-9])|' +
31+ '(5090(0[0-2]|0[4-9]|1[2-9]|[24589][0-9]|3[1-9]|6[0-46-9]|7[0-24-9]))|' +
32+ '(5067(0[0-24-8]|1[0-24-9]|2[014-9]|3[0-379]|4[0-9]|5[0-3]|6[0-5]|7[0-8]))|' +
33+ '(6504(0[5-9]|1[0-9]|2[0-9]|3[0-9]))|' +
34+ '(6504(8[5-9]|9[0-9])|6505(0[0-9]|1[0-9]|2[0-9]|3[0-8]))|' +
35+ '(6505(4[1-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-8]))|' +
36+ '(6507(0[0-9]|1[0-8]))|(65072[0-7])|(6509(0[1-9]|1[0-9]|20))|' +
37+ '(6516(5[2-9]|6[0-9]|7[0-9]))|(6550(0[0-9]|1[0-9]))|' +
38+ '(6550(2[1-9]|3[0-9]|4[0-9]|5[0-8])))\\d*$'
39+ ) ;
40+
41+ if ( mastercardRegex . test ( number ) ) return 'mastercard' ;
42+ if ( amexRegex . test ( number ) ) return 'amex' ;
43+ if ( dinersRegex . test ( number ) ) return 'diners' ;
44+ if ( jcbRegex . test ( number ) ) return 'jcb' ;
45+ if ( auraRegex . test ( number ) ) return 'aura' ;
46+ if ( hiperRegex . test ( number ) ) return 'hipercard' ;
47+ if ( eloRegex . test ( number ) ) return 'elo' ;
48+ if ( visaRegex . test ( number ) ) return 'visa' ;
49+ return '' ;
50+ } ;
51+
52+ const fetchInstallments = ( bin , force = false ) => {
53+ if ( bin . length < 6 || ( prevCcBinRef . current === bin && ! force ) ) return ;
54+
55+ if ( settings . isCartRecurring === true ) return ;
56+
57+ prevCcBinRef . current = bin ;
58+
59+ jQuery . ajax ( {
60+ url : settings . ajax_url ,
61+ method : 'POST' ,
62+ data : {
63+ cc_bin : bin ,
64+ nonce : settings . rm_pagbank_nonce ,
65+ action : 'ps_get_installments' ,
66+ } ,
67+ success : ( response ) => {
68+ window . ps_cc_installments = response ;
69+ setInstallments ( response ) ;
70+ } ,
71+ error : ( ) => {
72+ alert ( 'Erro ao calcular parcelas. Verifique os dados do cartão e tente novamente.' ) ;
73+ console . info ( 'WooCommerce > Status > Logs para mais detalhes.' ) ;
74+ }
75+ } ) ;
76+ } ;
77+
78+ // When the credit card number changes
79+ useEffect ( ( ) => {
80+ const digits = creditCardNumber . replace ( / \D / g, '' ) ;
81+ if ( digits . length >= 6 ) {
82+ setCardBrand ( detectCardBrand ( digits ) ) ;
83+ setCcBin ( digits . substring ( 0 , 6 ) ) ;
84+ }
85+ } , [ creditCardNumber ] ) ;
86+
87+ // When the bin changes or total recalculates
88+ useEffect ( ( ) => {
89+ if ( ! isCalculating && ccBin ) {
90+ fetchInstallments ( ccBin , true ) ;
91+ }
92+ } , [ ccBin , isCalculating ] ) ;
9893
9994 return (
10095 < div >
0 commit comments