Skip to content

Commit

Permalink
update codes.
Browse files Browse the repository at this point in the history
  • Loading branch information
ianlin-bbpos committed Nov 13, 2023
1 parent bccb1b8 commit e71e4eb
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 75 deletions.
10 changes: 8 additions & 2 deletions android/src/main/java/com/stripeterminalreactnative/Mappers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}

Original file line number Diff line number Diff line change
Expand Up @@ -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"),
}
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down Expand Up @@ -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
}
}

Expand Down Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}
Expand Down
50 changes: 19 additions & 31 deletions ios/StripeTerminalReactNative.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -343,7 +342,6 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe
resolve(Errors.createError(nsError: error))
} else {
self.paymentIntents = [:]
self.terminal = nil
resolve([:])
}
}
Expand Down Expand Up @@ -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
}
}()

Expand Down Expand Up @@ -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])
}
}
18 changes: 9 additions & 9 deletions src/components/StripeTerminalProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -211,23 +211,23 @@ export function StripeTerminalProvider({
const didChangeOfflineStatus = useCallback(
({ result }: { result?: OfflineStatus }) => {
log('didChangeOfflineStatus');
emitter?.emit(OFFLINE_STATUS_CHANGE, result);
emitter?.emit(CHANGE_OFFLINE_STATUS, result);
},
[log]
);

const didForwardPaymentIntent = useCallback(
({ result }: EventResult<PaymentIntent.Type>) => {
log('didForwardPaymentIntent');
emitter?.emit(PAYMENT_INTENT_FORWARDED, result);
emitter?.emit(FORWARD_PAYMENT_INTENT, result);
},
[log]
);

const didReportForwardingError = useCallback(
({ error }: { error?: StripeError }) => {
log('didReportForwardingError');
emitter?.emit(FORWARDING_FAILURE, error);
emitter?.emit(REPORT_FORWARDING_ERROR, error);
},
[log]
);
Expand All @@ -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 {
Expand Down
3 changes: 2 additions & 1 deletion src/functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import type {
CollectPaymentMethodParams,
PaymentIntent,
SetupIntent,
OfflineStatusEx,
} from './types';

export async function initialize(
Expand Down Expand Up @@ -741,7 +742,7 @@ export async function cancelCollectSetupIntent(): Promise<{
}, 'cancelCollectSetupIntent')();
}

export async function getOfflineStatus(): Promise<{}> {
export async function getOfflineStatus(): Promise<OfflineStatusEx> {
return Logger.traceSdkMethod(async () => {
try {
await StripeTerminalSdk.getOfflineStatus();
Expand Down
12 changes: 6 additions & 6 deletions src/hooks/useStripeTerminal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down Expand Up @@ -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') {
Expand Down
19 changes: 17 additions & 2 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -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 = {
Expand Down

0 comments on commit e71e4eb

Please sign in to comment.