Skip to content

Commit a022568

Browse files
committed
fix: resolved conflicts
2 parents 83deb77 + 38a04c9 commit a022568

37 files changed

+225
-20
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "orca-payment-page",
3-
"version": "0.125.0",
3+
"version": "0.126.0",
44
"main": "index.js",
55
"private": true,
66
"dependencies": {

public/icons/orca.svg

Lines changed: 15 additions & 4 deletions
Loading

src/CardUtils.res

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,3 +749,26 @@ let emitIsFormReadyForSubmission = isFormReadyForSubmission =>
749749
Utils.messageParentWindow([
750750
("isFormReadyForSubmission", isFormReadyForSubmission->JSON.Encode.bool),
751751
])
752+
753+
let checkIfCardBinIsBlocked = (cardNumber, blockedBinsList) => {
754+
open PaymentType
755+
switch blockedBinsList {
756+
| Loading // If still loading, allow payment to proceed
757+
| LoadError(_) // If error loading, allow payment to proceed
758+
| SemiLoaded => false // If semi-loaded, allow payment to proceed
759+
| Loaded(data) => {
760+
let cardBin = cardNumber->CardValidations.clearSpaces->String.substring(~start=0, ~end=6)
761+
if cardBin->String.length >= 6 {
762+
// The response is directly an array of blocked bins
763+
let blockedBins = data->JSON.Decode.array->Option.getOr([])
764+
blockedBins->Array.some(item => {
765+
let binData = item->Utils.getDictFromJson
766+
let fingerprintId = binData->Utils.getString("fingerprint_id", "")
767+
fingerprintId === cardBin
768+
})
769+
} else {
770+
false // If card number is too short, don't block
771+
}
772+
}
773+
}
774+
}

src/Hooks/CommonCardProps.res

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
open CardUtils
22
open CardThemeType
3-
open CardTheme
43
open LoggerUtils
54
open 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)

src/LoaderController.res

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ let make = (~children, ~paymentMode, ~setIntegrateErrorError, ~logger, ~initTime
88
let (keys, setKeys) = Recoil.useRecoilState(keys)
99
let (paymentMethodList, setPaymentMethodList) = Recoil.useRecoilState(paymentMethodList)
1010
let (_, setSessions) = Recoil.useRecoilState(sessions)
11+
let setBlockedBins = Recoil.useSetRecoilState(blockedBins)
1112
let (options, setOptions) = Recoil.useRecoilState(elementOptions)
1213
let (optionsPayment, setOptionsPayment) = Recoil.useRecoilState(optionAtom)
1314
let setPaymentManagementList = Recoil.useSetRecoilState(paymentManagementList)
@@ -647,6 +648,10 @@ let make = (~children, ~paymentMode, ~setIntegrateErrorError, ~logger, ~initTime
647648
if dict->Dict.get("applePaySessionObjNotPresent")->Option.isSome {
648649
setIsApplePayReady(prev => prev && false)
649650
}
651+
if dict->getDictIsSome("blockedBins") {
652+
let blockedBins = dict->getJsonObjectFromDict("blockedBins")
653+
setBlockedBins(_ => Loaded(blockedBins))
654+
}
650655
} catch {
651656
| _ => setIntegrateErrorError(_ => true)
652657
}

src/LocaleStrings/ArabicLocale.res

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ let localeStrings: LocaleStringTypes.localeStrings = {
8989
cardExpiredText: `انتهت صلاحية هذه البطاقة`,
9090
cardHeader: `معلومات البطاقة`,
9191
cardBrandConfiguredErrorText: str => `${str} غير مدعوم في الوقت الحالي.`,
92+
blockedCardText: "هذه البطاقة غير مسموحة للمدفوعات.",
9293
currencyNetwork: `شبكات العملات`,
9394
expiryPlaceholder: `MM / YY`,
9495
dateOfBirth: `تاريخ الميلاد`,
@@ -173,6 +174,7 @@ let localeStrings: LocaleStringTypes.localeStrings = {
173174
payment_methods_duit_now: `DuitNow`,
174175
payment_methods_revolut_pay: `ريفولت باي`,
175176
payment_methods_affirm: `أفيرم`,
177+
payment_methods_pay_safe_card: `PaysafeCard`,
176178
payment_methods_crypto_currency: `العملات الرقمية`,
177179
payment_methods_card: `بطاقة`,
178180
payment_methods_klarna: `كلارنا`,

src/LocaleStrings/CatalanLocale.res

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ let localeStrings: LocaleStringTypes.localeStrings = {
8989
cardExpiredText: `Aquesta targeta ha caducat`,
9090
cardHeader: `Informació de la targeta`,
9191
cardBrandConfiguredErrorText: str => `${str} no està suportat en aquest moment.`,
92+
blockedCardText: "Aquesta targeta no està permesa per a pagaments.",
9293
currencyNetwork: `Xarxes de Monedes`,
9394
expiryPlaceholder: `MM / AA`,
9495
dateOfBirth: `Data de naixement`,
@@ -172,6 +173,7 @@ let localeStrings: LocaleStringTypes.localeStrings = {
172173
payment_methods_duit_now: `DuitNow`,
173174
payment_methods_revolut_pay: `Revolut Pay`,
174175
payment_methods_affirm: `Affirm`,
176+
payment_methods_pay_safe_card: `PaysafeCard`,
175177
payment_methods_crypto_currency: `Crypto`,
176178
payment_methods_card: `Carte`,
177179
payment_methods_klarna: `Klarna`,

src/LocaleStrings/ChineseLocale.res

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ let localeStrings: LocaleStringTypes.localeStrings = {
8989
cardExpiredText: `此卡已过期`,
9090
cardHeader: `卡片信息`,
9191
cardBrandConfiguredErrorText: str => `${str} 目前不支持。`,
92+
blockedCardText: "此卡不允许用于付款。",
9293
currencyNetwork: `货币网络`,
9394
expiryPlaceholder: `MM / YY`,
9495
dateOfBirth: `出生日期`,
@@ -170,6 +171,7 @@ let localeStrings: LocaleStringTypes.localeStrings = {
170171
payment_methods_duit_now: `DuitNow`,
171172
payment_methods_revolut_pay: `Revolut Pay`,
172173
payment_methods_affirm: `Affirm`,
174+
payment_methods_pay_safe_card: `PaysafeCard`,
173175
payment_methods_crypto_currency: `加密货币`,
174176
payment_methods_card: `卡`,
175177
payment_methods_klarna: `Klarna`,

src/LocaleStrings/DeutschLocale.res

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ let localeStrings: LocaleStringTypes.localeStrings = {
8989
cardExpiredText: `Diese Karte ist abgelaufen`,
9090
cardHeader: `Kartendaten`,
9191
cardBrandConfiguredErrorText: str => `${str} wird derzeit nicht unterstützt.`,
92+
blockedCardText: "Diese Karte ist für Zahlungen nicht zugelassen.",
9293
currencyNetwork: `Währungsnetzwerke`,
9394
expiryPlaceholder: `MM / JJ`,
9495
dateOfBirth: `Geburtsdatum`,
@@ -171,6 +172,7 @@ let localeStrings: LocaleStringTypes.localeStrings = {
171172
payment_methods_duit_now: `DuitNow`,
172173
payment_methods_revolut_pay: `Revolut Pay`,
173174
payment_methods_affirm: `Affirm`,
175+
payment_methods_pay_safe_card: `PaysafeCard`,
174176
payment_methods_crypto_currency: `Krypto`,
175177
payment_methods_card: `Karte`,
176178
payment_methods_klarna: `Klarna`,

0 commit comments

Comments
 (0)