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

Support reader disconnect reason #628

Merged
merged 4 commits into from
Mar 5, 2024
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
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