@capacitor-community/stripe-terminal 6.1.0 → 6.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +303 -34
  2. package/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminal.java +267 -49
  3. package/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminalPlugin.java +30 -0
  4. package/android/src/main/java/com/getcapacitor/community/stripe/terminal/TerminalEvent.kt +3 -0
  5. package/android/src/main/java/com/getcapacitor/community/stripe/terminal/helper/TerminalMappers.java +96 -0
  6. package/dist/docs.json +431 -66
  7. package/dist/esm/definitions.d.ts +94 -5
  8. package/dist/esm/definitions.js.map +1 -1
  9. package/dist/esm/events.enum.d.ts +4 -1
  10. package/dist/esm/events.enum.js +3 -0
  11. package/dist/esm/events.enum.js.map +1 -1
  12. package/dist/esm/stripe-types/proto.d.ts +501 -0
  13. package/dist/esm/stripe-types/proto.js +2 -0
  14. package/dist/esm/stripe-types/proto.js.map +1 -0
  15. package/dist/esm/stripe.enum.d.ts +51 -0
  16. package/dist/esm/stripe.enum.js +55 -0
  17. package/dist/esm/stripe.enum.js.map +1 -1
  18. package/dist/esm/terminalMappers.d.ts +23 -0
  19. package/dist/esm/terminalMappers.js +119 -0
  20. package/dist/esm/terminalMappers.js.map +1 -0
  21. package/dist/esm/web.d.ts +20 -2
  22. package/dist/esm/web.js +134 -13
  23. package/dist/esm/web.js.map +1 -1
  24. package/dist/plugin.cjs.js +308 -13
  25. package/dist/plugin.cjs.js.map +1 -1
  26. package/dist/plugin.js +309 -15
  27. package/dist/plugin.js.map +1 -1
  28. package/ios/Plugin/StripeTerminal.swift +248 -63
  29. package/ios/Plugin/StripeTerminalPlugin.m +6 -0
  30. package/ios/Plugin/StripeTerminalPlugin.swift +25 -4
  31. package/ios/Plugin/TerminalEvents.swift +3 -0
  32. package/ios/Plugin/TerminalMappers.swift +127 -0
  33. package/package.json +4 -1
@@ -2,20 +2,24 @@ import Foundation
2
2
  import Capacitor
3
3
  import StripeTerminal
4
4
 
5
- public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDelegate, BluetoothReaderDelegate, TerminalDelegate {
5
+ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDelegate, BluetoothReaderDelegate, TerminalDelegate, ReconnectionDelegate {
6
6
 
7
7
  weak var plugin: StripeTerminalPlugin?
8
8
  private let apiClient = APIClient()
9
+
9
10
  var discoverCancelable: Cancelable?
11
+ var collectCancelable: Cancelable?
12
+ var installUpdateCancelable: Cancelable?
13
+ var cancelReaderConnectionCancellable: Cancelable?
14
+
10
15
  var discoverCall: CAPPluginCall?
11
16
  var locationId: String?
12
17
  var isTest: Bool?
13
- var collectCancelable: Cancelable?
14
18
  var type: DiscoveryMethod?
15
19
  var isInitialize: Bool = false
16
20
  var paymentIntent: PaymentIntent?
17
21
 
18
- var readers: [Reader]?
22
+ var discoveredReadersList: [Reader]?
19
23
 
20
24
  @objc public func initialize(_ call: CAPPluginCall) {
21
25
  self.isTest = call.getBool("isTest", true)
@@ -61,38 +65,21 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
61
65
  call.reject(error.localizedDescription)
62
66
  self.discoverCall = nil
63
67
  } else {
68
+ // This call is passed to discoverCall. So not resolve.
64
69
  }
65
70
  }
66
71
  }
67
72
 
68
- func cancelDiscoverReaders(_ call: CAPPluginCall) {
69
-
70
- if let cancelable = self.discoverCancelable {
71
- cancelable.cancel { error in
72
- if let error = error {
73
- call.reject(error.localizedDescription)
74
- } else {
75
- self.collectCancelable = nil
76
- call.resolve()
77
- }
78
- }
79
- return
80
- }
81
-
82
- call.resolve()
83
- }
84
-
85
73
  public func terminal(_ terminal: Terminal, didUpdateDiscoveredReaders readers: [Reader]) {
86
74
  var readersJSObject: JSArray = []
87
75
  var i = 0
88
76
  for reader in readers {
89
77
  readersJSObject.append([
90
- "index": i,
91
- "serialNumber": reader.serialNumber
92
- ])
78
+ "index": i
79
+ ].merging(self.convertReaderInterface(reader: reader)) { (_, new) in new })
93
80
  i += 1
94
81
  }
95
- self.readers = readers
82
+ self.discoveredReadersList = readers
96
83
 
97
84
  self.plugin?.notifyListeners(TerminalEvents.DiscoveredReaders.rawValue, data: ["readers": readersJSObject])
98
85
  self.discoverCall?.resolve([
@@ -113,9 +100,7 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
113
100
 
114
101
  public func getConnectedReader(_ call: CAPPluginCall) {
115
102
  if let reader = Terminal.shared.connectedReader {
116
- call.resolve(["reader": [
117
- "serialNumber": reader.serialNumber
118
- ]])
103
+ call.resolve(["reader": self.convertReaderInterface(reader: reader)])
119
104
  } else {
120
105
  call.resolve(["reader": nil])
121
106
  }
@@ -140,11 +125,25 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
140
125
  }
141
126
 
142
127
  private func connectLocalMobileReader(_ call: CAPPluginCall) {
143
- let connectionConfig = try! LocalMobileConnectionConfigurationBuilder.init(locationId: self.locationId!).build()
128
+ let autoReconnectOnUnexpectedDisconnect = call.getBool("autoReconnectOnUnexpectedDisconnect", false)
129
+ let merchantDisplayName: String? = call.getString("merchantDisplayName")
130
+ let onBehalfOf: String? = call.getString("onBehalfOf")
144
131
  let reader: JSObject = call.getObject("reader")!
145
- let index: Int = reader["index"] as! Int
132
+ let serialNumber: String = reader["serialNumber"] as! String
146
133
 
147
- Terminal.shared.connectLocalMobileReader(self.readers![index], delegate: self, connectionConfig: connectionConfig) { reader, error in
134
+ let connectionConfig = try! LocalMobileConnectionConfigurationBuilder.init(locationId: self.locationId!)
135
+ .setMerchantDisplayName(merchantDisplayName ?? nil)
136
+ .setOnBehalfOf(onBehalfOf ?? nil)
137
+ .setAutoReconnectOnUnexpectedDisconnect(autoReconnectOnUnexpectedDisconnect)
138
+ .setAutoReconnectionDelegate(autoReconnectOnUnexpectedDisconnect ? self : nil)
139
+ .build()
140
+
141
+ guard let foundReader = self.discoveredReadersList?.first(where: { $0.serialNumber == serialNumber }) else {
142
+ call.reject("reader is not match from descovered readers.")
143
+ return
144
+ }
145
+
146
+ Terminal.shared.connectLocalMobileReader(foundReader, delegate: self, connectionConfig: connectionConfig) { reader, error in
148
147
  if let reader = reader {
149
148
  self.plugin?.notifyListeners(TerminalEvents.ConnectedReader.rawValue, data: [:])
150
149
  call.resolve()
@@ -155,13 +154,19 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
155
154
  }
156
155
 
157
156
  private func connectInternetReader(_ call: CAPPluginCall) {
157
+ let reader: JSObject = call.getObject("reader")!
158
+ let serialNumber: String = reader["serialNumber"] as! String
159
+
160
+ guard let foundReader = self.discoveredReadersList?.first(where: { $0.serialNumber == serialNumber }) else {
161
+ call.reject("reader is not match from descovered readers.")
162
+ return
163
+ }
164
+
158
165
  let config = try! InternetConnectionConfigurationBuilder()
159
166
  .setFailIfInUse(true)
160
167
  .build()
161
- let reader: JSObject = call.getObject("reader")!
162
- let index: Int = reader["index"] as! Int
163
168
 
164
- Terminal.shared.connectInternetReader(self.readers![index], connectionConfig: config) { reader, error in
169
+ Terminal.shared.connectInternetReader(foundReader, connectionConfig: config) { reader, error in
165
170
  if let reader = reader {
166
171
  self.plugin?.notifyListeners(TerminalEvents.ConnectedReader.rawValue, data: [:])
167
172
  call.resolve()
@@ -172,11 +177,24 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
172
177
  }
173
178
 
174
179
  private func connectBluetoothReader(_ call: CAPPluginCall) {
175
- let config = try! BluetoothConnectionConfigurationBuilder(locationId: self.locationId!).build()
176
180
  let reader: JSObject = call.getObject("reader")!
177
- let index: Int = reader["index"] as! Int
181
+ let serialNumber: String = reader["serialNumber"] as! String
182
+
183
+ guard let foundReader = self.discoveredReadersList?.first(where: { $0.serialNumber == serialNumber }) else {
184
+ call.reject("reader is not match from descovered readers.")
185
+ return
186
+ }
187
+
188
+ let autoReconnectOnUnexpectedDisconnect = call.getBool("autoReconnectOnUnexpectedDisconnect", false)
189
+ let merchantDisplayName: String? = call.getString("merchantDisplayName")
190
+ let onBehalfOf: String? = call.getString("onBehalfOf")
178
191
 
179
- Terminal.shared.connectBluetoothReader(self.readers![index], delegate: self, connectionConfig: config) { reader, error in
192
+ let config = try! BluetoothConnectionConfigurationBuilder(locationId: self.locationId!)
193
+ .setAutoReconnectOnUnexpectedDisconnect(autoReconnectOnUnexpectedDisconnect)
194
+ .setAutoReconnectionDelegate(autoReconnectOnUnexpectedDisconnect ? self : nil)
195
+ .build()
196
+
197
+ Terminal.shared.connectBluetoothReader(foundReader, delegate: self, connectionConfig: config) { reader, error in
180
198
  if let reader = reader {
181
199
  self.plugin?.notifyListeners(TerminalEvents.ConnectedReader.rawValue, data: [:])
182
200
  call.resolve()
@@ -190,6 +208,7 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
190
208
  Terminal.shared.retrievePaymentIntent(clientSecret: call.getString("paymentIntent")!) { retrieveResult, retrieveError in
191
209
  if let error = retrieveError {
192
210
  print("retrievePaymentIntent failed: \(error)")
211
+ call.reject(error.localizedDescription)
193
212
  } else if let paymentIntent = retrieveResult {
194
213
  self.collectCancelable = Terminal.shared.collectPaymentMethod(paymentIntent) { collectResult, collectError in
195
214
  if let error = collectError {
@@ -205,23 +224,6 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
205
224
  }
206
225
  }
207
226
 
208
- public func cancelCollectPaymentMethod(_ call: CAPPluginCall) {
209
- if let cancelable = self.collectCancelable {
210
- cancelable.cancel { error in
211
- if let error = error {
212
- call.reject(error.localizedDescription)
213
- } else {
214
- self.plugin?.notifyListeners(TerminalEvents.Canceled.rawValue, data: [:])
215
- self.collectCancelable = nil
216
- self.paymentIntent = nil
217
- call.resolve()
218
- }
219
- }
220
- return
221
- }
222
- call.resolve()
223
- }
224
-
225
227
  public func confirmPaymentIntent(_ call: CAPPluginCall) {
226
228
  if let paymentIntent = self.paymentIntent {
227
229
  Terminal.shared.confirmPaymentIntent(paymentIntent) { confirmResult, confirmError in
@@ -250,6 +252,151 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
250
252
  call.resolve([:])
251
253
  }
252
254
 
255
+ public func installAvailableUpdate(_ call: CAPPluginCall) {
256
+ Terminal.shared.installAvailableUpdate()
257
+ call.resolve([:])
258
+ }
259
+
260
+ public func setReaderDisplay(_ call: CAPPluginCall) {
261
+ guard let currency = call.getString("currency") else {
262
+ call.reject("You must provide a currency value")
263
+ return
264
+ }
265
+ guard let tax = call.getInt("tax") as? NSNumber else {
266
+ call.reject("You must provide a tax value")
267
+ return
268
+ }
269
+ guard let total = call.getInt("total") as? NSNumber else {
270
+ call.reject("You must provide a total value")
271
+ return
272
+ }
273
+
274
+ let cartBuilder = CartBuilder(currency: currency)
275
+ .setTax(Int(truncating: tax))
276
+ .setTotal(Int(truncating: total))
277
+
278
+ let cartLineItems = TerminalMappers.mapToCartLineItems(call.getArray("lineItems") ?? JSArray())
279
+
280
+ cartBuilder.setLineItems(cartLineItems)
281
+
282
+ let cart: Cart
283
+ do {
284
+ cart = try cartBuilder.build()
285
+ } catch {
286
+ call.reject(error.localizedDescription)
287
+ return
288
+ }
289
+
290
+ Terminal.shared.setReaderDisplay(cart) { error in
291
+ if let error = error as NSError? {
292
+ call.reject(error.localizedDescription)
293
+ } else {
294
+ call.resolve([:])
295
+ }
296
+ }
297
+
298
+ }
299
+
300
+ public func clearReaderDisplay(_ call: CAPPluginCall) {
301
+ Terminal.shared.clearReaderDisplay { error in
302
+ if let error = error as NSError? {
303
+ call.reject(error.localizedDescription)
304
+ } else {
305
+ call.resolve([:])
306
+ }
307
+ }
308
+ }
309
+
310
+ public func rebootReader(_ call: CAPPluginCall) {
311
+ Terminal.shared.rebootReader { error in
312
+ if let error = error as NSError? {
313
+ call.reject(error.localizedDescription)
314
+ } else {
315
+ self.paymentIntent = nil
316
+ call.resolve([:])
317
+ }
318
+ }
319
+ }
320
+
321
+ /**
322
+ * Cancelable
323
+ */
324
+ public func cancelInstallUpdate(_ call: CAPPluginCall) {
325
+ if let cancelable = self.installUpdateCancelable {
326
+ if cancelable.completed {
327
+ call.resolve()
328
+ return
329
+ }
330
+ cancelable.cancel { error in
331
+ if let error = error as NSError? {
332
+ call.reject(error.localizedDescription)
333
+ } else {
334
+ call.resolve([:])
335
+ }
336
+ }
337
+ return
338
+ }
339
+ call.resolve([:])
340
+ }
341
+
342
+ public func cancelCollectPaymentMethod(_ call: CAPPluginCall) {
343
+ if let cancelable = self.collectCancelable {
344
+ if cancelable.completed {
345
+ call.resolve()
346
+ return
347
+ }
348
+ cancelable.cancel { error in
349
+ if let error = error {
350
+ call.reject(error.localizedDescription)
351
+ } else {
352
+ self.plugin?.notifyListeners(TerminalEvents.Canceled.rawValue, data: [:])
353
+ self.paymentIntent = nil
354
+ call.resolve()
355
+ }
356
+ }
357
+ return
358
+ }
359
+ call.resolve()
360
+ }
361
+
362
+ func cancelDiscoverReaders(_ call: CAPPluginCall) {
363
+ if let cancelable = self.discoverCancelable {
364
+ if cancelable.completed {
365
+ call.resolve()
366
+ return
367
+ }
368
+ cancelable.cancel { error in
369
+ if let error = error {
370
+ call.reject(error.localizedDescription)
371
+ } else {
372
+ call.resolve()
373
+ }
374
+ }
375
+ return
376
+ }
377
+
378
+ call.resolve()
379
+ }
380
+
381
+ public func cancelReaderReconnection(_ call: CAPPluginCall) {
382
+ if let cancelable = self.cancelReaderConnectionCancellable {
383
+ if cancelable.completed {
384
+ call.resolve()
385
+ return
386
+ }
387
+ cancelable.cancel { error in
388
+ if let error = error as NSError? {
389
+ call.reject(error.localizedDescription)
390
+ } else {
391
+ call.resolve([:])
392
+ }
393
+ }
394
+ return
395
+ }
396
+
397
+ call.resolve()
398
+ }
399
+
253
400
  /*
254
401
  * Terminal
255
402
  */
@@ -270,7 +417,10 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
270
417
  */
271
418
 
272
419
  public func localMobileReader(_ reader: Reader, didStartInstallingUpdate update: ReaderSoftwareUpdate, cancelable: Cancelable?) {
273
- self.plugin?.notifyListeners(TerminalEvents.StartInstallingUpdate.rawValue, data: self.convertReaderSoftwareUpdate(update: update))
420
+ self.installUpdateCancelable = cancelable
421
+ self.plugin?.notifyListeners(TerminalEvents.StartInstallingUpdate.rawValue, data: [
422
+ "update": self.convertReaderSoftwareUpdate(update: update)
423
+ ])
274
424
  }
275
425
 
276
426
  public func localMobileReader(_ reader: Reader, didReportReaderSoftwareUpdateProgress progress: Float) {
@@ -307,11 +457,16 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
307
457
  */
308
458
 
309
459
  public func reader(_: Reader, didReportAvailableUpdate update: ReaderSoftwareUpdate) {
310
- self.plugin?.notifyListeners(TerminalEvents.ReportAvailableUpdate.rawValue, data: self.convertReaderSoftwareUpdate(update: update))
460
+ self.plugin?.notifyListeners(TerminalEvents.ReportAvailableUpdate.rawValue, data: [
461
+ "update": self.convertReaderSoftwareUpdate(update: update)
462
+ ])
311
463
  }
312
464
 
313
465
  public func reader(_: Reader, didStartInstallingUpdate update: ReaderSoftwareUpdate, cancelable: Cancelable?) {
314
- self.plugin?.notifyListeners(TerminalEvents.StartInstallingUpdate.rawValue, data: self.convertReaderSoftwareUpdate(update: update))
466
+ self.installUpdateCancelable = cancelable
467
+ self.plugin?.notifyListeners(TerminalEvents.StartInstallingUpdate.rawValue, data: [
468
+ "update": self.convertReaderSoftwareUpdate(update: update)
469
+ ])
315
470
  }
316
471
 
317
472
  public func reader(_: Reader, didReportReaderSoftwareUpdateProgress progress: Float) {
@@ -363,19 +518,49 @@ public class StripeTerminal: NSObject, DiscoveryDelegate, LocalMobileReaderDeleg
363
518
  ])
364
519
  }
365
520
 
366
- private func convertReaderInterface(reader: Reader) -> [String: String] {
367
- return ["serialNumber": reader.serialNumber]
521
+ /*
522
+ * Reconnection
523
+ */
524
+ public func reader(_ reader: Reader, didStartReconnect cancelable: Cancelable, disconnectReason: DisconnectReason) {
525
+ self.cancelReaderConnectionCancellable = cancelable
526
+ self.plugin?.notifyListeners(TerminalEvents.ReaderReconnectStarted.rawValue, data: ["reader": self.convertReaderInterface(reader: reader), "reason": disconnectReason.rawValue])
527
+ }
528
+
529
+ public func readerDidSucceedReconnect(_ reader: Reader) {
530
+ self.plugin?.notifyListeners(TerminalEvents.ReaderReconnectSucceeded.rawValue, data: ["reader": self.convertReaderInterface(reader: reader)])
531
+ }
532
+
533
+ public func readerDidFailReconnect(_ reader: Reader) {
534
+ self.plugin?.notifyListeners(TerminalEvents.ReaderReconnectFailed.rawValue, data: ["reader": self.convertReaderInterface(reader: reader)])
368
535
  }
369
536
 
370
- private func convertReaderSoftwareUpdate(update: ReaderSoftwareUpdate) -> [String: String] {
537
+ /*
538
+ * Private
539
+ */
540
+ private func convertReaderInterface(reader: Reader) -> JSObject {
371
541
  return [
372
- "version": update.deviceSoftwareVersion,
373
- "settingsVersion": update.deviceSoftwareVersion,
374
- "requiredAt": update.requiredAt.description,
375
- "timeEstimate": TerminalMappers.mapFromUpdateTimeEstimate(update.estimatedUpdateTime)
542
+ "label": reader.label ?? NSNull(),
543
+ "batteryLevel": (reader.batteryLevel ?? 0).intValue,
544
+ "batteryStatus": TerminalMappers.mapFromBatteryStatus(reader.batteryStatus),
545
+ "simulated": reader.simulated,
546
+ "serialNumber": reader.serialNumber,
547
+ "isCharging": (reader.isCharging ?? 0).intValue,
548
+ "id": reader.stripeId ?? NSNull(),
549
+ "availableUpdate": TerminalMappers.mapFromReaderSoftwareUpdate(reader.availableUpdate),
550
+ "locationId": reader.locationId ?? NSNull(),
551
+ "ipAddress": reader.ipAddress ?? NSNull(),
552
+ "status": TerminalMappers.mapFromReaderNetworkStatus(reader.status),
553
+ "location": TerminalMappers.mapFromLocation(reader.location),
554
+ "locationStatus": TerminalMappers.mapFromLocationStatus(reader.locationStatus),
555
+ "deviceType": TerminalMappers.mapFromDeviceType(reader.deviceType),
556
+ "deviceSoftwareVersion": reader.deviceSoftwareVersion ?? NSNull()
376
557
  ]
377
558
  }
378
559
 
560
+ private func convertReaderSoftwareUpdate(update: ReaderSoftwareUpdate) -> JSObject {
561
+ return TerminalMappers.mapFromReaderSoftwareUpdate(update)
562
+ }
563
+
379
564
  }
380
565
 
381
566
  class APIClient: ConnectionTokenProvider {
@@ -15,4 +15,10 @@ CAP_PLUGIN(StripeTerminalPlugin, "StripeTerminal",
15
15
  CAP_PLUGIN_METHOD(cancelCollectPaymentMethod, CAPPluginReturnPromise);
16
16
  CAP_PLUGIN_METHOD(confirmPaymentIntent, CAPPluginReturnPromise);
17
17
  CAP_PLUGIN_METHOD(setSimulatorConfiguration, CAPPluginReturnPromise);
18
+ CAP_PLUGIN_METHOD(installAvailableUpdate, CAPPluginReturnPromise);
19
+ CAP_PLUGIN_METHOD(cancelInstallUpdate, CAPPluginReturnPromise);
20
+ CAP_PLUGIN_METHOD(setReaderDisplay, CAPPluginReturnPromise);
21
+ CAP_PLUGIN_METHOD(clearReaderDisplay, CAPPluginReturnPromise);
22
+ CAP_PLUGIN_METHOD(rebootReader, CAPPluginReturnPromise);
23
+ CAP_PLUGIN_METHOD(cancelReaderReconnection, CAPPluginReturnPromise);
18
24
  )
@@ -3,10 +3,6 @@ import StripeTerminal
3
3
  import Capacitor
4
4
  import PassKit
5
5
 
6
- /**
7
- * Please read the Capacitor iOS Plugin Development Guide
8
- * here: https://capacitorjs.com/docs/plugins/ios
9
- */
10
6
  @objc(StripeTerminalPlugin)
11
7
  public class StripeTerminalPlugin: CAPPlugin {
12
8
  private let implementation = StripeTerminal()
@@ -64,4 +60,29 @@ public class StripeTerminalPlugin: CAPPlugin {
64
60
  @objc func confirmPaymentIntent(_ call: CAPPluginCall) {
65
61
  self.implementation.confirmPaymentIntent(call)
66
62
  }
63
+
64
+ @objc func installAvailableUpdate(_ call: CAPPluginCall) {
65
+ self.implementation.installAvailableUpdate(call)
66
+ }
67
+
68
+ @objc func cancelInstallUpdate(_ call: CAPPluginCall) {
69
+ self.implementation.cancelInstallUpdate(call)
70
+ }
71
+
72
+ @objc func setReaderDisplay(_ call: CAPPluginCall) {
73
+ self.implementation.setReaderDisplay(call)
74
+ }
75
+
76
+ @objc func clearReaderDisplay(_ call: CAPPluginCall) {
77
+ self.implementation.clearReaderDisplay(call)
78
+ }
79
+
80
+ @objc func rebootReader(_ call: CAPPluginCall) {
81
+ self.implementation.rebootReader(call)
82
+ }
83
+
84
+ @objc func cancelReaderReconnection(_ call: CAPPluginCall) {
85
+ self.implementation.cancelReaderReconnection(call)
86
+ }
87
+
67
88
  }
@@ -19,4 +19,7 @@ public enum TerminalEvents: String {
19
19
  case RequestDisplayMessage = "terminalRequestDisplayMessage"
20
20
  case RequestReaderInput = "terminalRequestReaderInput"
21
21
  case PaymentStatusChange = "terminalPaymentStatusChange"
22
+ case ReaderReconnectStarted = "terminalReaderReconnectStarted"
23
+ case ReaderReconnectSucceeded = "terminalReaderReconnectSucceeded"
24
+ case ReaderReconnectFailed = "terminalReaderReconnectFailed"
22
25
  }
@@ -2,6 +2,133 @@ import StripeTerminal
2
2
  import Capacitor
3
3
 
4
4
  class TerminalMappers {
5
+ class func mapFromDeviceType(_ type: DeviceType) -> String {
6
+ switch type {
7
+ case DeviceType.appleBuiltIn: return "appleBuiltIn"
8
+ case DeviceType.chipper1X: return "chipper1X"
9
+ case DeviceType.chipper2X: return "chipper2X"
10
+ case DeviceType.etna: return "etna"
11
+ case DeviceType.stripeM2: return "stripeM2"
12
+ case DeviceType.stripeS700: return "stripeS700"
13
+ case DeviceType.stripeS700DevKit: return "stripeS700Devkit"
14
+ case DeviceType.verifoneP400: return "verifoneP400"
15
+ case DeviceType.wiseCube: return "wiseCube"
16
+ case DeviceType.wisePad3: return "wisePad3"
17
+ case DeviceType.wisePosE: return "wisePosE"
18
+ case DeviceType.wisePosEDevKit: return "wisePosEDevkit"
19
+ default: return "unknown"
20
+ }
21
+ }
22
+
23
+ class func mapFromAddress(_ address: Address?) -> JSObject {
24
+ if let address = address {
25
+ let result: JSObject = [
26
+ "city": address.city ?? NSNull(),
27
+ "country": address.country ?? NSNull(),
28
+ "postalCode": address.postalCode ?? NSNull(),
29
+ "line1": address.line1 ?? NSNull(),
30
+ "line2": address.line2 ?? NSNull(),
31
+ "state": address.state ?? NSNull()
32
+ ]
33
+ return result
34
+ } else {
35
+ return JSObject()
36
+ }
37
+ }
38
+
39
+ class func mapFromLocation(_ location: Location?) -> JSObject {
40
+ guard let unwrappedLocation = location else {
41
+ return [:]
42
+ }
43
+ let result: JSObject = [
44
+ "displayName": unwrappedLocation.displayName ?? NSNull(),
45
+ "id": unwrappedLocation.stripeId,
46
+ "livemode": unwrappedLocation.livemode,
47
+ "address": mapFromAddress(unwrappedLocation.address)
48
+ ]
49
+ return result
50
+ }
51
+
52
+ class func mapFromLocationStatus(_ status: LocationStatus) -> String {
53
+ switch status {
54
+ case LocationStatus.notSet: return "NOT_SET"
55
+ case LocationStatus.set: return "SET"
56
+ case LocationStatus.unknown: return "UNKNOWN"
57
+ default: return "UNKNOWN"
58
+ }
59
+ }
60
+
61
+ class func mapFromLocationsList(_ locations: [Location]) -> JSArray {
62
+ var list: JSArray = []
63
+
64
+ for location in locations {
65
+ let result = mapFromLocation(location)
66
+ if result.count != 0 {
67
+ list.append(result)
68
+ }
69
+ }
70
+
71
+ return list
72
+ }
73
+
74
+ class func mapFromReaderNetworkStatus(_ status: ReaderNetworkStatus) -> String {
75
+ switch status {
76
+ case ReaderNetworkStatus.offline: return "OFFLINE"
77
+ case ReaderNetworkStatus.online: return "ONLINE"
78
+ default: return "UNKNOWN"
79
+ }
80
+ }
81
+
82
+ class func convertDateToUnixTimestamp(date: Date?) -> String {
83
+ if let date = date {
84
+ let value = date.timeIntervalSince1970 * 1000.0
85
+ return String(format: "%.0f", value)
86
+ }
87
+ return ""
88
+ }
89
+
90
+ class func mapFromReaderSoftwareUpdate(_ update: ReaderSoftwareUpdate?) -> JSObject {
91
+ guard let unwrappedUpdate = update else {
92
+ return JSObject()
93
+ }
94
+ let result: JSObject = [
95
+ "deviceSoftwareVersion": unwrappedUpdate.deviceSoftwareVersion,
96
+ "estimatedUpdateTime": mapFromUpdateTimeEstimate(unwrappedUpdate.estimatedUpdateTime),
97
+ "requiredAt": convertDateToUnixTimestamp(date: unwrappedUpdate.requiredAt)
98
+ ]
99
+ return result
100
+ }
101
+
102
+ class func mapToCartLineItem(_ cartLineItem: NSDictionary) -> CartLineItem? {
103
+ guard let displayName = cartLineItem["displayName"] as? String else { return nil }
104
+ guard let quantity = cartLineItem["quantity"] as? NSNumber else { return nil }
105
+ guard let amount = cartLineItem["amount"] as? NSNumber else { return nil }
106
+
107
+ do {
108
+ let lineItem = try CartLineItemBuilder(displayName: displayName)
109
+ .setQuantity(Int(truncating: quantity))
110
+ .setAmount(Int(truncating: amount))
111
+ .build()
112
+ return lineItem
113
+ } catch {
114
+ print("Error wihle building CartLineItem, error:\(error)")
115
+ return nil
116
+ }
117
+ }
118
+
119
+ class func mapToCartLineItems(_ cartLineItems: JSArray) -> [CartLineItem] {
120
+ var items = [CartLineItem]()
121
+
122
+ cartLineItems.forEach {
123
+ if let item = $0 as? NSDictionary {
124
+ if let lineItem = TerminalMappers.mapToCartLineItem(item) {
125
+ items.append(lineItem)
126
+ }
127
+ }
128
+ }
129
+ return items
130
+ }
131
+
5
132
  class func mapToSimulateReaderUpdate(_ update: String) -> SimulateReaderUpdate {
6
133
  switch update {
7
134
  case "UPDATE_AVAILABLE": return SimulateReaderUpdate.available
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capacitor-community/stripe-terminal",
3
- "version": "6.1.0",
3
+ "version": "6.2.1",
4
4
  "engines": {
5
5
  "node": ">=18.0.0"
6
6
  },
@@ -77,5 +77,8 @@
77
77
  "android": {
78
78
  "src": "android"
79
79
  }
80
+ },
81
+ "dependencies": {
82
+ "@stripe/terminal-js": "^0.13.0"
80
83
  }
81
84
  }