@onramper/onramper-react-native 1.2.2 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +249 -0
  2. package/README.md +64 -4
  3. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64/OnramperSDK.framework/Modules/OnramperSDK.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  4. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64/OnramperSDK.framework/Modules/OnramperSDK.swiftmodule/arm64-apple-ios.swiftinterface +110 -4
  5. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64/OnramperSDK.framework/OnramperSDK +0 -0
  6. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64/dSYMs/OnramperSDK.framework.dSYM/Contents/Resources/DWARF/OnramperSDK +0 -0
  7. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64/dSYMs/OnramperSDK.framework.dSYM/Contents/Resources/Relocations/aarch64/OnramperSDK.yml +3562 -2684
  8. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64_x86_64-simulator/OnramperSDK.framework/Modules/OnramperSDK.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  9. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64_x86_64-simulator/OnramperSDK.framework/Modules/OnramperSDK.swiftmodule/arm64-apple-ios-simulator.swiftinterface +110 -4
  10. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64_x86_64-simulator/OnramperSDK.framework/Modules/OnramperSDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  11. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64_x86_64-simulator/OnramperSDK.framework/Modules/OnramperSDK.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +110 -4
  12. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64_x86_64-simulator/OnramperSDK.framework/OnramperSDK +0 -0
  13. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/OnramperSDK.framework.dSYM/Contents/Resources/DWARF/OnramperSDK +0 -0
  14. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/OnramperSDK.framework.dSYM/Contents/Resources/Relocations/aarch64/OnramperSDK.yml +3562 -2684
  15. package/ios/Frameworks/OnramperSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/OnramperSDK.framework.dSYM/Contents/Resources/Relocations/x86_64/OnramperSDK.yml +3525 -2651
  16. package/ios/HybridOnramperCheckoutButton.swift +77 -3
  17. package/ios/HybridOnramperNitro.swift +142 -78
  18. package/ios/OnramperSDKBridge.swift +19 -2
  19. package/ios/PreparedIntentRegistry.swift +124 -6
  20. package/ios/SDKLogRelay.swift +41 -0
  21. package/lib/commonjs/CheckoutButton.js +34 -0
  22. package/lib/commonjs/CheckoutButton.js.map +1 -0
  23. package/lib/commonjs/OnramperClient.js +81 -12
  24. package/lib/commonjs/OnramperClient.js.map +1 -1
  25. package/lib/commonjs/errors.js +19 -5
  26. package/lib/commonjs/errors.js.map +1 -1
  27. package/lib/commonjs/generated/OnramperCheckoutButtonConfig.json +1 -0
  28. package/lib/module/CheckoutButton.js +30 -0
  29. package/lib/module/CheckoutButton.js.map +1 -0
  30. package/lib/module/OnramperClient.js +81 -12
  31. package/lib/module/OnramperClient.js.map +1 -1
  32. package/lib/module/errors.js +19 -5
  33. package/lib/module/errors.js.map +1 -1
  34. package/lib/module/generated/OnramperCheckoutButtonConfig.json +1 -0
  35. package/lib/typescript/commonjs/src/CheckoutButton.d.ts +20 -0
  36. package/lib/typescript/commonjs/src/CheckoutButton.d.ts.map +1 -0
  37. package/lib/typescript/commonjs/src/OnramperClient.d.ts +10 -1
  38. package/lib/typescript/commonjs/src/OnramperClient.d.ts.map +1 -1
  39. package/lib/typescript/commonjs/src/errors.d.ts +6 -1
  40. package/lib/typescript/commonjs/src/errors.d.ts.map +1 -1
  41. package/lib/typescript/commonjs/src/events.d.ts +10 -0
  42. package/lib/typescript/commonjs/src/events.d.ts.map +1 -1
  43. package/lib/typescript/commonjs/src/index.d.ts +1 -1
  44. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/src/specs/OnramperCheckoutButton.nitro.d.ts +6 -0
  46. package/lib/typescript/commonjs/src/specs/OnramperCheckoutButton.nitro.d.ts.map +1 -1
  47. package/lib/typescript/commonjs/src/specs/OnramperNitro.nitro.d.ts +4 -0
  48. package/lib/typescript/commonjs/src/specs/OnramperNitro.nitro.d.ts.map +1 -1
  49. package/lib/typescript/commonjs/src/types.d.ts +32 -3
  50. package/lib/typescript/commonjs/src/types.d.ts.map +1 -1
  51. package/lib/typescript/module/src/CheckoutButton.d.ts +20 -0
  52. package/lib/typescript/module/src/CheckoutButton.d.ts.map +1 -0
  53. package/lib/typescript/module/src/OnramperClient.d.ts +10 -1
  54. package/lib/typescript/module/src/OnramperClient.d.ts.map +1 -1
  55. package/lib/typescript/module/src/errors.d.ts +6 -1
  56. package/lib/typescript/module/src/errors.d.ts.map +1 -1
  57. package/lib/typescript/module/src/events.d.ts +10 -0
  58. package/lib/typescript/module/src/events.d.ts.map +1 -1
  59. package/lib/typescript/module/src/index.d.ts +1 -1
  60. package/lib/typescript/module/src/index.d.ts.map +1 -1
  61. package/lib/typescript/module/src/specs/OnramperCheckoutButton.nitro.d.ts +6 -0
  62. package/lib/typescript/module/src/specs/OnramperCheckoutButton.nitro.d.ts.map +1 -1
  63. package/lib/typescript/module/src/specs/OnramperNitro.nitro.d.ts +4 -0
  64. package/lib/typescript/module/src/specs/OnramperNitro.nitro.d.ts.map +1 -1
  65. package/lib/typescript/module/src/types.d.ts +32 -3
  66. package/lib/typescript/module/src/types.d.ts.map +1 -1
  67. package/nitrogen/generated/ios/OnramperReactNative-Swift-Cxx-Bridge.cpp +11 -3
  68. package/nitrogen/generated/ios/OnramperReactNative-Swift-Cxx-Bridge.hpp +44 -7
  69. package/nitrogen/generated/ios/c++/HybridOnramperCheckoutButtonSpecSwift.hpp +9 -0
  70. package/nitrogen/generated/ios/c++/HybridOnramperNitroSpecSwift.hpp +11 -2
  71. package/nitrogen/generated/ios/c++/views/HybridOnramperCheckoutButtonComponent.mm +5 -0
  72. package/nitrogen/generated/ios/swift/Func_void_double.swift +46 -0
  73. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +5 -5
  74. package/nitrogen/generated/ios/swift/HybridOnramperCheckoutButtonSpec.swift +1 -0
  75. package/nitrogen/generated/ios/swift/HybridOnramperCheckoutButtonSpec_cxx.swift +32 -0
  76. package/nitrogen/generated/ios/swift/HybridOnramperNitroSpec.swift +2 -1
  77. package/nitrogen/generated/ios/swift/HybridOnramperNitroSpec_cxx.swift +32 -11
  78. package/nitrogen/generated/ios/swift/OnramperNitroConfig.swift +16 -6
  79. package/nitrogen/generated/shared/c++/HybridOnramperCheckoutButtonSpec.cpp +2 -0
  80. package/nitrogen/generated/shared/c++/HybridOnramperCheckoutButtonSpec.hpp +4 -0
  81. package/nitrogen/generated/shared/c++/HybridOnramperNitroSpec.cpp +2 -0
  82. package/nitrogen/generated/shared/c++/HybridOnramperNitroSpec.hpp +3 -2
  83. package/nitrogen/generated/shared/c++/OnramperNitroConfig.hpp +10 -2
  84. package/nitrogen/generated/shared/c++/views/HybridOnramperCheckoutButtonComponent.cpp +11 -0
  85. package/nitrogen/generated/shared/c++/views/HybridOnramperCheckoutButtonComponent.hpp +3 -2
  86. package/nitrogen/generated/shared/json/OnramperCheckoutButtonConfig.json +1 -0
  87. package/package.json +5 -2
  88. package/src/CheckoutButton.ts +28 -0
  89. package/src/OnramperClient.ts +82 -9
  90. package/src/errors.ts +29 -6
  91. package/src/events.ts +5 -0
  92. package/src/generated/OnramperCheckoutButtonConfig.json +1 -0
  93. package/src/index.ts +3 -0
  94. package/src/specs/OnramperCheckoutButton.nitro.ts +6 -0
  95. package/src/specs/OnramperNitro.nitro.ts +5 -0
  96. package/src/types.ts +36 -3
@@ -0,0 +1,41 @@
1
+ import Foundation
2
+ import NitroModules
3
+ import OnramperSDK
4
+
5
+ /// The SDK can emit records from any thread. Keep callback registration and
6
+ /// teardown synchronized; invoke outside the lock (Nitro schedules delivery).
7
+ final class SDKLogRelay: @unchecked Sendable {
8
+ private let lock = NSLock()
9
+ private var listener: ((String) -> Void)?
10
+
11
+ func setListener(_ listener: ((String) -> Void)?) {
12
+ lock.lock()
13
+ self.listener = listener
14
+ lock.unlock()
15
+ }
16
+
17
+ func emit(_ record: OnramperLogRecord) {
18
+ lock.lock()
19
+ let callback = listener
20
+ lock.unlock()
21
+ guard let callback else { return }
22
+ callback(jsonString([
23
+ "timestamp": record.timestamp.timeIntervalSince1970 * 1000,
24
+ "level": String(describing: record.level),
25
+ "category": record.category,
26
+ "event": record.event,
27
+ "context": record.context,
28
+ "message": record.message,
29
+ ]))
30
+ }
31
+ }
32
+
33
+ /// Nitro otherwise converts a Swift error to a message-only JavaScript Error.
34
+ /// Both failed events and rejected operations must carry the SDK's safe copy.
35
+ func bridgeSDKError(_ error: Error) -> Error {
36
+ if let lifecycleError = error as? BridgeLifecycleError {
37
+ return RuntimeError.error(withMessage: "ONRAMPER_ERROR:" + jsonString(lifecycleError.payload))
38
+ }
39
+ guard let sdkError = error as? OnramperError else { return error }
40
+ return RuntimeError.error(withMessage: "ONRAMPER_ERROR:" + jsonString(sdkError.toJSDict()))
41
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CHECKOUT_BUTTON_FALLBACK_HEIGHT = void 0;
7
+ exports.CheckoutButton = CheckoutButton;
8
+ var _react = require("react");
9
+ var _reactNativeNitroModules = require("react-native-nitro-modules");
10
+ var _OnramperCheckoutButtonView = require("./OnramperCheckoutButtonView.js");
11
+ // Height of the bare Buy button. Used until native reports the measured content
12
+ // height so the first frame isn't collapsed.
13
+ const CHECKOUT_BUTTON_FALLBACK_HEIGHT = exports.CHECKOUT_BUTTON_FALLBACK_HEIGHT = 56;
14
+ /**
15
+ * Sizes the native checkout button to its SwiftUI content. The content grows when
16
+ * the SDK shows ToS text under the Buy button (which can change after mount), and
17
+ * Yoga can't measure a SwiftUI view — so native reports the height and it is
18
+ * applied here as an explicit `height`.
19
+ */
20
+ function CheckoutButton({
21
+ intentHandle
22
+ }) {
23
+ const [height, setHeight] = (0, _react.useState)(null);
24
+ const onContentHeightChange = (0, _react.useMemo)(() => (0, _reactNativeNitroModules.callback)(h => setHeight(Math.ceil(h))), []);
25
+ return /*#__PURE__*/(0, _react.createElement)(_OnramperCheckoutButtonView.OnramperCheckoutButtonView, {
26
+ intentHandle,
27
+ onContentHeightChange,
28
+ style: {
29
+ width: '100%',
30
+ height: height ?? CHECKOUT_BUTTON_FALLBACK_HEIGHT
31
+ }
32
+ });
33
+ }
34
+ //# sourceMappingURL=CheckoutButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNativeNitroModules","_OnramperCheckoutButtonView","CHECKOUT_BUTTON_FALLBACK_HEIGHT","exports","CheckoutButton","intentHandle","height","setHeight","useState","onContentHeightChange","useMemo","callback","h","Math","ceil","createElement","OnramperCheckoutButtonView","style","width"],"sourceRoot":"../../src","sources":["CheckoutButton.ts"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AAEA,IAAAE,2BAAA,GAAAF,OAAA;AAEA;AACA;AACO,MAAMG,+BAA+B,GAAAC,OAAA,CAAAD,+BAAA,GAAG,EAAE;AAMjD;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,cAAcA,CAAC;EAAEC;AAAkC,CAAC,EAAE;EACpE,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAG,IAAAC,eAAQ,EAAgB,IAAI,CAAC;EACzD,MAAMC,qBAAqB,GAAG,IAAAC,cAAO,EAAC,MAAM,IAAAC,iCAAQ,EAAEC,CAAS,IAAKL,SAAS,CAACM,IAAI,CAACC,IAAI,CAACF,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;EACjG,oBAAO,IAAAG,oBAAa,EAACC,sDAA0B,EAAE;IAC/CX,YAAY;IACZI,qBAAqB;IACrBQ,KAAK,EAAE;MAAEC,KAAK,EAAE,MAAM;MAAEZ,MAAM,EAAEA,MAAM,IAAIJ;IAAgC;EAC5E,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.OnramperClient = void 0;
7
7
  var _react = require("react");
8
- var _OnramperCheckoutButtonView = require("./OnramperCheckoutButtonView.js");
8
+ var _CheckoutButton = require("./CheckoutButton.js");
9
9
  var _OnramperNative = require("./OnramperNative.js");
10
10
  var _errors = require("./errors.js");
11
11
  /**
@@ -15,6 +15,18 @@ var _errors = require("./errors.js");
15
15
  * unions, then fanned out to any number of listeners.
16
16
  */
17
17
  class OnramperClient {
18
+ /**
19
+ * Version of the native Onramper iOS SDK loaded by this app (not the RN
20
+ * package version). No client configuration or session is required. iOS only.
21
+ */
22
+ static get sdkVersion() {
23
+ const native = (0, _OnramperNative.createOnramperNative)();
24
+ try {
25
+ return native.sdkVersion;
26
+ } finally {
27
+ native.dispose();
28
+ }
29
+ }
18
30
  state = {
19
31
  kind: 'idle'
20
32
  };
@@ -30,9 +42,23 @@ class OnramperClient {
30
42
  // Resolved when the constructor-issued configure() completes. Public methods
31
43
  // that need the native client await this first.
32
44
 
45
+ destroyed = false;
33
46
  constructor(config) {
47
+ if (config.logHandler) {
48
+ const handler = config.logHandler;
49
+ this.native.setLogListener(json => {
50
+ if (this.destroyed) return;
51
+ try {
52
+ handler(JSON.parse(json));
53
+ } catch {
54
+ // Diagnostics must never interrupt checkout; do not log callback data.
55
+ console.warn('Onramper logHandler failed.');
56
+ }
57
+ });
58
+ }
34
59
  // Single native state callback → update the mirror + fan out to listeners.
35
60
  this.native.setStateListener(json => {
61
+ if (this.destroyed) return;
36
62
  const s = JSON.parse(json);
37
63
  this.state = s;
38
64
  if (s.kind === 'failed') this.lastError = _errors.OnramperError.from(s.error);
@@ -42,6 +68,7 @@ class OnramperClient {
42
68
  // Single native checkout-event callback → keep the transaction ID mirror
43
69
  // synchronized at finalization, then fan out to checkout listeners.
44
70
  this.native.setEventListener(json => {
71
+ if (this.destroyed) return;
45
72
  const e = JSON.parse(json);
46
73
  if (e.type === 'checkoutFinalized') {
47
74
  this.updateCurrentTransactionId(e.response.onramperTransactionId);
@@ -49,6 +76,7 @@ class OnramperClient {
49
76
  for (const fn of this.eventListeners) fn(e);
50
77
  });
51
78
  this.native.setTransactionIdListener(transactionId => {
79
+ if (this.destroyed) return;
52
80
  // The SDK transiently publishes nil while re-preparing after the payment
53
81
  // sheet is dismissed. The finalized transaction ID remains durable across
54
82
  // that attempt change; only explicit reset()/signOut() clear the JS mirror.
@@ -59,7 +87,9 @@ class OnramperClient {
59
87
  // Nitro stores the async callback natively and awaits it directly — no
60
88
  // event round-trip needed.
61
89
  this.native.setSessionExpirationHandler(async () => {
90
+ this.assertActive();
62
91
  const creds = await config.onSessionExpired();
92
+ this.assertActive();
63
93
  return {
64
94
  sessionId: creds.sessionId,
65
95
  sessionToken: creds.sessionToken
@@ -70,20 +100,33 @@ class OnramperClient {
70
100
  clientId: config.clientId,
71
101
  environment: config.environment,
72
102
  theme: config.theme ?? 'system',
73
- logLevel: config.logLevel ?? 'off'
103
+ logLevel: config.logLevel ?? 'off',
104
+ isEventLoggingEnabled: config.isEventLoggingEnabled ?? false,
105
+ isEventConsoleLoggingEnabled: config.isEventConsoleLoggingEnabled ?? false
74
106
  }).catch(e => {
75
107
  const err = _errors.OnramperError.from(e);
76
- this.lastError = err;
108
+ if (!this.destroyed) this.lastError = err;
77
109
  throw err;
78
110
  });
79
111
  // Swallow the unhandled-rejection warning when no one awaits .configured
80
112
  // before calling initialize(). The error still surfaces via initialize().
81
113
  this.configured.catch(() => undefined);
82
114
  }
115
+ assertActive() {
116
+ if (this.destroyed) {
117
+ throw new _errors.OnramperError({
118
+ code: 'clientDestroyed',
119
+ message: 'This OnramperClient has been destroyed. Create a new client before making SDK calls.',
120
+ userMessage: 'This checkout session has ended. Please reopen checkout.'
121
+ });
122
+ }
123
+ }
83
124
  updateCurrentTransactionId(next) {
125
+ if (this.destroyed) return;
84
126
  if (next === this.currentTransactionId) return;
85
127
  this.currentTransactionId = next;
86
128
  for (const fn of [...this.transactionIdListeners]) {
129
+ if (this.destroyed) break;
87
130
  try {
88
131
  fn(next);
89
132
  } catch (error) {
@@ -93,18 +136,26 @@ class OnramperClient {
93
136
  }
94
137
  async initialize(creds) {
95
138
  try {
139
+ this.assertActive();
96
140
  await this.configured;
141
+ this.assertActive();
97
142
  await this.native.initialize(creds.sessionId, creds.sessionToken);
143
+ this.assertActive();
98
144
  } catch (e) {
145
+ this.assertActive();
99
146
  throw _errors.OnramperError.from(e);
100
147
  }
101
148
  }
102
149
  async reset() {
103
150
  try {
151
+ this.assertActive();
104
152
  await this.configured;
153
+ this.assertActive();
105
154
  await this.native.reset();
155
+ this.assertActive();
106
156
  this.updateCurrentTransactionId(null);
107
157
  } catch (e) {
158
+ this.assertActive();
108
159
  throw _errors.OnramperError.from(e);
109
160
  }
110
161
  }
@@ -117,10 +168,14 @@ class OnramperClient {
117
168
  */
118
169
  async signOut() {
119
170
  try {
171
+ this.assertActive();
120
172
  await this.configured;
173
+ this.assertActive();
121
174
  await this.native.signOut();
175
+ this.assertActive();
122
176
  this.updateCurrentTransactionId(null);
123
177
  } catch (e) {
178
+ this.assertActive();
124
179
  throw _errors.OnramperError.from(e);
125
180
  }
126
181
  }
@@ -129,6 +184,8 @@ class OnramperClient {
129
184
  * Fetches checkout requirements + quote and returns a native checkout button
130
185
  * to render plus the quote. The button handles login / finalize / webview
131
186
  * internally; outcomes surface via the event stream (`addEventListener`).
187
+ * A newer preparation, reset, or sign-out invalidates older unmounted buttons
188
+ * and rejects obsolete in-flight preparations with `intentInvalidated`.
132
189
  *
133
190
  * Pass `prefill` to pre-populate the OnramperID sign-in and additional-info
134
191
  * screens with values you already know about the user. It is best-effort and
@@ -142,32 +199,40 @@ class OnramperClient {
142
199
  */
143
200
  async getCheckoutRequirements(request, buttonStyle = {}, prefill = {}) {
144
201
  try {
202
+ this.assertActive();
145
203
  await this.configured;
204
+ this.assertActive();
146
205
  const result = await this.native.getCheckoutRequirements(JSON.stringify(request), JSON.stringify(prefill), JSON.stringify(buttonStyle));
206
+ this.assertActive();
147
207
  const quote = JSON.parse(result.quoteJson);
148
- const button = /*#__PURE__*/(0, _react.createElement)(_OnramperCheckoutButtonView.OnramperCheckoutButtonView, {
149
- intentHandle: result.intentHandle,
150
- style: {
151
- width: '100%',
152
- minHeight: 56
153
- }
208
+ const button = /*#__PURE__*/(0, _react.createElement)(_CheckoutButton.CheckoutButton, {
209
+ intentHandle: result.intentHandle
154
210
  });
155
211
  return {
156
212
  button,
157
213
  quote
158
214
  };
159
215
  } catch (e) {
216
+ this.assertActive();
160
217
  throw _errors.OnramperError.from(e);
161
218
  }
162
219
  }
163
220
 
164
221
  /** Discards a prepared intent (e.g. if the user navigates away before checkout). */
165
- cancelPreparedIntent(intentHandle) {
166
- return this.native.cancelPreparedIntent(intentHandle);
222
+ async cancelPreparedIntent(intentHandle) {
223
+ try {
224
+ this.assertActive();
225
+ await this.native.cancelPreparedIntent(intentHandle);
226
+ this.assertActive();
227
+ } catch (e) {
228
+ this.assertActive();
229
+ throw _errors.OnramperError.from(e);
230
+ }
167
231
  }
168
232
 
169
233
  /** Subscribe to state changes. Returns an unsubscribe function. */
170
234
  addStateListener(fn) {
235
+ this.assertActive();
171
236
  this.stateListeners.add(fn);
172
237
  return () => {
173
238
  this.stateListeners.delete(fn);
@@ -176,6 +241,7 @@ class OnramperClient {
176
241
 
177
242
  /** Subscribe to the durable Onramper transaction ID. Successful reset/signOut publish null. */
178
243
  addTransactionIdListener(fn) {
244
+ this.assertActive();
179
245
  this.transactionIdListeners.add(fn);
180
246
  return () => {
181
247
  this.transactionIdListeners.delete(fn);
@@ -184,6 +250,7 @@ class OnramperClient {
184
250
 
185
251
  /** Subscribe to a specific checkout event. Returns an unsubscribe function. */
186
252
  addEventListener(name, fn) {
253
+ this.assertActive();
187
254
  const wrapper = e => {
188
255
  if (e.type === name) fn(e);
189
256
  };
@@ -193,8 +260,10 @@ class OnramperClient {
193
260
  };
194
261
  }
195
262
 
196
- /** Tear down: clears JS listeners and releases the native callbacks + SDK client. */
263
+ /** Idempotent teardown. Further operations reject with `clientDestroyed`; create a new client to restart. */
197
264
  destroy() {
265
+ if (this.destroyed) return;
266
+ this.destroyed = true;
198
267
  this.stateListeners.clear();
199
268
  this.eventListeners.clear();
200
269
  this.transactionIdListeners.clear();
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_OnramperCheckoutButtonView","_OnramperNative","_errors","OnramperClient","state","kind","lastError","currentTransactionId","native","createOnramperNative","stateListeners","Set","eventListeners","transactionIdListeners","constructor","config","setStateListener","json","s","JSON","parse","OnramperError","from","error","fn","setEventListener","e","type","updateCurrentTransactionId","response","onramperTransactionId","setTransactionIdListener","transactionId","undefined","setSessionExpirationHandler","creds","onSessionExpired","sessionId","sessionToken","configured","configure","apiKey","clientId","environment","theme","logLevel","catch","err","next","console","initialize","reset","signOut","getCheckoutRequirements","request","buttonStyle","prefill","result","stringify","quote","quoteJson","button","createElement","OnramperCheckoutButtonView","intentHandle","style","width","minHeight","cancelPreparedIntent","addStateListener","add","delete","addTransactionIdListener","addEventListener","name","wrapper","destroy","clear","dispose","exports"],"sourceRoot":"../../src","sources":["OnramperClient.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_CheckoutButton","_OnramperNative","_errors","OnramperClient","sdkVersion","native","createOnramperNative","dispose","state","kind","lastError","currentTransactionId","stateListeners","Set","eventListeners","transactionIdListeners","destroyed","constructor","config","logHandler","handler","setLogListener","json","JSON","parse","console","warn","setStateListener","s","OnramperError","from","error","fn","setEventListener","e","type","updateCurrentTransactionId","response","onramperTransactionId","setTransactionIdListener","transactionId","undefined","setSessionExpirationHandler","assertActive","creds","onSessionExpired","sessionId","sessionToken","configured","configure","apiKey","clientId","environment","theme","logLevel","isEventLoggingEnabled","isEventConsoleLoggingEnabled","catch","err","code","message","userMessage","next","initialize","reset","signOut","getCheckoutRequirements","request","buttonStyle","prefill","result","stringify","quote","quoteJson","button","createElement","CheckoutButton","intentHandle","cancelPreparedIntent","addStateListener","add","delete","addTransactionIdListener","addEventListener","name","wrapper","destroy","clear","exports"],"sourceRoot":"../../src","sources":["OnramperClient.ts"],"mappings":"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","ignoreList":[]}
@@ -9,20 +9,34 @@ class OnramperError extends Error {
9
9
  super(payload.message);
10
10
  this.name = 'OnramperError';
11
11
  this.code = payload.code;
12
+ this.userMessage = payload.userMessage ?? 'Something went wrong. Please try again.';
13
+ this.supportCode = payload.supportCode ?? payload.code;
12
14
  this.info = payload.info;
13
15
  }
14
16
  static from(value) {
15
17
  if (value instanceof OnramperError) return value;
18
+ // Nitro transports Swift exceptions as message-only JS Errors. Our native
19
+ // bridge encodes SDK errors explicitly so Promise rejections retain the
20
+ // same fields as failed events, without consulting unrelated client state.
21
+ const message = value instanceof Error ? value.message : typeof value === 'string' ? value : undefined;
22
+ if (message?.startsWith('ONRAMPER_ERROR:')) {
23
+ try {
24
+ const payload = JSON.parse(message.slice('ONRAMPER_ERROR:'.length));
25
+ if (payload && typeof payload.code === 'string' && typeof payload.message === 'string') {
26
+ return OnramperError.from(payload);
27
+ }
28
+ } catch {
29
+ // A malformed/non-SDK error falls back to the ordinary error path.
30
+ }
31
+ }
16
32
  if (value && typeof value === 'object') {
17
- // Structured errors (from the `.failed` state) arrive as a plain
18
- // `{ code, message, info? }` object. Thrown promise rejections surface
19
- // as a JS Error with just a message; we default the code in that case
20
- // (the structured error is also available on `client.state` / lastError).
21
33
  const v = value;
22
34
  return new OnramperError({
23
35
  code: v.code ?? 'unrecoverable',
24
36
  message: v.message ?? 'Unknown error',
25
- info: v.info
37
+ info: v.info,
38
+ userMessage: typeof v.userMessage === 'string' ? v.userMessage : undefined,
39
+ supportCode: typeof v.supportCode === 'string' ? v.supportCode : undefined
26
40
  });
27
41
  }
28
42
  return new OnramperError({
@@ -1 +1 @@
1
- {"version":3,"names":["OnramperError","Error","constructor","payload","message","name","code","info","from","value","v","String","exports"],"sourceRoot":"../../src","sources":["errors.ts"],"mappings":";;;;;;AAyCO,MAAMA,aAAa,SAASC,KAAK,CAAiC;EAIvEC,WAAWA,CAACC,OAA6B,EAAE;IACzC,KAAK,CAACA,OAAO,CAACC,OAAO,CAAC;IACtB,IAAI,CAACC,IAAI,GAAG,eAAe;IAC3B,IAAI,CAACC,IAAI,GAAGH,OAAO,CAACG,IAAI;IACxB,IAAI,CAACC,IAAI,GAAGJ,OAAO,CAACI,IAAI;EAC1B;EAEA,OAAOC,IAAIA,CAACC,KAAc,EAAiB;IACzC,IAAIA,KAAK,YAAYT,aAAa,EAAE,OAAOS,KAAK;IAChD,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MACtC;MACA;MACA;MACA;MACA,MAAMC,CAAC,GAAGD,KAA4E;MACtF,OAAO,IAAIT,aAAa,CAAC;QACvBM,IAAI,EAAGI,CAAC,CAACJ,IAAI,IAAI,eAAqC;QACtDF,OAAO,EAAEM,CAAC,CAACN,OAAO,IAAI,eAAe;QACrCG,IAAI,EAAEG,CAAC,CAACH;MACV,CAAC,CAAC;IACJ;IACA,OAAO,IAAIP,aAAa,CAAC;MAAEM,IAAI,EAAE,eAAe;MAAEF,OAAO,EAAEO,MAAM,CAACF,KAAK;IAAE,CAAC,CAAC;EAC7E;AACF;AAACG,OAAA,CAAAZ,aAAA,GAAAA,aAAA","ignoreList":[]}
1
+ {"version":3,"names":["OnramperError","Error","constructor","payload","message","name","code","userMessage","supportCode","info","from","value","undefined","startsWith","JSON","parse","slice","length","v","String","exports"],"sourceRoot":"../../src","sources":["errors.ts"],"mappings":";;;;;;AAgDO,MAAMA,aAAa,SAASC,KAAK,CAAiC;EAMvEC,WAAWA,CAACC,OAA6B,EAAE;IACzC,KAAK,CAACA,OAAO,CAACC,OAAO,CAAC;IACtB,IAAI,CAACC,IAAI,GAAG,eAAe;IAC3B,IAAI,CAACC,IAAI,GAAGH,OAAO,CAACG,IAAI;IACxB,IAAI,CAACC,WAAW,GAAGJ,OAAO,CAACI,WAAW,IAAI,yCAAyC;IACnF,IAAI,CAACC,WAAW,GAAGL,OAAO,CAACK,WAAW,IAAIL,OAAO,CAACG,IAAI;IACtD,IAAI,CAACG,IAAI,GAAGN,OAAO,CAACM,IAAI;EAC1B;EAEA,OAAOC,IAAIA,CAACC,KAAc,EAAiB;IACzC,IAAIA,KAAK,YAAYX,aAAa,EAAE,OAAOW,KAAK;IAChD;IACA;IACA;IACA,MAAMP,OAAO,GAAGO,KAAK,YAAYV,KAAK,GAAGU,KAAK,CAACP,OAAO,GAAG,OAAOO,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAGC,SAAS;IACtG,IAAIR,OAAO,EAAES,UAAU,CAAC,iBAAiB,CAAC,EAAE;MAC1C,IAAI;QACF,MAAMV,OAAO,GAAGW,IAAI,CAACC,KAAK,CAACX,OAAO,CAACY,KAAK,CAAC,iBAAiB,CAACC,MAAM,CAAC,CAAC;QACnE,IAAId,OAAO,IAAI,OAAOA,OAAO,CAACG,IAAI,KAAK,QAAQ,IAAI,OAAOH,OAAO,CAACC,OAAO,KAAK,QAAQ,EAAE;UACtF,OAAOJ,aAAa,CAACU,IAAI,CAACP,OAAO,CAAC;QACpC;MACF,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;IACA,IAAIQ,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MACtC,MAAMO,CAAC,GAAGP,KAAsC;MAChD,OAAO,IAAIX,aAAa,CAAC;QACvBM,IAAI,EAAGY,CAAC,CAACZ,IAAI,IAAI,eAAqC;QACtDF,OAAO,EAAEc,CAAC,CAACd,OAAO,IAAI,eAAe;QACrCK,IAAI,EAAES,CAAC,CAACT,IAAI;QACZF,WAAW,EAAE,OAAOW,CAAC,CAACX,WAAW,KAAK,QAAQ,GAAGW,CAAC,CAACX,WAAW,GAAGK,SAAS;QAC1EJ,WAAW,EAAE,OAAOU,CAAC,CAACV,WAAW,KAAK,QAAQ,GAAGU,CAAC,CAACV,WAAW,GAAGI;MACnE,CAAC,CAAC;IACJ;IACA,OAAO,IAAIZ,aAAa,CAAC;MAAEM,IAAI,EAAE,eAAe;MAAEF,OAAO,EAAEe,MAAM,CAACR,KAAK;IAAE,CAAC,CAAC;EAC7E;AACF;AAACS,OAAA,CAAApB,aAAA,GAAAA,aAAA","ignoreList":[]}
@@ -5,6 +5,7 @@
5
5
  "directEventTypes": {},
6
6
  "validAttributes": {
7
7
  "intentHandle": true,
8
+ "onContentHeightChange": true,
8
9
  "hybridRef": true
9
10
  }
10
11
  }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ import { createElement, useMemo, useState } from 'react';
4
+ import { callback } from 'react-native-nitro-modules';
5
+ import { OnramperCheckoutButtonView } from "./OnramperCheckoutButtonView.js";
6
+
7
+ // Height of the bare Buy button. Used until native reports the measured content
8
+ // height so the first frame isn't collapsed.
9
+ export const CHECKOUT_BUTTON_FALLBACK_HEIGHT = 56;
10
+ /**
11
+ * Sizes the native checkout button to its SwiftUI content. The content grows when
12
+ * the SDK shows ToS text under the Buy button (which can change after mount), and
13
+ * Yoga can't measure a SwiftUI view — so native reports the height and it is
14
+ * applied here as an explicit `height`.
15
+ */
16
+ export function CheckoutButton({
17
+ intentHandle
18
+ }) {
19
+ const [height, setHeight] = useState(null);
20
+ const onContentHeightChange = useMemo(() => callback(h => setHeight(Math.ceil(h))), []);
21
+ return /*#__PURE__*/createElement(OnramperCheckoutButtonView, {
22
+ intentHandle,
23
+ onContentHeightChange,
24
+ style: {
25
+ width: '100%',
26
+ height: height ?? CHECKOUT_BUTTON_FALLBACK_HEIGHT
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=CheckoutButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createElement","useMemo","useState","callback","OnramperCheckoutButtonView","CHECKOUT_BUTTON_FALLBACK_HEIGHT","CheckoutButton","intentHandle","height","setHeight","onContentHeightChange","h","Math","ceil","style","width"],"sourceRoot":"../../src","sources":["CheckoutButton.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACxD,SAASC,QAAQ,QAAQ,4BAA4B;AAErD,SAASC,0BAA0B,QAAQ,iCAA8B;;AAEzE;AACA;AACA,OAAO,MAAMC,+BAA+B,GAAG,EAAE;AAMjD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAC;EAAEC;AAAkC,CAAC,EAAE;EACpE,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGP,QAAQ,CAAgB,IAAI,CAAC;EACzD,MAAMQ,qBAAqB,GAAGT,OAAO,CAAC,MAAME,QAAQ,CAAEQ,CAAS,IAAKF,SAAS,CAACG,IAAI,CAACC,IAAI,CAACF,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;EACjG,oBAAOX,aAAa,CAACI,0BAA0B,EAAE;IAC/CG,YAAY;IACZG,qBAAqB;IACrBI,KAAK,EAAE;MAAEC,KAAK,EAAE,MAAM;MAAEP,MAAM,EAAEA,MAAM,IAAIH;IAAgC;EAC5E,CAAC,CAAC;AACJ","ignoreList":[]}