From e71e4ebb6147238f1b032f7b2bfff09abbef64bf Mon Sep 17 00:00:00 2001 From: Ian Lin Date: Mon, 13 Nov 2023 19:06:00 +0800 Subject: [PATCH] update codes. --- .../com/stripeterminalreactnative/Mappers.kt | 10 +++- .../ReactNativeConstants.kt | 6 +-- .../StripeTerminalReactNativeModule.kt | 41 ++++++++------- .../listener/RNOfflineListener.kt | 8 +-- ios/StripeTerminalReactNative.swift | 50 +++++++------------ src/components/StripeTerminalProvider.tsx | 18 +++---- src/functions.ts | 3 +- src/hooks/useStripeTerminal.tsx | 12 ++--- src/types/index.ts | 19 ++++++- 9 files changed, 92 insertions(+), 75 deletions(-) diff --git a/android/src/main/java/com/stripeterminalreactnative/Mappers.kt b/android/src/main/java/com/stripeterminalreactnative/Mappers.kt index 0ea733c0..dfb210eb 100644 --- a/android/src/main/java/com/stripeterminalreactnative/Mappers.kt +++ b/android/src/main/java/com/stripeterminalreactnative/Mappers.kt @@ -4,8 +4,6 @@ import com.facebook.react.bridge.ReadableArray import com.facebook.react.bridge.ReadableMap import com.facebook.react.bridge.WritableArray import com.facebook.react.bridge.WritableMap -import com.stripe.stripeterminal.external.InternalApi -import com.stripe.stripeterminal.external.OfflineMode import com.stripe.stripeterminal.external.models.Address import com.stripe.stripeterminal.external.models.CardDetails import com.stripe.stripeterminal.external.models.CardPresentDetails @@ -503,5 +501,13 @@ internal fun mapFromNetworkStatus(status: NetworkStatus): String { fun mapFromOfflineStatus(offlineStatus: OfflineStatus): ReadableMap = nativeMapOf { putString("networkStatus", mapFromNetworkStatus(offlineStatus.sdk.networkStatus)) + putInt("offlinePaymentsCount", offlineStatus.sdk.offlinePaymentsCount) + + val map = nativeMapOf { + offlineStatus.sdk.offlinePaymentAmountsByCurrency.forEach { + putInt(it.key, it.value.toInt()) + } + } + putMap("offlinePaymentAmountsByCurrency", map) } diff --git a/android/src/main/java/com/stripeterminalreactnative/ReactNativeConstants.kt b/android/src/main/java/com/stripeterminalreactnative/ReactNativeConstants.kt index 8ec26cee..80e2de30 100644 --- a/android/src/main/java/com/stripeterminalreactnative/ReactNativeConstants.kt +++ b/android/src/main/java/com/stripeterminalreactnative/ReactNativeConstants.kt @@ -16,7 +16,7 @@ enum class ReactNativeConstants(val listenerName: String) { START_READER_RECONNECT("didStartReaderReconnect"), READER_RECONNECT_SUCCEED("didSucceedReaderReconnect"), READER_RECONNECT_FAIL("didFailReaderReconnect"), - OFFLINE_STATUS_CHANGE("didChangeOfflineStatus"), - PAYMENT_INTENT_FORWARDED("didForwardPaymentIntent"), - FORWARDING_FAILURE("didReportForwardingError"), + CHANGE_OFFLINE_STATUS("didChangeOfflineStatus"), + FORWARD_PAYMENT_INTENT("didForwardPaymentIntent"), + REPORT_FORWARDING_ERROR("didReportForwardingError"), } diff --git a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt index 79c22578..7a79adaf 100644 --- a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt +++ b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt @@ -331,8 +331,6 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : val requestedPriority = paymentMethodOptions?.getString("requestedPriority") val captureMethod = params.getString("captureMethod") val offlineBehavior = params.getString("offlineBehavior") - val offlineModeTransactionLimit = params.getInt("offlineModeTransactionLimit") ?: 0 - val offlineModeStoredTransactionLimit = params.getInt("offlineModeStoredTransactionLimit") ?: 0 val paymentMethodTypes = paymentMethods?.toArrayList()?.mapNotNull { if (it is String) PaymentMethodType.valueOf(it.uppercase()) @@ -407,16 +405,12 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : } } - val offlineBehaviorParam = if (amount > offlineModeTransactionLimit - || (terminal.offlineStatus.sdk.offlinePaymentAmountsByCurrency[currency]?.toInt() ?: 0) > offlineModeStoredTransactionLimit - ) { OfflineBehavior.REQUIRE_ONLINE } else { - offlineBehavior.let { - when (it) { - "prefer_online" -> OfflineBehavior.PREFER_ONLINE - "require_online" -> OfflineBehavior.REQUIRE_ONLINE - "force_offline" -> OfflineBehavior.FORCE_OFFLINE - else -> OfflineBehavior.PREFER_ONLINE - } + val offlineBehaviorParam = offlineBehavior.let { + when (it) { + "prefer_online" -> OfflineBehavior.PREFER_ONLINE + "require_online" -> OfflineBehavior.REQUIRE_ONLINE + "force_offline" -> OfflineBehavior.FORCE_OFFLINE + else -> OfflineBehavior.PREFER_ONLINE } } @@ -697,11 +691,24 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : } @OptIn(OfflineMode::class) - fun getOfflineStatus(): ReadableMap = nativeMapOf { - val mutableMap = terminal.offlineStatus.sdk.offlinePaymentAmountsByCurrency.toMutableMap() - val sdkMap = mutableMapOf("offlinePaymentsCount" to terminal.offlineStatus.sdk.offlinePaymentsCount, - "offlinePaymentAmountsByCurrency" to mutableMap) - putString("sdk", sdkMap.toString()) + fun getOfflineStatus(promise: Promise) { + promise.resolve( + nativeMapOf { + var mutableMap = terminal.offlineStatus.sdk.offlinePaymentAmountsByCurrency.toMutableMap() + val sdkMap = mutableMapOf( + "offlinePaymentsCount" to terminal.offlineStatus.sdk.offlinePaymentsCount, + "offlinePaymentAmountsByCurrency" to mutableMap + ) + putString("sdk", sdkMap.toString()) + + mutableMap = terminal.offlineStatus.reader?.offlinePaymentAmountsByCurrency?.toMutableMap()!! + val readerMap = mutableMapOf( + "offlinePaymentsCount" to terminal.offlineStatus.sdk.offlinePaymentsCount, + "offlinePaymentAmountsByCurrency" to mutableMap + ) + putString("reader", readerMap.toString()) + } + ) } private fun cancelOperation( diff --git a/android/src/main/java/com/stripeterminalreactnative/listener/RNOfflineListener.kt b/android/src/main/java/com/stripeterminalreactnative/listener/RNOfflineListener.kt index 080f524d..a2f475fd 100644 --- a/android/src/main/java/com/stripeterminalreactnative/listener/RNOfflineListener.kt +++ b/android/src/main/java/com/stripeterminalreactnative/listener/RNOfflineListener.kt @@ -17,19 +17,19 @@ class RNOfflineListener( private val context: ReactApplicationContext, ): OfflineListener { override fun onOfflineStatusChange(offlineStatus: OfflineStatus) { - context.sendEvent(ReactNativeConstants.OFFLINE_STATUS_CHANGE.listenerName) { - putMap("result" ,mapFromOfflineStatus(offlineStatus)) + context.sendEvent(ReactNativeConstants.CHANGE_OFFLINE_STATUS.listenerName) { + putMap("result", mapFromOfflineStatus(offlineStatus)) } } override fun onPaymentIntentForwarded(paymentIntent: PaymentIntent, e: TerminalException?) { - context.sendEvent(ReactNativeConstants.PAYMENT_INTENT_FORWARDED.listenerName) { + context.sendEvent(ReactNativeConstants.FORWARD_PAYMENT_INTENT.listenerName) { putMap("result", mapFromPaymentIntent(paymentIntent, "")) } } override fun onForwardingFailure(e: TerminalException) { - context.sendEvent(ReactNativeConstants.FORWARDING_FAILURE.listenerName) { + context.sendEvent(ReactNativeConstants.REPORT_FORWARDING_ERROR.listenerName) { putMap("result", createError(e)) } } diff --git a/ios/StripeTerminalReactNative.swift b/ios/StripeTerminalReactNative.swift index 503c70c2..b7efb042 100644 --- a/ios/StripeTerminalReactNative.swift +++ b/ios/StripeTerminalReactNative.swift @@ -17,9 +17,9 @@ enum ReactNativeConstants: String, CaseIterable { case START_READER_RECONNECT = "didStartReaderReconnect" case READER_RECONNECT_SUCCEED = "didSucceedReaderReconnect" case READER_RECONNECT_FAIL = "didFailReaderReconnect" - case OFFLINE_STATUS_CHANGE = "didOfflineStatusChange" - case PAYMENT_INTENT_FORWARDED = "didPaymentIntentForwarded" - case FORWARDING_FAILURE = "didReportForwardingError" + case CHANGE_OFFLINE_STATUS = "didChangeOfflineStatus" + case FORWARD_PAYMENT_INTENT = "didForwardPaymentIntent" + case REPORT_FORWARDING_ERROR = "didReportForwardingError" } @objc(StripeTerminalReactNative) @@ -52,7 +52,6 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe var readReusableCardCancelable: Cancelable? = nil var cancelReaderConnectionCancellable: Cancelable? = nil var loggingToken: String? = nil - var terminal: Terminal? = nil func terminal(_ terminal: Terminal, didUpdateDiscoveredReaders readers: [Reader]) { discoveredReadersList = readers @@ -343,7 +342,6 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe resolve(Errors.createError(nsError: error)) } else { self.paymentIntents = [:] - self.terminal = nil resolve([:]) } } @@ -428,23 +426,12 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe } let offlineBehavior = params["offlineBehavior"] as? String - let offlineModeTransactionLimit = params["offlineModeTransactionLimit"] as? NSNumber ?? 0 - let offlineModeStoredTransactionLimit = params["offlineModeStoredTransactionLimit"] as? NSNumber ?? 0 - - var isOverOfflineTransactionLimit = amount.intValue >= offlineModeTransactionLimit.intValue - if let offlinePaymentTotalByCurrency = Terminal.shared.offlineStatus.sdk.paymentAmountsByCurrency[paymentParams.currency]?.intValue { - isOverOfflineTransactionLimit = isOverOfflineTransactionLimit || (offlinePaymentTotalByCurrency >= offlineModeStoredTransactionLimit.intValue) - } let offlineBehaviorFromTransactionLimit: OfflineBehavior = { - if isOverOfflineTransactionLimit { - return .requireOnline - } else { - switch offlineBehavior { - case "prefer_online": return OfflineBehavior.preferOnline - case "require_online": return OfflineBehavior.requireOnline - case "force_offline": return OfflineBehavior.forceOffline - default: return OfflineBehavior.preferOnline - } + switch offlineBehavior { + case "prefer_online": return OfflineBehavior.preferOnline + case "require_online": return OfflineBehavior.requireOnline + case "force_offline": return OfflineBehavior.forceOffline + default: return OfflineBehavior.preferOnline } }() @@ -999,31 +986,32 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe } func terminal(_ terminal: Terminal, didChange offlineStatus: OfflineStatus) { - self.terminal = terminal let offlineStatus = Mappers.mapFromOfflineStatus(offlineStatus) - sendEvent(withName: ReactNativeConstants.OFFLINE_STATUS_CHANGE.rawValue, body: ["result": offlineStatus]) + sendEvent(withName: ReactNativeConstants.CHANGE_OFFLINE_STATUS.rawValue, body: ["result": offlineStatus]) } func terminal(_ terminal: Terminal, didForwardPaymentIntent intent: PaymentIntent, error: Error?) { - self.terminal = terminal let result = Mappers.mapFromPaymentIntent(intent, uuid: "") - sendEvent(withName: ReactNativeConstants.PAYMENT_INTENT_FORWARDED.rawValue, body: ["result": result]) + sendEvent(withName: ReactNativeConstants.FORWARD_PAYMENT_INTENT.rawValue, body: ["result": result]) } func terminal(_ terminal: Terminal, didReportForwardingError error: Error) { - self.terminal = terminal let result = Errors.createError(nsError: error as NSError) - sendEvent(withName: ReactNativeConstants.FORWARDING_FAILURE.rawValue, body: ["result": result]) + sendEvent(withName: ReactNativeConstants.REPORT_FORWARDING_ERROR.rawValue, body: ["result": result]) } @objc(getOfflineStatus:rejecter:) func getOfflineStatus(resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { - let offlinePaymentAmountsByCurrencyDic = self.terminal?.offlineStatus.sdk.paymentAmountsByCurrency let sdkDic: NSDictionary = [ - "offlinePaymentsCount": self.terminal?.offlineStatus.sdk.paymentsCount, - "offlinePaymentAmountsByCurrency": offlinePaymentAmountsByCurrencyDic + "offlinePaymentsCount": Terminal.shared.offlineStatus.sdk.paymentsCount, + "offlinePaymentAmountsByCurrency": Terminal.shared.offlineStatus.sdk.paymentAmountsByCurrency + ] + + let readDic: NSDictionary = [ + "offlinePaymentsCount": Terminal.shared.offlineStatus.reader?.paymentsCount, + "offlinePaymentAmountsByCurrency": Terminal.shared.offlineStatus.reader?.paymentAmountsByCurrency ] - resolve(["sdk": sdkDic]) + resolve(["sdk": sdkDic, "reader": readDic]) } } diff --git a/src/components/StripeTerminalProvider.tsx b/src/components/StripeTerminalProvider.tsx index 6bd16781..3534424b 100644 --- a/src/components/StripeTerminalProvider.tsx +++ b/src/components/StripeTerminalProvider.tsx @@ -31,9 +31,9 @@ const { START_READER_RECONNECT, READER_RECONNECT_SUCCEED, READER_RECONNECT_FAIL, - OFFLINE_STATUS_CHANGE, - PAYMENT_INTENT_FORWARDED, - FORWARDING_FAILURE, + CHANGE_OFFLINE_STATUS, + FORWARD_PAYMENT_INTENT, + REPORT_FORWARDING_ERROR, } = NativeModules.StripeTerminalReactNative.getConstants(); const emitter = new EventEmitter(); @@ -211,7 +211,7 @@ export function StripeTerminalProvider({ const didChangeOfflineStatus = useCallback( ({ result }: { result?: OfflineStatus }) => { log('didChangeOfflineStatus'); - emitter?.emit(OFFLINE_STATUS_CHANGE, result); + emitter?.emit(CHANGE_OFFLINE_STATUS, result); }, [log] ); @@ -219,7 +219,7 @@ export function StripeTerminalProvider({ const didForwardPaymentIntent = useCallback( ({ result }: EventResult) => { log('didForwardPaymentIntent'); - emitter?.emit(PAYMENT_INTENT_FORWARDED, result); + emitter?.emit(FORWARD_PAYMENT_INTENT, result); }, [log] ); @@ -227,7 +227,7 @@ export function StripeTerminalProvider({ const didReportForwardingError = useCallback( ({ error }: { error?: StripeError }) => { log('didReportForwardingError'); - emitter?.emit(FORWARDING_FAILURE, error); + emitter?.emit(REPORT_FORWARDING_ERROR, error); }, [log] ); @@ -252,9 +252,9 @@ export function StripeTerminalProvider({ useListener(READER_RECONNECT_SUCCEED, didSucceedReaderReconnect); useListener(READER_RECONNECT_FAIL, didFailReaderReconnect); - useListener(OFFLINE_STATUS_CHANGE, didChangeOfflineStatus); - useListener(PAYMENT_INTENT_FORWARDED, didForwardPaymentIntent); - useListener(FORWARDING_FAILURE, didReportForwardingError); + useListener(CHANGE_OFFLINE_STATUS, didChangeOfflineStatus); + useListener(FORWARD_PAYMENT_INTENT, didForwardPaymentIntent); + useListener(REPORT_FORWARDING_ERROR, didReportForwardingError); const tokenProviderHandler = async () => { try { diff --git a/src/functions.ts b/src/functions.ts index 36bbbb6c..781d1eb0 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -30,6 +30,7 @@ import type { CollectPaymentMethodParams, PaymentIntent, SetupIntent, + OfflineStatusEx, } from './types'; export async function initialize( @@ -741,7 +742,7 @@ export async function cancelCollectSetupIntent(): Promise<{ }, 'cancelCollectSetupIntent')(); } -export async function getOfflineStatus(): Promise<{}> { +export async function getOfflineStatus(): Promise { return Logger.traceSdkMethod(async () => { try { await StripeTerminalSdk.getOfflineStatus(); diff --git a/src/hooks/useStripeTerminal.tsx b/src/hooks/useStripeTerminal.tsx index 0742131c..3da54339 100644 --- a/src/hooks/useStripeTerminal.tsx +++ b/src/hooks/useStripeTerminal.tsx @@ -76,9 +76,9 @@ export const { START_READER_RECONNECT, READER_RECONNECT_SUCCEED, READER_RECONNECT_FAIL, - OFFLINE_STATUS_CHANGE, - PAYMENT_INTENT_FORWARDED, - FORWARDING_FAILURE, + CHANGE_OFFLINE_STATUS, + FORWARD_PAYMENT_INTENT, + REPORT_FORWARDING_ERROR, } = NativeModules.StripeTerminalReactNative.getConstants(); const NOT_INITIALIZED_ERROR_MESSAGE = @@ -311,9 +311,9 @@ export function useStripeTerminal(props?: Props) { useListener(READER_RECONNECT_SUCCEED, didSucceedReaderReconnect); useListener(READER_RECONNECT_FAIL, didFailReaderReconnect); - useListener(OFFLINE_STATUS_CHANGE, didChangeOfflineStatus); - useListener(PAYMENT_INTENT_FORWARDED, didForwardPaymentIntent); - useListener(FORWARDING_FAILURE, didReportForwardingError); + useListener(CHANGE_OFFLINE_STATUS, didChangeOfflineStatus); + useListener(FORWARD_PAYMENT_INTENT, didForwardPaymentIntent); + useListener(REPORT_FORWARDING_ERROR, didReportForwardingError); const _initialize = useCallback(async () => { if (!initialize || typeof initialize !== 'function') { diff --git a/src/types/index.ts b/src/types/index.ts index d7a861d3..72a1592e 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -167,8 +167,6 @@ export type CreatePaymentIntentParams = CreatePaymentIntentIOSParams & { paymentMethodOptions?: PaymentMethodOptions; captureMethod?: 'automatic' | 'manual'; offlineBehavior: 'prefer_online' | 'require_online' | 'force_offline'; - offlineModeTransactionLimit: number; - offlineModeStoredTransactionLimit: number; }; export type CreatePaymentIntentIOSParams = { @@ -273,8 +271,25 @@ export type ConfirmRefundResultType = { error?: StripeError; }; +export type OfflinePaymentAmountByCurrency = { + currency: string; + amount: number; +}; + export type OfflineStatus = { networkStatus: 'online' | 'offline' | 'unknown'; + offlinePaymentsCount: number; + offlinePaymentAmountsByCurrency: OfflinePaymentAmountByCurrency[]; +}; + +export type OfflinePaymentStatus = { + offlinePaymentsCount: number; + offlinePaymentAmountsByCurrency: OfflinePaymentAmountByCurrency[]; +}; + +export type OfflineStatusEx = { + sdk: OfflinePaymentStatus; + reader: OfflinePaymentStatus; }; type CardDetails = {