diff --git a/ios/Mappers.swift b/ios/Mappers.swift index 0be38eb..34d7e8e 100644 --- a/ios/Mappers.swift +++ b/ios/Mappers.swift @@ -37,11 +37,11 @@ class Mappers { return .failure(.missingProcessingMode) } - guard let idempotencyKey = paymentParameters["idempotencyKey"] as? String else { - return .failure(.missingIdempotencyKey) + guard let paymentAttemptId = paymentParameters["paymentAttemptId"] as? String else { + return .failure(.missingPaymentAttemptId) } - let paymentParams = PaymentParameters(idempotencyKey: idempotencyKey, amountMoney: amountMoney, processingMode: processingMode) + let paymentParams = PaymentParameters(paymentAttemptID: paymentAttemptId, amountMoney: amountMoney, processingMode: processingMode) // Optional parameters if let partialAuth = paymentParameters["acceptPartialAuthorization"] as? Bool { @@ -106,6 +106,14 @@ class Mappers { "currencyCode": money.currency.currencyCode ] } + + class func mapToDictionary(readerStatusInfo: ReaderStatusInfo) -> NSDictionary { + return [ + "reason": readerStatusInfo.reason.mapToString(), + "status": readerStatusInfo.status.mapToString(), + "title": readerStatusInfo.title, + ] + } class func mapToDictionary(payment: Payment) -> NSDictionary { return [ @@ -127,7 +135,6 @@ class Mappers { return [ "batteryStatus" : reader.batteryStatus?.toMap() ?? NSNull(), "cardInsertionStatus": reader.cardInsertionStatus.toName(), - "connectionInfo": reader.connectionInfo.toMap(), "firmwareInfo" : reader.firmwareInfo?.toMap() ?? NSNull(), "id": String(reader.id), "isBlinkable" : reader.isBlinkable, @@ -136,7 +143,7 @@ class Mappers { "model": reader.model.toName(), "name" : reader.name, "serialNumber" : reader.serialNumber ?? NSNull(), - "state" : reader.state.toName(), + "statusInfo": Mappers.mapToDictionary(readerStatusInfo: reader.statusInfo), "supportedCardEntryMethods" : reader.supportedInputMethods.toList() ] } @@ -180,9 +187,63 @@ extension SquareMobilePaymentsSDK.SourceType { } } +extension SquareMobilePaymentsSDK.ReaderStatus { + func mapToString() -> String { + switch self { + case .ready: + return "READY" + case .connectingToDevice: + return "CONNECTING_TO_DEVICE" + case .connectingToSquare: + return "CONNECTING_TO_SQUARE" + case .faulty: + return "FAULTY" + case .readerUnavailable: + return "READER_UNAVAILABLE" + @unknown default: + return "UNKNOWN" + } + } +} + +extension SquareMobilePaymentsSDK.ReaderUnavailableReason { + func mapToString() -> String { + switch self { + case .blockingFirmwareUpdate: + return "BLOCKING_FIRMWARE_UPDATE" + case .bluetoothDisabled: + return "BLUETOOTH_DISABLED" + case .bluetoothFailure: + return "BLUETOOTH_FAILURE" + case .internalError: + return "INTERNAL_ERROR" + case .maxReadersConnected: + return "MAX_READERS_CONNECTED" + case .none: + return "NONE" + case .notConnectedToInternet: + return "NOT_CONNECTED_TO_INTERNET" + case .readerTimeout: + return "READER_TIMEOUT" + case .revokedByDevice: + return "REVOKED_BY_DEVICE" + case .secureConnectionNetworkFailure: + return "SECURE_CONNECTION_NETWORK_FAILURE" + case .secureConnectionToSquareFailure: + return "SECURE_CONNECTION_TO_SQUARE_FAILURE" + case .tapToPayError: + return "TAP_TO_PAY_ERROR" + case .tapToPayIsNotLinked: + return "TAP_TO_PAY_IS_NOT_LINKED" + @unknown default: + return "UNKNOWN" + } + } +} + enum PaymentParametersError: Error { case missingAmount - case missingIdempotencyKey + case missingPaymentAttemptId case missingProcessingMode } diff --git a/ios/MobilePaymentsSdkReactNative.swift b/ios/MobilePaymentsSdkReactNative.swift index f3d0e39..3374fac 100644 --- a/ios/MobilePaymentsSdkReactNative.swift +++ b/ios/MobilePaymentsSdkReactNative.swift @@ -512,7 +512,7 @@ class MobilePaymentsReaderObserver: ReaderObserver { let body = [ "change": change.toName(), "reader": readerMap, - "readerState" : readerMap["state"], + "readerStatus" : readerMap["statusInfo"], "readerSerialNumber" : readerMap["serialNumber"] ?? NSNull() ] emitter.sendEvent(withName: "ReaderChanged", body: body) diff --git a/src/models/enums.ts b/src/models/enums.ts index 54d493a..a1b01c5 100644 --- a/src/models/enums.ts +++ b/src/models/enums.ts @@ -1,7 +1,7 @@ export enum AccountType { - SAVINGS, - CHECKING, - CREDIT, + SAVINGS = 'SAVINGS', + CHECKING = 'CHECKING', + CREDIT = 'CREDIT', } export enum AdditionalPaymentMethodType { @@ -12,50 +12,50 @@ export enum AdditionalPaymentMethodType { export enum AuthorizationState { AUTHORIZED = 'AUTHORIZED', AUTHORIZING = 'AUTHORIZING', - NOT_AUTHORIZED = 'NOT_AUTHORIZING', + NOT_AUTHORIZED = 'NOT_AUTHORIZED', } export enum CardBrand { - ALIPAY, - AMERICAN_EXPRESS, - CASH_APP, - CHINA_UNION_PAY, - DISCOVER, - DISCOVER_DINERS, - EBT, - EFTPOS, - FELICA, - ID, - INTERAC, - JCB, - MASTERCARD, - OTHER_BRAND, - SQUARE_CAPITAL_CARD, - SQUARE_GIFT_CARD, - SUICA, - UNKNOWN, - VISA, + ALIPAY = 'ALIPAY', + AMERICAN_EXPRESS = 'AMERICAN_EXPRESS', + CASH_APP = 'CASH_APP', + CHINA_UNION_PAY = 'CHINA_UNION_PAY', + DISCOVER = 'DISCOVER', + DISCOVER_DINERS = 'DISCOVER_DINERS', + EBT = 'EBT', + EFTPOS = 'EFTPOS', + FELICA = 'FELICA', + ID = 'ID', + INTERAC = 'INTERAC', + JCB = 'JCB', + MASTERCARD = 'MASTERCARD', + OTHER_BRAND = 'OTHER_BRAND', + SQUARE_CAPITAL_CARD = 'SQUARE_CAPITAL_CARD', + SQUARE_GIFT_CARD = 'SQUARE_GIFT_CARD', + SUICA = 'SUICA', + UNKNOWN = 'UNKNOWN', + VISA = 'VISA', } export enum CardCoBrand { - AFTERPAY, - CLEARPAY, - NONE, - UNKNOWN, + AFTERPAY = 'AFTERPAY', + CLEARPAY = 'CLEARPAY', + NONE = 'NONE', + UNKNOWN = 'UNKNOWN', } export enum CardPaymentStatus { - AUTHORIZED, - CAPTURED, - VOIDED, - FAILED, - UNKNOWN, + AUTHORIZED = 'AUTHORIZED', + CAPTURED = 'CAPTURED', + VOIDED = 'VOIDED', + FAILED = 'FAILED', + UNKNOWN = 'UNKNOWN', } export enum CardInsertionStatus { - INSERTED, - NOT_INSERTED, - UNKNOWN, + INSERTED = 'INSERTED', + NOT_INSERTED = 'NOT_INSERTED', + UNKNOWN = 'UNKNOWN', } export enum CurrencyCode { @@ -73,12 +73,12 @@ export enum DelayAction { } export enum EntryMethod { - KEYED, - SWIPED, - EMV, - CONTACTLESS, - ON_FILE, - UNKNOWN, + KEYED = 'KEYED', + SWIPED = 'SWIPED', + EMV = 'EMV', + CONTACTLESS = 'CONTACTLESS', + ON_FILE = 'ON_FILE', + UNKNOWN = 'UNKNOWN', } export enum Environment { @@ -87,11 +87,11 @@ export enum Environment { } export enum PaymentStatus { - APPROVED, - COMPLETE, - CANCELED, - FAILED, - UNKNOWN, + APPROVED = 'APPROVED', + COMPLETE = 'COMPLETE', + CANCELED = 'CANCELED', + FAILED = 'FAILED', + UNKNOWN = 'UNKNOWN', } export enum PromptMode { @@ -99,97 +99,88 @@ export enum PromptMode { } export enum SourceType { - BANK_ACCOUNT, - CARD, - CASH, - EXTERNAL, - SQUARE_ACCOUNT, - UNKNOWN, - WALLET, + BANK_ACCOUNT = 'BANK_ACCOUNT', + CARD = 'CARD', + CASH = 'CASH', + EXTERNAL = 'EXTERNAL', + SQUARE_ACCOUNT = 'SQUARE_ACCOUNT', + UNKNOWN = 'UNKNOWN', + WALLET = 'WALLET', } // Reader Enums export enum ReaderBatteryLevel { - CRITICALLY_LOW, - FULL, - HIGH, - LOW, - MID, + CRITICALLY_LOW = 'CRITICALLY_LOW', + FULL = 'FULL', + HIGH = 'HIGH', + LOW = 'LOW', + MID = 'MID', } export enum ReaderChange { - BATTERY_DID_BEGIN_CHARGING, - BATTERY_DID_END_CHARGING, - BATTERY_LEVEL_DID_CHANGE, - CARD_INSERTED, - CARD_REMOVED, - CONNECTION_DID_FAIL, - CONNECTION_STATE_DID_CHANGE, - FIRMWARE_UPDATE_DID_FAIL, - FIRMWARE_UPDATE_PERCENT_DID_CHANGE, - STATE_DID_CHANGE, + BATTERY_DID_BEGIN_CHARGING = 'BATTERY_DID_BEGIN_CHARGING', + BATTERY_DID_END_CHARGING = 'BATTERY_DID_END_CHARGING', + BATTERY_LEVEL_DID_CHANGE = 'BATTERY_LEVEL_DID_CHANGE', + CARD_INSERTED = 'CARD_INSERTED', + CARD_REMOVED = 'CARD_REMOVED', + CONNECTION_DID_FAIL = 'CONNECTION_DID_FAIL', + CONNECTION_STATE_DID_CHANGE = 'CONNECTION_STATE_DID_CHANGE', + FIRMWARE_UPDATE_DID_FAIL = 'FIRMWARE_UPDATE_DID_FAIL', + FIRMWARE_UPDATE_PERCENT_DID_CHANGE = 'FIRMWARE_UPDATE_PERCENT_DID_CHANGE', + STATE_DID_CHANGE = 'STATE_DID_CHANGE', //--android - ADDED, - CHANGED_STATE, - BATTERY_THRESHOLD, - BATTERY_CHARGING, - FIRMWARE_PROGRESS, - REMOVED, + ADDED = 'ADDED', + CHANGED_STATE = 'CHANGED_STATE', + BATTERY_THRESHOLD = 'BATTERY_THRESHOLD', + BATTERY_CHARGING = 'BATTERY_CHARGING', + FIRMWARE_PROGRESS = 'FIRMWARE_PROGRESS', + REMOVED = 'REMOVED', } export enum ReaderConnectionFailureRecoverySuggestion { - ACTIVATE_ACCOUNT, - CONTACT_SUPPORT, - NO_SUGGESTION, - RETRY, - REVIEW_TAP_TO_PAY_GUIDELINES, - ENABLE_PASSCODE_TO_USE_TAP_TO_PAY, + ACTIVATE_ACCOUNT = 'ACTIVATE_ACCOUNT', + CONTACT_SUPPORT = 'CONTACT_SUPPORT', + NO_SUGGESTION = 'NO_SUGGESTION', + RETRY = 'RETRY', + REVIEW_TAP_TO_PAY_GUIDELINES = 'REVIEW_TAP_TO_PAY_GUIDELINES', + ENABLE_PASSCODE_TO_USE_TAP_TO_PAY = 'ENABLE_PASSCODE_TO_USE_TAP_TO_PAY', } export enum ReaderConnectionState { - CONNECTED, - CONNECTING, - FAILED_TO_CONNECT, - NOT_CONNECTED, + CONNECTED = 'CONNECTED', + CONNECTING = 'CONNECTING', + FAILED_TO_CONNECT = 'FAILED_TO_CONNECT', + NOT_CONNECTED = 'NOT_CONNECTED', } export enum ReaderFirmwareUpdateError { - CONNECTION_TIMEOUT, - FIRMWARE_FAILURE, - SERVER_CALL_FAILURE, - UNKNOWN_ERROR, + CONNECTION_TIMEOUT = 'CONNECTION_TIMEOUT', + FIRMWARE_FAILURE = 'FIRMWARE_FAILURE', + SERVER_CALL_FAILURE = 'SERVER_CALL_FAILURE', + UNKNOWN_ERROR = 'UNKNOWN_ERROR', } export enum ReaderModel { - CONTACTLESS_AND_CHIP, - EMBEDDED, - MAGSTRIPE, - STAND, - TAP_TO_PAY, - UNKNOWN, + CONTACTLESS_AND_CHIP = 'CONTACTLESS_AND_CHIP', + EMBEDDED = 'EMBEDDED', + MAGSTRIPE = 'MAGSTRIPE', + STAND = 'STAND', + TAP_TO_PAY = 'TAP_TO_PAY', + UNKNOWN = 'UNKNOWN', } export enum ReaderConnectionFailureReason { - DENIED_BY_SERVER, - GENERIC_ERROR, - MAX_READERS_CONNECTED, - NETWORK_TIMEOUT, - NETWORK_TRANSPORT_ERROR, - NOT_CONNECTED_TO_INTERNET, - READER_TIMEOUT, - REVOKED_BY_DEVICE, - SERVER_ERROR, - TAP_TO_PAY_ERROR, - UNKNOWN, -} - -export enum ReaderState { - CONNECTING, - DISABLED, - DISCONNECTED, - FAILED_TO_CONNECT, - READY, - UPDATING_FIRMWARE, + DENIED_BY_SERVER = 'DENIED_BY_SERVER', + GENERIC_ERROR = 'GENERIC_ERROR', + MAX_READERS_CONNECTED = 'MAX_READERS_CONNECTED', + NETWORK_TIMEOUT = 'NETWORK_TIMEOUT', + NETWORK_TRANSPORT_ERROR = 'NETWORK_TRANSPORT_ERROR', + NOT_CONNECTED_TO_INTERNET = 'NOT_CONNECTED_TO_INTERNET', + READER_TIMEOUT = 'READER_TIMEOUT', + REVOKED_BY_DEVICE = 'REVOKED_BY_DEVICE', + SERVER_ERROR = 'SERVER_ERROR', + TAP_TO_PAY_ERROR = 'TAP_TO_PAY_ERROR', + UNKNOWN = 'UNKNOWN', } export enum ReaderInternalStatus { @@ -200,12 +191,29 @@ export enum ReaderInternalStatus { READY = 'READY', } +export enum ReaderStatus { + READY = 'READY', + CONNECTING_TO_DEVICE = 'CONNECTING_TO_DEVICE', + CONNECTING_TO_SQUARE = 'CONNECTING_TO_SQUARE', + FAULTY = 'FAULTY', + READER_UNAVAILABLE = 'READER_UNAVAILABLE', +} + export enum ReaderUnavailableReason { - INTERNAL_ERROR = 'INTERNAL_ERROR', + BLOCKING_FIRMWARE_UPDATE = 'BLOCKING_FIRMWARE_UPDATE', BLUETOOTH_DISABLED = 'BLUETOOTH_DISABLED', BLUETOOTH_FAILURE = 'BLUETOOTH_FAILURE', - SECURE_CONNECTION_TO_SQUARE_FAILURE = 'SECURE_CONNECTION_TO_SQUARE_FAILURE', + INTERNAL_ERROR = 'INTERNAL_ERROR', + MAX_READERS_CONNECTED = 'MAX_READERS_CONNECTED', + NONE = 'NONE', + NOT_CONNECTED_TO_INTERNET = 'NOT_CONNECTED_TO_INTERNET', + READER_TIMEOUT = 'READER_TIMEOUT', + REVOKED_BY_DEVICE = 'REVOKED_BY_DEVICE', SECURE_CONNECTION_NETWORK_FAILURE = 'SECURE_CONNECTION_NETWORK_FAILURE', + SECURE_CONNECTION_TO_SQUARE_FAILURE = 'SECURE_CONNECTION_TO_SQUARE_FAILURE', + TAP_TO_PAY_ERROR = 'TAP_TO_PAY_ERROR', + TAP_TO_PAY_IS_NOT_LINKED = 'TAP_TO_PAY_IS_NOT_LINKED', + // Android-specific reasons OFFLINE_SESSION_EXPIRED = 'OFFLINE_SESSION_EXPIRED', READER_UNAVAILABLE_OFFLINE = 'READER_UNAVAILABLE_OFFLINE', OFFLINE_MODE_DISABLED = 'OFFLINE_MODE_DISABLED', @@ -223,26 +231,26 @@ export enum ReaderUnavailableReason { } export enum CardEntryMethod { - CHIP, - EMV, - CONTACTLESS, - SWIPED, + CHIP = 'CHIP', + EMV = 'EMV', + CONTACTLESS = 'CONTACTLESS', + SWIPED = 'SWIPED', } // Offline Mode Enums export enum OfflinePaymentQueueError { - NOT_AUTHORIZED, - UNEXPECTED, - UNSUPPORTED_SANDBOX_ENVIRONMENT, + NOT_AUTHORIZED = 'NOT_AUTHORIZED', + UNEXPECTED = 'UNEXPECTED', + UNSUPPORTED_SANDBOX_ENVIRONMENT = 'UNSUPPORTED_SANDBOX_ENVIRONMENT', } export enum OfflinePaymentStatus { - QUEUED, - UPLOADED, - FAILED_TO_UPLOAD, - FAILED_TO_PROCESS, - PROCESSED, - UNKNOWN, + QUEUED = 'QUEUED', + UPLOADED = 'UPLOADED', + FAILED_TO_UPLOAD = 'FAILED_TO_UPLOAD', + FAILED_TO_PROCESS = 'FAILED_TO_PROCESS', + PROCESSED = 'PROCESSED', + UNKNOWN = 'UNKNOWN', } export enum ProcessingMode { diff --git a/src/models/objects.ts b/src/models/objects.ts index 0aaa51c..01e227d 100644 --- a/src/models/objects.ts +++ b/src/models/objects.ts @@ -16,22 +16,21 @@ import type { ReaderConnectionFailureReason, ReaderConnectionFailureRecoverySuggestion, ReaderConnectionState, - ReaderInternalStatus, ReaderModel, - ReaderState, + ReaderStatus, ReaderUnavailableReason, SourceType, } from './enums'; export type Location = { - id: String; - currencyCode: String; - name: String; - mcc: String; + id: string; + currencyCode: string; + name: string; + mcc: string; }; export type Money = { - amount?: Number; + amount?: number; currencyCode: CurrencyCode; }; @@ -40,12 +39,12 @@ export type OnlinePayment = { appFeeMoney: Money; cardDetails: CardPaymentDetails; createdAt: Date; - customerId: String; - id: String; - locationId: String; - note: String; - orderId: String; - referenceId: String; + customerId: string; + id: string; + locationId: string; + note: string; + orderId: string; + referenceId: string; status: PaymentStatus; tipMoney: Money; totalMoney: Money; @@ -57,11 +56,11 @@ export type OffLinePayment = { appFeeMoney: Money; cardDetails: OfflineCardPaymentDetails; createdAt: Date; - id: String; - localId: String; - locationId: String; - orderId: String; - referenceId: String; + id: string; + localId: string; + locationId: string; + orderId: string; + referenceId: string; status: OfflinePaymentStatus; sourceType: SourceType; tipMoney: Money; @@ -73,58 +72,57 @@ export type OffLinePayment = { export type PaymentParameters = { // Required amountMoney: Money; - processingMode: Number; + processingMode: number; // Optional. For defaults, check: // Android: https://square.github.io/mobile-payments-sdk-android/-mobile%20-payments%20-s-d-k%20-android%20-technical%20-reference/com.squareup.sdk.mobilepayments.payment/-payment-parameters/index.html // iOS: https://square.github.io/mobile-payments-sdk-ios/docs/documentation/mobilepaymentssdkapi/paymentparameters/ - acceptPartialAuthorization?: Boolean; + acceptPartialAuthorization?: boolean; appFeeMoney?: Money; - autocomplete?: Boolean; - customerId?: String; + autocomplete?: boolean; + customerId?: string; delayAction?: DelayAction; - delayDuration?: Number; - locationId?: String; - note?: String; - orderId?: String; - referenceId?: String; - statementDescriptionIdentifer?: String; - teamMemberId?: String; + delayDuration?: number; + locationId?: string; + note?: string; + orderId?: string; + referenceId?: string; + statementDescriptionIdentifer?: string; + teamMemberId?: string; tipMoney?: Money; totalMoney?: Money; - idempotencyKey?: String; - paymentAttemptId?: String; + paymentAttemptId?: string; }; export type Card = { brand: CardBrand; - cardholderName: String; + cardholderName: string; coBrand: CardCoBrand; - expirationMonth?: Number; - expirationYear?: Number; - id: String; - lastFourDigits: String; + expirationMonth?: number; + expirationYear?: number; + id: string; + lastFourDigits: string; }; export type CardPaymentDetails = { - applicationIdentifier: String; - applicationName: String; - authorizationCode: String; + applicationIdentifier: string; + applicationName: string; + authorizationCode: string; card: Card; entryMethod: EntryMethod; status: CardPaymentStatus; }; export type OfflineCardPaymentDetails = { - applicationIdentifier: String; - applicationName: String; + applicationIdentifier: string; + applicationName: string; card: Card; entryMethod: EntryMethod; }; export type CardInputMethods = { - chip: Boolean; - contactless: Boolean; - swipe: Boolean; + chip: boolean; + contactless: boolean; + swipe: boolean; }; export type PromptParameters = { @@ -136,10 +134,10 @@ export type Payment = { amountMoney: Money; appFeeMoney: Money; createdAt: Date; - id: String; - locationId: String; - orderId: String; - referenceId: String; + id: string; + locationId: string; + orderId: string; + referenceId: string; sourceType: SourceType; tipMoney: Money; totalMoney: Money; @@ -147,15 +145,15 @@ export type Payment = { }; export type ReaderBatteryStatus = { - isCharging: Boolean; + isCharging: boolean; level?: ReaderBatteryLevel; - percent: Number; + percent: number; }; export type ReaderConnectionFailureInfo = { failureReason: ReaderConnectionFailureReason; - localizedDescription: String; - localizedTitle: String; + localizedDescription: string; + localizedTitle: string; recoverySuggestion: ReaderConnectionFailureRecoverySuggestion; }; @@ -165,39 +163,40 @@ export type ReaderConnectionInfo = { }; export type ReaderFirmwareInfo = { - failureReason?: String; - updatePercentage: Number; - version: String; + failureReason?: string; + updatePercentage: number; + version: string; }; -export type ReaderStatus = { - status: ReaderInternalStatus; - readerUnavailableReason?: ReaderUnavailableReason; +export type ReaderStatusInfo = { + status: ReaderStatus; + reason: ReaderUnavailableReason; + title: string; }; export type ReaderInfo = { - id: String; + id: string; model: ReaderModel; - state: ReaderState; - status: ReaderStatus; - serialNumber?: String; - name: String; + status?: string; //Android-specific direct status + statusInfo?: ReaderStatusInfo; //iOS-specific status info + serialNumber?: string; + name: string; batteryStatus?: ReaderBatteryStatus; - firmwareVersion?: String; - firmwarePercent?: Number; + firmwareVersion?: string; + firmwarePercent?: number; supportedCardEntryMethods: CardEntryMethod[]; - isForgettable: Boolean; - isBlinkable: Boolean; + isForgettable: boolean; + isBlinkable: boolean; cardInsertionStatus?: CardInsertionStatus; connectionInfo?: ReaderConnectionInfo; firmwareInfo?: ReaderFirmwareInfo; - isConnectionRetryable?: Boolean; + isConnectionRetryable?: boolean; }; export type ReaderChangedEvent = { change: ReaderChange; reader: ReaderInfo; - readerState: ReaderState; - readerSerialNumber?: String; + readerStatusInfo: ReaderStatusInfo; + readerSerialNumber?: string; };