-
Notifications
You must be signed in to change notification settings - Fork 128
Expand file tree
/
Copy pathCardSchemeComponent.res
More file actions
72 lines (63 loc) · 2.47 KB
/
Copy pathCardSchemeComponent.res
File metadata and controls
72 lines (63 loc) · 2.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
module CoBadgeCardSchemeDropDown = {
@react.component
let make = (~eligibleCardSchemes, ~setCardBrand) => {
let loggerState = Recoil.useRecoilValueFromAtom(RecoilAtoms.loggerAtom)
<select
className="w-4"
onClick={_ =>
loggerState.setLogInfo(~value="CardSchemeMenu expanded", ~eventName=CARD_SCHEME_SELECTION)}
onChange={ev => {
let target = ev->ReactEvent.Form.target
let value = target["value"]
setCardBrand(_ => value)
}}>
<option disabled=true> {"Select a card brand"->React.string} </option>
{eligibleCardSchemes
->Array.mapWithIndex((item, i) => {
<option key={Int.toString(i)} value=item> {item->React.string} </option>
})
->React.array}
</select>
}
}
@react.component
let make = (
~cardNumber,
~paymentType,
~cardBrand,
~setCardBrand,
~isCoBadgedCardDetectedOnce: React.ref<bool>,
) => {
let cardType = React.useMemo1(_ => cardBrand->CardUtils.getCardType, [cardBrand])
let animate = cardType == NOTFOUND ? "animate-slideLeft" : "animate-slideRight"
let cardBrandIcon = React.useMemo1(
_ => CardUtils.getCardBrandIcon(cardType, paymentType),
[cardBrand],
)
let paymentMethodListValue = Recoil.useRecoilValueFromAtom(PaymentUtils.paymentMethodListValue)
let enabledCardSchemes =
paymentMethodListValue->PaymentUtils.getSupportedCardBrands->Option.getOr([])
let matchedCardSchemes = cardNumber->CardValidations.clearSpaces->CardValidations.getAllMatchedCardSchemes
let eligibleCardSchemes = CardUtils.getEligibleCoBadgedCardSchemes(
~matchedCardSchemes,
~enabledCardSchemes,
)
let isCardCoBadged = eligibleCardSchemes->Array.length > 1
let marginLeft = isCardCoBadged ? "-ml-2" : ""
let loggerState = Recoil.useRecoilValueFromAtom(RecoilAtoms.loggerAtom)
let shouldShowCoBadgeCardSchemeDropDown =
isCardCoBadged && cardNumber->CardValidations.clearSpaces->String.length >= 16
React.useEffect1(() => {
if shouldShowCoBadgeCardSchemeDropDown && !isCoBadgedCardDetectedOnce.current {
isCoBadgedCardDetectedOnce.current = true
loggerState.setLogInfo(~value="Card detected as co-badged", ~eventName=CARD_SCHEME_SELECTION)
}
None
}, [shouldShowCoBadgeCardSchemeDropDown])
<div className={`${animate} flex items-center ${marginLeft} hellow-rodl`}>
cardBrandIcon
<RenderIf condition={shouldShowCoBadgeCardSchemeDropDown}>
<CoBadgeCardSchemeDropDown eligibleCardSchemes setCardBrand />
</RenderIf>
</div>
}