Skip to content

Commit

Permalink
feat: retrieveSetupIntent (#309)
Browse files Browse the repository at this point in the history
  • Loading branch information
thorsten-stripe committed Jun 4, 2021
1 parent b3bf228 commit 89042f4
Show file tree
Hide file tree
Showing 11 changed files with 122 additions and 4 deletions.
5 changes: 4 additions & 1 deletion android/src/main/java/com/reactnativestripesdk/Errors.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ enum class CreateTokenErrorType {
Failed
}


enum class NextPaymentActionErrorType {
Failed, Canceled, Unknown
}
Expand All @@ -30,6 +29,10 @@ enum class RetrievePaymentIntentErrorType {
Unknown
}

enum class RetrieveSetupIntentErrorType {
Unknown
}

enum class PaymentSheetErrorType {
Failed, Canceled
}
Expand Down
18 changes: 18 additions & 0 deletions android/src/main/java/com/reactnativestripesdk/Mappers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,19 @@ internal fun mapFromPaymentIntentLastErrorType(errorType: PaymentIntent.Error.Ty
}
}

internal fun mapFromSetupIntentLastErrorType(errorType: SetupIntent.Error.Type?): String? {
return when (errorType) {
SetupIntent.Error.Type.ApiConnectionError -> "api_connection_error"
SetupIntent.Error.Type.AuthenticationError -> "authentication_error"
SetupIntent.Error.Type.ApiError -> "api_error"
SetupIntent.Error.Type.CardError -> "card_error"
SetupIntent.Error.Type.IdempotencyError -> "idempotency_error"
SetupIntent.Error.Type.InvalidRequestError -> "invalid_request_error"
SetupIntent.Error.Type.RateLimitError -> "rate_limit_error"
else -> null
}
}

fun getValOr(map: ReadableMap, key: String, default: String? = ""): String? {
return if (map.hasKey(key)) map.getString(key) else default
}
Expand Down Expand Up @@ -648,6 +661,11 @@ internal fun mapFromSetupIntentResult(setupIntent: SetupIntent): WritableMap {
val setupError: WritableMap = WritableNativeMap()
setupError.putString("code", it.code)
setupError.putString("message", it.message)
setupError.putString("type", mapFromSetupIntentLastErrorType(it.type))

setupIntent.lastSetupError?.paymentMethod?.let { paymentMethod ->
setupError.putMap("paymentMethod", mapFromPaymentMethod(paymentMethod))
}

map.putMap("lastSetupError", setupError)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,19 @@ class StripeSdkModule(reactContext: ReactApplicationContext, cardFieldManager: S
paymentIntent?.let {
promise.resolve(createResult("paymentIntent", mapFromPaymentIntentResult(it)))
} ?: run {
promise.resolve(createError(RetrievePaymentIntentErrorType.Unknown.toString(), "Retrieving payment intent failed"))
promise.resolve(createError(RetrievePaymentIntentErrorType.Unknown.toString(), "Failed to retrieve the PaymentIntent"))
}
}
}

@ReactMethod
fun retrieveSetupIntent(clientSecret: String, promise: Promise) {
AsyncTask.execute {
val setupIntent = stripe.retrieveSetupIntentSynchronous(clientSecret)
setupIntent?.let {
promise.resolve(createResult("setupIntent", mapFromSetupIntentResult(it)))
} ?: run {
promise.resolve(createError(RetrieveSetupIntentErrorType.Unknown.toString(), "Failed to retrieve the SetupIntent"))
}
}
}
Expand Down
4 changes: 4 additions & 0 deletions ios/Errors.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ enum RetrievePaymentIntentErrorType: String {
case Unknown
}

enum RetrieveSetupIntentErrorType: String {
case Unknown
}

enum PaymentSheetErrorType: String {
case Failed, Canceled
}
Expand Down
6 changes: 6 additions & 0 deletions ios/StripeSdk.m
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ @interface RCT_EXTERN_MODULE(StripeSdk, RCTEventEmitter)
rejecter: (RCTPromiseRejectBlock)reject
)

RCT_EXTERN_METHOD(
retrieveSetupIntent:(NSString *)clientSecret
resolver: (RCTPromiseResolveBlock)resolve
rejecter: (RCTPromiseRejectBlock)reject
)

RCT_EXTERN_METHOD(
handleCardAction:(NSString *)paymentIntentClientSecret
resolver: (RCTPromiseResolveBlock)resolve
Expand Down
27 changes: 26 additions & 1 deletion ios/StripeSdk.swift
Original file line number Diff line number Diff line change
Expand Up @@ -633,7 +633,32 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
if let paymentIntent = paymentIntent {
resolve(Mappers.createResult("paymentIntent", Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)))
} else {
resolve(Errors.createError(RetrievePaymentIntentErrorType.Unknown.rawValue, "Cannot retrieve PaymentIntent"))
resolve(Errors.createError(RetrievePaymentIntentErrorType.Unknown.rawValue, "Failed to retrieve the PaymentIntent"))
}
}
}

@objc(retrieveSetupIntent:resolver:rejecter:)
func retrieveSetupIntent(
clientSecret: String,
resolver resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock
) -> Void {
STPAPIClient.shared.retrieveSetupIntent(withClientSecret: clientSecret) { (setupIntent, error) in
guard error == nil else {
if let lastSetupError = setupIntent?.lastSetupError {
resolve(Errors.createError(RetrieveSetupIntentErrorType.Unknown.rawValue, lastSetupError))
} else {
resolve(Errors.createError(RetrieveSetupIntentErrorType.Unknown.rawValue, error?.localizedDescription))
}

return
}

if let setupIntent = setupIntent {
resolve(Mappers.createResult("setupIntent", Mappers.mapFromSetupIntent(setupIntent: setupIntent)))
} else {
resolve(Errors.createError(RetrieveSetupIntentErrorType.Unknown.rawValue, "Failed to retrieve the SetupIntent"))
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/NativeStripeSdk.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type {
InitialiseParams,
CreatePaymentMethodResult,
RetrievePaymentIntentResult,
RetrieveSetupIntentResult,
ConfirmPaymentMethodResult,
HandleCardActionResult,
ConfirmSetupIntentResult,
Expand Down Expand Up @@ -50,6 +51,7 @@ type NativeStripeSdkType = {
retrievePaymentIntent(
clientSecret: string
): Promise<RetrievePaymentIntentResult>;
retrieveSetupIntent(clientSecret: string): Promise<RetrieveSetupIntentResult>;
initPaymentSheet(
params: PaymentSheet.SetupParams
): Promise<InitPaymentSheetResult>;
Expand Down
23 changes: 23 additions & 0 deletions src/functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
PaymentSheet,
PresentPaymentSheetResult,
RetrievePaymentIntentResult,
RetrieveSetupIntentResult,
StripeError,
} from './types';
import type { Card } from './types/Card';
Expand Down Expand Up @@ -86,6 +87,28 @@ export const retrievePaymentIntent = async (
}
};

export const retrieveSetupIntent = async (
clientSecret: string
): Promise<RetrieveSetupIntentResult> => {
try {
const { setupIntent, error } = await NativeStripeSdk.retrieveSetupIntent(
clientSecret
);
if (error) {
return {
error,
};
}
return {
setupIntent: setupIntent!,
};
} catch (error) {
return {
error,
};
}
};

export const confirmPaymentMethod = async (
paymentIntentClientSecret: string,
data: PaymentMethodCreateParams.Params,
Expand Down
10 changes: 10 additions & 0 deletions src/hooks/useStripe.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import type {
PaymentSheet,
CreatePaymentMethodResult,
RetrievePaymentIntentResult,
RetrieveSetupIntentResult,
ConfirmPaymentMethodResult,
HandleCardActionResult,
ConfirmSetupIntentResult,
Expand All @@ -25,6 +26,7 @@ import {
confirmPaymentMethod,
createPaymentMethod,
retrievePaymentIntent,
retrieveSetupIntent,
confirmApplePayPayment,
confirmSetupIntent,
createTokenForCVCUpdate,
Expand Down Expand Up @@ -78,6 +80,13 @@ export function useStripe() {
[]
);

const _retrieveSetupIntent = useCallback(
async (clientSecret: string): Promise<RetrieveSetupIntentResult> => {
return retrieveSetupIntent(clientSecret);
},
[]
);

const _confirmPaymentMethod = useCallback(
async (
paymentIntentClientSecret: string,
Expand Down Expand Up @@ -176,6 +185,7 @@ export function useStripe() {

return {
retrievePaymentIntent: _retrievePaymentIntent,
retrieveSetupIntent: _retrieveSetupIntent,
confirmPayment: _confirmPaymentMethod,
createPaymentMethod: _createPaymentMethod,
handleCardAction: _handleCardAction,
Expand Down
6 changes: 5 additions & 1 deletion src/types/Errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ export enum CreateTokenError {
}

export enum RetrievePaymentIntentError {
Canceled = 'Canceled',
Unknown = 'Unknown',
}

export enum RetrieveSetupIntentError {
Unknown = 'Unknown',
}

export enum ApplePayError {
Expand Down
11 changes: 11 additions & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import type {
CreateTokenError,
PaymentSheetError,
RetrievePaymentIntentError,
RetrieveSetupIntentError,
StripeError,
} from './Errors';
import type { PaymentIntent } from './PaymentIntents';
Expand Down Expand Up @@ -67,6 +68,16 @@ export type RetrievePaymentIntentResult =
error: StripeError<RetrievePaymentIntentError>;
};

export type RetrieveSetupIntentResult =
| {
setupIntent: SetupIntent;
error?: undefined;
}
| {
setupIntent?: undefined;
error: StripeError<RetrieveSetupIntentError>;
};

export type ConfirmPaymentMethodResult =
| {
paymentIntent: PaymentIntent;
Expand Down

0 comments on commit 89042f4

Please sign in to comment.