diff --git a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt index 7a79adaf..0acf5378 100644 --- a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt +++ b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt @@ -691,22 +691,35 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : } @OptIn(OfflineMode::class) + @ReactMethod + @Suppress("unused") 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()) + val sdkMap = nativeMapOf { + putInt("offlinePaymentsCount", terminal.offlineStatus.sdk.offlinePaymentsCount) - mutableMap = terminal.offlineStatus.reader?.offlinePaymentAmountsByCurrency?.toMutableMap()!! - val readerMap = mutableMapOf( - "offlinePaymentsCount" to terminal.offlineStatus.sdk.offlinePaymentsCount, - "offlinePaymentAmountsByCurrency" to mutableMap - ) - putString("reader", readerMap.toString()) + val map = nativeMapOf { + terminal.offlineStatus.sdk.offlinePaymentAmountsByCurrency.forEach { + putInt(it.key, it.value.toInt()) + } + } + putMap("offlinePaymentAmountsByCurrency", map) + } + + val readerMap = nativeMapOf { + putInt("offlinePaymentsCount", terminal.offlineStatus.reader?.offlinePaymentsCount?:0) + + val map = nativeMapOf { + terminal.offlineStatus.reader?.offlinePaymentAmountsByCurrency?.forEach { + putInt(it.key, it.value.toInt()) + } + } + putMap("offlinePaymentAmountsByCurrency", map) + } + + putMap("sdk", sdkMap) + putMap("reader", readerMap) } ) } diff --git a/dev-app/src/screens/CollectCardPaymentScreen.tsx b/dev-app/src/screens/CollectCardPaymentScreen.tsx index de4abc8a..88f2a886 100644 --- a/dev-app/src/screens/CollectCardPaymentScreen.tsx +++ b/dev-app/src/screens/CollectCardPaymentScreen.tsx @@ -7,7 +7,6 @@ import { PaymentIntent, StripeError, CommonError, - OfflineStatus, } from '@stripe/stripe-terminal-react-native'; import { colors } from '../colors'; import List from '../components/List'; @@ -84,7 +83,6 @@ export default function CollectCardPaymentScreen() { const { simulated, discoveryMethod } = params; const { addLogs, clearLogs, setCancel } = useContext(LogContext); const navigation = useNavigation(); - let offlineStatus: OfflineStatus | undefined; const { createPaymentIntent, @@ -93,6 +91,7 @@ export default function CollectCardPaymentScreen() { retrievePaymentIntent, cancelCollectPaymentMethod, setSimulatedCard, + getOfflineStatus, } = useStripeTerminal({ onDidRequestReaderInput: (input) => { // @ts-ignore @@ -119,9 +118,6 @@ export default function CollectCardPaymentScreen() { ], }); }, - onDidChangeOfflineStatus: (status: OfflineStatus) => { - offlineStatus = status; - }, }); const _createPaymentIntent = async () => { @@ -203,12 +199,25 @@ export default function CollectCardPaymentScreen() { paymentIntent = response.paymentIntent; paymentIntentError = response.error; } else { + const offlineStatus = await getOfflineStatus(); + let paymentAmountsByCurrency = 0; + for (let currency in offlineStatus.sdk.offlinePaymentAmountsByCurrency) { + if (currency === inputValues.currency) { + paymentAmountsByCurrency = + offlineStatus.sdk.offlinePaymentAmountsByCurrency[currency]; + } + } + console.log( + 'currency = ' + + inputValues.currency + + ' paymentAmountsByCurrency = ' + + paymentAmountsByCurrency + ); if ( Number(inputValues.amount) > Number(inputValues.offlineModeTransactionLimit) || - (offlineStatus - ? offlineStatus.offlinePaymentAmountsByCurrency[0].amount - : 0) > Number(inputValues.offlineModeStoredTransactionLimit) + paymentAmountsByCurrency > + Number(inputValues.offlineModeStoredTransactionLimit) ) { inputValues.offlineBehavior = 'require_online'; } diff --git a/src/StripeTerminalSdk.tsx b/src/StripeTerminalSdk.tsx index a4585870..5de1280c 100644 --- a/src/StripeTerminalSdk.tsx +++ b/src/StripeTerminalSdk.tsx @@ -29,6 +29,7 @@ import type { CollectPaymentMethodParams, PaymentIntent, SetupIntent, + OfflinePaymentStatus, } from './types'; const { StripeTerminalReactNative } = NativeModules; @@ -138,7 +139,7 @@ export interface StripeTerminalSdkType { setSimulatedCard(cardNumber: string): Promise<{ error?: StripeError; }>; - getOfflineStatus(): Promise<{}>; + getOfflineStatus(): Promise; } export default StripeTerminalReactNative as StripeTerminalSdkType; diff --git a/src/functions.ts b/src/functions.ts index 781d1eb0..a26b8bd9 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -30,7 +30,7 @@ import type { CollectPaymentMethodParams, PaymentIntent, SetupIntent, - OfflineStatusEx, + OfflinePaymentStatus, } from './types'; export async function initialize( @@ -742,11 +742,11 @@ export async function cancelCollectSetupIntent(): Promise<{ }, 'cancelCollectSetupIntent')(); } -export async function getOfflineStatus(): Promise { +export async function getOfflineStatus(): Promise { return Logger.traceSdkMethod(async () => { try { - await StripeTerminalSdk.getOfflineStatus(); - return {}; + const offlineStatus = await StripeTerminalSdk.getOfflineStatus(); + return offlineStatus; } catch (error) { return { error: error as any, diff --git a/src/types/index.ts b/src/types/index.ts index 72a1592e..152429eb 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -271,25 +271,21 @@ export type ConfirmRefundResultType = { error?: StripeError; }; -export type OfflinePaymentAmountByCurrency = { - currency: string; - amount: number; -}; - export type OfflineStatus = { networkStatus: 'online' | 'offline' | 'unknown'; offlinePaymentsCount: number; - offlinePaymentAmountsByCurrency: OfflinePaymentAmountByCurrency[]; + offlinePaymentAmountsByCurrency: { [key: string]: number }; }; export type OfflinePaymentStatus = { - offlinePaymentsCount: number; - offlinePaymentAmountsByCurrency: OfflinePaymentAmountByCurrency[]; -}; - -export type OfflineStatusEx = { - sdk: OfflinePaymentStatus; - reader: OfflinePaymentStatus; + sdk: { + offlinePaymentsCount: number; + offlinePaymentAmountsByCurrency: { [key: string]: number }; + }; + reader: { + offlinePaymentsCount: number; + offlinePaymentAmountsByCurrency: { [key: string]: number }; + }; }; type CardDetails = {