Skip to content

Commit 18571ee

Browse files
fix: country selection, card holder name util, dropdown options memoization
1 parent a9f7660 commit 18571ee

7 files changed

Lines changed: 28 additions & 32 deletions

File tree

src/Components/DynamicFields.res

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ let make = (
7878
)
7979
}, (paymentMethod, paymentMethodType, country, paymentMethodListValue))
8080

81-
let (_requiredFields, missingRequiredFields, initialValues) = React.useMemo(() => {
81+
let (_requiredFields, missingRequiredFields, superpositionInitialValues) = React.useMemo(() => {
8282
getSuperpositionFinalFields(
8383
eligibleConnectors,
8484
superpositionBaseContext,
@@ -90,6 +90,7 @@ let make = (
9090
superpositionBaseContext,
9191
requiredFieldsFromPMLFlat,
9292
))
93+
let initialValues = React.useMemo(() => superpositionInitialValues, [requiredFieldsFromPMLFlat])
9394

9495
let missingRequiredFieldsFiltered = React.useMemo(() => {
9596
let afterBillingFilter = removeBillingDetailsIfUseBillingAddress(
@@ -126,8 +127,6 @@ let make = (
126127
})
127128
}, (missingRequiredFields, billingAddress.isUseBillingAddress))
128129

129-
let billingPrefix = "payment_method_data.billing."
130-
131130
let dynamicFieldsOutsideBilling = React.useMemo(() => {
132131
missingRequiredFieldsFiltered->Array.filter(field =>
133132
!(field.confirmRequestWritePath->String.startsWith(billingPrefix)) ||
@@ -190,7 +189,7 @@ let make = (
190189

191190
ReactFinalForm.useFormStateHandler(
192191
~onFormChange=values => {
193-
// Flatten the nested form values so keys align correctly during merge using `mergeAndFlattenToTuples`.
192+
// RFF stores values as nested objects; flatten to dot-notation keys so they align with the confirm-payload merge.
194193
let flatValues = values->JSON.Encode.object->Utils.flattenObject(false)
195194
setRequiredFieldsBody(_ => flatValues)
196195
},

src/Components/DynamicFields/CardHolderNameField.res

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
open SuperpositionTypes
22

3-
// "John Doe" -> ("John", "Doe") "John" -> ("John", "")
4-
let splitName = (value: string): (string, string) =>
5-
switch value->String.indexOf(" ") {
6-
| -1 => (value, "")
7-
| i => (value->String.substring(~start=0, ~end=i), value->String.substringToEnd(~start=i + 1))
8-
}
9-
103
module FullNameFieldInput = {
114
@react.component
125
let make = (~firstNameFieldConfig: fieldConfig, ~lastNameFieldConfig: fieldConfig) => {
@@ -46,7 +39,7 @@ module FullNameFieldInput = {
4639
let handleChange = event => {
4740
let value: string = ReactEvent.Form.target(event)["value"]
4841
setName(_ => value)
49-
let (firstName, lastName) = splitName(value)
42+
let (firstName, lastName) = Utils.splitFullName(value)
5043
firstProps.input.onChange(firstName)
5144
lastProps.input.onChange(lastName)
5245
}

src/Components/DynamicFields/CountryDropdownField.res

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ let make = (~fieldConfig: fieldConfig, ~options: array<DropdownField.optionType>
1010
let firstCountryName = options->Array.get(0)->Option.map(opt => opt.value)->Option.getOr("")
1111
let defaultCountryName = countryName !== "" ? countryName : firstCountryName
1212
let defaultIso = Utils.getCountryCode(defaultCountryName).isoAlpha2
13+
let defaultIsoRef = React.useRef(defaultIso)
1314

1415
let field = ReactFinalForm.useField(
1516
fieldConfig.confirmRequestWritePath,
16-
~config={validate, defaultValue: Some(defaultIso)},
17+
~config={validate, defaultValue: Some(defaultIsoRef.current)},
1718
)
1819

1920
let storedIso = field.input.value->Option.getOr("")

src/Components/DynamicFields/PhoneCountryCodeDropdownField.res

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@ let make = (~fieldConfig: fieldConfig) => {
99
let {label} = DynamicFieldsUtils.resolveFieldTexts(~field=fieldConfig, ~localeObject=localeString)
1010
let validate = DynamicFieldsUtils.resolveValidator(~field=fieldConfig, ~localeObject=localeString)
1111

12-
let countryAndCodeList =
12+
let countryAndCodeList = React.useMemo0(() =>
1313
phoneNumberJson
14-
->JSON.Decode.object
15-
->Option.getOr(Dict.make())
14+
->getDictFromJson
1615
->getArray("countries")
16+
)
1717

18-
let phoneNumberCodeOptions: array<DropdownField.optionType> = countryAndCodeList->Array.reduce(
19-
[],
20-
(acc, countryObj) => {
18+
let phoneNumberCodeOptions: array<DropdownField.optionType> = React.useMemo0(() =>
19+
countryAndCodeList->Array.reduce([], (acc, countryObj) => {
2120
let countryDict = countryObj->getDictFromJson
2221
let flag = countryDict->getString("country_flag", "")
2322
let code = countryDict->getString("phone_number_code", "")
@@ -29,7 +28,7 @@ let make = (~fieldConfig: fieldConfig) => {
2928
}
3029
acc->Array.push(opt)
3130
acc
32-
},
31+
})
3332
)
3433

3534
let defaultCountry = Recoil.useRecoilValueFromAtom(RecoilAtoms.userCountry)

src/Components/DynamicFields/StateDropdownField.res

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ let make = (~fieldConfig: fieldConfig) => {
3232
stateField.input.onChange(effectiveCode)
3333
}
3434
None
35-
}, [effectiveCode])
35+
}, (hasStates, storedCode, effectiveCode))
3636

3737
<RenderIf condition={hasStates}>
3838
<DropdownField

src/Utilities/DynamicFieldsUtils.res

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ type fieldTexts = {
33
placeholder: string,
44
}
55

6+
let billingPrefix = "payment_method_data.billing."
7+
68
let lookupLocaleKey = (key: string, locale: LocaleStringTypes.localeStrings): option<string> =>
79
switch key {
810
| "cardNumberLabel" => Some(locale.cardNumberLabel)
@@ -259,7 +261,7 @@ let resolveValidator = (
259261
~field: SuperpositionTypes.fieldConfig,
260262
~localeObject: LocaleStringTypes.localeStrings,
261263
) => {
262-
let requiredRule = field.isRequired ? [Validation.Required] : []
264+
let requiredRule = field.isRequired ? [Validation.Required(None)] : []
263265

264266
let semanticRule = switch field.validationRuleType {
265267
| Some("phone") => [Validation.Phone]
@@ -281,7 +283,7 @@ let resolveValidator = (
281283

282284
let maxLengthRule = [Validation.MaxLength(field.maxInputLength->Option.getOr(255))]
283285

284-
let rules = Array.concat(Array.concat(requiredRule, semanticRule), maxLengthRule)
286+
let rules = [...requiredRule, ...semanticRule, ...maxLengthRule]
285287

286288
Validation.createFieldValidator(
287289
rules,
@@ -311,7 +313,7 @@ let removeBillingDetailsIfUseBillingAddress = (
311313
) => {
312314
if billingAddress.isUseBillingAddress {
313315
missingRequiredFields->Array.filter(requiredField => {
314-
!(requiredField.confirmRequestWritePath->String.startsWith("payment_method_data.billing."))
316+
!(requiredField.confirmRequestWritePath->String.startsWith(billingPrefix))
315317
})
316318
} else {
317319
missingRequiredFields

src/Utilities/Utils.res

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,17 +1761,19 @@ let checkIs18OrAbove = dateOfBirth => {
17611761
dateOfBirth <= compareDate
17621762
}
17631763

1764-
let getFirstAndLastNameFromFullName = fullName => {
1764+
let splitFullName = fullName => {
17651765
let nameStrings = fullName->String.split(" ")
1766-
let firstName =
1767-
nameStrings
1768-
->Array.get(0)
1769-
->Option.flatMap(x => Some(x->JSON.Encode.string))
1770-
->Option.getOr(JSON.Encode.null)
1771-
let lastNameStr = nameStrings->Array.sliceToEnd(~start=1)->Array.join(" ")->String.trim
1766+
let firstName = nameStrings->Array.get(0)->Option.getOr("")
1767+
let lastName = nameStrings->Array.sliceToEnd(~start=1)->Array.join(" ")->String.trim
1768+
(firstName, lastName)
1769+
}
1770+
1771+
let getFirstAndLastNameFromFullName = fullName => {
1772+
let (firstNameStr, lastNameStr) = fullName->splitFullName
1773+
let firstNameJson = firstNameStr->JSON.Encode.string
17721774
let lastNameJson = lastNameStr === "" ? JSON.Encode.null : lastNameStr->JSON.Encode.string
17731775

1774-
(firstName, lastNameJson)
1776+
(firstNameJson, lastNameJson)
17751777
}
17761778

17771779
let isKeyPresentInDict = (dict, key) => dict->Dict.get(key)->Option.isSome

0 commit comments

Comments
 (0)