diff --git a/.gitignore b/.gitignore index 3fcaa5c..c1372a1 100644 --- a/.gitignore +++ b/.gitignore @@ -59,7 +59,7 @@ android/keystores/debug.keystore .turbo/ # generated by bob -lib/ +# lib/ intentionally NOT ignored — prebuilt for git dependency installs # React Native Codegen ios/generated diff --git a/android/src/main/java/com/expensify/wallet/Utils.kt b/android/src/main/java/com/expensify/wallet/Utils.kt index 6bb09ef..34a7646 100644 --- a/android/src/main/java/com/expensify/wallet/Utils.kt +++ b/android/src/main/java/com/expensify/wallet/Utils.kt @@ -56,44 +56,44 @@ object Utils { ) } - override fun reject(code: String, userInfo: WritableMap) { - val errorMessage = "Error: $code\nUserInfo: $userInfo" + override fun reject(code: String?, userInfo: WritableMap) { + val errorMessage = "Error: ${code ?: "Unknown code"}\nUserInfo: $userInfo" continuation.resumeWithException( Exception(errorMessage) ) } - override fun reject(code: String, message: String?) { - val errorMessage = "Error: $code\nMessage: ${message ?: "No message provided"}" + override fun reject(code: String?, message: String?) { + val errorMessage = "Error: ${code ?: "Unknown code"}\nMessage: ${message ?: "No message provided"}" continuation.resumeWithException( Exception(errorMessage) ) } - override fun reject(code: String, message: String?, userInfo: WritableMap) { + override fun reject(code: String?, message: String?, userInfo: WritableMap) { val errorMessage = - "Error: $code\nMessage: ${message ?: "No message provided"}\nUserInfo: $userInfo" + "Error: ${code ?: "Unknown code"}\nMessage: ${message ?: "No message provided"}\nUserInfo: $userInfo" continuation.resumeWithException( Exception(errorMessage) ) } - override fun reject(code: String, message: String?, throwable: Throwable?) { - val errorMessage = "Error: $code\nMessage: ${message ?: "No message provided"}" + override fun reject(code: String?, message: String?, throwable: Throwable?) { + val errorMessage = "Error: ${code ?: "Unknown code"}\nMessage: ${message ?: "No message provided"}" continuation.resumeWithException( throwable ?: Exception(errorMessage) ) } - override fun reject(code: String, throwable: Throwable?) { - val errorMessage = "Error: $code" + override fun reject(code: String?, throwable: Throwable?) { + val errorMessage = "Error: ${code ?: "Unknown code"}" continuation.resumeWithException( throwable ?: Exception(errorMessage) ) } - override fun reject(code: String, throwable: Throwable?, userInfo: WritableMap) { - val errorMessage = "Error: $code\nUserInfo: $userInfo" + override fun reject(code: String?, throwable: Throwable?, userInfo: WritableMap) { + val errorMessage = "Error: ${code ?: "Unknown code"}\nUserInfo: $userInfo" continuation.resumeWithException( throwable ?: Exception(errorMessage) ) diff --git a/lib/commonjs/AddToWalletButton.js b/lib/commonjs/AddToWalletButton.js new file mode 100644 index 0000000..e20eb2e --- /dev/null +++ b/lib/commonjs/AddToWalletButton.js @@ -0,0 +1,82 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _react = _interopRequireDefault(require("react")); +var _reactNative = require("react-native"); +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +const NativeWalletButton = (0, _reactNative.requireNativeComponent)('RNAddToWalletButton'); +const BUTTON_TYPE_BREAKPOINT = 236; +const BUTTON_DIMENSIONS = { + basic: { + ios: { + width: 300, + height: 40 + }, + android: { + width: 300, + height: 48 + } + }, + badge: { + ios: { + width: 120, + height: 40 + }, + android: { + width: 200, + height: 56 + } + } +}; +function AddToWalletButton({ + style, + buttonStyle = 'black', + buttonType = 'basic', + borderRadius = 4, + onPress +}) { + const flattenedStyle = _reactNative.StyleSheet.flatten(style) || {}; + const currentDimensions = BUTTON_DIMENSIONS[buttonType][_reactNative.Platform.OS]; + const { + width = currentDimensions.width, + height = currentDimensions.height, + ...rest + } = flattenedStyle; + return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, { + onPress: onPress, + activeOpacity: 0.8, + style: [rest, + // Android allows us to define the type of the button, however on iOS type depends on the width. + // Adding this limits to ensure consistent behavior across platforms. + buttonType === 'badge' ? { + maxWidth: BUTTON_TYPE_BREAKPOINT - 1 + } : { + minWidth: BUTTON_TYPE_BREAKPOINT + }, { + width, + height + }, styles.touchable] + }, /*#__PURE__*/_react.default.createElement(NativeWalletButton, { + style: styles.fill, + buttonStyle: buttonStyle, + borderRadius: borderRadius, + buttonType: buttonType + })); +} +const styles = _reactNative.StyleSheet.create({ + touchable: { + justifyContent: 'center', + alignItems: 'center', + margin: 10 + }, + fill: { + flex: 1, + width: '100%', + height: '100%' + } +}); +var _default = exports.default = AddToWalletButton; +//# sourceMappingURL=AddToWalletButton.js.map \ No newline at end of file diff --git a/lib/commonjs/AddToWalletButton.js.map b/lib/commonjs/AddToWalletButton.js.map new file mode 100644 index 0000000..dd871dd --- /dev/null +++ b/lib/commonjs/AddToWalletButton.js.map @@ -0,0 +1 @@ +{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","e","__esModule","default","NativeWalletButton","requireNativeComponent","BUTTON_TYPE_BREAKPOINT","BUTTON_DIMENSIONS","basic","ios","width","height","android","badge","AddToWalletButton","style","buttonStyle","buttonType","borderRadius","onPress","flattenedStyle","StyleSheet","flatten","currentDimensions","Platform","OS","rest","createElement","TouchableOpacity","activeOpacity","maxWidth","minWidth","styles","touchable","fill","create","justifyContent","alignItems","margin","flex","_default","exports"],"sourceRoot":"../../src","sources":["AddToWalletButton.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AAA4F,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAgB5F,MAAMG,kBAA0D,GAAG,IAAAC,mCAAsB,EAAC,qBAAqB,CAAC;AAEhH,MAAMC,sBAAsB,GAAG,GAAG;AAClC,MAAMC,iBAAiB,GAAG;EACxBC,KAAK,EAAE;IACLC,GAAG,EAAE;MAACC,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAE,CAAC;IAC7BC,OAAO,EAAE;MAACF,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAE;EAClC,CAAC;EACDE,KAAK,EAAE;IACLJ,GAAG,EAAE;MAACC,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAE,CAAC;IAC7BC,OAAO,EAAE;MAACF,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAE;EAClC;AACF,CAAC;AAED,SAASG,iBAAiBA,CAAC;EAACC,KAAK;EAAEC,WAAW,GAAG,OAAO;EAAEC,UAAU,GAAG,OAAO;EAAEC,YAAY,GAAG,CAAC;EAAEC;AAAc,CAAC,EAAE;EACjH,MAAMC,cAAc,GAAGC,uBAAU,CAACC,OAAO,CAACP,KAAK,CAAC,IAAI,CAAC,CAAC;EACtD,MAAMQ,iBAAiB,GAAGhB,iBAAiB,CAACU,UAAU,CAAC,CAACO,qBAAQ,CAACC,EAAE,CAAsB;EACzF,MAAM;IAACf,KAAK,GAAGa,iBAAiB,CAACb,KAAK;IAAEC,MAAM,GAAGY,iBAAiB,CAACZ,MAAM;IAAE,GAAGe;EAAI,CAAC,GAAGN,cAAc;EAEpG,oBACEvB,MAAA,CAAAM,OAAA,CAAAwB,aAAA,CAAC3B,YAAA,CAAA4B,gBAAgB;IACfT,OAAO,EAAEA,OAAQ;IACjBU,aAAa,EAAE,GAAI;IACnBd,KAAK,EAAE,CACLW,IAAI;IACJ;IACA;IACAT,UAAU,KAAK,OAAO,GAAG;MAACa,QAAQ,EAAExB,sBAAsB,GAAG;IAAC,CAAC,GAAG;MAACyB,QAAQ,EAAEzB;IAAsB,CAAC,EACpG;MACEI,KAAK;MACLC;IACF,CAAC,EACDqB,MAAM,CAACC,SAAS;EAChB,gBAEFpC,MAAA,CAAAM,OAAA,CAAAwB,aAAA,CAACvB,kBAAkB;IACjBW,KAAK,EAAEiB,MAAM,CAACE,IAAK;IACnBlB,WAAW,EAAEA,WAAY;IACzBE,YAAY,EAAEA,YAAa;IAC3BD,UAAU,EAAEA;EAAW,CACxB,CACe,CAAC;AAEvB;AAEA,MAAMe,MAAM,GAAGX,uBAAU,CAACc,MAAM,CAAC;EAC/BF,SAAS,EAAE;IACTG,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBC,MAAM,EAAE;EACV,CAAC;EACDJ,IAAI,EAAE;IACJK,IAAI,EAAE,CAAC;IACP7B,KAAK,EAAE,MAAM;IACbC,MAAM,EAAE;EACV;AACF,CAAC,CAAC;AAAC,IAAA6B,QAAA,GAAAC,OAAA,CAAAtC,OAAA,GAEYW,iBAAiB","ignoreList":[]} \ No newline at end of file diff --git a/lib/commonjs/NativeWallet.js b/lib/commonjs/NativeWallet.js new file mode 100644 index 0000000..f3affef --- /dev/null +++ b/lib/commonjs/NativeWallet.js @@ -0,0 +1,22 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.PACKAGE_NAME = void 0; +var _reactNative = require("react-native"); +const PACKAGE_NAME = exports.PACKAGE_NAME = '@expensify/react-native-wallet'; +// Try catch block to prevent crashing in case the module is not linked. +// Especialy useful for builds where Google SDK is not available +// eslint-disable-next-line import/no-mutable-exports +let Wallet; +try { + Wallet = _reactNative.TurboModuleRegistry.getEnforcing('RNWallet'); +} catch (error) { + if (error instanceof Error) { + // eslint-disable-next-line no-console + console.warn(`[${PACKAGE_NAME}] Failed to load Wallet module, ${error.message}`); + } +} +var _default = exports.default = Wallet; +//# sourceMappingURL=NativeWallet.js.map \ No newline at end of file diff --git a/lib/commonjs/NativeWallet.js.map b/lib/commonjs/NativeWallet.js.map new file mode 100644 index 0000000..858fa0b --- /dev/null +++ b/lib/commonjs/NativeWallet.js.map @@ -0,0 +1 @@ +{"version":3,"names":["_reactNative","require","PACKAGE_NAME","exports","Wallet","TurboModuleRegistry","getEnforcing","error","Error","console","warn","message","_default","default"],"sourceRoot":"../../src","sources":["NativeWallet.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAqFA,MAAMC,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG,gCAAgC;AACrD;AACA;AACA;AACA,IAAIE,MAAwB;AAC5B,IAAI;EACFA,MAAM,GAAGC,gCAAmB,CAACC,YAAY,CAAO,UAAU,CAAC;AAC7D,CAAC,CAAC,OAAOC,KAAK,EAAE;EACd,IAAIA,KAAK,YAAYC,KAAK,EAAE;IAC1B;IACAC,OAAO,CAACC,IAAI,CAAC,IAAIR,YAAY,mCAAmCK,KAAK,CAACI,OAAO,EAAE,CAAC;EAClF;AACF;AAAC,IAAAC,QAAA,GAAAT,OAAA,CAAAU,OAAA,GACcT,MAAM","ignoreList":[]} \ No newline at end of file diff --git a/lib/commonjs/index.js b/lib/commonjs/index.js new file mode 100644 index 0000000..916b6de --- /dev/null +++ b/lib/commonjs/index.js @@ -0,0 +1,142 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "AddToWalletButton", { + enumerable: true, + get: function () { + return _AddToWalletButton.default; + } +}); +exports.addCardToAppleWallet = addCardToAppleWallet; +exports.addCardToGoogleWallet = addCardToGoogleWallet; +exports.addListener = addListener; +exports.checkWalletAvailability = checkWalletAvailability; +exports.getCardStatusByIdentifier = getCardStatusByIdentifier; +exports.getCardStatusBySuffix = getCardStatusBySuffix; +exports.getSecureWalletInfo = getSecureWalletInfo; +exports.listTokens = listTokens; +exports.removeListener = removeListener; +exports.resumeAddCardToGoogleWallet = resumeAddCardToGoogleWallet; +var _reactNative = require("react-native"); +var _NativeWallet = _interopRequireWildcard(require("./NativeWallet")); +var _utils = require("./utils"); +var _AddToWalletButton = _interopRequireDefault(require("./AddToWalletButton")); +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } +/* eslint-disable @lwc/lwc/no-async-await */ + +function getModuleLinkingRejection() { + return Promise.reject(new Error(`Failed to load Wallet module, make sure to link ${_NativeWallet.PACKAGE_NAME} correctly`)); +} +const eventEmitter = new _reactNative.NativeEventEmitter(_NativeWallet.default); +function addListener(event, callback) { + return eventEmitter.addListener(event, callback); +} +function removeListener(subscription) { + subscription.remove(); +} +function checkWalletAvailability() { + if (!_NativeWallet.default) { + return getModuleLinkingRejection(); + } + return _NativeWallet.default.checkWalletAvailability(); +} +async function getSecureWalletInfo() { + if (_reactNative.Platform.OS === 'ios') { + throw new Error('getSecureWalletInfo is not available on iOS'); + } + if (!_NativeWallet.default) { + return getModuleLinkingRejection(); + } + const isWalletInitialized = await _NativeWallet.default.ensureGoogleWalletInitialized(); + if (!isWalletInitialized) { + throw new Error('Wallet could not be initialized'); + } + return _NativeWallet.default.getSecureWalletInfo(); +} +async function getCardStatusBySuffix(last4Digits) { + if (!_NativeWallet.default) { + return getModuleLinkingRejection(); + } + const cardState = await _NativeWallet.default.getCardStatusBySuffix(last4Digits); + return (0, _utils.getCardState)(cardState); +} + +/** + * Returns the state of a card based on a platform-specific identifier. + * @param identifier - The card identifier. On Android, it's `Token Reference ID` and on iOS, it's `Primary Account Identifier` + * @param tsp - The Token Service Provider, e.g. `VISA`, `MASTERCARD` + * @returns CardStatus - The card status + */ +async function getCardStatusByIdentifier(identifier, tsp) { + if (!_NativeWallet.default) { + return getModuleLinkingRejection(); + } + const tokenState = await _NativeWallet.default.getCardStatusByIdentifier(identifier, tsp.toUpperCase()); + return (0, _utils.getCardState)(tokenState); +} +async function addCardToGoogleWallet(cardData) { + if (_reactNative.Platform.OS === 'ios') { + throw new Error('addCardToGoogleWallet is not available on iOS'); + } + if (!_NativeWallet.default) { + return getModuleLinkingRejection(); + } + const isWalletInitialized = await _NativeWallet.default.ensureGoogleWalletInitialized(); + if (!isWalletInitialized) { + throw new Error('Wallet could not be initialized'); + } + const tokenizationStatus = await _NativeWallet.default.addCardToGoogleWallet(cardData); + return (0, _utils.getTokenizationStatus)(tokenizationStatus); +} +async function resumeAddCardToGoogleWallet(cardData) { + if (_reactNative.Platform.OS === 'ios') { + throw new Error('resumeAddCardToGoogleWallet is not available on iOS'); + } + if (!_NativeWallet.default) { + return getModuleLinkingRejection(); + } + const isWalletInitialized = await _NativeWallet.default.ensureGoogleWalletInitialized(); + if (!isWalletInitialized) { + throw new Error('Wallet could not be initialized'); + } + const tokenizationStatus = await _NativeWallet.default.resumeAddCardToGoogleWallet(cardData); + return (0, _utils.getTokenizationStatus)(tokenizationStatus); +} +async function listTokens() { + if (_reactNative.Platform.OS === 'ios') { + return Promise.resolve([]); + } + if (!_NativeWallet.default) { + return getModuleLinkingRejection(); + } + const isWalletInitialized = await _NativeWallet.default.ensureGoogleWalletInitialized(); + if (!isWalletInitialized) { + throw new Error('Wallet could not be initialized'); + } + return _NativeWallet.default.listTokens(); +} +async function addCardToAppleWallet(cardData, issuerEncryptPayloadCallback) { + if (_reactNative.Platform.OS === 'android') { + throw new Error('addCardToAppleWallet is not available on Android'); + } + const passData = await (_NativeWallet.default === null || _NativeWallet.default === void 0 ? void 0 : _NativeWallet.default.IOSPresentAddPaymentPassView(cardData)); + if (!passData || passData.status !== 0) { + return (0, _utils.getTokenizationStatus)((passData === null || passData === void 0 ? void 0 : passData.status) || -1); + } + async function addPaymentPassToWallet(paymentPassData) { + const responseData = await issuerEncryptPayloadCallback(paymentPassData.nonce, paymentPassData.nonceSignature, paymentPassData.certificates); + const response = await (_NativeWallet.default === null || _NativeWallet.default === void 0 ? void 0 : _NativeWallet.default.IOSHandleAddPaymentPassResponse(responseData)); + // Response is null when a pass is successfully added to the wallet or the user cancels the process + // In case the user presses the `Try again` option, new pass data is returned, and it should reenter the function + if (response) { + return addPaymentPassToWallet(response); + } + return 0; + } + const status = await addPaymentPassToWallet(passData); + return (0, _utils.getTokenizationStatus)(status); +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/commonjs/index.js.map b/lib/commonjs/index.js.map new file mode 100644 index 0000000..e3d1825 --- /dev/null +++ b/lib/commonjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"names":["_reactNative","require","_NativeWallet","_interopRequireWildcard","_utils","_AddToWalletButton","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","getModuleLinkingRejection","Promise","reject","Error","PACKAGE_NAME","eventEmitter","NativeEventEmitter","Wallet","addListener","event","callback","removeListener","subscription","remove","checkWalletAvailability","getSecureWalletInfo","Platform","OS","isWalletInitialized","ensureGoogleWalletInitialized","getCardStatusBySuffix","last4Digits","cardState","getCardState","getCardStatusByIdentifier","identifier","tsp","tokenState","toUpperCase","addCardToGoogleWallet","cardData","tokenizationStatus","getTokenizationStatus","resumeAddCardToGoogleWallet","listTokens","resolve","addCardToAppleWallet","issuerEncryptPayloadCallback","passData","IOSPresentAddPaymentPassView","status","addPaymentPassToWallet","paymentPassData","responseData","nonce","nonceSignature","certificates","response","IOSHandleAddPaymentPassResponse"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/lib/commonjs/utils.js b/lib/commonjs/utils.js new file mode 100644 index 0000000..6300556 --- /dev/null +++ b/lib/commonjs/utils.js @@ -0,0 +1,38 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getCardState = getCardState; +exports.getTokenizationStatus = getTokenizationStatus; +function getCardState(stateId) { + switch (stateId) { + case -1: + return 'not found'; + case 0: + return 'active'; + case 1: + return 'requireActivation'; + case 2: + return 'pending'; + case 3: + return 'suspended'; + case 4: + return 'deactivated'; + default: + throw new Error(`Unknown card state: ${stateId}`); + } +} +function getTokenizationStatus(stateId) { + switch (stateId) { + case -1: + return 'error'; + case 0: + return 'success'; + case 1: + return 'canceled'; + default: + throw new Error(`Unknown tokenization status: ${stateId}`); + } +} +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/lib/commonjs/utils.js.map b/lib/commonjs/utils.js.map new file mode 100644 index 0000000..4ebf933 --- /dev/null +++ b/lib/commonjs/utils.js.map @@ -0,0 +1 @@ +{"version":3,"names":["getCardState","stateId","Error","getTokenizationStatus"],"sourceRoot":"../../src","sources":["utils.ts"],"mappings":";;;;;;;AAEA,SAASA,YAAYA,CAACC,OAAe,EAAc;EACjD,QAAQA,OAAO;IACb,KAAK,CAAC,CAAC;MACL,OAAO,WAAW;IACpB,KAAK,CAAC;MACJ,OAAO,QAAQ;IACjB,KAAK,CAAC;MACJ,OAAO,mBAAmB;IAC5B,KAAK,CAAC;MACJ,OAAO,SAAS;IAClB,KAAK,CAAC;MACJ,OAAO,WAAW;IACpB,KAAK,CAAC;MACJ,OAAO,aAAa;IACtB;MACE,MAAM,IAAIC,KAAK,CAAC,uBAAuBD,OAAO,EAAE,CAAC;EACrD;AACF;AAEA,SAASE,qBAAqBA,CAACF,OAAe,EAAsB;EAClE,QAAQA,OAAO;IACb,KAAK,CAAC,CAAC;MACL,OAAO,OAAO;IAChB,KAAK,CAAC;MACJ,OAAO,SAAS;IAClB,KAAK,CAAC;MACJ,OAAO,UAAU;IACnB;MACE,MAAM,IAAIC,KAAK,CAAC,gCAAgCD,OAAO,EAAE,CAAC;EAC9D;AACF","ignoreList":[]} \ No newline at end of file diff --git a/lib/module/AddToWalletButton.js b/lib/module/AddToWalletButton.js new file mode 100644 index 0000000..1625a94 --- /dev/null +++ b/lib/module/AddToWalletButton.js @@ -0,0 +1,75 @@ +import React from 'react'; +import { Platform, requireNativeComponent, StyleSheet, TouchableOpacity } from 'react-native'; +const NativeWalletButton = requireNativeComponent('RNAddToWalletButton'); +const BUTTON_TYPE_BREAKPOINT = 236; +const BUTTON_DIMENSIONS = { + basic: { + ios: { + width: 300, + height: 40 + }, + android: { + width: 300, + height: 48 + } + }, + badge: { + ios: { + width: 120, + height: 40 + }, + android: { + width: 200, + height: 56 + } + } +}; +function AddToWalletButton({ + style, + buttonStyle = 'black', + buttonType = 'basic', + borderRadius = 4, + onPress +}) { + const flattenedStyle = StyleSheet.flatten(style) || {}; + const currentDimensions = BUTTON_DIMENSIONS[buttonType][Platform.OS]; + const { + width = currentDimensions.width, + height = currentDimensions.height, + ...rest + } = flattenedStyle; + return /*#__PURE__*/React.createElement(TouchableOpacity, { + onPress: onPress, + activeOpacity: 0.8, + style: [rest, + // Android allows us to define the type of the button, however on iOS type depends on the width. + // Adding this limits to ensure consistent behavior across platforms. + buttonType === 'badge' ? { + maxWidth: BUTTON_TYPE_BREAKPOINT - 1 + } : { + minWidth: BUTTON_TYPE_BREAKPOINT + }, { + width, + height + }, styles.touchable] + }, /*#__PURE__*/React.createElement(NativeWalletButton, { + style: styles.fill, + buttonStyle: buttonStyle, + borderRadius: borderRadius, + buttonType: buttonType + })); +} +const styles = StyleSheet.create({ + touchable: { + justifyContent: 'center', + alignItems: 'center', + margin: 10 + }, + fill: { + flex: 1, + width: '100%', + height: '100%' + } +}); +export default AddToWalletButton; +//# sourceMappingURL=AddToWalletButton.js.map \ No newline at end of file diff --git a/lib/module/AddToWalletButton.js.map b/lib/module/AddToWalletButton.js.map new file mode 100644 index 0000000..54049d5 --- /dev/null +++ b/lib/module/AddToWalletButton.js.map @@ -0,0 +1 @@ +{"version":3,"names":["React","Platform","requireNativeComponent","StyleSheet","TouchableOpacity","NativeWalletButton","BUTTON_TYPE_BREAKPOINT","BUTTON_DIMENSIONS","basic","ios","width","height","android","badge","AddToWalletButton","style","buttonStyle","buttonType","borderRadius","onPress","flattenedStyle","flatten","currentDimensions","OS","rest","createElement","activeOpacity","maxWidth","minWidth","styles","touchable","fill","create","justifyContent","alignItems","margin","flex"],"sourceRoot":"../../src","sources":["AddToWalletButton.tsx"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAAQC,QAAQ,EAAEC,sBAAsB,EAAEC,UAAU,EAAEC,gBAAgB,QAAO,cAAc;AAgB3F,MAAMC,kBAA0D,GAAGH,sBAAsB,CAAC,qBAAqB,CAAC;AAEhH,MAAMI,sBAAsB,GAAG,GAAG;AAClC,MAAMC,iBAAiB,GAAG;EACxBC,KAAK,EAAE;IACLC,GAAG,EAAE;MAACC,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAE,CAAC;IAC7BC,OAAO,EAAE;MAACF,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAE;EAClC,CAAC;EACDE,KAAK,EAAE;IACLJ,GAAG,EAAE;MAACC,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAE,CAAC;IAC7BC,OAAO,EAAE;MAACF,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAE;EAClC;AACF,CAAC;AAED,SAASG,iBAAiBA,CAAC;EAACC,KAAK;EAAEC,WAAW,GAAG,OAAO;EAAEC,UAAU,GAAG,OAAO;EAAEC,YAAY,GAAG,CAAC;EAAEC;AAAc,CAAC,EAAE;EACjH,MAAMC,cAAc,GAAGjB,UAAU,CAACkB,OAAO,CAACN,KAAK,CAAC,IAAI,CAAC,CAAC;EACtD,MAAMO,iBAAiB,GAAGf,iBAAiB,CAACU,UAAU,CAAC,CAAChB,QAAQ,CAACsB,EAAE,CAAsB;EACzF,MAAM;IAACb,KAAK,GAAGY,iBAAiB,CAACZ,KAAK;IAAEC,MAAM,GAAGW,iBAAiB,CAACX,MAAM;IAAE,GAAGa;EAAI,CAAC,GAAGJ,cAAc;EAEpG,oBACEpB,KAAA,CAAAyB,aAAA,CAACrB,gBAAgB;IACfe,OAAO,EAAEA,OAAQ;IACjBO,aAAa,EAAE,GAAI;IACnBX,KAAK,EAAE,CACLS,IAAI;IACJ;IACA;IACAP,UAAU,KAAK,OAAO,GAAG;MAACU,QAAQ,EAAErB,sBAAsB,GAAG;IAAC,CAAC,GAAG;MAACsB,QAAQ,EAAEtB;IAAsB,CAAC,EACpG;MACEI,KAAK;MACLC;IACF,CAAC,EACDkB,MAAM,CAACC,SAAS;EAChB,gBAEF9B,KAAA,CAAAyB,aAAA,CAACpB,kBAAkB;IACjBU,KAAK,EAAEc,MAAM,CAACE,IAAK;IACnBf,WAAW,EAAEA,WAAY;IACzBE,YAAY,EAAEA,YAAa;IAC3BD,UAAU,EAAEA;EAAW,CACxB,CACe,CAAC;AAEvB;AAEA,MAAMY,MAAM,GAAG1B,UAAU,CAAC6B,MAAM,CAAC;EAC/BF,SAAS,EAAE;IACTG,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBC,MAAM,EAAE;EACV,CAAC;EACDJ,IAAI,EAAE;IACJK,IAAI,EAAE,CAAC;IACP1B,KAAK,EAAE,MAAM;IACbC,MAAM,EAAE;EACV;AACF,CAAC,CAAC;AAEF,eAAeG,iBAAiB","ignoreList":[]} \ No newline at end of file diff --git a/lib/module/NativeWallet.js b/lib/module/NativeWallet.js new file mode 100644 index 0000000..71ebde0 --- /dev/null +++ b/lib/module/NativeWallet.js @@ -0,0 +1,17 @@ +import { TurboModuleRegistry } from 'react-native'; +const PACKAGE_NAME = '@expensify/react-native-wallet'; +// Try catch block to prevent crashing in case the module is not linked. +// Especialy useful for builds where Google SDK is not available +// eslint-disable-next-line import/no-mutable-exports +let Wallet; +try { + Wallet = TurboModuleRegistry.getEnforcing('RNWallet'); +} catch (error) { + if (error instanceof Error) { + // eslint-disable-next-line no-console + console.warn(`[${PACKAGE_NAME}] Failed to load Wallet module, ${error.message}`); + } +} +export default Wallet; +export { PACKAGE_NAME }; +//# sourceMappingURL=NativeWallet.js.map \ No newline at end of file diff --git a/lib/module/NativeWallet.js.map b/lib/module/NativeWallet.js.map new file mode 100644 index 0000000..faa171e --- /dev/null +++ b/lib/module/NativeWallet.js.map @@ -0,0 +1 @@ +{"version":3,"names":["TurboModuleRegistry","PACKAGE_NAME","Wallet","getEnforcing","error","Error","console","warn","message"],"sourceRoot":"../../src","sources":["NativeWallet.ts"],"mappings":"AACA,SAAQA,mBAAmB,QAAO,cAAc;AAqFhD,MAAMC,YAAY,GAAG,gCAAgC;AACrD;AACA;AACA;AACA,IAAIC,MAAwB;AAC5B,IAAI;EACFA,MAAM,GAAGF,mBAAmB,CAACG,YAAY,CAAO,UAAU,CAAC;AAC7D,CAAC,CAAC,OAAOC,KAAK,EAAE;EACd,IAAIA,KAAK,YAAYC,KAAK,EAAE;IAC1B;IACAC,OAAO,CAACC,IAAI,CAAC,IAAIN,YAAY,mCAAmCG,KAAK,CAACI,OAAO,EAAE,CAAC;EAClF;AACF;AACA,eAAeN,MAAM;AACrB,SAAQD,YAAY","ignoreList":[]} \ No newline at end of file diff --git a/lib/module/index.js b/lib/module/index.js new file mode 100644 index 0000000..18d0dd6 --- /dev/null +++ b/lib/module/index.js @@ -0,0 +1,119 @@ +/* eslint-disable @lwc/lwc/no-async-await */ +import { NativeEventEmitter, Platform } from 'react-native'; +import Wallet, { PACKAGE_NAME } from './NativeWallet'; +import { getCardState, getTokenizationStatus } from './utils'; +import AddToWalletButton from './AddToWalletButton'; +function getModuleLinkingRejection() { + return Promise.reject(new Error(`Failed to load Wallet module, make sure to link ${PACKAGE_NAME} correctly`)); +} +const eventEmitter = new NativeEventEmitter(Wallet); +function addListener(event, callback) { + return eventEmitter.addListener(event, callback); +} +function removeListener(subscription) { + subscription.remove(); +} +function checkWalletAvailability() { + if (!Wallet) { + return getModuleLinkingRejection(); + } + return Wallet.checkWalletAvailability(); +} +async function getSecureWalletInfo() { + if (Platform.OS === 'ios') { + throw new Error('getSecureWalletInfo is not available on iOS'); + } + if (!Wallet) { + return getModuleLinkingRejection(); + } + const isWalletInitialized = await Wallet.ensureGoogleWalletInitialized(); + if (!isWalletInitialized) { + throw new Error('Wallet could not be initialized'); + } + return Wallet.getSecureWalletInfo(); +} +async function getCardStatusBySuffix(last4Digits) { + if (!Wallet) { + return getModuleLinkingRejection(); + } + const cardState = await Wallet.getCardStatusBySuffix(last4Digits); + return getCardState(cardState); +} + +/** + * Returns the state of a card based on a platform-specific identifier. + * @param identifier - The card identifier. On Android, it's `Token Reference ID` and on iOS, it's `Primary Account Identifier` + * @param tsp - The Token Service Provider, e.g. `VISA`, `MASTERCARD` + * @returns CardStatus - The card status + */ +async function getCardStatusByIdentifier(identifier, tsp) { + if (!Wallet) { + return getModuleLinkingRejection(); + } + const tokenState = await Wallet.getCardStatusByIdentifier(identifier, tsp.toUpperCase()); + return getCardState(tokenState); +} +async function addCardToGoogleWallet(cardData) { + if (Platform.OS === 'ios') { + throw new Error('addCardToGoogleWallet is not available on iOS'); + } + if (!Wallet) { + return getModuleLinkingRejection(); + } + const isWalletInitialized = await Wallet.ensureGoogleWalletInitialized(); + if (!isWalletInitialized) { + throw new Error('Wallet could not be initialized'); + } + const tokenizationStatus = await Wallet.addCardToGoogleWallet(cardData); + return getTokenizationStatus(tokenizationStatus); +} +async function resumeAddCardToGoogleWallet(cardData) { + if (Platform.OS === 'ios') { + throw new Error('resumeAddCardToGoogleWallet is not available on iOS'); + } + if (!Wallet) { + return getModuleLinkingRejection(); + } + const isWalletInitialized = await Wallet.ensureGoogleWalletInitialized(); + if (!isWalletInitialized) { + throw new Error('Wallet could not be initialized'); + } + const tokenizationStatus = await Wallet.resumeAddCardToGoogleWallet(cardData); + return getTokenizationStatus(tokenizationStatus); +} +async function listTokens() { + if (Platform.OS === 'ios') { + return Promise.resolve([]); + } + if (!Wallet) { + return getModuleLinkingRejection(); + } + const isWalletInitialized = await Wallet.ensureGoogleWalletInitialized(); + if (!isWalletInitialized) { + throw new Error('Wallet could not be initialized'); + } + return Wallet.listTokens(); +} +async function addCardToAppleWallet(cardData, issuerEncryptPayloadCallback) { + if (Platform.OS === 'android') { + throw new Error('addCardToAppleWallet is not available on Android'); + } + const passData = await (Wallet === null || Wallet === void 0 ? void 0 : Wallet.IOSPresentAddPaymentPassView(cardData)); + if (!passData || passData.status !== 0) { + return getTokenizationStatus((passData === null || passData === void 0 ? void 0 : passData.status) || -1); + } + async function addPaymentPassToWallet(paymentPassData) { + const responseData = await issuerEncryptPayloadCallback(paymentPassData.nonce, paymentPassData.nonceSignature, paymentPassData.certificates); + const response = await (Wallet === null || Wallet === void 0 ? void 0 : Wallet.IOSHandleAddPaymentPassResponse(responseData)); + // Response is null when a pass is successfully added to the wallet or the user cancels the process + // In case the user presses the `Try again` option, new pass data is returned, and it should reenter the function + if (response) { + return addPaymentPassToWallet(response); + } + return 0; + } + const status = await addPaymentPassToWallet(passData); + return getTokenizationStatus(status); +} +export { AddToWalletButton, checkWalletAvailability, getSecureWalletInfo, getCardStatusBySuffix, getCardStatusByIdentifier, addCardToGoogleWallet, resumeAddCardToGoogleWallet, listTokens, addCardToAppleWallet, addListener, removeListener }; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/module/index.js.map b/lib/module/index.js.map new file mode 100644 index 0000000..aefcc73 --- /dev/null +++ b/lib/module/index.js.map @@ -0,0 +1 @@ +{"version":3,"names":["NativeEventEmitter","Platform","Wallet","PACKAGE_NAME","getCardState","getTokenizationStatus","AddToWalletButton","getModuleLinkingRejection","Promise","reject","Error","eventEmitter","addListener","event","callback","removeListener","subscription","remove","checkWalletAvailability","getSecureWalletInfo","OS","isWalletInitialized","ensureGoogleWalletInitialized","getCardStatusBySuffix","last4Digits","cardState","getCardStatusByIdentifier","identifier","tsp","tokenState","toUpperCase","addCardToGoogleWallet","cardData","tokenizationStatus","resumeAddCardToGoogleWallet","listTokens","resolve","addCardToAppleWallet","issuerEncryptPayloadCallback","passData","IOSPresentAddPaymentPassView","status","addPaymentPassToWallet","paymentPassData","responseData","nonce","nonceSignature","certificates","response","IOSHandleAddPaymentPassResponse"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/lib/module/utils.js b/lib/module/utils.js new file mode 100644 index 0000000..0c13113 --- /dev/null +++ b/lib/module/utils.js @@ -0,0 +1,32 @@ +function getCardState(stateId) { + switch (stateId) { + case -1: + return 'not found'; + case 0: + return 'active'; + case 1: + return 'requireActivation'; + case 2: + return 'pending'; + case 3: + return 'suspended'; + case 4: + return 'deactivated'; + default: + throw new Error(`Unknown card state: ${stateId}`); + } +} +function getTokenizationStatus(stateId) { + switch (stateId) { + case -1: + return 'error'; + case 0: + return 'success'; + case 1: + return 'canceled'; + default: + throw new Error(`Unknown tokenization status: ${stateId}`); + } +} +export { getCardState, getTokenizationStatus }; +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/lib/module/utils.js.map b/lib/module/utils.js.map new file mode 100644 index 0000000..6d04b0e --- /dev/null +++ b/lib/module/utils.js.map @@ -0,0 +1 @@ +{"version":3,"names":["getCardState","stateId","Error","getTokenizationStatus"],"sourceRoot":"../../src","sources":["utils.ts"],"mappings":"AAEA,SAASA,YAAYA,CAACC,OAAe,EAAc;EACjD,QAAQA,OAAO;IACb,KAAK,CAAC,CAAC;MACL,OAAO,WAAW;IACpB,KAAK,CAAC;MACJ,OAAO,QAAQ;IACjB,KAAK,CAAC;MACJ,OAAO,mBAAmB;IAC5B,KAAK,CAAC;MACJ,OAAO,SAAS;IAClB,KAAK,CAAC;MACJ,OAAO,WAAW;IACpB,KAAK,CAAC;MACJ,OAAO,aAAa;IACtB;MACE,MAAM,IAAIC,KAAK,CAAC,uBAAuBD,OAAO,EAAE,CAAC;EACrD;AACF;AAEA,SAASE,qBAAqBA,CAACF,OAAe,EAAsB;EAClE,QAAQA,OAAO;IACb,KAAK,CAAC,CAAC;MACL,OAAO,OAAO;IAChB,KAAK,CAAC;MACJ,OAAO,SAAS;IAClB,KAAK,CAAC;MACJ,OAAO,UAAU;IACnB;MACE,MAAM,IAAIC,KAAK,CAAC,gCAAgCD,OAAO,EAAE,CAAC;EAC9D;AACF;AAEA,SAAQD,YAAY,EAAEG,qBAAqB","ignoreList":[]} \ No newline at end of file diff --git a/lib/typescript/src/AddToWalletButton.d.ts b/lib/typescript/src/AddToWalletButton.d.ts new file mode 100644 index 0000000..25b6593 --- /dev/null +++ b/lib/typescript/src/AddToWalletButton.d.ts @@ -0,0 +1,16 @@ +import React from 'react'; +import type { ViewStyle, GestureResponderEvent, StyleProp } from 'react-native'; +type ButtonStyle = 'black' | 'blackOutline'; +type ButtonType = 'basic' | 'badge'; +interface NativeWalletButtonProps { + style?: StyleProp; + buttonStyle?: ButtonStyle; + buttonType?: ButtonType; + borderRadius?: number; +} +type Props = NativeWalletButtonProps & { + onPress?: (e: GestureResponderEvent) => void; +}; +declare function AddToWalletButton({ style, buttonStyle, buttonType, borderRadius, onPress }: Props): React.JSX.Element; +export default AddToWalletButton; +//# sourceMappingURL=AddToWalletButton.d.ts.map \ No newline at end of file diff --git a/lib/typescript/src/AddToWalletButton.d.ts.map b/lib/typescript/src/AddToWalletButton.d.ts.map new file mode 100644 index 0000000..83c020f --- /dev/null +++ b/lib/typescript/src/AddToWalletButton.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"AddToWalletButton.d.ts","sourceRoot":"","sources":["../../../src/AddToWalletButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAC,SAAS,EAAE,qBAAqB,EAAiB,SAAS,EAAC,MAAM,cAAc,CAAC;AAG7F,KAAK,WAAW,GAAG,OAAO,GAAG,cAAc,CAAC;AAC5C,KAAK,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpC,UAAU,uBAAuB;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,KAAK,GAAG,uBAAuB,GAAG;IACrC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC9C,CAAC;AAgBF,iBAAS,iBAAiB,CAAC,EAAC,KAAK,EAAE,WAAqB,EAAE,UAAoB,EAAE,YAAgB,EAAE,OAAO,EAAC,EAAE,KAAK,qBA6BhH;AAeD,eAAe,iBAAiB,CAAC"} \ No newline at end of file diff --git a/lib/typescript/src/NativeWallet.d.ts b/lib/typescript/src/NativeWallet.d.ts new file mode 100644 index 0000000..e204212 --- /dev/null +++ b/lib/typescript/src/NativeWallet.d.ts @@ -0,0 +1,77 @@ +import type { TurboModule } from 'react-native'; +type AndroidWalletData = { + deviceID: string; + walletAccountID: string; +}; +type CardStatus = 'not found' | 'requireActivation' | 'pending' | 'active' | 'suspended' | 'deactivated'; +type Platform = 'android' | 'ios'; +type UserAddress = { + name: string; + addressOne: string; + addressTwo?: string; + administrativeArea: string; + locality: string; + countryCode: string; + postalCode: string; + phoneNumber: string; +}; +type AndroidCardData = { + network: string; + opaquePaymentCard: string; + cardHolderName: string; + lastDigits: string; + userAddress: UserAddress; +}; +type AndroidResumeCardData = { + network: string; + tokenReferenceID: string; + cardHolderName?: string; + lastDigits?: string; +}; +type IOSCardData = { + network: string; + cardHolderName: string; + lastDigits: string; + cardDescription: string; +}; +type onCardActivatedPayload = { + tokenId: string; + status: 'activated' | 'canceled'; +}; +type IOSAddPaymentPassData = { + status: number; + nonce: string; + nonceSignature: string; + certificates: string[]; +}; +type IOSEncryptPayload = { + encryptedPassData: string; + activationData: string; + ephemeralPublicKey: string; +}; +type TokenizationStatus = 'canceled' | 'success' | 'error'; +type TokenInfo = { + identifier: string; + lastDigits: string; + tokenState: number; +}; +export interface Spec extends TurboModule { + checkWalletAvailability(): Promise; + ensureGoogleWalletInitialized(): Promise; + getSecureWalletInfo(): Promise; + getCardStatusBySuffix(last4Digits: string): Promise; + getCardStatusByIdentifier(identifier: string, tsp: string): Promise; + addCardToGoogleWallet(cardData: AndroidCardData): Promise; + resumeAddCardToGoogleWallet(cardData: AndroidResumeCardData): Promise; + listTokens(): Promise; + IOSPresentAddPaymentPassView(cardData: IOSCardData): Promise; + IOSHandleAddPaymentPassResponse(payload: IOSEncryptPayload): Promise; + addListener: (eventType: string) => void; + removeListeners: (count: number) => void; +} +declare const PACKAGE_NAME = "@expensify/react-native-wallet"; +declare let Wallet: Spec | undefined; +export default Wallet; +export { PACKAGE_NAME }; +export type { AndroidCardData, AndroidResumeCardData, IOSCardData, AndroidWalletData, CardStatus, UserAddress, onCardActivatedPayload, Platform, IOSAddPaymentPassData, IOSEncryptPayload, TokenizationStatus, TokenInfo, }; +//# sourceMappingURL=NativeWallet.d.ts.map \ No newline at end of file diff --git a/lib/typescript/src/NativeWallet.d.ts.map b/lib/typescript/src/NativeWallet.d.ts.map new file mode 100644 index 0000000..eac9d48 --- /dev/null +++ b/lib/typescript/src/NativeWallet.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"NativeWallet.d.ts","sourceRoot":"","sources":["../../../src/NativeWallet.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/typescript/src/index.d.ts b/lib/typescript/src/index.d.ts new file mode 100644 index 0000000..cba33e5 --- /dev/null +++ b/lib/typescript/src/index.d.ts @@ -0,0 +1,22 @@ +import type { EmitterSubscription } from 'react-native'; +import type { TokenizationStatus, AndroidCardData, AndroidResumeCardData, CardStatus, IOSCardData, IOSEncryptPayload, AndroidWalletData, onCardActivatedPayload, IOSAddPaymentPassData, TokenInfo } from './NativeWallet'; +import AddToWalletButton from './AddToWalletButton'; +declare function addListener(event: string, callback: (data: onCardActivatedPayload) => void): EmitterSubscription; +declare function removeListener(subscription: EmitterSubscription): void; +declare function checkWalletAvailability(): Promise; +declare function getSecureWalletInfo(): Promise; +declare function getCardStatusBySuffix(last4Digits: string): Promise; +/** + * Returns the state of a card based on a platform-specific identifier. + * @param identifier - The card identifier. On Android, it's `Token Reference ID` and on iOS, it's `Primary Account Identifier` + * @param tsp - The Token Service Provider, e.g. `VISA`, `MASTERCARD` + * @returns CardStatus - The card status + */ +declare function getCardStatusByIdentifier(identifier: string, tsp: string): Promise; +declare function addCardToGoogleWallet(cardData: AndroidCardData): Promise; +declare function resumeAddCardToGoogleWallet(cardData: AndroidResumeCardData): Promise; +declare function listTokens(): Promise; +declare function addCardToAppleWallet(cardData: IOSCardData, issuerEncryptPayloadCallback: (nonce: string, nonceSignature: string, certificate: string[]) => Promise): Promise; +export type { AndroidCardData, AndroidWalletData, CardStatus, IOSEncryptPayload, IOSCardData, IOSAddPaymentPassData, onCardActivatedPayload, TokenizationStatus, TokenInfo }; +export { AddToWalletButton, checkWalletAvailability, getSecureWalletInfo, getCardStatusBySuffix, getCardStatusByIdentifier, addCardToGoogleWallet, resumeAddCardToGoogleWallet, listTokens, addCardToAppleWallet, addListener, removeListener, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/typescript/src/index.d.ts.map b/lib/typescript/src/index.d.ts.map new file mode 100644 index 0000000..b8f5262 --- /dev/null +++ b/lib/typescript/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAEtD,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAQpD,iBAAS,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,IAAI,GAAG,mBAAmB,CAEzG;AAED,iBAAS,cAAc,CAAC,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAE/D;AAED,iBAAS,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAKnD;AAED,iBAAe,mBAAmB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAc/D;AAED,iBAAe,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAO7E;AAED;;;;;GAKG;AACH,iBAAe,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAO7F;AAED,iBAAe,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAc3F;AAED,iBAAe,2BAA2B,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAcvG;AAED,iBAAe,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAahD;AAED,iBAAe,oBAAoB,CACjC,QAAQ,EAAE,WAAW,EACrB,4BAA4B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,iBAAiB,CAAC,GACzH,OAAO,CAAC,kBAAkB,CAAC,CAsB7B;AAED,YAAY,EAAC,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,SAAS,EAAC,CAAC;AAC3K,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,EAC3B,UAAU,EACV,oBAAoB,EACpB,WAAW,EACX,cAAc,GACf,CAAC"} \ No newline at end of file diff --git a/lib/typescript/src/utils.d.ts b/lib/typescript/src/utils.d.ts new file mode 100644 index 0000000..f60daad --- /dev/null +++ b/lib/typescript/src/utils.d.ts @@ -0,0 +1,5 @@ +import type { CardStatus, TokenizationStatus } from './NativeWallet'; +declare function getCardState(stateId: number): CardStatus; +declare function getTokenizationStatus(stateId: number): TokenizationStatus; +export { getCardState, getTokenizationStatus }; +//# sourceMappingURL=utils.d.ts.map \ No newline at end of file diff --git a/lib/typescript/src/utils.d.ts.map b/lib/typescript/src/utils.d.ts.map new file mode 100644 index 0000000..3843643 --- /dev/null +++ b/lib/typescript/src/utils.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAE,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAEnE,iBAAS,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAiBjD;AAED,iBAAS,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAWlE;AAED,OAAO,EAAC,YAAY,EAAE,qBAAqB,EAAC,CAAC"} \ No newline at end of file diff --git a/package.json b/package.json index c14e306..eb4ca4f 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "@expensify/react-native-wallet", + "private": true, "version": "0.1.21", "description": "A React Native module designed for seamless integration of Card Push Provisioning into Apple Wallet and Google Wallet, enabling easy and secure addition of payment cards directly from your application.", "source": "./src/index.tsx", @@ -29,17 +30,13 @@ "!**/__mocks__", "!**/.*" ], - "workspaces": [ - "apps/common-app", - "apps/basic-example" - ], "scripts": { "test": "jest", "typecheck": "tsc --noEmit", "lint": "eslint . --ext .js,.ts,.tsx", "lint:root": "eslint . --ext .js,.ts,.tsx --ignore-pattern '/plugins/**/*' --ignore-pattern '/apps/**/*'", "clean": "del-cli android/build apps/basic-example/android/build apps/basic-example/android/app/build apps/basic-example/ios/build apps/expo-example/android/build apps/expo-example/ios/build lib plugins/build", - "prepare": "bob build && npm run build:plugins", + "prepare": "echo 'prebuilt'", "build:watch": "nodemon --watch src --ext .ts,.tsx,.css --exec \"rm -f .build_complete && npm run prepare && npm pack && touch .build_complete\"", "release": "release-it", "build:plugins": "cd plugins && npx tsc"