Swiftgram/submodules/Stripe/Sources/STPPaymentCardTextFieldViewModel.m
Ali 5bb8089449 Update card validation
(cherry picked from commit 5c71c08b6e9442b009ca3b71e784a1f8e2ebe4a1)
2023-02-07 23:25:39 +04:00

106 lines
4.4 KiB
Objective-C
Executable File

//
// STPPaymentCardTextFieldViewModel.m
// Stripe
//
// Created by Jack Flintermann on 7/21/15.
// Copyright (c) 2015 Stripe, Inc. All rights reserved.
//
#import "STPPaymentCardTextFieldViewModel.h"
#import "NSString+Stripe.h"
#define FAUXPAS_IGNORED_IN_METHOD(...)
@implementation STPPaymentCardTextFieldViewModel
- (void)setCardNumber:(NSString *)cardNumber {
NSString *sanitizedNumber = [STPCardValidator sanitizedNumericStringForString:cardNumber];
STPCardBrand brand = [STPCardValidator brandForNumber:sanitizedNumber];
NSInteger maxLength = [STPCardValidator maxLengthForCardBrand:brand];
_cardNumber = [sanitizedNumber stp_safeSubstringToIndex:maxLength];
}
// This might contain slashes.
- (void)setRawExpiration:(NSString *)expiration {
NSString *sanitizedExpiration = [STPCardValidator sanitizedNumericStringForString:expiration];
self.expirationMonth = [sanitizedExpiration stp_safeSubstringToIndex:2];
self.expirationYear = [[sanitizedExpiration stp_safeSubstringFromIndex:2] stp_safeSubstringToIndex:2];
}
- (NSString *)rawExpiration {
NSMutableArray *array = [@[] mutableCopy];
if (self.expirationMonth && ![self.expirationMonth isEqualToString:@""]) {
[array addObject:self.expirationMonth];
}
if ([STPCardValidator validationStateForExpirationMonth:self.expirationMonth] == STPCardValidationStateValid) {
[array addObject:self.expirationYear];
}
return [array componentsJoinedByString:@"/"];
}
- (void)setExpirationMonth:(NSString *)expirationMonth {
NSString *sanitizedExpiration = [STPCardValidator sanitizedNumericStringForString:expirationMonth];
if (sanitizedExpiration.length == 1 && ![sanitizedExpiration isEqualToString:@"0"] && ![sanitizedExpiration isEqualToString:@"1"]) {
sanitizedExpiration = [@"0" stringByAppendingString:sanitizedExpiration];
}
_expirationMonth = [sanitizedExpiration stp_safeSubstringToIndex:2];
}
- (void)setExpirationYear:(NSString *)expirationYear {
_expirationYear = [[STPCardValidator sanitizedNumericStringForString:expirationYear] stp_safeSubstringToIndex:2];
}
- (void)setCvc:(NSString *)cvc {
NSInteger maxLength = [STPCardValidator maxCVCLengthForCardBrand:self.brand];
_cvc = [[STPCardValidator sanitizedNumericStringForString:cvc] stp_safeSubstringToIndex:maxLength];
}
- (STPCardBrand)brand {
return [STPCardValidator brandForNumber:self.cardNumber];
}
- (STPCardValidationState)validationStateForField:(STPCardFieldType)fieldType {
switch (fieldType) {
case STPCardFieldTypeNumber:
return [STPCardValidator validationStateForNumber:self.cardNumber validatingCardBrand:YES];
break;
case STPCardFieldTypeExpiration: {
STPCardValidationState monthState = [STPCardValidator validationStateForExpirationMonth:self.expirationMonth];
STPCardValidationState yearState = [STPCardValidator validationStateForExpirationYear:self.expirationYear inMonth:self.expirationMonth cardBrand:[STPCardValidator brandForNumber:self.cardNumber]];
if (monthState == STPCardValidationStateValid && yearState == STPCardValidationStateValid) {
return STPCardValidationStateValid;
} else if (monthState == STPCardValidationStateInvalid || yearState == STPCardValidationStateInvalid) {
return STPCardValidationStateInvalid;
} else {
return STPCardValidationStateIncomplete;
}
break;
}
case STPCardFieldTypeCVC:
return [STPCardValidator validationStateForCVC:self.cvc cardBrand:self.brand];
}
}
- (BOOL)isValid {
return ([self validationStateForField:STPCardFieldTypeNumber] == STPCardValidationStateValid &&
[self validationStateForField:STPCardFieldTypeExpiration] == STPCardValidationStateValid &&
[self validationStateForField:STPCardFieldTypeCVC] == STPCardValidationStateValid);
}
- (NSString *)defaultPlaceholder {
return @"1234567812345678";
}
- (NSString *)numberWithoutLastDigits {
NSUInteger length = [STPCardValidator fragmentLengthForCardBrand:[STPCardValidator brandForNumber:self.cardNumber]];
NSUInteger toIndex = self.cardNumber.length - length;
return (toIndex < self.cardNumber.length) ?
[self.cardNumber substringToIndex:toIndex] :
[self.defaultPlaceholder stp_safeSubstringToIndex:[self defaultPlaceholder].length - length];
}
@end