11open CardUtils
22open CardThemeType
3- open CardTheme
43open LoggerUtils
54open RecoilAtoms
65
@@ -9,6 +8,7 @@ let useCardForm = (~logger, ~paymentType) => {
98 let cardScheme = Recoil .useRecoilValueFromAtom (cardBrand )
109 let showPaymentMethodsScreen = Recoil .useRecoilValueFromAtom (showPaymentMethodsScreen )
1110 let selectedOption = Recoil .useRecoilValueFromAtom (selectedOptionAtom )
11+ let blockedBinsList = Recoil .useRecoilValueFromAtom (blockedBins )
1212 let paymentToken = Recoil .useRecoilValueFromAtom (paymentTokenAtom )
1313 let paymentMethodListValue = Recoil .useRecoilValueFromAtom (PaymentUtils .paymentMethodListValue )
1414 let paymentMethodListValueV2 = Recoil .useRecoilValueFromAtom (
@@ -112,12 +112,22 @@ let useCardForm = (~logger, ~paymentType) => {
112112 logInputChangeInfo ("cardNumber" , logger )
113113 let card = val -> formatCardNumber (cardType )
114114 let clearValue = card -> CardValidations .clearSpaces
115- setCardValid (clearValue , cardBrand , setIsCardValid )
115+
116+ // Check if card BIN is blocked
117+ let isCardBlocked = CardUtils .checkIfCardBinIsBlocked (clearValue , blockedBinsList )
118+ if isCardBlocked {
119+ setCardError (_ => localeString .blockedCardText )
120+ setIsCardValid (_ => Some (false ))
121+ } else {
122+ setCardValid (clearValue , cardBrand , setIsCardValid )
123+ }
124+
116125 if (
117126 focusCardValid (clearValue , cardBrand ) &&
118127 PaymentUtils .checkIsCardSupported (clearValue , cardBrand , supportedCardBrands )-> Option .getOr (
119128 false ,
120- )
129+ ) &&
130+ ! isCardBlocked
121131 ) {
122132 handleInputFocus (~currentRef = cardRef , ~destinationRef = expiryRef )
123133 }
@@ -254,20 +264,28 @@ let useCardForm = (~logger, ~paymentType) => {
254264 }
255265
256266 React .useEffect (() => {
267+ // Check if card is blocked first
268+ let isCardBlocked = CardUtils .checkIfCardBinIsBlocked (
269+ cardNumber -> CardValidations .clearSpaces ,
270+ blockedBinsList ,
271+ )
272+
257273 let cardError = switch (
258274 isCardSupported -> Option .getOr (true ),
259275 isCardValid -> Option .getOr (true ),
260276 cardNumber -> String .length == 0 ,
277+ isCardBlocked ,
261278 ) {
262- | (_ , _ , true ) => ""
263- | (true , true , _ ) => ""
264- | (true , _ , _ ) => localeString .inValidCardErrorText
265- | (_ , _ , _ ) => CardUtils .getCardBrandInvalidError (~cardBrand , ~localeString )
279+ | (_ , _ , _ , true ) => localeString .blockedCardText
280+ | (_ , _ , true , _ ) => ""
281+ | (true , true , _ , _ ) => ""
282+ | (true , _ , _ , _ ) => localeString .inValidCardErrorText
283+ | _ => CardUtils .getCardBrandInvalidError (~cardBrand , ~localeString )
266284 }
267285 let cardError = isCardValid -> Option .isSome ? cardError : ""
268286 setCardError (_ => cardError )
269287 None
270- }, [ isCardValid , isCardSupported ] )
288+ }, ( isCardValid , isCardSupported , cardNumber , blockedBinsList ) )
271289
272290 React .useEffect (() => {
273291 setCvcError (_ => isCVCValid -> Option .getOr (true ) ? "" : localeString .inCompleteCVCErrorText )
0 commit comments