From 4519c7af15527e95038ab385f8d7c95847a02231 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 9 May 2024 11:39:09 -0500 Subject: [PATCH] updated cc cardType logic Signed-off-by: Matt Bruce --- .../InputField/FieldTypes/CreditCard.swift | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/VDS/Components/TextFields/InputField/FieldTypes/CreditCard.swift b/VDS/Components/TextFields/InputField/FieldTypes/CreditCard.swift index 42441574..aac95a6a 100644 --- a/VDS/Components/TextFields/InputField/FieldTypes/CreditCard.swift +++ b/VDS/Components/TextFields/InputField/FieldTypes/CreditCard.swift @@ -52,26 +52,33 @@ extension InputField { } } - static func from(iin: Int) -> CreditCardType? { - switch iin { - case 4000...4999: + static func from(cardNumber: String) -> CreditCardType { + let clean = cardNumber.filter { $0.isNumber } + let firstNum = Int(clean.prefix(1)) ?? 0 + let twoChar = Int(clean.prefix(2)) ?? 0 + let threeChar = Int(clean.prefix(3)) ?? 0 + let fourChar = Int(clean.prefix(4)) ?? 0 + let sixChar = Int(clean.prefix(6)) ?? 0 + + if firstNum == 4 { return .visa - case 5100...5599, 2221...2720: - return .mastercard - case 3400...3499, 3700...3799: + } else if twoChar == 34 || twoChar == 37 { return .amex - case 6011, 6221...6229, 6440...6499, 6500...6599: - return .discover - case 3600...3699, 3800...3999: - return .dinersClub - case 3528...3589: - return .jcb - case 6200...6299, 6000...6010, 8100...8199: + } else if (twoChar == 62 && !(sixChar >= 622126 && sixChar <= 622925)) || twoChar == 81 || (twoChar == 60 && fourChar != 6011) { return .unionPay - default: - return nil + } else if (threeChar > 299 && threeChar <= 305) || threeChar == 309 || twoChar == 36 || twoChar == 38 || twoChar == 39 { + return .dinersClub + } else if fourChar == 6011 || (sixChar >= 622126 && sixChar <= 622925) || (threeChar >= 644 && threeChar <= 649) || twoChar == 65 { + return .discover + } else if fourChar >= 3528 && fourChar <= 3589 { + return .jcb + } else if (twoChar >= 51 && twoChar <= 55) || (sixChar >= 222100 && sixChar <= 272099) { + return .mastercard + } else { + return .generic } } + } class CreditCardHandler: FieldTypeHandler { @@ -171,13 +178,13 @@ extension InputField { defer { inputField.setNeedsUpdate() } guard rawNumber.count >= 4, - let firstFourDigits = Int(String(rawNumber.prefix(4))), - let creditCardType = CreditCardType.from(iin: firstFourDigits) else { + let firstFourDigits = Int(String(rawNumber.prefix(4))) + else { inputField.cardType = .generic return } - inputField.cardType = creditCardType + inputField.cardType = CreditCardType.from(cardNumber: rawNumber) } internal func maskCreditCardNumber(_ cardType: CreditCardType, number: String) -> String {