Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix offline status #579

Merged
merged 9 commits into from
Dec 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions android/src/main/java/com/stripeterminalreactnative/Mappers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -499,8 +499,8 @@ internal fun mapFromNetworkStatus(status: NetworkStatus): String {
}
}

fun mapFromOfflineStatus(offlineStatus: OfflineStatus): ReadableMap =
nativeMapOf {
fun mapFromOfflineStatus(offlineStatus: OfflineStatus): ReadableMap {
val sdkMap = nativeMapOf {
putString("networkStatus", mapFromNetworkStatus(offlineStatus.sdk.networkStatus))
putInt("offlinePaymentsCount", offlineStatus.sdk.offlinePaymentsCount)

Expand All @@ -512,3 +512,23 @@ fun mapFromOfflineStatus(offlineStatus: OfflineStatus): ReadableMap =
putMap("offlinePaymentAmountsByCurrency", map)
}

val readerMap = nativeMapOf {
offlineStatus.reader?.also { reader ->
putString("networkStatus", mapFromNetworkStatus(reader.networkStatus))
putInt("offlinePaymentsCount", reader.offlinePaymentsCount)

val map = nativeMapOf {
reader.offlinePaymentAmountsByCurrency.forEach {
putInt(it.key, it.value.toInt())
}
}
putMap("offlinePaymentAmountsByCurrency", map)
}

}

return nativeMapOf {
putMap("sdk", sdkMap)
putMap("reader", readerMap)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -696,34 +696,7 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) :
@ReactMethod
@Suppress("unused")
fun getOfflineStatus(promise: Promise) {
promise.resolve(
nativeMapOf {
val sdkMap = nativeMapOf {
putInt("offlinePaymentsCount", terminal.offlineStatus.sdk.offlinePaymentsCount)

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)
}
)
promise.resolve(mapFromOfflineStatus(terminal.offlineStatus))
}

private fun cancelOperation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,12 @@ class RNOfflineListener(
override fun onPaymentIntentForwarded(paymentIntent: PaymentIntent, e: TerminalException?) {
context.sendEvent(ReactNativeConstants.FORWARD_PAYMENT_INTENT.listenerName) {
putMap("result", mapFromPaymentIntent(paymentIntent, ""))
putMap("error", nativeMapOf {
putString("code", e?.errorCode.toString())
putString("message", e?.errorMessage)
})
if (e != null) {
putMap("error", nativeMapOf {
putString("code", e.errorCode.toString())
putString("message", e.errorMessage)
})
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions dev-app/src/screens/DatabaseScreen.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useContext, useEffect, useState } from 'react';
import { ScrollView, StyleSheet, Text } from 'react-native';
import type { OfflinePaymentStatus } from 'src/types';
import type { OfflineStatus } from 'src/types';
import { colors } from '../colors';
import List from '../components/List';
import ListItem from '../components/ListItem';
Expand All @@ -10,7 +10,7 @@ import { useStripeTerminal } from '@stripe/stripe-terminal-react-native';
export default function DatabaseScreen() {
const { account } = useContext(AppContext);
const [offlinePaymentStatus, setOfflinePaymentStatus] =
useState<OfflinePaymentStatus | null>(null);
useState<OfflineStatus | null>(null);
const currencySymbols = [
{ value: 'usd', label: '$' },
{ value: 'gbp', label: '£' },
Expand Down
8 changes: 4 additions & 4 deletions dev-app/src/screens/HomeScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ export default function HomeScreen() {
useState<Reader.DiscoveryMethod>('bluetoothScan');
const { disconnectReader, connectedReader } = useStripeTerminal({
onDidChangeOfflineStatus(status: OfflineStatus) {
console.log('offline status = ' + status.networkStatus);
setOnline(status.networkStatus == 'online' ? true : false);
console.log(status);
setOnline(status.sdk.networkStatus === 'online' ? true : false);
},
onDidForwardingFailure(error) {
console.log('onDidForwardingFailure ' + error?.message);
Expand All @@ -56,9 +56,9 @@ export default function HomeScreen() {
'Payment Intent ' +
paymentIntent.id +
' forwarded. ErrorCode' +
error.code +
error?.code +
'. ErrorMsg = ' +
error.message;
error?.message;
let toast = Toast.show(toastMsg, {
duration: Toast.durations.LONG,
position: Toast.positions.BOTTOM,
Expand Down
2 changes: 1 addition & 1 deletion ios/Errors.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Errors {
return createError(errorCode: code.rawValue, message: message)
}

class func createError(nsError: NSError) -> [String: Any?] {
class func createError(nsError: NSError) -> [String: Any] {
return createError(code: ErrorCode.Code.init(rawValue: nsError.code) ?? ErrorCode.unexpectedSdkError, message: nsError.localizedDescription)
}

Expand Down
20 changes: 16 additions & 4 deletions ios/Mappers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -518,10 +518,22 @@ class Mappers {
}

class func mapFromOfflineStatus(_ offlineStatus: OfflineStatus) -> NSDictionary {
let result: NSDictionary = [
"networkStatus": mapFromNetworkStatus(offlineStatus.sdk.networkStatus)
]
return result
let sdkDict: NSDictionary = [
"networkStatus": Mappers.mapFromNetworkStatus(offlineStatus.sdk.networkStatus),
"offlinePaymentsCount": offlineStatus.sdk.paymentsCount ?? 0,
"offlinePaymentAmountsByCurrency": offlineStatus.sdk.paymentAmountsByCurrency
]

var readerDict: NSDictionary = [:]
if let reader = offlineStatus.reader {
readerDict = [
"networkStatus": Mappers.mapFromNetworkStatus(reader.networkStatus),
"offlinePaymentsCount": reader.paymentsCount ?? 0,
"offlinePaymentAmountsByCurrency": reader.paymentAmountsByCurrency
]
}

return(["sdk": sdkDict, "reader": readerDict])
}
}

Expand Down
29 changes: 16 additions & 13 deletions ios/StripeTerminalReactNative.swift
Original file line number Diff line number Diff line change
Expand Up @@ -915,17 +915,9 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe

@objc(getOfflineStatus:rejecter:)
func getOfflineStatus(resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
let sdkDic: NSDictionary = [
"offlinePaymentsCount": Terminal.shared.offlineStatus.sdk.paymentsCount ?? 0,
"offlinePaymentAmountsByCurrency": Terminal.shared.offlineStatus.sdk.paymentAmountsByCurrency
]

let readDic: NSDictionary = [
"offlinePaymentsCount": Terminal.shared.offlineStatus.reader?.paymentsCount ?? 0,
"offlinePaymentAmountsByCurrency": Terminal.shared.offlineStatus.reader?.paymentAmountsByCurrency ?? {}
]
let result = Mappers.mapFromOfflineStatus(Terminal.shared.offlineStatus)

resolve(["sdk": sdkDic, "reader": readDic])
resolve(result)
}

func reader(_ reader: Reader, didReportAvailableUpdate update: ReaderSoftwareUpdate) {
Expand Down Expand Up @@ -1003,13 +995,24 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe
}

func terminal(_ terminal: Terminal, didChange offlineStatus: OfflineStatus) {
let offlineStatus = Mappers.mapFromOfflineStatus(offlineStatus)
sendEvent(withName: ReactNativeConstants.CHANGE_OFFLINE_STATUS.rawValue, body: ["result": offlineStatus])
let result = Mappers.mapFromOfflineStatus(offlineStatus)
sendEvent(withName: ReactNativeConstants.CHANGE_OFFLINE_STATUS.rawValue, body: ["result": result])
}

func terminal(_ terminal: Terminal, didForwardPaymentIntent intent: PaymentIntent, error: Error?) {
let result = Mappers.mapFromPaymentIntent(intent, uuid: "")
sendEvent(withName: ReactNativeConstants.FORWARD_PAYMENT_INTENT.rawValue, body: ["result": result])
var body: [String: Any] = ["result": result]

if let nsError = error as NSError? {
let errorAsDictionary = Errors.createError(nsError: nsError)
// createError will return a dictionary of ["error": {the error}]
// so merge that with the result so we have [result:, error:]
body = body.merging(errorAsDictionary, uniquingKeysWith: { _, error in
nazli-stripe marked this conversation as resolved.
Show resolved Hide resolved
error
})
}

sendEvent(withName: ReactNativeConstants.FORWARD_PAYMENT_INTENT.rawValue, body: body)
}

func terminal(_ terminal: Terminal, didReportForwardingError error: Error) {
Expand Down
4 changes: 2 additions & 2 deletions src/StripeTerminalSdk.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import type {
CollectPaymentMethodParams,
PaymentIntent,
SetupIntent,
OfflinePaymentStatus,
OfflineStatus,
} from './types';

const { StripeTerminalReactNative } = NativeModules;
Expand Down Expand Up @@ -139,7 +139,7 @@ export interface StripeTerminalSdkType {
setSimulatedCard(cardNumber: string): Promise<{
error?: StripeError;
}>;
getOfflineStatus(): Promise<OfflinePaymentStatus>;
getOfflineStatus(): Promise<OfflineStatus>;
}

export default StripeTerminalReactNative as StripeTerminalSdkType;
6 changes: 3 additions & 3 deletions src/components/StripeTerminalProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -210,23 +210,23 @@ export function StripeTerminalProvider({

const didChangeOfflineStatus = useCallback(
({ result }: { result?: OfflineStatus }) => {
log('didChangeOfflineStatus');
log('didChangeOfflineStatus', result);
emitter?.emit(CHANGE_OFFLINE_STATUS, result);
},
[log]
);

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

const didReportForwardingError = useCallback(
({ error }: { error?: StripeError }) => {
log('didReportForwardingError');
log('didReportForwardingError', error);
emitter?.emit(REPORT_FORWARDING_ERROR, error);
},
[log]
Expand Down
4 changes: 2 additions & 2 deletions src/functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import type {
CollectPaymentMethodParams,
PaymentIntent,
SetupIntent,
OfflinePaymentStatus,
OfflineStatus,
} from './types';

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

export async function getOfflineStatus(): Promise<OfflinePaymentStatus> {
export async function getOfflineStatus(): Promise<OfflineStatus> {
return Logger.traceSdkMethod(async () => {
try {
const offlineStatus = await StripeTerminalSdk.getOfflineStatus();
Expand Down
6 changes: 6 additions & 0 deletions src/hooks/useStripeTerminal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,9 @@ export function useStripeTerminal(props?: Props) {

const didChangeOfflineStatus = useCallback(
({ result }: { result: OfflineStatus }) => {
if (!result.reader?.networkStatus) {
result.reader = undefined;
}
onDidChangeOfflineStatus?.(result);
},
[onDidChangeOfflineStatus]
Expand Down Expand Up @@ -835,6 +838,9 @@ export function useStripeTerminal(props?: Props) {
throw Error(NOT_INITIALIZED_ERROR_MESSAGE);
}
const response = await getOfflineStatus();
if (response.reader?.networkStatus) {
response.reader = undefined;
}
return response;
}, [_isInitialized]);

Expand Down
14 changes: 4 additions & 10 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -272,21 +272,15 @@ export type ConfirmRefundResultType = {
error?: StripeError;
};

export type OfflineStatus = {
export type OfflineStatusDetails = {
networkStatus: 'online' | 'offline' | 'unknown';
offlinePaymentsCount: number;
offlinePaymentAmountsByCurrency: { [key: string]: number };
};

export type OfflinePaymentStatus = {
sdk: {
offlinePaymentsCount: number;
offlinePaymentAmountsByCurrency: { [key: string]: number };
};
reader: {
offlinePaymentsCount: number;
offlinePaymentAmountsByCurrency: { [key: string]: number };
};
export type OfflineStatus = {
sdk: OfflineStatusDetails;
reader?: OfflineStatusDetails;
};

type CardDetails = {
Expand Down