From dd54dd23bdcab959d865f5219c4390a754471797 Mon Sep 17 00:00:00 2001 From: Arek Kubaczkowski Date: Thu, 24 Feb 2022 11:19:51 +0100 Subject: [PATCH 1/7] chore: handle other connection methods --- .../com/stripeterminalreactnative/Mappers.kt | 7 ++ .../StripeTerminalReactNativeModule.kt | 106 ++++++++++++++++++ example/src/screens/DiscoverReadersScreen.tsx | 62 +++++++++- example/src/screens/DiscoveryMethodScreen.tsx | 33 ++++-- example/src/screens/HomeScreen.tsx | 6 + src/StripeTerminalSdk.tsx | 19 +++- src/functions.ts | 84 +++++++++++++- src/hooks/useStripeTerminal.tsx | 56 +++++++++ src/types/Reader.ts | 24 ++-- src/types/index.ts | 24 ++-- 10 files changed, 387 insertions(+), 34 deletions(-) diff --git a/android/src/main/java/com/stripeterminalreactnative/Mappers.kt b/android/src/main/java/com/stripeterminalreactnative/Mappers.kt index 3371e0bf..ad809c51 100644 --- a/android/src/main/java/com/stripeterminalreactnative/Mappers.kt +++ b/android/src/main/java/com/stripeterminalreactnative/Mappers.kt @@ -199,6 +199,13 @@ internal fun mapFromReaderInputOptions(options: ReaderInputOptions): WritableArr return mappedOptions } +internal fun mapFromReaderEvent(event: ReaderEvent): String { + return when (event) { + ReaderEvent.CARD_INSERTED -> "cardInserted" + ReaderEvent.CARD_REMOVED -> "cardRemoved" + } +} + internal fun mapFromReaderDisplayMessage(message: ReaderDisplayMessage): String { return when (message) { ReaderDisplayMessage.CHECK_MOBILE_DEVICE -> "checkMobileDevice" diff --git a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt index 3db65f80..30d3721e 100644 --- a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt +++ b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt @@ -20,6 +20,7 @@ import com.stripe.stripeterminal.external.callable.BluetoothReaderListener import com.stripe.stripeterminal.external.callable.Callback import com.stripe.stripeterminal.external.callable.Cancelable import com.stripe.stripeterminal.external.callable.DiscoveryListener +import com.stripe.stripeterminal.external.callable.HandoffReaderListener import com.stripe.stripeterminal.external.callable.LocationListCallback import com.stripe.stripeterminal.external.callable.PaymentIntentCallback import com.stripe.stripeterminal.external.callable.PaymentMethodCallback @@ -41,6 +42,7 @@ import com.stripe.stripeterminal.external.models.PaymentStatus import com.stripe.stripeterminal.external.models.ReadReusableCardParameters import com.stripe.stripeterminal.external.models.Reader import com.stripe.stripeterminal.external.models.ReaderDisplayMessage +import com.stripe.stripeterminal.external.models.ReaderEvent import com.stripe.stripeterminal.external.models.ReaderInputOptions import com.stripe.stripeterminal.external.models.ReaderSoftwareUpdate import com.stripe.stripeterminal.external.models.Refund @@ -263,6 +265,110 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : }) } + @ReactMethod + fun connectLocalMobileReader(params: ReadableMap, promise: Promise) { + val readerId = requireParam(params.getString("readerId")) { + "You must provide readerId" + } + + val selectedReader = requireParam(discoveredReadersList.find { + it.serialNumber == readerId + }) { + "Could not find reader with id $readerId" + } + + val locationId = params.getString("locationId") ?: selectedReader.location?.id.orEmpty() + + Terminal.getInstance().connectLocalMobileReader( + selectedReader, + ConnectionConfiguration.LocalMobileConnectionConfiguration(locationId), + object : ReaderCallback { + override fun onSuccess(reader: Reader) { + promise.resolve(nativeMapOf { + putMap("reader", mapFromReader(reader)) + }) + } + + override fun onFailure(e: TerminalException) { + promise.resolve(createError(e)) + } + } + ) + } + + @ReactMethod + fun connectEmbeddedReader(params: ReadableMap, promise: Promise) = + withExceptionResolver(promise) { + val readerId = requireParam(params.getString("readerId")) { + "You must provide readerId" + } + + val selectedReader = requireParam(discoveredReadersList.find { + it.serialNumber == readerId + }) { + "Could not find reader with id $readerId" + } + + val locationId = params.getString("locationId") ?: selectedReader.location?.id.orEmpty() + + Terminal.getInstance().connectEmbeddedReader( + selectedReader, + ConnectionConfiguration.EmbeddedConnectionConfiguration(locationId), + object : ReaderCallback { + override fun onSuccess(reader: Reader) { + promise.resolve(nativeMapOf { + putMap("reader", mapFromReader(reader)) + }) + } + + override fun onFailure(e: TerminalException) { + promise.resolve(e) + } + } + ) + } + + @ReactMethod + fun connectHandoffReader(params: ReadableMap, promise: Promise) = + withExceptionResolver(promise) { + val readerId = requireParam(params.getString("readerId")) { + "You must provide readerId" + } + + val selectedReader = requireParam(discoveredReadersList.find { + it.serialNumber == readerId + }) { + "Could not find reader with id $readerId" + } + + val locationId = params.getString("locationId") ?: selectedReader.location?.id.orEmpty() + + val listener: HandoffReaderListener = object : HandoffReaderListener { + override fun onReportReaderEvent(event: ReaderEvent) { + sendEvent("didRequestReaderInput", nativeMapOf { + putString("event", mapFromReaderEvent(event)) + }) + } + } + + Terminal.getInstance().connectHandoffReader( + selectedReader, + ConnectionConfiguration.HandoffConnectionConfiguration(locationId), + listener, + object : ReaderCallback { + override fun onSuccess(reader: Reader) { + promise.resolve(nativeMapOf { + putMap("reader", mapFromReader(reader)) + }) + } + + override fun onFailure(e: TerminalException) { + promise.resolve(createError(e)) + } + } + ) + } + @ReactMethod @Suppress("unused") fun connectBluetoothReader(params: ReadableMap, promise: Promise) = diff --git a/example/src/screens/DiscoverReadersScreen.tsx b/example/src/screens/DiscoverReadersScreen.tsx index f1ebbd51..ae2ebd4c 100644 --- a/example/src/screens/DiscoverReadersScreen.tsx +++ b/example/src/screens/DiscoverReadersScreen.tsx @@ -49,6 +49,9 @@ export default function DiscoverReadersScreen() { connectInternetReader, connectUsbReader, simulateReaderUpdate, + connectEmbeddedReader, + connectLocalMobileReader, + connectHandoffReader, } = useStripeTerminal({ onFinishDiscoveringReaders: (finishError) => { if (finishError) { @@ -152,7 +155,16 @@ export default function DiscoverReadersScreen() { discoveryMethod === 'bluetoothScan' || discoveryMethod === 'bluetoothProximity' ) { - const result = await handleConnectBluetoothReader(reader); + const { error } = await handleConnectBluetoothReader(reader); + error = result.error; + } else if (discoveryMethod === 'localMobile') { + const { error } = await handleConnectLocalMobileReader(id); + error = result.error; + } else if (discoveryMethod === 'handoff') { + const { error } = await handleConnectHandoffReader(id); + error = result.error; + } else if (discoveryMethod === 'embedded') { + const { error } = await handleConnectEmbeddedReader(id); error = result.error; } else if (discoveryMethod === 'usb') { const result = await handleConnectUsbReader(reader); @@ -166,6 +178,54 @@ export default function DiscoverReadersScreen() { } }; + const handleConnectEmbeddedReader = async (id: string) => { + setConnectingReaderId(id); + + const { reader, error } = await connectEmbeddedReader({ + readerId: id, + locationId: selectedLocation?.id, + }); + + if (error) { + console.log('connectEmbeddedReader error:', error); + } else { + console.log('Reader connected successfully', reader); + } + return { error }; + }; + + const handleConnectHandoffReader = async (id: string) => { + setConnectingReaderId(id); + + const { reader, error } = await connectHandoffReader({ + readerId: id, + locationId: selectedLocation?.id, + }); + + if (error) { + console.log('connectHandoffReader error:', error); + } else { + console.log('Reader connected successfully', reader); + } + return { error }; + }; + + const handleConnectLocalMobileReader = async (id: string) => { + setConnectingReaderId(id); + + const { reader, error } = await connectLocalMobileReader({ + readerId: id, + locationId: selectedLocation?.id, + }); + + if (error) { + console.log('connectLocalMobileReader error:', error); + } else { + console.log('Reader connected successfully', reader); + } + return { error }; + }; + const handleConnectBluetoothReader = async (reader: Reader.Type) => { setConnectingReader(reader); diff --git a/example/src/screens/DiscoveryMethodScreen.tsx b/example/src/screens/DiscoveryMethodScreen.tsx index 3b1f99a2..bfbee63c 100644 --- a/example/src/screens/DiscoveryMethodScreen.tsx +++ b/example/src/screens/DiscoveryMethodScreen.tsx @@ -1,6 +1,6 @@ import { RouteProp, useNavigation, useRoute } from '@react-navigation/core'; import React from 'react'; -import { StyleSheet, Text, View } from 'react-native'; +import { Platform, StyleSheet, Text, View } from 'react-native'; import type { Reader } from 'stripe-terminal-react-native'; import { colors } from '../colors'; import ListItem from '../components/ListItem'; @@ -28,14 +28,7 @@ export default function DiscoveryMethodScreen() { Discover a reader by scanning for Bluetooth or Bluetooth LE devices. - onSelect('bluetoothProximity')} - title="Bluetooth Proximity" - /> - - Discover a reader by holding it next to the iOS device (only supported - for the BBPOS Chipper 2X BT). - + { 'Note: the Stripe Terminal SDK can discover supported readers automatically - you should not connect to the reader in the iOS Settings > Bluetooth page.' @@ -51,6 +44,28 @@ export default function DiscoveryMethodScreen() { Discover a reader connected to this device via USB. + + {Platform.OS === 'android' ? ( + <> + onSelect('embedded')} title="Embedded" /> + onSelect('handoff')} title="Handoff" /> + onSelect('localMobile')} + title="Local mobile" + /> + + ) : ( + <> + onSelect('bluetoothProximity')} + title="Bluetooth Proximity" + /> + + Discover a reader by holding it next to the iOS device (only + supported for the BBPOS Chipper 2X BT). + + + )} ); } diff --git a/example/src/screens/HomeScreen.tsx b/example/src/screens/HomeScreen.tsx index 394241d7..28591d5c 100644 --- a/example/src/screens/HomeScreen.tsx +++ b/example/src/screens/HomeScreen.tsx @@ -153,6 +153,12 @@ function mapFromDiscoveryMethod(method: Reader.DiscoveryMethod) { return 'Bluetooth Proximity'; case 'internet': return 'Internet'; + case 'embedded': + return 'Embedded'; + case 'handoff': + return 'Handoff'; + case 'localMobile': + return 'Local mobile'; case 'usb': return 'USB'; default: diff --git a/src/StripeTerminalSdk.tsx b/src/StripeTerminalSdk.tsx index 9c9a652e..84d53269 100644 --- a/src/StripeTerminalSdk.tsx +++ b/src/StripeTerminalSdk.tsx @@ -5,11 +5,9 @@ import type { DiscoverReadersParams, DiscoverReadersResultType, CancelDiscoveringResultType, - ConnectBluetoothReaderResultType, ConnectBluetoothReaderParams, DisconnectReaderResultType, Reader, - ConnectInternetResultType, ConnectInternetReaderParams, ConnectUsbReaderResultType, ConnectUsbReaderParams, @@ -28,6 +26,10 @@ import type { ReadReusableCardParamsType, PaymentMethodResultType, SetConnectionTokenParams, + ConnectHandoffParams, + ConnectEmbeddedParams, + ConnectLocalMobileParams, + ConnectReaderResultType, } from './types'; const { StripeTerminalReactNative } = NativeModules; @@ -49,11 +51,20 @@ type StripeTerminalSdkType = { // Connect to reader via bluetooth connectBluetoothReader( params: ConnectBluetoothReaderParams - ): Promise; + ): Promise; // Connect to reader via internet connectInternetReader( params: ConnectInternetReaderParams - ): Promise; + ): Promise; + connectHandoffReader( + params: ConnectHandoffParams + ): Promise; + connectEmbeddedReader( + params: ConnectEmbeddedParams + ): Promise; + connectLocalMobileReader( + params: ConnectLocalMobileParams + ): Promise; // Connect to reader via USB connectUsbReader( params: ConnectUsbReaderParams diff --git a/src/functions.ts b/src/functions.ts index b282ac12..9ad67e78 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -6,7 +6,6 @@ import type { DiscoverReadersResultType, ConnectBluetoothReaderParams, CancelDiscoveringResultType, - ConnectBluetoothReaderResultType, DisconnectReaderResultType, ConnectInternetReaderParams, ConnectInternetResultType, @@ -27,6 +26,10 @@ import type { PaymentMethodResultType, ReadReusableCardParamsType, ProcessRefundResultType, + ConnectLocalMobileParams, + ConnectReaderResultType, + ConnectHandoffParams, + ConnectEmbeddedParams, } from './types'; export async function initialize( @@ -96,7 +99,7 @@ export async function cancelDiscovering(): Promise export async function connectBluetoothReader( params: ConnectBluetoothReaderParams -): Promise { +): Promise { try { const { error, reader } = await StripeTerminalSdk.connectBluetoothReader( params @@ -119,9 +122,84 @@ export async function connectBluetoothReader( } } +export async function connectHandoffReader( + params: ConnectHandoffParams +): Promise { + try { + const { error, reader } = await StripeTerminalSdk.connectHandoffReader( + params + ); + + if (error) { + return { + error, + reader: undefined, + }; + } + return { + reader: reader!, + error: undefined, + }; + } catch (error) { + return { + error: error as any, + }; + } +} + +export async function connectEmbeddedReader( + params: ConnectEmbeddedParams +): Promise { + try { + const { error, reader } = await StripeTerminalSdk.connectEmbeddedReader( + params + ); + + if (error) { + return { + error, + reader: undefined, + }; + } + return { + reader: reader!, + error: undefined, + }; + } catch (error) { + return { + error: error as any, + }; + } +} + +export async function connectLocalMobileReader( + params: ConnectLocalMobileParams +): Promise { + try { + const { error, reader } = await StripeTerminalSdk.connectLocalMobileReader( + params + ); + + if (error) { + return { + error, + reader: undefined, + }; + } + return { + reader: reader!, + error: undefined, + }; + } catch (error) { + return { + error: error as any, + }; + } +} + export async function connectInternetReader( params: ConnectInternetReaderParams -): Promise { +): Promise { try { const { error, reader } = await StripeTerminalSdk.connectInternetReader( params diff --git a/src/hooks/useStripeTerminal.tsx b/src/hooks/useStripeTerminal.tsx index 597d439c..09fff13c 100644 --- a/src/hooks/useStripeTerminal.tsx +++ b/src/hooks/useStripeTerminal.tsx @@ -13,6 +13,8 @@ import type { RefundParams, ReadReusableCardParamsType, InitParams, + ConnectEmbeddedParams, + ConnectLocalMobileParams, UserCallbacks, } from '../types'; import { @@ -45,6 +47,9 @@ import { cancelCollectPaymentMethod, cancelCollectSetupIntent, cancelReadReusableCard, + connectEmbeddedReader, + connectHandoffReader, + connectLocalMobileReader, } from '../functions'; import { StripeTerminalContext } from '../components/StripeTerminalContext'; import { useListener } from './useListener'; @@ -211,6 +216,54 @@ export function useStripeTerminal(props?: Props) { [setConnectedReader, setLoading] ); + const _connectEmbeddedReader = useCallback( + async (params: ConnectEmbeddedParams) => { + setLoading(true); + + const response = await connectEmbeddedReader(params); + + if (response.reader) { + setConnectedReader(response.reader); + } + setLoading(false); + + return response; + }, + [setConnectedReader, setLoading] + ); + + const _connectLocalMobileReader = useCallback( + async (params: ConnectLocalMobileParams) => { + setLoading(true); + + const response = await connectLocalMobileReader(params); + + if (response.reader) { + setConnectedReader(response.reader); + } + setLoading(false); + + return response; + }, + [setConnectedReader, setLoading] + ); + + const _connectHandoffReader = useCallback( + async (params: ConnectEmbeddedParams) => { + setLoading(true); + + const response = await connectHandoffReader(params); + + if (response.reader) { + setConnectedReader(response.reader); + } + setLoading(false); + + return response; + }, + [setConnectedReader, setLoading] + ); + const _disconnectReader = useCallback(async () => { setLoading(true); @@ -528,6 +581,9 @@ export function useStripeTerminal(props?: Props) { cancelCollectPaymentMethod: _cancelCollectPaymentMethod, cancelCollectSetupIntent: _cancelCollectSetupIntent, cancelReadReusableCard: _cancelReadReusableCard, + connectEmbeddedReader: _connectEmbeddedReader, + connectHandoffReader: _connectHandoffReader, + connectLocalMobileReader: _connectLocalMobileReader, emitter: emitter, discoveredReaders, connectedReader, diff --git a/src/types/Reader.ts b/src/types/Reader.ts index d5887389..6f69f6bd 100644 --- a/src/types/Reader.ts +++ b/src/types/Reader.ts @@ -1,6 +1,8 @@ import type { Location, LocationStatus } from './'; export namespace Reader { + export type DiscoveryMethod = IOS.DiscoveryMethod | Android.DiscoveryMethod; + export type Type = IOS.Type & Android.Type & { id: string; @@ -23,6 +25,11 @@ export namespace Reader { batteryStatus: BatteryStatus; isCharging?: number; }; + + export type DiscoveryMethod = + | 'bluetoothProximity' + | 'bluetoothScan' + | 'internet'; } export namespace Android { @@ -39,6 +46,14 @@ export namespace Reader { settingsVersion?: string; pinKeysetId?: string; }; + + export type DiscoveryMethod = + | 'bluetoothScan' + | 'internet' + | 'embedded' + | 'localMobile' + | 'handoff' + | 'usb'; } export type BatteryStatus = 'critical' | 'low' | 'nominal' | 'unknown'; @@ -57,15 +72,6 @@ export namespace Reader { | 'estimate5To15Minutes' | 'estimateLessThan1Minute'; - export type DiscoveryMethod = - | 'bluetoothProximity' - | 'bluetoothScan' - | 'internet' - | 'embedded' - | 'localMobile' - | 'handoff' - | 'usb'; - export type SimulateUpdateType = | 'random' | 'available' diff --git a/src/types/index.ts b/src/types/index.ts index af9e0f45..ba97a610 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -42,6 +42,21 @@ export type ConnectUsbReaderParams = { locationId?: string; }; +export type ConnectLocalMobileParams = { + readerId: string; + locationId?: string; +}; + +export type ConnectHandoffParams = { + readerId: string; + locationId?: string; +}; + +export type ConnectEmbeddedParams = { + readerId: string; + locationId?: string; +}; + export type LineItem = { displayName: string; quantity: number; @@ -88,14 +103,7 @@ export type CancelDiscoveringResultType = Promise<{ error?: StripeError; }>; -export type ConnectBluetoothReaderResultType = - | { - reader: Reader.Type; - error?: undefined; - } - | { reader?: undefined; error: StripeError }; - -export type ConnectInternetResultType = +export type ConnectReaderResultType = | { reader: Reader.Type; error?: undefined; From 3ac88942767b4f9bea31dae6f063190ad22c2d05 Mon Sep 17 00:00:00 2001 From: Arek Kubaczkowski Date: Thu, 24 Feb 2022 11:57:26 +0100 Subject: [PATCH 2/7] chore: add proper e2e tests --- e2e/app.e2e.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/e2e/app.e2e.js b/e2e/app.e2e.js index 95c25e6c..e5bdee63 100644 --- a/e2e/app.e2e.js +++ b/e2e/app.e2e.js @@ -50,6 +50,9 @@ describe('Payments', () => { }); it('Change discovery method to bluetooth proximity', async () => { + if (device.getPlatform() !== 'android') { + return; + } await changeDiscoveryMethod('Bluetooth Proximity'); }); @@ -57,6 +60,27 @@ describe('Payments', () => { await changeDiscoveryMethod('Internet'); }); + it('Change discovery method to Embedded', async () => { + if (device.getPlatform() !== 'ios') { + return; + } + await changeDiscoveryMethod('Embedded'); + }); + + it('Change discovery method to LocalMobile', async () => { + if (device.getPlatform() !== 'ios') { + return; + } + await changeDiscoveryMethod('LocalMobile'); + }); + + it('Change discovery method to Handoff', async () => { + if (device.getPlatform() !== 'ios') { + return; + } + await changeDiscoveryMethod('Handoff'); + }); + // temporary skipped due to bug in stripe-termina-ios that connects the device despite an error. // it('Required update impossible due to low battery', async () => { From b5417e72c762951bd04eb5fa9ce3e14008e295ba Mon Sep 17 00:00:00 2001 From: Arek Kubaczkowski Date: Thu, 24 Feb 2022 12:27:25 +0100 Subject: [PATCH 3/7] fix: e2e tests --- e2e/app.e2e.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/e2e/app.e2e.js b/e2e/app.e2e.js index e5bdee63..7c789803 100644 --- a/e2e/app.e2e.js +++ b/e2e/app.e2e.js @@ -50,7 +50,7 @@ describe('Payments', () => { }); it('Change discovery method to bluetooth proximity', async () => { - if (device.getPlatform() !== 'android') { + if (device.getPlatform() !== 'ios') { return; } await changeDiscoveryMethod('Bluetooth Proximity'); @@ -61,21 +61,21 @@ describe('Payments', () => { }); it('Change discovery method to Embedded', async () => { - if (device.getPlatform() !== 'ios') { + if (device.getPlatform() !== 'android') { return; } await changeDiscoveryMethod('Embedded'); }); it('Change discovery method to LocalMobile', async () => { - if (device.getPlatform() !== 'ios') { + if (device.getPlatform() !== 'android') { return; } await changeDiscoveryMethod('LocalMobile'); }); it('Change discovery method to Handoff', async () => { - if (device.getPlatform() !== 'ios') { + if (device.getPlatform() !== 'android') { return; } await changeDiscoveryMethod('Handoff'); From 4d70fa1135563fb8a3f2aec0bbaaef16f075f137 Mon Sep 17 00:00:00 2001 From: Arek Kubaczkowski Date: Thu, 24 Feb 2022 12:53:14 +0100 Subject: [PATCH 4/7] fix: e2e test --- e2e/app.e2e.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/app.e2e.js b/e2e/app.e2e.js index 7c789803..e131b1d0 100644 --- a/e2e/app.e2e.js +++ b/e2e/app.e2e.js @@ -71,7 +71,7 @@ describe('Payments', () => { if (device.getPlatform() !== 'android') { return; } - await changeDiscoveryMethod('LocalMobile'); + await changeDiscoveryMethod('Local mobile'); }); it('Change discovery method to Handoff', async () => { From 784e8aa781bf6f676c72ea07d2112be176d3de98 Mon Sep 17 00:00:00 2001 From: Arek Kubaczkowski Date: Tue, 22 Mar 2022 09:29:45 +0100 Subject: [PATCH 5/7] fix methods params --- example/src/screens/DiscoverReadersScreen.tsx | 12 ++++++------ src/types/index.ts | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/example/src/screens/DiscoverReadersScreen.tsx b/example/src/screens/DiscoverReadersScreen.tsx index ae2ebd4c..5e5c1f1d 100644 --- a/example/src/screens/DiscoverReadersScreen.tsx +++ b/example/src/screens/DiscoverReadersScreen.tsx @@ -181,8 +181,8 @@ export default function DiscoverReadersScreen() { const handleConnectEmbeddedReader = async (id: string) => { setConnectingReaderId(id); - const { reader, error } = await connectEmbeddedReader({ - readerId: id, + const { reader: connectedReader, error } = await connectEmbeddedReader({ + reader, locationId: selectedLocation?.id, }); @@ -197,8 +197,8 @@ export default function DiscoverReadersScreen() { const handleConnectHandoffReader = async (id: string) => { setConnectingReaderId(id); - const { reader, error } = await connectHandoffReader({ - readerId: id, + const { reader: connectedReader, error } = await connectHandoffReader({ + reader, locationId: selectedLocation?.id, }); @@ -213,8 +213,8 @@ export default function DiscoverReadersScreen() { const handleConnectLocalMobileReader = async (id: string) => { setConnectingReaderId(id); - const { reader, error } = await connectLocalMobileReader({ - readerId: id, + const { reader: connectedReader, error } = await connectLocalMobileReader({ + reader, locationId: selectedLocation?.id, }); diff --git a/src/types/index.ts b/src/types/index.ts index ba97a610..b0259087 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -43,17 +43,17 @@ export type ConnectUsbReaderParams = { }; export type ConnectLocalMobileParams = { - readerId: string; + reader: Reader.Type; locationId?: string; }; export type ConnectHandoffParams = { - readerId: string; + reader: Reader.Type; locationId?: string; }; export type ConnectEmbeddedParams = { - readerId: string; + reader: Reader.Type; locationId?: string; }; From deecfb05628fe4ea7e400523ddd73beffafd9e34 Mon Sep 17 00:00:00 2001 From: David Henry Date: Wed, 23 Mar 2022 16:23:48 -0400 Subject: [PATCH 6/7] rebase fixes --- .../com/stripeterminalreactnative/Mappers.kt | 8 +++--- .../StripeTerminalReactNativeModule.kt | 9 +------ example/src/screens/DiscoverReadersScreen.tsx | 26 +++++++++---------- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/android/src/main/java/com/stripeterminalreactnative/Mappers.kt b/android/src/main/java/com/stripeterminalreactnative/Mappers.kt index ad809c51..da9baa86 100644 --- a/android/src/main/java/com/stripeterminalreactnative/Mappers.kt +++ b/android/src/main/java/com/stripeterminalreactnative/Mappers.kt @@ -200,10 +200,10 @@ internal fun mapFromReaderInputOptions(options: ReaderInputOptions): WritableArr } internal fun mapFromReaderEvent(event: ReaderEvent): String { - return when (event) { - ReaderEvent.CARD_INSERTED -> "cardInserted" - ReaderEvent.CARD_REMOVED -> "cardRemoved" - } + return when (event) { + ReaderEvent.CARD_INSERTED -> "cardInserted" + ReaderEvent.CARD_REMOVED -> "cardRemoved" + } } internal fun mapFromReaderDisplayMessage(message: ReaderDisplayMessage): String { diff --git a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt index 30d3721e..aa3718ee 100644 --- a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt +++ b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt @@ -389,10 +389,6 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : "You must provide a locationId" } - val connectionConfig = ConnectionConfiguration.BluetoothConnectionConfiguration( - locationId - ) - val listener: BluetoothReaderListener = object : BluetoothReaderListener { override fun onReportAvailableUpdate(update: ReaderSoftwareUpdate) { sendEvent(REPORT_AVAILABLE_UPDATE.listenerName) { @@ -446,7 +442,7 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : terminal.connectBluetoothReader( selectedReader, - connectionConfig, + ConnectionConfiguration.BluetoothConnectionConfiguration(locationId), listener, object : ReaderCallback { override fun onSuccess(reader: Reader) { @@ -567,9 +563,6 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : sendEvent(REQUEST_READER_DISPLAY_MESSAGE.listenerName) { putString("result", mapFromReaderDisplayMessage(message)) } - sendEvent(REQUEST_READER_DISPLAY_MESSAGE.listenerName) { - putString("result", mapFromReaderDisplayMessage(message)) - } } } diff --git a/example/src/screens/DiscoverReadersScreen.tsx b/example/src/screens/DiscoverReadersScreen.tsx index 5e5c1f1d..7b527802 100644 --- a/example/src/screens/DiscoverReadersScreen.tsx +++ b/example/src/screens/DiscoverReadersScreen.tsx @@ -155,16 +155,16 @@ export default function DiscoverReadersScreen() { discoveryMethod === 'bluetoothScan' || discoveryMethod === 'bluetoothProximity' ) { - const { error } = await handleConnectBluetoothReader(reader); + const result = await handleConnectBluetoothReader(reader); error = result.error; } else if (discoveryMethod === 'localMobile') { - const { error } = await handleConnectLocalMobileReader(id); + const result = await handleConnectLocalMobileReader(reader); error = result.error; } else if (discoveryMethod === 'handoff') { - const { error } = await handleConnectHandoffReader(id); + const result = await handleConnectHandoffReader(reader); error = result.error; } else if (discoveryMethod === 'embedded') { - const { error } = await handleConnectEmbeddedReader(id); + const result = await handleConnectEmbeddedReader(reader); error = result.error; } else if (discoveryMethod === 'usb') { const result = await handleConnectUsbReader(reader); @@ -178,8 +178,8 @@ export default function DiscoverReadersScreen() { } }; - const handleConnectEmbeddedReader = async (id: string) => { - setConnectingReaderId(id); + const handleConnectEmbeddedReader = async (reader: Reader.Type) => { + setConnectingReader(reader); const { reader: connectedReader, error } = await connectEmbeddedReader({ reader, @@ -189,13 +189,13 @@ export default function DiscoverReadersScreen() { if (error) { console.log('connectEmbeddedReader error:', error); } else { - console.log('Reader connected successfully', reader); + console.log('Reader connected successfully', connectedReader); } return { error }; }; - const handleConnectHandoffReader = async (id: string) => { - setConnectingReaderId(id); + const handleConnectHandoffReader = async (reader: Reader.Type) => { + setConnectingReader(reader); const { reader: connectedReader, error } = await connectHandoffReader({ reader, @@ -205,13 +205,13 @@ export default function DiscoverReadersScreen() { if (error) { console.log('connectHandoffReader error:', error); } else { - console.log('Reader connected successfully', reader); + console.log('Reader connected successfully', connectedReader); } return { error }; }; - const handleConnectLocalMobileReader = async (id: string) => { - setConnectingReaderId(id); + const handleConnectLocalMobileReader = async (reader: Reader.Type) => { + setConnectingReader(reader); const { reader: connectedReader, error } = await connectLocalMobileReader({ reader, @@ -221,7 +221,7 @@ export default function DiscoverReadersScreen() { if (error) { console.log('connectLocalMobileReader error:', error); } else { - console.log('Reader connected successfully', reader); + console.log('Reader connected successfully', connectedReader); } return { error }; }; From e447a76aab6c861353e069491c01fc1cdc76449d Mon Sep 17 00:00:00 2001 From: David Henry Date: Wed, 23 Mar 2022 18:18:07 -0400 Subject: [PATCH 7/7] rebase fix --- src/functions.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/functions.ts b/src/functions.ts index 9ad67e78..de45910d 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -8,7 +8,6 @@ import type { CancelDiscoveringResultType, DisconnectReaderResultType, ConnectInternetReaderParams, - ConnectInternetResultType, ConnectUsbReaderParams, ConnectUsbReaderResultType, CreatePaymentIntentParams,