BTTokenizationService.m 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #import "BTTokenizationService.h"
  2. NSString * const BTTokenizationServiceErrorDomain = @"com.braintreepayments.BTTokenizationServiceErrorDomain";
  3. NSString * const BTTokenizationServiceViewPresentingDelegateOption = @"viewControllerPresentingDelegate";
  4. NSString * const BTTokenizationServiceAppSwitchDelegateOption = @"BTTokenizationServiceAppSwitchDelegateOption";
  5. NSString * const BTTokenizationServicePayPalScopesOption = @"BTPaymentRequest.additionalPayPalScopes";
  6. NSString * const BTTokenizationServiceAmountOption = @"BTTokenizationServiceAmountOption";
  7. NSString * const BTTokenizationServiceNonceOption = @"BTTokenizationServiceNonceOption";
  8. @interface BTTokenizationService ()
  9. /// Dictionary of tokenization blocks keyed by types as strings. The blocks have the following type:
  10. ///
  11. /// `void (^)(BTAPIClient * _Nonnull, NSDictionary * _Nullable, void (^ _Nonnull)(BTPaymentMethodNonce * _Nullable, NSError * _Nullable))`
  12. @property (nonatomic, strong) NSMutableDictionary *tokenizationBlocks;
  13. @end
  14. @implementation BTTokenizationService
  15. + (instancetype)sharedService {
  16. static BTTokenizationService *sharedService;
  17. static dispatch_once_t onceToken;
  18. dispatch_once(&onceToken, ^{
  19. sharedService = [[BTTokenizationService alloc] init];
  20. });
  21. return sharedService;
  22. }
  23. - (NSMutableDictionary *)tokenizationBlocks {
  24. if (!_tokenizationBlocks) {
  25. _tokenizationBlocks = [NSMutableDictionary dictionary];
  26. }
  27. return _tokenizationBlocks;
  28. }
  29. - (void)registerType:(NSString *)type withTokenizationBlock:(void (^)(BTAPIClient * _Nonnull, NSDictionary * _Nullable, void (^ _Nonnull)(BTPaymentMethodNonce * _Nullable, NSError * _Nullable)))tokenizationBlock
  30. {
  31. self.tokenizationBlocks[type] = [tokenizationBlock copy];
  32. }
  33. - (BOOL)isTypeAvailable:(NSString *)type {
  34. return self.tokenizationBlocks[type] != nil;
  35. }
  36. - (NSArray *)allTypes {
  37. return [self.tokenizationBlocks allKeys];
  38. }
  39. - (void)tokenizeType:(NSString *)type
  40. withAPIClient:(BTAPIClient *)apiClient
  41. completion:(void (^)(BTPaymentMethodNonce * _Nullable, NSError * _Nullable))completion
  42. {
  43. [self tokenizeType:type options:nil withAPIClient:apiClient completion:completion];
  44. }
  45. - (void)tokenizeType:(NSString *)type
  46. options:(NSDictionary<NSString *,id> *)options
  47. withAPIClient:(BTAPIClient *)apiClient
  48. completion:(void (^)(BTPaymentMethodNonce * _Nullable, NSError * _Nullable))completion
  49. {
  50. void(^block)(BTAPIClient *, NSDictionary *, void(^)(BTPaymentMethodNonce *, NSError *)) = self.tokenizationBlocks[type];
  51. if (block) {
  52. block(apiClient, options ?: @{}, completion);
  53. } else {
  54. NSError *error = [NSError errorWithDomain:BTTokenizationServiceErrorDomain
  55. code:BTTokenizationServiceErrorTypeNotRegistered
  56. userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"%@ processing not available", type],
  57. NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"Type '%@' is not registered with BTTokenizationService", type],
  58. NSLocalizedRecoverySuggestionErrorKey: [NSString stringWithFormat:@"Please link Braintree%@.framework to your app", type]
  59. }];
  60. completion(nil, error);
  61. }
  62. }
  63. @end