Swiftgram/submodules/Stripe/Sources/STPPhoneNumberValidator.m
2019-08-12 23:42:50 +03:00

108 lines
4.1 KiB
Objective-C
Executable File

//
// STPPhoneNumberValidator.m
// Stripe
//
// Created by Jack Flintermann on 10/16/15.
// Copyright © 2015 Stripe, Inc. All rights reserved.
//
#import "STPPhoneNumberValidator.h"
#import "STPCardValidator.h"
#import "NSString+Stripe.h"
@implementation STPPhoneNumberValidator
+ (NSString *)countryCodeOrCurrentLocaleCountryFromString:(nullable NSString *)nillableCode {
NSString *countryCode = nillableCode;
if (!countryCode) {
countryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
}
return countryCode;
}
+ (BOOL)stringIsValidPartialPhoneNumber:(NSString *)string {
return [self stringIsValidPartialPhoneNumber:string forCountryCode:nil];
}
+ (BOOL)stringIsValidPhoneNumber:(NSString *)string {
return [self stringIsValidPhoneNumber:string forCountryCode:nil];
}
+ (BOOL)stringIsValidPartialPhoneNumber:(NSString *)string
forCountryCode:(nullable NSString *)nillableCode {
NSString *countryCode = [self countryCodeOrCurrentLocaleCountryFromString:nillableCode];
if ([countryCode isEqualToString:@"US"]) {
return [STPCardValidator sanitizedNumericStringForString:string].length <= 10;
}
else {
return YES;
}
}
+ (BOOL)stringIsValidPhoneNumber:(NSString *)string
forCountryCode:(nullable NSString *)nillableCode {
NSString *countryCode = [self countryCodeOrCurrentLocaleCountryFromString:nillableCode];
if ([countryCode isEqualToString:@"US"]) {
return [STPCardValidator sanitizedNumericStringForString:string].length == 10;
}
else {
return YES;
}
}
+ (NSString *)formattedSanitizedPhoneNumberForString:(NSString *)string {
return [self formattedSanitizedPhoneNumberForString:string
forCountryCode:nil];
}
+ (NSString *)formattedSanitizedPhoneNumberForString:(NSString *)string
forCountryCode:(nullable NSString *)nillableCode {
NSString *countryCode = [self countryCodeOrCurrentLocaleCountryFromString:nillableCode];
NSString *sanitized = [STPCardValidator sanitizedNumericStringForString:string];
return [self formattedPhoneNumberForString:sanitized
forCountryCode:countryCode];
}
+ (NSString *)formattedRedactedPhoneNumberForString:(NSString *)string {
return [self formattedRedactedPhoneNumberForString:string
forCountryCode:nil];
}
+ (NSString *)formattedRedactedPhoneNumberForString:(NSString *)string
forCountryCode:(nullable NSString *)nillableCode {
NSString *countryCode = [self countryCodeOrCurrentLocaleCountryFromString:nillableCode];
NSScanner *scanner = [NSScanner scannerWithString:string];
NSMutableString *prefix = [NSMutableString stringWithCapacity:string.length];
[scanner scanUpToString:@"*" intoString:&prefix];
NSString *number = [string stringByReplacingOccurrencesOfString:prefix withString:@""];
number = [number stringByReplacingOccurrencesOfString:@"*" withString:@""];
number = [self formattedPhoneNumberForString:number
forCountryCode:countryCode];
return [NSString stringWithFormat:@"%@ %@", prefix, number];
}
+ (NSString *)formattedPhoneNumberForString:(NSString *)string
forCountryCode:(NSString *)countryCode {
if (![countryCode isEqualToString:@"US"]) {
return string;
}
if (string.length >= 6) {
return [NSString stringWithFormat:@"(%@) %@-%@",
[string stp_safeSubstringToIndex:3],
[[string stp_safeSubstringToIndex:6] stp_safeSubstringFromIndex:3],
[[string stp_safeSubstringToIndex:10] stp_safeSubstringFromIndex:6]
];
} else if (string.length >= 3) {
return [NSString stringWithFormat:@"(%@) %@",
[string stp_safeSubstringToIndex:3],
[string stp_safeSubstringFromIndex:3]
];
}
return string;
}
@end