updated cc cardType logic

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-05-09 11:39:09 -05:00
parent 7965d4056f
commit 4519c7af15

View File

@ -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 {