Skip to content

Commit

Permalink
Support reader disconnect reason (#628)
Browse files Browse the repository at this point in the history
* support reader disconnect reason.

* change type DisconnectReason.

* use camelCase for disconnect reason definition.
  • Loading branch information
ianlin-bbpos authored Mar 5, 2024
1 parent f666da6 commit 8407ea0
Show file tree
Hide file tree
Showing 11 changed files with 90 additions and 0 deletions.
13 changes: 13 additions & 0 deletions android/src/main/java/com/stripeterminalreactnative/Mappers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.stripe.stripeterminal.external.models.CartLineItem
import com.stripe.stripeterminal.external.models.Charge
import com.stripe.stripeterminal.external.models.ConnectionStatus
import com.stripe.stripeterminal.external.models.DeviceType
import com.stripe.stripeterminal.external.models.DisconnectReason
import com.stripe.stripeterminal.external.models.Location
import com.stripe.stripeterminal.external.models.LocationStatus
import com.stripe.stripeterminal.external.models.NetworkStatus
Expand Down Expand Up @@ -562,3 +563,15 @@ fun mapFromOfflineStatus(offlineStatus: OfflineStatus): ReadableMap {
putMap("reader", readerMap)
}
}

fun mapFromReaderDisconnectReason(reason: DisconnectReason): String {
return when (reason) {
DisconnectReason.DISCONNECT_REQUESTED -> "disconnectRequested"
DisconnectReason.REBOOT_REQUESTED -> "rebootRequested"
DisconnectReason.SECURITY_REBOOT -> "securityReboot"
DisconnectReason.CRITICALLY_LOW_BATTERY -> "criticallyLowBattery"
DisconnectReason.POWERED_OFF -> "poweredOff"
DisconnectReason.BLUETOOTH_DISABLED -> "bluetoothDisabled"
else -> { "unknown" }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ enum class ReactNativeConstants(val listenerName: String) {
CHANGE_OFFLINE_STATUS("didChangeOfflineStatus"),
FORWARD_PAYMENT_INTENT("didForwardPaymentIntent"),
REPORT_FORWARDING_ERROR("didReportForwardingError"),
DISCONNECT("didDisconnect")
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@ package com.stripeterminalreactnative.listener
import com.facebook.react.bridge.ReactApplicationContext
import com.stripe.stripeterminal.external.callable.Cancelable
import com.stripe.stripeterminal.external.callable.ReaderListener
import com.stripe.stripeterminal.external.models.DisconnectReason
import com.stripe.stripeterminal.external.models.ReaderDisplayMessage
import com.stripe.stripeterminal.external.models.ReaderInputOptions
import com.stripe.stripeterminal.external.models.ReaderSoftwareUpdate
import com.stripe.stripeterminal.external.models.TerminalException
import com.stripeterminalreactnative.ReactExtensions.sendEvent
import com.stripeterminalreactnative.ReactNativeConstants.DISCONNECT
import com.stripeterminalreactnative.ReactNativeConstants.FINISH_INSTALLING_UPDATE
import com.stripeterminalreactnative.ReactNativeConstants.REPORT_AVAILABLE_UPDATE
import com.stripeterminalreactnative.ReactNativeConstants.REPORT_UPDATE_PROGRESS
import com.stripeterminalreactnative.ReactNativeConstants.REQUEST_READER_DISPLAY_MESSAGE
import com.stripeterminalreactnative.ReactNativeConstants.REQUEST_READER_INPUT
import com.stripeterminalreactnative.ReactNativeConstants.START_INSTALLING_UPDATE
import com.stripeterminalreactnative.mapFromReaderDisconnectReason
import com.stripeterminalreactnative.mapFromReaderDisplayMessage
import com.stripeterminalreactnative.mapFromReaderInputOptions
import com.stripeterminalreactnative.mapFromReaderSoftwareUpdate
Expand Down Expand Up @@ -72,4 +75,10 @@ class RNBluetoothReaderListener(
putString("result", mapFromReaderDisplayMessage(message))
}
}

override fun onDisconnect(reason: DisconnectReason) {
context.sendEvent(DISCONNECT.listenerName) {
putString("reason", mapFromReaderDisconnectReason(reason))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@ package com.stripeterminalreactnative.listener
import com.facebook.react.bridge.ReactApplicationContext
import com.stripe.stripeterminal.external.callable.Cancelable
import com.stripe.stripeterminal.external.callable.ReaderListener
import com.stripe.stripeterminal.external.models.DisconnectReason
import com.stripe.stripeterminal.external.models.ReaderDisplayMessage
import com.stripe.stripeterminal.external.models.ReaderInputOptions
import com.stripe.stripeterminal.external.models.ReaderSoftwareUpdate
import com.stripe.stripeterminal.external.models.TerminalException
import com.stripeterminalreactnative.ReactExtensions.sendEvent
import com.stripeterminalreactnative.ReactNativeConstants.DISCONNECT
import com.stripeterminalreactnative.ReactNativeConstants.FINISH_INSTALLING_UPDATE
import com.stripeterminalreactnative.ReactNativeConstants.REPORT_AVAILABLE_UPDATE
import com.stripeterminalreactnative.ReactNativeConstants.REPORT_UPDATE_PROGRESS
import com.stripeterminalreactnative.ReactNativeConstants.REQUEST_READER_DISPLAY_MESSAGE
import com.stripeterminalreactnative.ReactNativeConstants.REQUEST_READER_INPUT
import com.stripeterminalreactnative.ReactNativeConstants.START_INSTALLING_UPDATE
import com.stripeterminalreactnative.mapFromReaderDisconnectReason
import com.stripeterminalreactnative.mapFromReaderDisplayMessage
import com.stripeterminalreactnative.mapFromReaderInputOptions
import com.stripeterminalreactnative.mapFromReaderSoftwareUpdate
Expand Down Expand Up @@ -72,4 +75,10 @@ class RNUsbReaderListener(
putString("result", mapFromReaderDisplayMessage(message))
}
}

override fun onDisconnect(reason: DisconnectReason) {
context.sendEvent(DISCONNECT.listenerName) {
putString("reason", mapFromReaderDisconnectReason(reason))
}
}
}
7 changes: 7 additions & 0 deletions dev-app/src/screens/HomeScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
Text,
Image,
Switch,
Alert,
} from 'react-native';
import { colors } from '../colors';
import { AppContext } from '../AppContext';
Expand Down Expand Up @@ -76,6 +77,12 @@ export default function HomeScreen() {
Toast.hide(toast);
}, 3000);
},
onDidDisconnect(reason) {
Alert.alert(
'Reader disconnected!',
'Reader disconnected with reason ' + reason
);
},
}
);
const batteryPercentage =
Expand Down
12 changes: 12 additions & 0 deletions ios/Mappers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -600,6 +600,18 @@ class Mappers {

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

class func mapFromReaderDisconnectReason(_ reason: DisconnectReason) -> String {
switch reason {
case DisconnectReason.disconnectRequested: return "disconnectRequested"
case DisconnectReason.rebootRequested: return "rebootRequested"
case DisconnectReason.securityReboot: return "securityReboot"
case DisconnectReason.criticallyLowBattery: return "criticallyLowBattery"
case DisconnectReason.poweredOff: return "poweredOff"
case DisconnectReason.bluetoothDisabled: return "bluetoothDisabled"
default: return "unknown"
}
}
}

extension UInt {
Expand Down
6 changes: 6 additions & 0 deletions ios/StripeTerminalReactNative.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ enum ReactNativeConstants: String, CaseIterable {
case CHANGE_OFFLINE_STATUS = "didChangeOfflineStatus"
case FORWARD_PAYMENT_INTENT = "didForwardPaymentIntent"
case REPORT_FORWARDING_ERROR = "didReportForwardingError"
case DISCONNECT = "didDisconnect"
}

@objc(StripeTerminalReactNative)
Expand Down Expand Up @@ -982,6 +983,11 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe
let result = Mappers.mapFromReaderDisplayMessage(displayMessage)
sendEvent(withName: ReactNativeConstants.REQUEST_READER_DISPLAY_MESSAGE.rawValue, body: ["result": result])
}

func reader(_ reader: Reader, didDisconnect reason: DisconnectReason) {
let result = Mappers.mapFromReaderDisconnectReason(reason)
sendEvent(withName: ReactNativeConstants.DISCONNECT.rawValue, body: ["reason": result])
}

func localMobileReader(_ reader: Reader, didStartInstallingUpdate update: ReaderSoftwareUpdate, cancelable: Cancelable?) {
self.installUpdateCancelable = cancelable
Expand Down
11 changes: 11 additions & 0 deletions src/components/StripeTerminalProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ const {
CHANGE_OFFLINE_STATUS,
FORWARD_PAYMENT_INTENT,
REPORT_FORWARDING_ERROR,
DISCONNECT,
} = NativeModules.StripeTerminalReactNative.getConstants();

const emitter = new EventEmitter();
Expand Down Expand Up @@ -232,6 +233,14 @@ export function StripeTerminalProvider({
[log]
);

const didDisconnect = useCallback(
({ reason }: { reason?: Reader.DisconnectReason }) => {
log('didDisconnect', reason);
emitter?.emit(DISCONNECT, reason);
},
[log]
);

useListener(REPORT_AVAILABLE_UPDATE, didReportAvailableUpdate);
useListener(START_INSTALLING_UPDATE, didStartInstallingUpdate);
useListener(REPORT_UPDATE_PROGRESS, didReportReaderSoftwareUpdateProgress);
Expand All @@ -256,6 +265,8 @@ export function StripeTerminalProvider({
useListener(FORWARD_PAYMENT_INTENT, didForwardPaymentIntent);
useListener(REPORT_FORWARDING_ERROR, didReportForwardingError);

useListener(DISCONNECT, didDisconnect);

const tokenProviderHandler = async () => {
try {
const connectionToken = await tokenProvider();
Expand Down
11 changes: 11 additions & 0 deletions src/hooks/useStripeTerminal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ export const {
CHANGE_OFFLINE_STATUS,
FORWARD_PAYMENT_INTENT,
REPORT_FORWARDING_ERROR,
DISCONNECT,
} = NativeModules.StripeTerminalReactNative.getConstants();

const NOT_INITIALIZED_ERROR_MESSAGE =
Expand Down Expand Up @@ -143,6 +144,7 @@ export function useStripeTerminal(props?: Props) {
onDidChangeOfflineStatus,
onDidForwardPaymentIntent,
onDidForwardingFailure,
onDidDisconnect,
} = props || {};

const _discoverReaders = useCallback(
Expand Down Expand Up @@ -298,6 +300,13 @@ export function useStripeTerminal(props?: Props) {
[onDidForwardingFailure]
);

const didDisconnect = useCallback(
({ reason }: { reason?: Reader.DisconnectReason }) => {
onDidDisconnect?.(reason);
},
[onDidDisconnect]
);

useListener(REPORT_AVAILABLE_UPDATE, didReportAvailableUpdate);
useListener(START_INSTALLING_UPDATE, didStartInstallingUpdate);
useListener(REPORT_UPDATE_PROGRESS, didReportReaderSoftwareUpdateProgress);
Expand All @@ -322,6 +331,8 @@ export function useStripeTerminal(props?: Props) {
useListener(FORWARD_PAYMENT_INTENT, didForwardPaymentIntent);
useListener(REPORT_FORWARDING_ERROR, didReportForwardingError);

useListener(DISCONNECT, didDisconnect);

const _initialize = useCallback(async () => {
if (!initialize || typeof initialize !== 'function') {
const errorMessage =
Expand Down
9 changes: 9 additions & 0 deletions src/types/Reader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,13 @@ export namespace Reader {
| 'cardRemovedTooEarly';

export type ConnectionStatus = 'connected' | 'connecting' | 'notConnected';

export type DisconnectReason =
| 'disconnectRequested'
| 'rebootRequested'
| 'securityReboot'
| 'criticallyLowBattery'
| 'poweredOff'
| 'bluetoothDisabled'
| 'unknown';
}
2 changes: 2 additions & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,8 @@ export type UserCallbacks = {
error: StripeError
): void;
onDidForwardingFailure?(error?: StripeError): void;

onDidDisconnect?(reason?: Reader.DisconnectReason): void;
};

export namespace PaymentMethod {
Expand Down

0 comments on commit 8407ea0

Please sign in to comment.