Skip to content

Commit

Permalink
Add missing Reader callbacks (#706)
Browse files Browse the repository at this point in the history
* Add missing Reader callbacks

* fix missing import

* add __snapshots__ file

* rename paramter

* add callback in UsbReaderListener

* rename parameter

* code optimization

* change parameter type

* remove unuse code

* update

* rename swift parameter

---------

Co-authored-by: Nazli Yurdakul <69359432+nazli-stripe@users.noreply.github.com>
  • Loading branch information
EricLin-BBpos and nazli-stripe authored May 29, 2024
1 parent 7699879 commit 4084634
Show file tree
Hide file tree
Showing 10 changed files with 192 additions and 1 deletion.
11 changes: 11 additions & 0 deletions android/src/main/java/com/stripeterminalreactnative/Mappers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.stripe.stripeterminal.external.CollectInputs
import com.stripe.stripeterminal.external.OfflineMode
import com.stripe.stripeterminal.external.models.Address
import com.stripe.stripeterminal.external.models.AmountDetails
import com.stripe.stripeterminal.external.models.BatteryStatus
import com.stripe.stripeterminal.external.models.CardDetails
import com.stripe.stripeterminal.external.models.CardPresentDetails
import com.stripe.stripeterminal.external.models.CartLineItem
Expand Down Expand Up @@ -834,3 +835,13 @@ fun mapFromReaderSupportResult(readerSupportResult: ReaderSupportResult): Readab
putBoolean("readerSupportResult", readerSupportResult.isSupported)
}
}

fun mapFromBatteryStatus(status: BatteryStatus): String {
return when (status) {
BatteryStatus.CRITICAL -> "CRITICAL"
BatteryStatus.LOW -> "LOW"
BatteryStatus.NOMINAL -> "NOMINAL"
BatteryStatus.UNKNOWN -> "UNKNOWN"
else -> { "UNKNOWN" }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,8 @@ enum class ReactNativeConstants(val listenerName: String) {
CHANGE_OFFLINE_STATUS("didChangeOfflineStatus"),
FORWARD_PAYMENT_INTENT("didForwardPaymentIntent"),
REPORT_FORWARDING_ERROR("didReportForwardingError"),
DISCONNECT("didDisconnect")
DISCONNECT("didDisconnect"),
UPDATE_BATTERY_LEVEL("didUpdateBatteryLevel"),
REPORT_LOW_BATTERY_WARNING("didReportLowBatteryWarning"),
REPORT_READER_EVENT("didReportReaderEvent"),
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ 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.BatteryStatus
import com.stripe.stripeterminal.external.models.DisconnectReason
import com.stripe.stripeterminal.external.models.ReaderEvent
import com.stripe.stripeterminal.external.models.ReaderDisplayMessage
import com.stripe.stripeterminal.external.models.ReaderInputOptions
import com.stripe.stripeterminal.external.models.ReaderSoftwareUpdate
Expand All @@ -17,11 +19,17 @@ import com.stripeterminalreactnative.ReactNativeConstants.REQUEST_READER_DISPLAY
import com.stripeterminalreactnative.ReactNativeConstants.REQUEST_READER_INPUT
import com.stripeterminalreactnative.ReactNativeConstants.START_INSTALLING_UPDATE
import com.stripeterminalreactnative.mapFromReaderDisconnectReason
import com.stripeterminalreactnative.ReactNativeConstants.UPDATE_BATTERY_LEVEL
import com.stripeterminalreactnative.ReactNativeConstants.REPORT_LOW_BATTERY_WARNING
import com.stripeterminalreactnative.ReactNativeConstants.REPORT_READER_EVENT
import com.stripeterminalreactnative.mapFromBatteryStatus
import com.stripeterminalreactnative.mapFromReaderDisplayMessage
import com.stripeterminalreactnative.mapFromReaderEvent
import com.stripeterminalreactnative.mapFromReaderInputOptions
import com.stripeterminalreactnative.mapFromReaderSoftwareUpdate
import com.stripeterminalreactnative.nativeMapOf
import com.stripeterminalreactnative.putError
import com.stripeterminalreactnative.putDoubleOrNull

class RNBluetoothReaderListener(
private val context: ReactApplicationContext,
Expand Down Expand Up @@ -84,4 +92,33 @@ class RNBluetoothReaderListener(
putString("reason", mapFromReaderDisconnectReason(reason))
}
}

override fun onBatteryLevelUpdate(
batteryLevel: Float,
batteryStatus: BatteryStatus,
isCharging: Boolean
) {
context.sendEvent(UPDATE_BATTERY_LEVEL.listenerName) {
putMap(
"result",
nativeMapOf {
putDoubleOrNull(this,"batteryLevel", batteryLevel.toDouble())
putString("batteryStatus", mapFromBatteryStatus(batteryStatus))
putBoolean("isCharging", isCharging)
}
)
}
}

override fun onReportLowBatteryWarning() {
context.sendEvent(REPORT_LOW_BATTERY_WARNING.listenerName) {
putString("result", "LOW BATTERY")
}
}

override fun onReportReaderEvent(event: ReaderEvent) {
context.sendEvent(REPORT_READER_EVENT.listenerName) {
putString("result", mapFromReaderEvent(event))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ 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.BatteryStatus
import com.stripe.stripeterminal.external.models.DisconnectReason
import com.stripe.stripeterminal.external.models.ReaderEvent
import com.stripe.stripeterminal.external.models.ReaderDisplayMessage
import com.stripe.stripeterminal.external.models.ReaderInputOptions
import com.stripe.stripeterminal.external.models.ReaderSoftwareUpdate
Expand All @@ -16,12 +18,18 @@ 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.ReactNativeConstants.UPDATE_BATTERY_LEVEL
import com.stripeterminalreactnative.ReactNativeConstants.REPORT_LOW_BATTERY_WARNING
import com.stripeterminalreactnative.ReactNativeConstants.REPORT_READER_EVENT
import com.stripeterminalreactnative.mapFromBatteryStatus
import com.stripeterminalreactnative.mapFromReaderDisconnectReason
import com.stripeterminalreactnative.mapFromReaderDisplayMessage
import com.stripeterminalreactnative.mapFromReaderEvent
import com.stripeterminalreactnative.mapFromReaderInputOptions
import com.stripeterminalreactnative.mapFromReaderSoftwareUpdate
import com.stripeterminalreactnative.nativeMapOf
import com.stripeterminalreactnative.putError
import com.stripeterminalreactnative.putDoubleOrNull

class RNUsbReaderListener(
private val context: ReactApplicationContext,
Expand Down Expand Up @@ -84,4 +92,33 @@ class RNUsbReaderListener(
putString("reason", mapFromReaderDisconnectReason(reason))
}
}

override fun onBatteryLevelUpdate(
batteryLevel: Float,
batteryStatus: BatteryStatus,
isCharging: Boolean
) {
context.sendEvent(UPDATE_BATTERY_LEVEL.listenerName) {
putMap(
"result",
nativeMapOf {
putDoubleOrNull(this,"batteryLevel", batteryLevel.toDouble())
putString("batteryStatus", mapFromBatteryStatus(batteryStatus))
putBoolean("isCharging", isCharging)
}
)
}
}

override fun onReportLowBatteryWarning() {
context.sendEvent(REPORT_LOW_BATTERY_WARNING.listenerName) {
putString("result", "LOW BATTERY")
}
}

override fun onReportReaderEvent(event: ReaderEvent) {
context.sendEvent(REPORT_READER_EVENT.listenerName) {
putString("result", mapFromReaderEvent(event))
}
}
}
8 changes: 8 additions & 0 deletions ios/Mappers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,14 @@ class Mappers {

return (["collectInputResults": collectInputResults])
}

class func mapFromReaderEvent(_ readerEvent: ReaderEvent) -> String {
switch readerEvent {
case .cardInserted: return "cardInserted"
case .cardRemoved: return "cardRemoved"
@unknown default: return "unknown"
}
}
}

extension UInt {
Expand Down
22 changes: 22 additions & 0 deletions ios/StripeTerminalReactNative.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ enum ReactNativeConstants: String, CaseIterable {
case FORWARD_PAYMENT_INTENT = "didForwardPaymentIntent"
case REPORT_FORWARDING_ERROR = "didReportForwardingError"
case DISCONNECT = "didDisconnect"
case UPDATE_BATTERY_LEVEL = "didUpdateBatteryLevel"
case REPORT_LOW_BATTERY_WARNING = "didReportLowBatteryWarning"
case REPORT_READER_EVENT = "didReportReaderEvent"
}

@objc(StripeTerminalReactNative)
Expand Down Expand Up @@ -1405,4 +1408,23 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe
let result = Errors.createError(nsError: error as NSError)
sendEvent(withName: ReactNativeConstants.REPORT_FORWARDING_ERROR.rawValue, body: ["result": result])
}

func reader(_ reader: Reader, didReportReaderEvent event: ReaderEvent, info: [AnyHashable : Any]?) {
let result = Mappers.mapFromReaderEvent(event)
sendEvent(withName: ReactNativeConstants.REPORT_READER_EVENT.rawValue, body: ["result": result])
}

func reader(_ reader: Reader, didReportBatteryLevel batteryLevel: Float, status: BatteryStatus, isCharging: Bool) {
let result: NSDictionary = [
"batteryLevel": batteryLevel,
"batteryStatus": Mappers.mapFromBatteryStatus(status),
"isCharging": isCharging,
]
sendEvent(withName: ReactNativeConstants.UPDATE_BATTERY_LEVEL.rawValue, body: ["result": result])
}

func readerDidReportLowBatteryWarning(_ reader: Reader) {
let result = "LOW BATTERY"
sendEvent(withName: ReactNativeConstants.REPORT_LOW_BATTERY_WARNING.rawValue, body: ["result": result])
}
}
32 changes: 32 additions & 0 deletions src/components/StripeTerminalProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
PaymentStatus,
OfflineStatus,
PaymentIntent,
ReaderEvent,
} from '../types';
import { StripeTerminalContext } from './StripeTerminalContext';
import { initialize, setConnectionToken } from '../functions';
Expand Down Expand Up @@ -35,6 +36,9 @@ const {
FORWARD_PAYMENT_INTENT,
REPORT_FORWARDING_ERROR,
DISCONNECT,
UPDATE_BATTERY_LEVEL,
REPORT_LOW_BATTERY_WARNING,
REPORT_READER_EVENT,
} = NativeModules.StripeTerminalReactNative.getConstants();

const emitter = new EventEmitter();
Expand Down Expand Up @@ -241,6 +245,30 @@ export function StripeTerminalProvider({
[log]
);

const didUpdateBatteryLevel = useCallback(
({ result }: { result?: Reader.BatteryLevel }) => {
log('didUpdateBatteryLevel', result);
emitter?.emit(UPDATE_BATTERY_LEVEL, result);
},
[log]
);

const didReportLowBatteryWarning = useCallback(
({ result }: { result?: string }) => {
log('didReportLowBatteryWarning', result);
emitter?.emit(REPORT_LOW_BATTERY_WARNING, result);
},
[log]
);

const didReportReaderEvent = useCallback(
({ result }: EventResult<ReaderEvent>) => {
log('didReportReaderEvent', result);
emitter?.emit(REPORT_READER_EVENT, result);
},
[log]
);

useListener(REPORT_AVAILABLE_UPDATE, didReportAvailableUpdate);
useListener(START_INSTALLING_UPDATE, didStartInstallingUpdate);
useListener(REPORT_UPDATE_PROGRESS, didReportReaderSoftwareUpdateProgress);
Expand All @@ -267,6 +295,10 @@ export function StripeTerminalProvider({

useListener(DISCONNECT, didDisconnect);

useListener(UPDATE_BATTERY_LEVEL, didUpdateBatteryLevel);
useListener(REPORT_LOW_BATTERY_WARNING, didReportLowBatteryWarning);
useListener(REPORT_READER_EVENT, didReportReaderEvent);

const tokenProviderHandler = async () => {
try {
const connectionToken = await tokenProvider();
Expand Down
29 changes: 29 additions & 0 deletions src/hooks/useStripeTerminal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import type {
SetupIntent,
OfflineStatus,
CollectInputsParameters,
ReaderEvent,
} from '../types';
import {
discoverReaders,
Expand Down Expand Up @@ -93,6 +94,9 @@ export const {
FORWARD_PAYMENT_INTENT,
REPORT_FORWARDING_ERROR,
DISCONNECT,
UPDATE_BATTERY_LEVEL,
REPORT_LOW_BATTERY_WARNING,
REPORT_READER_EVENT,
} = NativeModules.StripeTerminalReactNative.getConstants();

const NOT_INITIALIZED_ERROR_MESSAGE =
Expand Down Expand Up @@ -154,6 +158,9 @@ export function useStripeTerminal(props?: Props) {
onDidForwardPaymentIntent,
onDidForwardingFailure,
onDidDisconnect,
onDidUpdateBatteryLevel,
onDidReportLowBatteryWarning,
onDidReportReaderEvent,
} = props || {};

const _discoverReaders = useCallback(
Expand Down Expand Up @@ -316,6 +323,24 @@ export function useStripeTerminal(props?: Props) {
[onDidDisconnect]
);

const didUpdateBatteryLevel = useCallback(
({ result }: { result: Reader.BatteryLevel }) => {
onDidUpdateBatteryLevel?.(result);
},
[onDidUpdateBatteryLevel]
);

const didReportLowBatteryWarning = useCallback(() => {
onDidReportLowBatteryWarning?.();
}, [onDidReportLowBatteryWarning]);

const didReportReaderEvent = useCallback(
({ result }: { result: ReaderEvent }) => {
onDidReportReaderEvent?.(result);
},
[onDidReportReaderEvent]
);

useListener(REPORT_AVAILABLE_UPDATE, didReportAvailableUpdate);
useListener(START_INSTALLING_UPDATE, didStartInstallingUpdate);
useListener(REPORT_UPDATE_PROGRESS, didReportReaderSoftwareUpdateProgress);
Expand All @@ -342,6 +367,10 @@ export function useStripeTerminal(props?: Props) {

useListener(DISCONNECT, didDisconnect);

useListener(UPDATE_BATTERY_LEVEL, didUpdateBatteryLevel);
useListener(REPORT_LOW_BATTERY_WARNING, didReportLowBatteryWarning);
useListener(REPORT_READER_EVENT, didReportReaderEvent);

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

export type BatteryStatus = 'critical' | 'low' | 'nominal' | 'unknown';

export type BatteryLevel = {
batteryLevel: number;
batteryStatus: BatteryStatus;
isCharging: boolean;
};

export type NetworkStatus = 'offline' | 'online';

export type SoftwareUpdate = {
Expand Down
6 changes: 6 additions & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ export type OfflineStatus = {
reader?: OfflineStatusDetails;
};

export type ReaderEvent = 'cardInserted' | 'cardRemoved';

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

/**
Expand Down Expand Up @@ -353,6 +355,10 @@ export type UserCallbacks = {
onDidForwardingFailure?(error?: StripeError): void;

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

onDidUpdateBatteryLevel?(result: Reader.BatteryLevel): void;
onDidReportLowBatteryWarning?(): void;
onDidReportReaderEvent?(event: ReaderEvent): void;
};

export namespace PaymentMethod {
Expand Down

0 comments on commit 4084634

Please sign in to comment.