@oobit/react-native-sdk 3.0.1 → 3.0.2

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.
@@ -1,9 +1,5 @@
1
- /**
2
- * Widget SDK Component
3
- * Embeds the web widget in a WebView and handles bidirectional communication
4
- */
5
1
  import React from "react";
6
- import { WidgetSDKConfig } from "./types";
2
+ import type { WidgetSDKConfig } from "@oobit/core";
7
3
  export interface WidgetSDKRef {
8
4
  navigateBack: () => void;
9
5
  reload: () => void;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetSDK.d.ts","sourceRoot":"","sources":["../../src/components/WidgetSDK.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,aAAa,CAAC;AAIlE,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,sFAkIrB,CAAC"}
@@ -1,8 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * Widget SDK Component
4
- * Embeds the web widget in a WebView and handles bidirectional communication
5
- */
6
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
3
  if (k2 === undefined) k2 = k;
8
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -41,8 +37,8 @@ exports.WidgetSDK = void 0;
41
37
  const react_1 = __importStar(require("react"));
42
38
  const react_native_1 = require("react-native");
43
39
  const react_native_webview_1 = require("react-native-webview");
44
- const config_1 = require("./config");
45
- const walletUtils_1 = require("./walletUtils");
40
+ const core_1 = require("@oobit/core");
41
+ const walletUtils_1 = require("../utils/walletUtils");
46
42
  exports.WidgetSDK = (0, react_1.forwardRef)(({ accessToken, userWalletAddress, onClose, onTransactionRequested }, ref) => {
47
43
  const webViewRef = (0, react_1.useRef)(null);
48
44
  const [walletAvailable, setWalletAvailable] = (0, react_1.useState)(false);
@@ -93,16 +89,16 @@ exports.WidgetSDK = (0, react_1.forwardRef)(({ accessToken, userWalletAddress, o
93
89
  }
94
90
  }
95
91
  catch {
96
- // Ignore parse errors
92
+ // Invalid JSON from WebView - ignore
97
93
  }
98
94
  };
99
95
  const sendMessageToWidget = (message) => {
100
96
  webViewRef.current?.injectJavaScript(`window.postMessage(${JSON.stringify(message)}, '*'); true;`);
101
97
  };
102
98
  const finalWidgetUrl = (0, react_1.useMemo)(() => {
103
- const baseUrl = (0, config_1.getWidgetUrl)(accessToken);
99
+ const baseUrl = (0, core_1.getWidgetUrl)(accessToken);
104
100
  const params = new URLSearchParams({
105
- token: (0, config_1.stripTokenPrefix)(accessToken),
101
+ token: (0, core_1.stripTokenPrefix)(accessToken),
106
102
  platform: react_native_1.Platform.OS,
107
103
  userWalletAddress,
108
104
  });
@@ -124,6 +120,10 @@ exports.WidgetSDK = (0, react_1.forwardRef)(({ accessToken, userWalletAddress, o
124
120
  return false;
125
121
  }
126
122
  return true;
123
+ }} onOpenWindow={(syntheticEvent) => {
124
+ const { nativeEvent } = syntheticEvent;
125
+ const { targetUrl } = nativeEvent;
126
+ react_native_1.Linking.openURL(targetUrl).catch(() => { });
127
127
  }} javaScriptEnabled={true} domStorageEnabled={true} allowsInlineMediaPlayback={true} bounces={false} allowsBackForwardNavigationGestures={true} mixedContentMode="always"/>
128
128
  {isLoading && (<react_native_1.View style={styles.loadingOverlay}>
129
129
  <react_native_1.ActivityIndicator size="large" color="#007AFF"/>
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetSDK.js","sourceRoot":"","sources":["../../src/components/WidgetSDK.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAOe;AACf,+CAOsB;AACtB,+DAAoE;AAEpE,sCAA6D;AAC7D,sDAA2E;AAO9D,QAAA,SAAS,GAAG,IAAA,kBAAU,EACjC,CACE,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,sBAAsB,EAAE,EACnE,GAAG,EACH,EAAE;IACF,MAAM,UAAU,GAAG,IAAA,cAAM,EAAU,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAEpC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAA,+BAAiB,GAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,0BAAW,CAAC,gBAAgB,CAC9C,mBAAmB,EACnB,GAAG,EAAE;YACH,mBAAmB,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC,CACF,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,2BAAmB,EAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,YAAY,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;QACzE,MAAM,EAAE,GAAG,EAAE;YACX,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;YAC9B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC/B,CAAC;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,aAAa,GAAG,CAAC,KAA0B,EAAE,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAkB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAElE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,cAAc;oBACjB,mBAAmB,CAAC;wBAClB,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EAAE,EAAE,QAAQ,EAAE,uBAAQ,CAAC,EAAE,EAAE,eAAe,EAAE;qBACpD,CAAC,CAAC;oBACH,MAAM;gBAER,KAAK,oBAAoB;oBACvB,IAAA,8BAAgB,GAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;wBAClC,mBAAmB,CAAC;4BAClB,IAAI,EAAE,sBAAsB;4BAC5B,OAAO,EAAE,EAAE,OAAO,EAAE;yBACrB,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;oBACH,MAAM;gBAER,KAAK,cAAc;oBACjB,OAAO,EAAE,EAAE,CAAC;oBACZ,MAAM;gBAER,KAAK,8BAA8B;oBACjC,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxC,MAAM;YACV,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAE,EAAE;QAC/C,UAAU,CAAC,OAAO,EAAE,gBAAgB,CAClC,sBAAsB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAC7D,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAClC,MAAM,OAAO,GAAG,IAAA,mBAAY,EAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,KAAK,EAAE,IAAA,uBAAgB,EAAC,WAAW,CAAC;YACpC,QAAQ,EAAE,uBAAQ,CAAC,EAAE;YACrB,iBAAiB;SAClB,CAAC,CAAC;QACH,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC3C,CAAC,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAErC,OAAO,CACL,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;QAAA,CAAC,8BAAO,CACN,GAAG,CAAC,CAAC,UAAU,CAAC,CAChB,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACtB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAChC,SAAS,CAAC,CAAC,aAAa,CAAC,CACzB,SAAS,CAAC,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC3B,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC7B,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CACF,4BAA4B,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE;YACxC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;YACxB,IACE,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;gBAC5B,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBAC9B,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACjC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAChC,CAAC;gBACD,sBAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACrC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CACF,YAAY,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE;YAC/B,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;YACvC,MAAM,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;YAClC,sBAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CACF,iBAAiB,CAAC,CAAC,IAAI,CAAC,CACxB,iBAAiB,CAAC,CAAC,IAAI,CAAC,CACxB,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAChC,OAAO,CAAC,CAAC,KAAK,CAAC,CACf,mCAAmC,CAAC,CAAC,IAAI,CAAC,CAC1C,gBAAgB,CAAC,QAAQ,EAE3B;QAAA,CAAC,SAAS,IAAI,CACZ,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CACjC;YAAA,CAAC,gCAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EACjD;UAAA,EAAE,mBAAI,CAAC,CACR,CACH;MAAA,EAAE,mBAAI,CAAC,CACR,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACtB,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;IACpB,cAAc,EAAE;QACd,GAAG,yBAAU,CAAC,kBAAkB;QAChC,eAAe,EAAE,0BAA0B;QAC3C,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;KACrB;CACF,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { EvmTransactionData, EvmTransactionRequest, SolanaTransactionRequest, TransactionRequest, TransactionTokenMetadata, WidgetSDKConfig, } from "./types";
2
- export { WidgetSDK } from "./WidgetSDK";
3
- export type { WidgetSDKRef } from "./WidgetSDK";
1
+ export { WidgetSDK } from './components/WidgetSDK';
2
+ export type { WidgetSDKRef } from './components/WidgetSDK';
3
+ export type { TransactionRequest, EvmTransactionRequest, SolanaTransactionRequest, TransactionTokenMetadata, WidgetSDKConfig, } from '@oobit/core';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,GAChB,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WidgetSDK = void 0;
4
- var WidgetSDK_1 = require("./WidgetSDK");
4
+ var WidgetSDK_1 = require("./components/WidgetSDK");
5
5
  Object.defineProperty(exports, "WidgetSDK", { enumerable: true, get: function () { return WidgetSDK_1.WidgetSDK; } });
6
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAQA,yCAAwC;AAA/B,sGAAA,SAAS,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oDAAmD;AAA1C,sGAAA,SAAS,OAAA"}
@@ -0,0 +1,3 @@
1
+ export declare function openNativeWallet(): Promise<boolean>;
2
+ export declare function isWalletAvailable(): Promise<boolean>;
3
+ //# sourceMappingURL=walletUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletUtils.d.ts","sourceRoot":"","sources":["../../src/utils/walletUtils.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBzD;AA4DD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAY1D"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openNativeWallet = openNativeWallet;
4
+ exports.isWalletAvailable = isWalletAvailable;
5
+ const react_native_1 = require("react-native");
6
+ const core_1 = require("@oobit/core");
7
+ const GOOGLE_WALLET_PACKAGE = "com.google.android.apps.walletnfcrel";
8
+ async function openNativeWallet() {
9
+ try {
10
+ if (react_native_1.Platform.OS === "ios") {
11
+ return await openAppleWallet();
12
+ }
13
+ if (react_native_1.Platform.OS === "android") {
14
+ return await openGoogleWallet();
15
+ }
16
+ return false;
17
+ }
18
+ catch {
19
+ react_native_1.Alert.alert("Error", "Could not open wallet. Please check if the app is installed.");
20
+ return false;
21
+ }
22
+ }
23
+ async function openAppleWallet() {
24
+ const { passkit, fallback } = core_1.WALLET_URLS.ios;
25
+ // Try wallet:// scheme first (documented for recent iOS)
26
+ if (await tryOpenUrl("wallet://")) {
27
+ return true;
28
+ }
29
+ // Try shoebox:// scheme (unofficial but widely used)
30
+ if (await tryOpenUrl(passkit)) {
31
+ return true;
32
+ }
33
+ // Fallback to wallet.apple.com (opens in browser)
34
+ if (await tryOpenUrl(fallback)) {
35
+ return true;
36
+ }
37
+ throw new Error("Apple Wallet not available");
38
+ }
39
+ async function openGoogleWallet() {
40
+ const launchUrl = `market://launch?id=${GOOGLE_WALLET_PACKAGE}`;
41
+ // Try launching the app directly
42
+ if (await tryOpenUrl(launchUrl)) {
43
+ return true;
44
+ }
45
+ // App not installed - open Play Store
46
+ const playStoreUrl = `market://details?id=${GOOGLE_WALLET_PACKAGE}`;
47
+ const webPlayStoreUrl = `https://play.google.com/store/apps/details?id=${GOOGLE_WALLET_PACKAGE}`;
48
+ const opened = await tryOpenUrl(playStoreUrl) || await tryOpenUrl(webPlayStoreUrl);
49
+ if (opened) {
50
+ react_native_1.Alert.alert("Google Wallet", "Google Wallet is not installed. Opening Play Store to install the app.");
51
+ }
52
+ return false;
53
+ }
54
+ async function tryOpenUrl(url) {
55
+ try {
56
+ const canOpen = await react_native_1.Linking.canOpenURL(url);
57
+ if (canOpen) {
58
+ await react_native_1.Linking.openURL(url);
59
+ return true;
60
+ }
61
+ }
62
+ catch {
63
+ // URL scheme not available
64
+ }
65
+ return false;
66
+ }
67
+ async function isWalletAvailable() {
68
+ try {
69
+ if (react_native_1.Platform.OS === "ios") {
70
+ return await react_native_1.Linking.canOpenURL(core_1.WALLET_URLS.ios.passkit);
71
+ }
72
+ if (react_native_1.Platform.OS === "android") {
73
+ return await react_native_1.Linking.canOpenURL(core_1.WALLET_URLS.android.googlePay);
74
+ }
75
+ return false;
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ //# sourceMappingURL=walletUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletUtils.js","sourceRoot":"","sources":["../../src/utils/walletUtils.ts"],"names":[],"mappings":";;AAKA,4CAgBC;AA4DD,8CAYC;AA7FD,+CAAwD;AACxD,sCAA0C;AAE1C,MAAM,qBAAqB,GAAG,sCAAsC,CAAC;AAE9D,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,IAAI,uBAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC1B,OAAO,MAAM,eAAe,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,uBAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,MAAM,gBAAgB,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,oBAAK,CAAC,KAAK,CACT,OAAO,EACP,8DAA8D,CAC/D,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,kBAAW,CAAC,GAAG,CAAC;IAE9C,yDAAyD;IACzD,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qDAAqD;IACrD,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,SAAS,GAAG,sBAAsB,qBAAqB,EAAE,CAAC;IAEhE,iCAAiC;IACjC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,MAAM,YAAY,GAAG,uBAAuB,qBAAqB,EAAE,CAAC;IACpE,MAAM,eAAe,GAAG,iDAAiD,qBAAqB,EAAE,CAAC;IAEjG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,IAAI,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC;IAEnF,IAAI,MAAM,EAAE,CAAC;QACX,oBAAK,CAAC,KAAK,CACT,eAAe,EACf,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,sBAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,sBAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAEM,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,IAAI,uBAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC1B,OAAO,MAAM,sBAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,uBAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,MAAM,sBAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oobit/react-native-sdk",
3
- "version": "3.0.1",
3
+ "version": "3.0.2",
4
4
  "description": "React Native SDK for integrating Oobit crypto payments into wallet apps",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -35,7 +35,8 @@
35
35
  },
36
36
  "repository": {
37
37
  "type": "git",
38
- "url": "git+https://github.com/oobit-tech/react-native-SDK.git"
38
+ "url": "git+https://github.com/oobit-tech/react-native-SDK.git",
39
+ "directory": "packages/react-native"
39
40
  },
40
41
  "peerDependencies": {
41
42
  "react": ">=18.0.0",
@@ -43,29 +44,37 @@
43
44
  "react-native-webview": ">=13.0.0"
44
45
  },
45
46
  "dependencies": {
46
- "node-forge": "^1.3.1"
47
+ "node-forge": "^1.3.1",
48
+ "@oobit/core": "3.0.2"
47
49
  },
48
50
  "devDependencies": {
49
51
  "@types/node-forge": "^1.3.11",
50
52
  "@types/react": "~19.1.0",
51
- "@typescript-eslint/eslint-plugin": "^8.47.0",
52
- "@typescript-eslint/parser": "^8.47.0",
53
- "eslint": "^9.39.1",
54
53
  "react": "19.1.0",
55
54
  "react-native": "0.81.5",
56
55
  "react-native-webview": "13.15.0",
57
- "typescript": "~5.9.2"
56
+ "typescript": "~5.9.2",
57
+ "vitest": "^1.2.0",
58
+ "@testing-library/react-native": "^12.4.0",
59
+ "@oobit/typescript-config": "1.0.0",
60
+ "@oobit/eslint-config": "1.0.0"
58
61
  },
59
62
  "files": [
60
63
  "dist",
61
64
  "src",
62
65
  "README.md",
66
+ "SDK_ARCHITECTURE.md",
67
+ "SDK_QUICKSTART.md",
68
+ "WIDGET_INTEGRATION.md",
63
69
  "LICENSE"
64
70
  ],
65
71
  "scripts": {
66
72
  "build": "tsc",
67
- "prepublishOnly": "npm run build",
73
+ "dev": "tsc --watch",
68
74
  "typecheck": "tsc --noEmit",
69
- "clean": "rm -rf dist"
75
+ "clean": "rm -rf dist",
76
+ "lint": "eslint src/",
77
+ "test": "vitest run",
78
+ "test:watch": "vitest"
70
79
  }
71
- }
80
+ }
@@ -1,8 +1,3 @@
1
- /**
2
- * Widget SDK Component
3
- * Embeds the web widget in a WebView and handles bidirectional communication
4
- */
5
-
6
1
  import React, {
7
2
  forwardRef,
8
3
  useEffect,
@@ -20,9 +15,9 @@ import {
20
15
  View,
21
16
  } from "react-native";
22
17
  import { WebView, WebViewMessageEvent } from "react-native-webview";
23
- import { getWidgetUrl, stripTokenPrefix } from "./config";
24
- import { WidgetMessage, WidgetSDKConfig } from "./types";
25
- import { isWalletAvailable, openNativeWallet } from "./walletUtils";
18
+ import type { WidgetMessage, WidgetSDKConfig } from "@oobit/core";
19
+ import { getWidgetUrl, stripTokenPrefix } from "@oobit/core";
20
+ import { isWalletAvailable, openNativeWallet } from "../utils/walletUtils";
26
21
 
27
22
  export interface WidgetSDKRef {
28
23
  navigateBack: () => void;
@@ -93,7 +88,7 @@ export const WidgetSDK = forwardRef<WidgetSDKRef, WidgetSDKConfig>(
93
88
  break;
94
89
  }
95
90
  } catch {
96
- // Ignore parse errors
91
+ // Invalid JSON from WebView - ignore
97
92
  }
98
93
  };
99
94
 
@@ -139,6 +134,11 @@ export const WidgetSDK = forwardRef<WidgetSDKRef, WidgetSDKConfig>(
139
134
  }
140
135
  return true;
141
136
  }}
137
+ onOpenWindow={(syntheticEvent) => {
138
+ const { nativeEvent } = syntheticEvent;
139
+ const { targetUrl } = nativeEvent;
140
+ Linking.openURL(targetUrl).catch(() => {});
141
+ }}
142
142
  javaScriptEnabled={true}
143
143
  domStorageEnabled={true}
144
144
  allowsInlineMediaPlayback={true}
package/src/index.ts CHANGED
@@ -1,10 +1,10 @@
1
+ export { WidgetSDK } from './components/WidgetSDK';
2
+ export type { WidgetSDKRef } from './components/WidgetSDK';
3
+
1
4
  export type {
2
- EvmTransactionData,
5
+ TransactionRequest,
3
6
  EvmTransactionRequest,
4
7
  SolanaTransactionRequest,
5
- TransactionRequest,
6
8
  TransactionTokenMetadata,
7
9
  WidgetSDKConfig,
8
- } from "./types";
9
- export { WidgetSDK } from "./WidgetSDK";
10
- export type { WidgetSDKRef } from "./WidgetSDK";
10
+ } from '@oobit/core';
@@ -0,0 +1,94 @@
1
+ import { Alert, Linking, Platform } from "react-native";
2
+ import { WALLET_URLS } from "@oobit/core";
3
+
4
+ const GOOGLE_WALLET_PACKAGE = "com.google.android.apps.walletnfcrel";
5
+
6
+ export async function openNativeWallet(): Promise<boolean> {
7
+ try {
8
+ if (Platform.OS === "ios") {
9
+ return await openAppleWallet();
10
+ }
11
+ if (Platform.OS === "android") {
12
+ return await openGoogleWallet();
13
+ }
14
+ return false;
15
+ } catch {
16
+ Alert.alert(
17
+ "Error",
18
+ "Could not open wallet. Please check if the app is installed."
19
+ );
20
+ return false;
21
+ }
22
+ }
23
+
24
+ async function openAppleWallet(): Promise<boolean> {
25
+ const { passkit, fallback } = WALLET_URLS.ios;
26
+
27
+ // Try wallet:// scheme first (documented for recent iOS)
28
+ if (await tryOpenUrl("wallet://")) {
29
+ return true;
30
+ }
31
+
32
+ // Try shoebox:// scheme (unofficial but widely used)
33
+ if (await tryOpenUrl(passkit)) {
34
+ return true;
35
+ }
36
+
37
+ // Fallback to wallet.apple.com (opens in browser)
38
+ if (await tryOpenUrl(fallback)) {
39
+ return true;
40
+ }
41
+
42
+ throw new Error("Apple Wallet not available");
43
+ }
44
+
45
+ async function openGoogleWallet(): Promise<boolean> {
46
+ const launchUrl = `market://launch?id=${GOOGLE_WALLET_PACKAGE}`;
47
+
48
+ // Try launching the app directly
49
+ if (await tryOpenUrl(launchUrl)) {
50
+ return true;
51
+ }
52
+
53
+ // App not installed - open Play Store
54
+ const playStoreUrl = `market://details?id=${GOOGLE_WALLET_PACKAGE}`;
55
+ const webPlayStoreUrl = `https://play.google.com/store/apps/details?id=${GOOGLE_WALLET_PACKAGE}`;
56
+
57
+ const opened = await tryOpenUrl(playStoreUrl) || await tryOpenUrl(webPlayStoreUrl);
58
+
59
+ if (opened) {
60
+ Alert.alert(
61
+ "Google Wallet",
62
+ "Google Wallet is not installed. Opening Play Store to install the app."
63
+ );
64
+ }
65
+
66
+ return false;
67
+ }
68
+
69
+ async function tryOpenUrl(url: string): Promise<boolean> {
70
+ try {
71
+ const canOpen = await Linking.canOpenURL(url);
72
+ if (canOpen) {
73
+ await Linking.openURL(url);
74
+ return true;
75
+ }
76
+ } catch {
77
+ // URL scheme not available
78
+ }
79
+ return false;
80
+ }
81
+
82
+ export async function isWalletAvailable(): Promise<boolean> {
83
+ try {
84
+ if (Platform.OS === "ios") {
85
+ return await Linking.canOpenURL(WALLET_URLS.ios.passkit);
86
+ }
87
+ if (Platform.OS === "android") {
88
+ return await Linking.canOpenURL(WALLET_URLS.android.googlePay);
89
+ }
90
+ return false;
91
+ } catch {
92
+ return false;
93
+ }
94
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"WidgetSDK.d.ts","sourceRoot":"","sources":["../src/WidgetSDK.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAWf,OAAO,EAAiB,eAAe,EAAE,MAAM,SAAS,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,sFA6HrB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"WidgetSDK.js","sourceRoot":"","sources":["../src/WidgetSDK.tsx"],"names":[],"mappings":"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"}
package/dist/config.d.ts DELETED
@@ -1,24 +0,0 @@
1
- /**
2
- * Widget SDK Configuration
3
- * Environment detection based on access token prefix
4
- */
5
- /**
6
- * Widget URLs by environment
7
- */
8
- export declare const WIDGET_URLS: {
9
- readonly sandbox: "https://oobit-widget-dev.web.app";
10
- readonly production: "https://oobit-widget.web.app";
11
- };
12
- /**
13
- * Get the widget URL based on the access token prefix
14
- * @param accessToken - The access token (prefixed with sbx_ or prod_)
15
- * @returns The widget URL for the corresponding environment
16
- */
17
- export declare function getWidgetUrl(accessToken: string): string;
18
- /**
19
- * Strip the environment prefix from an access token
20
- * @param accessToken - The access token (prefixed with sbx_ or prod_)
21
- * @returns The token without the environment prefix
22
- */
23
- export declare function stripTokenPrefix(accessToken: string): string;
24
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,eAAO,MAAM,WAAW;;;CAGd,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CASxD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQ5D"}
package/dist/config.js DELETED
@@ -1,53 +0,0 @@
1
- "use strict";
2
- /**
3
- * Widget SDK Configuration
4
- * Environment detection based on access token prefix
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.WIDGET_URLS = void 0;
8
- exports.getWidgetUrl = getWidgetUrl;
9
- exports.stripTokenPrefix = stripTokenPrefix;
10
- /**
11
- * Token prefixes that determine the environment
12
- */
13
- const TOKEN_PREFIX = {
14
- SANDBOX: "sbx_",
15
- PRODUCTION: "prod_",
16
- };
17
- /**
18
- * Widget URLs by environment
19
- */
20
- exports.WIDGET_URLS = {
21
- sandbox: "https://oobit-widget-dev.web.app",
22
- production: "https://oobit-widget.web.app",
23
- };
24
- /**
25
- * Get the widget URL based on the access token prefix
26
- * @param accessToken - The access token (prefixed with sbx_ or prod_)
27
- * @returns The widget URL for the corresponding environment
28
- */
29
- function getWidgetUrl(accessToken) {
30
- if (accessToken.startsWith(TOKEN_PREFIX.SANDBOX)) {
31
- return exports.WIDGET_URLS.sandbox;
32
- }
33
- if (accessToken.startsWith(TOKEN_PREFIX.PRODUCTION)) {
34
- return exports.WIDGET_URLS.production;
35
- }
36
- // Default to production for backwards compatibility
37
- return exports.WIDGET_URLS.production;
38
- }
39
- /**
40
- * Strip the environment prefix from an access token
41
- * @param accessToken - The access token (prefixed with sbx_ or prod_)
42
- * @returns The token without the environment prefix
43
- */
44
- function stripTokenPrefix(accessToken) {
45
- if (accessToken.startsWith(TOKEN_PREFIX.SANDBOX)) {
46
- return accessToken.slice(TOKEN_PREFIX.SANDBOX.length);
47
- }
48
- if (accessToken.startsWith(TOKEN_PREFIX.PRODUCTION)) {
49
- return accessToken.slice(TOKEN_PREFIX.PRODUCTION.length);
50
- }
51
- return accessToken;
52
- }
53
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAuBH,oCASC;AAOD,4CAQC;AA7CD;;GAEG;AACH,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,OAAO;CACX,CAAC;AAEX;;GAEG;AACU,QAAA,WAAW,GAAG;IACzB,OAAO,EAAE,kCAAkC;IAC3C,UAAU,EAAE,8BAA8B;CAClC,CAAC;AAEX;;;;GAIG;AACH,SAAgB,YAAY,CAAC,WAAmB;IAC9C,IAAI,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,OAAO,mBAAW,CAAC,OAAO,CAAC;IAC7B,CAAC;IACD,IAAI,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,OAAO,mBAAW,CAAC,UAAU,CAAC;IAChC,CAAC;IACD,oDAAoD;IACpD,OAAO,mBAAW,CAAC,UAAU,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,IAAI,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,OAAO,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,OAAO,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
package/dist/types.d.ts DELETED
@@ -1,73 +0,0 @@
1
- /**
2
- * Token metadata included with transaction requests
3
- */
4
- export interface TransactionTokenMetadata {
5
- symbol: string;
6
- amount: string;
7
- decimals: number;
8
- }
9
- /**
10
- * EVM transaction data
11
- */
12
- export interface EvmTransactionData {
13
- to: string;
14
- data: string;
15
- value: string;
16
- }
17
- /**
18
- * EVM transaction request payload
19
- */
20
- export interface EvmTransactionRequest {
21
- type: "evm";
22
- chainId: number;
23
- transaction: EvmTransactionData;
24
- tokenMetadata: TransactionTokenMetadata;
25
- }
26
- /**
27
- * Solana transaction request payload
28
- */
29
- export interface SolanaTransactionRequest {
30
- type: "solana";
31
- transaction: string;
32
- tokenMetadata: TransactionTokenMetadata;
33
- }
34
- /**
35
- * Transaction request payload
36
- */
37
- export type TransactionRequest = EvmTransactionRequest | SolanaTransactionRequest;
38
- /**
39
- * SDK Configuration
40
- */
41
- export interface WidgetSDKConfig {
42
- accessToken: string;
43
- userWalletAddress: string;
44
- onClose?: () => void;
45
- onTransactionRequested: (transaction: TransactionRequest) => void;
46
- }
47
- /**
48
- * Internal: Messages from widget
49
- */
50
- export type WidgetMessage = {
51
- type: "widget:ready";
52
- } | {
53
- type: "widget:open-wallet";
54
- } | {
55
- type: "widget:close";
56
- } | {
57
- type: "widget:transaction-requested";
58
- payload: TransactionRequest;
59
- };
60
- /**
61
- * Internal: Wallet URLs
62
- */
63
- export declare const WALLET_URLS: {
64
- readonly ios: {
65
- readonly passkit: "shoebox://";
66
- readonly fallback: "https://wallet.apple.com";
67
- };
68
- readonly android: {
69
- readonly googlePay: "https://pay.google.com/gp/w/home/wallet";
70
- readonly fallback: "https://wallet.google.com";
71
- };
72
- };
73
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,kBAAkB,CAAC;IAChC,aAAa,EAAE,wBAAwB,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,wBAAwB,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,qBAAqB,GACrB,wBAAwB,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sBAAsB,EAAE,CAAC,WAAW,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACnE;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,8BAA8B,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC"}
package/dist/types.js DELETED
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WALLET_URLS = void 0;
4
- /**
5
- * Internal: Wallet URLs
6
- */
7
- exports.WALLET_URLS = {
8
- ios: {
9
- passkit: "shoebox://",
10
- fallback: "https://wallet.apple.com",
11
- },
12
- android: {
13
- googlePay: "https://pay.google.com/gp/w/home/wallet",
14
- fallback: "https://wallet.google.com",
15
- },
16
- };
17
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AA+DA;;GAEG;AACU,QAAA,WAAW,GAAG;IACzB,GAAG,EAAE;QACH,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,0BAA0B;KACrC;IACD,OAAO,EAAE;QACP,SAAS,EAAE,yCAAyC;QACpD,QAAQ,EAAE,2BAA2B;KACtC;CACO,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Wallet Integration Utilities
3
- * Handles opening Apple Wallet (iOS) and Google Wallet (Android)
4
- */
5
- /**
6
- * Opens the native wallet app based on platform
7
- * @returns Promise that resolves when wallet opens successfully
8
- */
9
- export declare const openNativeWallet: () => Promise<boolean>;
10
- /**
11
- * Check if wallet is available on the current platform
12
- */
13
- export declare const isWalletAvailable: () => Promise<boolean>;
14
- //# sourceMappingURL=walletUtils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"walletUtils.d.ts","sourceRoot":"","sources":["../src/walletUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,OAAO,CAkBxD,CAAC;AA6GF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,OAAO,CAYzD,CAAC"}
@@ -1,144 +0,0 @@
1
- "use strict";
2
- /**
3
- * Wallet Integration Utilities
4
- * Handles opening Apple Wallet (iOS) and Google Wallet (Android)
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.isWalletAvailable = exports.openNativeWallet = void 0;
8
- const react_native_1 = require("react-native");
9
- const types_1 = require("./types");
10
- /**
11
- * Opens the native wallet app based on platform
12
- * @returns Promise that resolves when wallet opens successfully
13
- */
14
- const openNativeWallet = async () => {
15
- try {
16
- if (react_native_1.Platform.OS === "ios") {
17
- return await openAppleWallet();
18
- }
19
- else if (react_native_1.Platform.OS === "android") {
20
- return await openGoogleWallet();
21
- }
22
- else {
23
- console.warn("Wallet opening not supported on this platform");
24
- return false;
25
- }
26
- }
27
- catch (error) {
28
- console.error("Failed to open wallet:", error);
29
- react_native_1.Alert.alert("Error", "Could not open wallet. Please check if the app is installed.");
30
- return false;
31
- }
32
- };
33
- exports.openNativeWallet = openNativeWallet;
34
- /**
35
- * Opens Apple Wallet on iOS
36
- * Uses multiple URL schemes in order of reliability
37
- */
38
- const openAppleWallet = async () => {
39
- const { passkit, fallback } = types_1.WALLET_URLS.ios;
40
- try {
41
- console.log("Attempting to open Apple Wallet...");
42
- // Method 1: Try wallet:// scheme (documented as working in recent iOS)
43
- try {
44
- const canOpenWallet = await react_native_1.Linking.canOpenURL("wallet://");
45
- if (canOpenWallet) {
46
- await react_native_1.Linking.openURL("wallet://");
47
- console.log("Successfully opened Apple Wallet via wallet:// scheme");
48
- return true;
49
- }
50
- }
51
- catch (walletError) {
52
- console.log("wallet:// scheme failed, trying shoebox://:", walletError);
53
- }
54
- // Method 2: Try shoebox:// scheme (undocumented but widely used)
55
- // Note: This is unofficial and could potentially cause App Store rejection
56
- try {
57
- const canOpenShoebox = await react_native_1.Linking.canOpenURL(passkit);
58
- if (canOpenShoebox) {
59
- await react_native_1.Linking.openURL(passkit);
60
- console.log("Successfully opened Apple Wallet via shoebox:// scheme");
61
- return true;
62
- }
63
- }
64
- catch (shoeboxError) {
65
- console.log("shoebox:// scheme failed:", shoeboxError);
66
- }
67
- // Method 3: Fallback to wallet.apple.com (opens in browser)
68
- console.log("Direct schemes failed, falling back to web URL");
69
- const canOpenFallback = await react_native_1.Linking.canOpenURL(fallback);
70
- if (canOpenFallback) {
71
- await react_native_1.Linking.openURL(fallback);
72
- console.log("Opened wallet.apple.com in browser");
73
- return true;
74
- }
75
- throw new Error("Apple Wallet not available");
76
- }
77
- catch (error) {
78
- console.error("Failed to open Apple Wallet:", error);
79
- throw error;
80
- }
81
- };
82
- /**
83
- * Opens Google Wallet on Android
84
- * Uses Linking API to launch the app or fall back to Play Store
85
- */
86
- const openGoogleWallet = async () => {
87
- const GOOGLE_WALLET_PACKAGE = "com.google.android.apps.walletnfcrel";
88
- try {
89
- console.log("Attempting to open Google Wallet...");
90
- // Try using the market:// scheme to launch the app if it's installed
91
- try {
92
- const canOpen = await react_native_1.Linking.canOpenURL(`market://launch?id=${GOOGLE_WALLET_PACKAGE}`);
93
- console.log("Can open market launch URL:", canOpen);
94
- if (canOpen) {
95
- await react_native_1.Linking.openURL(`market://launch?id=${GOOGLE_WALLET_PACKAGE}`);
96
- console.log("Successfully opened Google Wallet via market:// scheme");
97
- return true;
98
- }
99
- }
100
- catch (marketLaunchError) {
101
- console.log("Market launch failed:", marketLaunchError);
102
- }
103
- // App is not installed or market:// not available, open Play Store
104
- console.log("Opening Play Store to install Google Wallet");
105
- try {
106
- // Try native Play Store app first
107
- const playStoreUrl = `market://details?id=${GOOGLE_WALLET_PACKAGE}`;
108
- await react_native_1.Linking.openURL(playStoreUrl);
109
- react_native_1.Alert.alert("Google Wallet", "Google Wallet is not installed. Opening Play Store to install the app.");
110
- return false;
111
- }
112
- catch (marketError) {
113
- console.log("Market URL failed, trying web Play Store:", marketError);
114
- // Fallback to web Play Store
115
- await react_native_1.Linking.openURL(`https://play.google.com/store/apps/details?id=${GOOGLE_WALLET_PACKAGE}`);
116
- react_native_1.Alert.alert("Google Wallet", "Google Wallet is not installed. Opening Play Store to install the app.");
117
- return false;
118
- }
119
- }
120
- catch (error) {
121
- console.error("Failed to open Google Wallet:", error);
122
- throw error;
123
- }
124
- };
125
- /**
126
- * Check if wallet is available on the current platform
127
- */
128
- const isWalletAvailable = async () => {
129
- try {
130
- if (react_native_1.Platform.OS === "ios") {
131
- return await react_native_1.Linking.canOpenURL(types_1.WALLET_URLS.ios.passkit);
132
- }
133
- else if (react_native_1.Platform.OS === "android") {
134
- return await react_native_1.Linking.canOpenURL(types_1.WALLET_URLS.android.googlePay);
135
- }
136
- return false;
137
- }
138
- catch (error) {
139
- console.error("Error checking wallet availability:", error);
140
- return false;
141
- }
142
- };
143
- exports.isWalletAvailable = isWalletAvailable;
144
- //# sourceMappingURL=walletUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"walletUtils.js","sourceRoot":"","sources":["../src/walletUtils.ts"],"names":[],"mappings":"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"}
package/src/config.ts DELETED
@@ -1,51 +0,0 @@
1
- /**
2
- * Widget SDK Configuration
3
- * Environment detection based on access token prefix
4
- */
5
-
6
- /**
7
- * Token prefixes that determine the environment
8
- */
9
- const TOKEN_PREFIX = {
10
- SANDBOX: "sbx_",
11
- PRODUCTION: "prod_",
12
- } as const;
13
-
14
- /**
15
- * Widget URLs by environment
16
- */
17
- export const WIDGET_URLS = {
18
- sandbox: "https://oobit-widget-dev.web.app",
19
- production: "https://oobit-widget.web.app",
20
- } as const;
21
-
22
- /**
23
- * Get the widget URL based on the access token prefix
24
- * @param accessToken - The access token (prefixed with sbx_ or prod_)
25
- * @returns The widget URL for the corresponding environment
26
- */
27
- export function getWidgetUrl(accessToken: string): string {
28
- if (accessToken.startsWith(TOKEN_PREFIX.SANDBOX)) {
29
- return WIDGET_URLS.sandbox;
30
- }
31
- if (accessToken.startsWith(TOKEN_PREFIX.PRODUCTION)) {
32
- return WIDGET_URLS.production;
33
- }
34
- // Default to production for backwards compatibility
35
- return WIDGET_URLS.production;
36
- }
37
-
38
- /**
39
- * Strip the environment prefix from an access token
40
- * @param accessToken - The access token (prefixed with sbx_ or prod_)
41
- * @returns The token without the environment prefix
42
- */
43
- export function stripTokenPrefix(accessToken: string): string {
44
- if (accessToken.startsWith(TOKEN_PREFIX.SANDBOX)) {
45
- return accessToken.slice(TOKEN_PREFIX.SANDBOX.length);
46
- }
47
- if (accessToken.startsWith(TOKEN_PREFIX.PRODUCTION)) {
48
- return accessToken.slice(TOKEN_PREFIX.PRODUCTION.length);
49
- }
50
- return accessToken;
51
- }
package/src/types.ts DELETED
@@ -1,76 +0,0 @@
1
- /**
2
- * Token metadata included with transaction requests
3
- */
4
- export interface TransactionTokenMetadata {
5
- symbol: string;
6
- amount: string;
7
- decimals: number;
8
- }
9
-
10
- /**
11
- * EVM transaction data
12
- */
13
- export interface EvmTransactionData {
14
- to: string;
15
- data: string;
16
- value: string;
17
- }
18
-
19
- /**
20
- * EVM transaction request payload
21
- */
22
- export interface EvmTransactionRequest {
23
- type: "evm";
24
- chainId: number;
25
- transaction: EvmTransactionData;
26
- tokenMetadata: TransactionTokenMetadata;
27
- }
28
-
29
- /**
30
- * Solana transaction request payload
31
- */
32
- export interface SolanaTransactionRequest {
33
- type: "solana";
34
- transaction: string;
35
- tokenMetadata: TransactionTokenMetadata;
36
- }
37
-
38
- /**
39
- * Transaction request payload
40
- */
41
- export type TransactionRequest =
42
- | EvmTransactionRequest
43
- | SolanaTransactionRequest;
44
-
45
- /**
46
- * SDK Configuration
47
- */
48
- export interface WidgetSDKConfig {
49
- accessToken: string;
50
- userWalletAddress: string;
51
- onClose?: () => void;
52
- onTransactionRequested: (transaction: TransactionRequest) => void;
53
- }
54
-
55
- /**
56
- * Internal: Messages from widget
57
- */
58
- export type WidgetMessage =
59
- | { type: "widget:ready" }
60
- | { type: "widget:open-wallet" }
61
- | { type: "widget:close" }
62
- | { type: "widget:transaction-requested"; payload: TransactionRequest };
63
-
64
- /**
65
- * Internal: Wallet URLs
66
- */
67
- export const WALLET_URLS = {
68
- ios: {
69
- passkit: "shoebox://",
70
- fallback: "https://wallet.apple.com",
71
- },
72
- android: {
73
- googlePay: "https://pay.google.com/gp/w/home/wallet",
74
- fallback: "https://wallet.google.com",
75
- },
76
- } as const;
@@ -1,155 +0,0 @@
1
- /**
2
- * Wallet Integration Utilities
3
- * Handles opening Apple Wallet (iOS) and Google Wallet (Android)
4
- */
5
-
6
- import { Alert, Linking, Platform } from "react-native";
7
- import { WALLET_URLS } from "./types";
8
-
9
- /**
10
- * Opens the native wallet app based on platform
11
- * @returns Promise that resolves when wallet opens successfully
12
- */
13
- export const openNativeWallet = async (): Promise<boolean> => {
14
- try {
15
- if (Platform.OS === "ios") {
16
- return await openAppleWallet();
17
- } else if (Platform.OS === "android") {
18
- return await openGoogleWallet();
19
- } else {
20
- console.warn("Wallet opening not supported on this platform");
21
- return false;
22
- }
23
- } catch (error) {
24
- console.error("Failed to open wallet:", error);
25
- Alert.alert(
26
- "Error",
27
- "Could not open wallet. Please check if the app is installed."
28
- );
29
- return false;
30
- }
31
- };
32
-
33
- /**
34
- * Opens Apple Wallet on iOS
35
- * Uses multiple URL schemes in order of reliability
36
- */
37
- const openAppleWallet = async (): Promise<boolean> => {
38
- const { passkit, fallback } = WALLET_URLS.ios;
39
-
40
- try {
41
- console.log("Attempting to open Apple Wallet...");
42
-
43
- // Method 1: Try wallet:// scheme (documented as working in recent iOS)
44
- try {
45
- const canOpenWallet = await Linking.canOpenURL("wallet://");
46
- if (canOpenWallet) {
47
- await Linking.openURL("wallet://");
48
- console.log("Successfully opened Apple Wallet via wallet:// scheme");
49
- return true;
50
- }
51
- } catch (walletError) {
52
- console.log("wallet:// scheme failed, trying shoebox://:", walletError);
53
- }
54
-
55
- // Method 2: Try shoebox:// scheme (undocumented but widely used)
56
- // Note: This is unofficial and could potentially cause App Store rejection
57
- try {
58
- const canOpenShoebox = await Linking.canOpenURL(passkit);
59
- if (canOpenShoebox) {
60
- await Linking.openURL(passkit);
61
- console.log("Successfully opened Apple Wallet via shoebox:// scheme");
62
- return true;
63
- }
64
- } catch (shoeboxError) {
65
- console.log("shoebox:// scheme failed:", shoeboxError);
66
- }
67
-
68
- // Method 3: Fallback to wallet.apple.com (opens in browser)
69
- console.log("Direct schemes failed, falling back to web URL");
70
- const canOpenFallback = await Linking.canOpenURL(fallback);
71
- if (canOpenFallback) {
72
- await Linking.openURL(fallback);
73
- console.log("Opened wallet.apple.com in browser");
74
- return true;
75
- }
76
-
77
- throw new Error("Apple Wallet not available");
78
- } catch (error) {
79
- console.error("Failed to open Apple Wallet:", error);
80
- throw error;
81
- }
82
- };
83
-
84
- /**
85
- * Opens Google Wallet on Android
86
- * Uses Linking API to launch the app or fall back to Play Store
87
- */
88
- const openGoogleWallet = async (): Promise<boolean> => {
89
- const GOOGLE_WALLET_PACKAGE = "com.google.android.apps.walletnfcrel";
90
-
91
- try {
92
- console.log("Attempting to open Google Wallet...");
93
-
94
- // Try using the market:// scheme to launch the app if it's installed
95
- try {
96
- const canOpen = await Linking.canOpenURL(`market://launch?id=${GOOGLE_WALLET_PACKAGE}`);
97
- console.log("Can open market launch URL:", canOpen);
98
-
99
- if (canOpen) {
100
- await Linking.openURL(`market://launch?id=${GOOGLE_WALLET_PACKAGE}`);
101
- console.log("Successfully opened Google Wallet via market:// scheme");
102
- return true;
103
- }
104
- } catch (marketLaunchError) {
105
- console.log("Market launch failed:", marketLaunchError);
106
- }
107
-
108
- // App is not installed or market:// not available, open Play Store
109
- console.log("Opening Play Store to install Google Wallet");
110
- try {
111
- // Try native Play Store app first
112
- const playStoreUrl = `market://details?id=${GOOGLE_WALLET_PACKAGE}`;
113
- await Linking.openURL(playStoreUrl);
114
-
115
- Alert.alert(
116
- "Google Wallet",
117
- "Google Wallet is not installed. Opening Play Store to install the app."
118
- );
119
- return false;
120
- } catch (marketError) {
121
- console.log("Market URL failed, trying web Play Store:", marketError);
122
-
123
- // Fallback to web Play Store
124
- await Linking.openURL(
125
- `https://play.google.com/store/apps/details?id=${GOOGLE_WALLET_PACKAGE}`
126
- );
127
-
128
- Alert.alert(
129
- "Google Wallet",
130
- "Google Wallet is not installed. Opening Play Store to install the app."
131
- );
132
- return false;
133
- }
134
- } catch (error) {
135
- console.error("Failed to open Google Wallet:", error);
136
- throw error;
137
- }
138
- };
139
-
140
- /**
141
- * Check if wallet is available on the current platform
142
- */
143
- export const isWalletAvailable = async (): Promise<boolean> => {
144
- try {
145
- if (Platform.OS === "ios") {
146
- return await Linking.canOpenURL(WALLET_URLS.ios.passkit);
147
- } else if (Platform.OS === "android") {
148
- return await Linking.canOpenURL(WALLET_URLS.android.googlePay);
149
- }
150
- return false;
151
- } catch (error) {
152
- console.error("Error checking wallet availability:", error);
153
- return false;
154
- }
155
- };