Skip to content

Commit

Permalink
[hotfix] notify caller of intention to show dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
ibrahimlawal committed May 24, 2017
1 parent b901e0e commit ef53271
Show file tree
Hide file tree
Showing 8 changed files with 119 additions and 28 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
=== 3.0.3 2017-05-24

* Hotfix Ensure we notify caller when showing or dismissing our dialogs

=== 2.1.1 2016-12-08

* Hotfix Add TransactionParams to PaystackIOSStatic's headers
Expand Down
4 changes: 2 additions & 2 deletions Example/Paystack iOS Example/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>3.0.2</string>
<string>3.0.3</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>4</string>
<string>5</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
Expand Down
15 changes: 11 additions & 4 deletions Example/Paystack iOS Example/ViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class ViewController: UIViewController, PSTCKPaymentCardTextFieldDelegate {
let transactionParams = PSTCKTransactionParams.init();
transactionParams.access_code = newCode as String;
// use library to create charge and get its reference
PSTCKAPIClient.shared().chargeCard(self.cardDetailsForm.cardParams, forTransaction: transactionParams, on: self, didEndWithError: { (error, reference) -> Void in
PSTCKAPIClient.shared().chargeCard(self.cardDetailsForm.cardParams, forTransaction: transactionParams, on: self, didEndWithError: { (error, reference) in
self.outputOnLabel(str: "Charge errored")
// what should I do if an error occured?
print(error)
Expand All @@ -131,13 +131,20 @@ class ViewController: UIViewController, PSTCKPaymentCardTextFieldDelegate {
}
}
self.chargeCardButton.isEnabled = true;
}, didRequestValidation: { (reference) -> Void in
}, didRequestValidation: { (reference) in
self.outputOnLabel(str: "requested validation: " + reference)
}, didTransactionSuccess: { (reference) -> Void in
}, willPresentDialog: {
// make sure dialog can show
// if using a "processing" dialog, please hide it
self.outputOnLabel(str: "will show a dialog")
}, dismissedDialog: {
// if using a processing dialog, please make it visible again
self.outputOnLabel(str: "dismissed dialog")
}) { (reference) in
self.outputOnLabel(str: "succeeded: " + reference)
self.chargeCardButton.isEnabled = true;
self.verifyTransaction(reference: reference)
})
}
return
}

Expand Down
2 changes: 1 addition & 1 deletion Paystack.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'Paystack'
s.version = '3.0.2'
s.version = '3.0.3'
s.summary = 'Paystack is a web-based API helping African Businesses accept payments online.'
s.description = <<-DESC
Paystack makes it easy for African Businesses to accept Mastercard, Visa and Verve cards from anyone, anywhere in the world.
Expand Down
4 changes: 2 additions & 2 deletions Paystack/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>3.0.2</string>
<string>3.0.3</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>4</string>
<string>5</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
Expand Down
89 changes: 76 additions & 13 deletions Paystack/PSTCKAPIClient.m
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ @interface PSTCKAPIClient ()
@property(nonatomic, retain) PSTCKTransactionParams *transaction;
@property(nonatomic, copy) PSTCKErrorCompletionBlock errorCompletion;
@property(nonatomic, copy) PSTCKTransactionCompletionBlock beforeValidateCompletion;
@property(nonatomic, copy) PSTCKNotifyCompletionBlock showingDialogCompletion;
@property(nonatomic, copy) PSTCKNotifyCompletionBlock dialogDismissedCompletion;
@property(nonatomic, copy) PSTCKTransactionCompletionBlock successCompletion;
@property int INVALID_DATA_SENT_RETRIES;
@end
Expand Down Expand Up @@ -245,14 +247,13 @@ - (void)chargeCard:(nonnull PSTCKCardParams *)card
forTransaction:(nonnull PSTCKTransactionParams *)transaction
onViewController:(nonnull UIViewController *)viewController
didEndWithError:(nonnull PSTCKErrorCompletionBlock)errorCompletion
didRequestValidation:(nullable PSTCKTransactionCompletionBlock)beforeValidateCompletion
didTransactionSuccess:(nonnull PSTCKTransactionCompletionBlock)successCompletion {
NSCAssert(card != nil, @"'card' is required for a charge");
NSCAssert(errorCompletion != nil, @"'errorCompletion' is required to handle any errors encountered while charging");
NSCAssert(viewController != nil, @"'viewController' is required to show any alerts that may be needed");
NSCAssert(transaction != nil, @"'transaction' is required so we may know who to charge");
NSCAssert(successCompletion != nil, @"'successCompletion' is required so you can continue the process after charge succeeds. Remember to verify on server before giving value.");
[self startWithCard:card forTransaction:transaction onViewController:viewController didEndWithError:errorCompletion didRequestValidation:beforeValidateCompletion didTransactionSuccess:successCompletion];
[self startWithCard:card forTransaction:transaction onViewController:viewController didEndWithError:errorCompletion didTransactionSuccess:successCompletion];

if(PROCESSING){
[self didEndWithProcessingError];
Expand All @@ -268,17 +269,54 @@ - (void)chargeCard:(nonnull PSTCKCardParams *)card
[self makeChargeRequest:data atStage:PSTCKChargeStageNoHandle];
}

- (void)chargeCard:(nonnull PSTCKCardParams *)card
forTransaction:(nonnull PSTCKTransactionParams *)transaction
onViewController:(nonnull UIViewController *)viewController
didEndWithError:(nonnull PSTCKErrorCompletionBlock)errorCompletion
didRequestValidation:(nonnull PSTCKTransactionCompletionBlock)beforeValidateCompletion
willPresentDialog:(nonnull PSTCKNotifyCompletionBlock)showingDialogCompletion
dismissedDialog:(nonnull PSTCKNotifyCompletionBlock)dialogDismissedCompletion
didTransactionSuccess:(nonnull PSTCKTransactionCompletionBlock)successCompletion {
self.beforeValidateCompletion = beforeValidateCompletion;
self.showingDialogCompletion = showingDialogCompletion;
self.dialogDismissedCompletion = dialogDismissedCompletion;
[self chargeCard:card forTransaction:transaction onViewController:viewController didEndWithError:errorCompletion didTransactionSuccess:successCompletion];

}

- (void)chargeCard:(nonnull PSTCKCardParams *)card
forTransaction:(nonnull PSTCKTransactionParams *)transaction
onViewController:(nonnull UIViewController *)viewController
didEndWithError:(nonnull PSTCKErrorCompletionBlock)errorCompletion
willPresentDialog:(nonnull PSTCKNotifyCompletionBlock)showingDialogCompletion
dismissedDialog:(nonnull PSTCKNotifyCompletionBlock)dialogDismissedCompletion
didTransactionSuccess:(nonnull PSTCKTransactionCompletionBlock)successCompletion {
self.showingDialogCompletion = showingDialogCompletion;
self.dialogDismissedCompletion = dialogDismissedCompletion;
[self chargeCard:card forTransaction:transaction onViewController:viewController didEndWithError:errorCompletion didTransactionSuccess:successCompletion];

}

- (void)chargeCard:(nonnull PSTCKCardParams *)card
forTransaction:(nonnull PSTCKTransactionParams *)transaction
onViewController:(nonnull UIViewController *)viewController
didEndWithError:(nonnull PSTCKErrorCompletionBlock)errorCompletion
didRequestValidation:(nonnull PSTCKTransactionCompletionBlock)beforeValidateCompletion
didTransactionSuccess:(nonnull PSTCKTransactionCompletionBlock)successCompletion {
self.beforeValidateCompletion = beforeValidateCompletion;
[self chargeCard:card forTransaction:transaction onViewController:viewController didEndWithError:errorCompletion didTransactionSuccess:successCompletion];

}

- (void)startWithCard:(nonnull PSTCKCardParams *)card
forTransaction:(nonnull PSTCKTransactionParams *)transaction
onViewController:(nonnull UIViewController *)viewController
didEndWithError:(nonnull PSTCKErrorCompletionBlock)errorCompletion
didRequestValidation:(nullable PSTCKTransactionCompletionBlock)beforeValidateCompletion
didTransactionSuccess:(nonnull PSTCKTransactionCompletionBlock)successCompletion {
self.card = card;
self.transaction = transaction;
self.viewController = viewController;
self.errorCompletion = errorCompletion;
self.beforeValidateCompletion = beforeValidateCompletion;
self.successCompletion = successCompletion;
self.serverTransaction = [PSTCKServerTransaction new];

Expand Down Expand Up @@ -346,9 +384,7 @@ - (void) makeChargeRequest:(NSData *)data
}

- (void) requestPin{
[self.operationQueue addOperationWithBlock:^{
self.beforeValidateCompletion(self.serverTransaction.reference);
}];
[self notifyShowingDialog];
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Enter CARD PIN"
message:@"To confirm that you are the owner of this card please enter your card PIN"
preferredStyle:UIAlertControllerStyleAlert];
Expand All @@ -357,6 +393,7 @@ - (void) requestPin{
actionWithTitle:@"Continue" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
[action isEnabled]; // Just to avoid Unused error
[self notifyDialogDismissed];
NSString *provided = ((UITextField *)[alert.textFields objectAtIndex:0]).text;
NSString *handle = [PSTCKCardValidator sanitizedNumericStringForString:provided];
if(handle == nil ||
Expand Down Expand Up @@ -386,13 +423,13 @@ - (void) requestPin{
}

- (void) requestAuth:(NSString * _Nonnull) url{
[self.operationQueue addOperationWithBlock:^{
self.beforeValidateCompletion(self.serverTransaction.reference);
}];
[self notifyShowingDialog];
[self notifyBeforeValidate];
PSTCKAuthViewController* authorizer = [[[PSTCKAuthViewController alloc] init]
initWithURL:[NSURL URLWithString:url]
handler:^{
[self.viewController dismissViewControllerAnimated:YES completion:nil];
[self notifyDialogDismissed];
[self makeChargeRequest:nil
atStage:PSTCKChargeStageRequery];
}];
Expand All @@ -405,9 +442,8 @@ - (void) requestAuth:(NSString * _Nonnull) url{
}

- (void) requestOtp:(NSString * _Nonnull) otpmessage{
[self.operationQueue addOperationWithBlock:^{
self.beforeValidateCompletion(self.serverTransaction.reference);
}];
[self notifyShowingDialog];
[self notifyBeforeValidate];
UIAlertController* tkalert = [UIAlertController alertControllerWithTitle:@"Enter OTP"
message:otpmessage
preferredStyle:UIAlertControllerStyleAlert];
Expand All @@ -416,6 +452,7 @@ - (void) requestOtp:(NSString * _Nonnull) otpmessage{
actionWithTitle:@"Continue" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
[action isEnabled]; // Just to avoid Unused error
[self notifyDialogDismissed];
NSString *provided = ((UITextField *)[tkalert.textFields objectAtIndex:0]).text;
PSTCKValidationParams *validateParams = [PSTCKValidationParams alloc];
validateParams.trans = self.serverTransaction.id;
Expand Down Expand Up @@ -499,6 +536,32 @@ - (void)didEndSuccessfully{
}];
}

- (void)notifyShowingDialog{
if(self.showingDialogCompletion == NULL){
return;
}
[self.operationQueue addOperationWithBlock:^{
self.showingDialogCompletion();
}];
}
- (void)notifyDialogDismissed{
if(self.dialogDismissedCompletion == NULL){
return;
}
[self.operationQueue addOperationWithBlock:^{
self.dialogDismissedCompletion();
}];
}
- (void)notifyBeforeValidate{
if(self.beforeValidateCompletion == NULL){
return;
}
[self.operationQueue addOperationWithBlock:^{
self.beforeValidateCompletion(self.serverTransaction.reference);
}];
}


- (void)didEndWithErrorMessage:(NSString *)errorString{
NSDictionary *userInfo = @{
NSLocalizedDescriptionKey: PSTCKCardErrorProcessingErrorUserMessage,
Expand Down
27 changes: 22 additions & 5 deletions Paystack/PublicHeaders/PSTCKAPIClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
#import <UIKit/UIViewController.h>
#endif

static NSString *const __nonnull PSTCKSDKVersion = @"3.0.2";
static NSString *const __nonnull PSTCKSDKBuild = @"11";
static NSString *const __nonnull PSTCKSDKVersion = @"3.0.3";
static NSString *const __nonnull PSTCKSDKBuild = @"12";

@class PSTCKCard, PSTCKCardParams, PSTCKTransactionParams, PSTCKToken;

Expand All @@ -21,6 +21,7 @@ static NSString *const __nonnull PSTCKSDKBuild = @"11";
*/
typedef void (^PSTCKErrorCompletionBlock)(NSError * __nonnull error, NSString * __nullable reference);
typedef void (^PSTCKTransactionCompletionBlock)(NSString * __nonnull reference);
typedef void (^PSTCKNotifyCompletionBlock)();

/**
A top-level class that imports the rest of the Paystack SDK. This class used to contain several methods to create Paystack tokens, but those are now deprecated in
Expand Down Expand Up @@ -67,16 +68,32 @@ typedef void (^PSTCKTransactionCompletionBlock)(NSString * __nonnull reference);
@interface PSTCKAPIClient (CreditCards)

/**
* Converts an PSTCKCardParams object into a Paystack token using the Paystack API.
* Charges a PSTCKCardParams object using the Paystack API.
*
* @param card The user's card details. Cannot be nil. @see https://paystack.com/docs/api#create_card_token
* @param completion The callback to run with the returned Paystack token (and any errors that may have occurred).
*/
- (void) chargeCard:(nonnull PSTCKCardParams *)card
forTransaction:(nonnull PSTCKTransactionParams *)transaction
onViewController:(nonnull UIViewController *)viewController
didEndWithError:(nonnull PSTCKErrorCompletionBlock)errorCompletion
didRequestValidation:(nullable PSTCKTransactionCompletionBlock)beforeValidateCompletion
didRequestValidation:(nonnull PSTCKTransactionCompletionBlock)beforeValidateCompletion
didTransactionSuccess:(nonnull PSTCKTransactionCompletionBlock)successCompletion;

- (void) chargeCard:(nonnull PSTCKCardParams *)card
forTransaction:(nonnull PSTCKTransactionParams *)transaction
onViewController:(nonnull UIViewController *)viewController
didEndWithError:(nonnull PSTCKErrorCompletionBlock)errorCompletion
didRequestValidation:(nonnull PSTCKTransactionCompletionBlock)beforeValidateCompletion
willPresentDialog:(nonnull PSTCKNotifyCompletionBlock)showingDialogCompletion
dismissedDialog:(nonnull PSTCKNotifyCompletionBlock)dialogDismissedCompletion
didTransactionSuccess:(nonnull PSTCKTransactionCompletionBlock)successCompletion;

- (void) chargeCard:(nonnull PSTCKCardParams *)card
forTransaction:(nonnull PSTCKTransactionParams *)transaction
onViewController:(nonnull UIViewController *)viewController
didEndWithError:(nonnull PSTCKErrorCompletionBlock)errorCompletion
willPresentDialog:(nonnull PSTCKNotifyCompletionBlock)showingDialogCompletion
dismissedDialog:(nonnull PSTCKNotifyCompletionBlock)dialogDismissedCompletion
didTransactionSuccess:(nonnull PSTCKTransactionCompletionBlock)successCompletion;

@end
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.0.2
3.0.3

0 comments on commit ef53271

Please sign in to comment.