From 557bf7d3733f7f4ecb3f0eb824c8663b65c338b7 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 7 Jun 2024 17:40:15 -0500 Subject: [PATCH] bug to fix issue of the timing of the value being set Signed-off-by: Matt Bruce --- .../InputField/FieldTypes/CreditCard.swift | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/VDS/Components/TextFields/InputField/FieldTypes/CreditCard.swift b/VDS/Components/TextFields/InputField/FieldTypes/CreditCard.swift index b0e8a165..ed457446 100644 --- a/VDS/Components/TextFields/InputField/FieldTypes/CreditCard.swift +++ b/VDS/Components/TextFields/InputField/FieldTypes/CreditCard.swift @@ -216,9 +216,12 @@ extension InputField { return false } + // Set the value to the rawNumber, if you don't the onChange will trigger + value = rawNumber + // Set the formatted text textField.text = formattedNumber - + // Calculate the new cursor position if let newPosition = textField.cursorPosition(range: range, replacementString: string, @@ -227,9 +230,6 @@ extension InputField { textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition) } - // if all passes, then set the number1 - value = rawNumber - // Prevent the default behavior return false } @@ -252,11 +252,20 @@ extension InputField { internal func maskCreditCardNumber(_ cardType: CreditCardType, number: String) -> String { // Mask the first 12 characters if the length is 16 let rawNumber = number.filter { $0.isNumber } - guard rawNumber.count == cardType.maxLength else { return formatCreditCardNumber(cardType, number: number) } + let count = rawNumber.count + let min = cardType.minLength + let max = cardType.maxLength + var shouldFormat: Bool = false + if min == max { + shouldFormat = true + } else { + shouldFormat = count >= min && count <= max + } + guard shouldFormat else { return formatCreditCardNumber(cardType, number: number) } let lastFourDigits = rawNumber.suffix(4) let maskedSection = String(repeating: "•", count: number.count - lastFourDigits.count) - let formattedMaskSection = String.format(maskedSection, indices: cardType.separatorIndices(rawNumber.count), with: " ") - return formattedMaskSection + " " + lastFourDigits + let formattedMaskSection = String.format(maskedSection + lastFourDigits, indices: cardType.separatorIndices(rawNumber.count), with: " ") + return formattedMaskSection } } }