@moonpay/platform-sdk-react-native 0.0.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +724 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +164 -0
- package/dist/index.d.ts +164 -0
- package/dist/index.js +702 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -5
- package/README.md +0 -3
- package/index.js +0 -1
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,724 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.ts
|
|
31
|
+
var src_exports = {};
|
|
32
|
+
__export(src_exports, {
|
|
33
|
+
MoonPayFrame: () => MoonPayFrame,
|
|
34
|
+
MoonPayProvider: () => MoonPayProvider,
|
|
35
|
+
WebViewTransport: () => WebViewTransport,
|
|
36
|
+
useMoonPay: () => useMoonPay
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(src_exports);
|
|
39
|
+
|
|
40
|
+
// src/frame-component.tsx
|
|
41
|
+
var import_react = require("react");
|
|
42
|
+
var import_react_native = require("react-native");
|
|
43
|
+
var import_react_native_webview = __toESM(require("react-native-webview"), 1);
|
|
44
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
45
|
+
function MoonPayFrame({ transport, hidden, style }) {
|
|
46
|
+
const webViewRef = (0, import_react.useRef)(null);
|
|
47
|
+
(0, import_react.useEffect)(() => {
|
|
48
|
+
transport.attachWebView(webViewRef);
|
|
49
|
+
return () => {
|
|
50
|
+
};
|
|
51
|
+
}, [transport]);
|
|
52
|
+
const url = transport.url;
|
|
53
|
+
if (!url)
|
|
54
|
+
return null;
|
|
55
|
+
const handleMessage = (event) => {
|
|
56
|
+
transport.handleWebViewMessage(event.nativeEvent.data);
|
|
57
|
+
};
|
|
58
|
+
const containerStyle = hidden ? { width: 0, height: 0, overflow: "hidden" } : { flex: 1, ...style };
|
|
59
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_native.View, { style: containerStyle, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
|
+
import_react_native_webview.default,
|
|
61
|
+
{
|
|
62
|
+
ref: webViewRef,
|
|
63
|
+
source: { uri: url },
|
|
64
|
+
onMessage: handleMessage,
|
|
65
|
+
allowsInlineMediaPlayback: true,
|
|
66
|
+
javaScriptEnabled: true,
|
|
67
|
+
domStorageEnabled: true,
|
|
68
|
+
style: { flex: 1 }
|
|
69
|
+
}
|
|
70
|
+
) });
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// src/provider.tsx
|
|
74
|
+
var import_platform_protocol = require("@moonpay/platform-protocol");
|
|
75
|
+
var import_platform_sdk_core = require("@moonpay/platform-sdk-core");
|
|
76
|
+
var import_react2 = require("react");
|
|
77
|
+
|
|
78
|
+
// src/webview-transport.ts
|
|
79
|
+
var WebViewTransport = class {
|
|
80
|
+
webViewRef = null;
|
|
81
|
+
handlers = [];
|
|
82
|
+
_url = "";
|
|
83
|
+
_options = null;
|
|
84
|
+
/** Called by the frame component when it mounts the WebView. */
|
|
85
|
+
attachWebView(ref) {
|
|
86
|
+
this.webViewRef = ref;
|
|
87
|
+
}
|
|
88
|
+
/** Called by the WebView's onMessage prop to route incoming messages. */
|
|
89
|
+
handleWebViewMessage(data) {
|
|
90
|
+
try {
|
|
91
|
+
const msg = JSON.parse(data);
|
|
92
|
+
if (!msg.kind)
|
|
93
|
+
return;
|
|
94
|
+
for (const handler of this.handlers) {
|
|
95
|
+
handler(msg);
|
|
96
|
+
}
|
|
97
|
+
} catch {
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
get url() {
|
|
101
|
+
return this._url;
|
|
102
|
+
}
|
|
103
|
+
get options() {
|
|
104
|
+
return this._options;
|
|
105
|
+
}
|
|
106
|
+
// FrameTransport interface
|
|
107
|
+
create(url, options) {
|
|
108
|
+
this._url = url;
|
|
109
|
+
this._options = options;
|
|
110
|
+
}
|
|
111
|
+
sendMessage(message) {
|
|
112
|
+
if (!this.webViewRef?.current) {
|
|
113
|
+
throw new Error("Cannot send message: WebView not attached");
|
|
114
|
+
}
|
|
115
|
+
const js = `
|
|
116
|
+
window.postMessage(${JSON.stringify(JSON.stringify(message))}, '*');
|
|
117
|
+
true;
|
|
118
|
+
`;
|
|
119
|
+
this.webViewRef.current.injectJavaScript(js);
|
|
120
|
+
}
|
|
121
|
+
onMessage(handler) {
|
|
122
|
+
this.handlers.push(handler);
|
|
123
|
+
return () => {
|
|
124
|
+
const idx = this.handlers.indexOf(handler);
|
|
125
|
+
if (idx >= 0)
|
|
126
|
+
this.handlers.splice(idx, 1);
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
dispose() {
|
|
130
|
+
this.handlers.length = 0;
|
|
131
|
+
this.webViewRef = null;
|
|
132
|
+
this._url = "";
|
|
133
|
+
this._options = null;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// src/provider.tsx
|
|
138
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
139
|
+
var MoonPayContext = (0, import_react2.createContext)(null);
|
|
140
|
+
var slotCounter = 0;
|
|
141
|
+
function MoonPayProvider({
|
|
142
|
+
sessionToken,
|
|
143
|
+
apiBaseUrl,
|
|
144
|
+
frameBaseUrl,
|
|
145
|
+
children
|
|
146
|
+
}) {
|
|
147
|
+
const [frameSlots, setFrameSlots] = (0, import_react2.useState)([]);
|
|
148
|
+
const addSlot = (0, import_react2.useCallback)((slot) => {
|
|
149
|
+
setFrameSlots((prev) => [...prev, slot]);
|
|
150
|
+
}, []);
|
|
151
|
+
const removeSlot = (0, import_react2.useCallback)((id) => {
|
|
152
|
+
setFrameSlots((prev) => prev.filter((s) => s.id !== id));
|
|
153
|
+
}, []);
|
|
154
|
+
const coreRef = (0, import_react2.useRef)(null);
|
|
155
|
+
if (!coreRef.current) {
|
|
156
|
+
coreRef.current = (0, import_platform_sdk_core.createClientCore)({
|
|
157
|
+
apiBaseUrl,
|
|
158
|
+
frameBaseUrl,
|
|
159
|
+
createTransport: () => new WebViewTransport()
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const core = coreRef.current;
|
|
163
|
+
const client = (0, import_react2.useMemo)(() => {
|
|
164
|
+
function createManagedFrame(opts) {
|
|
165
|
+
const transport = new WebViewTransport();
|
|
166
|
+
const slotId = `slot-${++slotCounter}`;
|
|
167
|
+
const promise = new Promise((resolve, reject) => {
|
|
168
|
+
transport.create(opts.url, { container: null, hidden: opts.hidden });
|
|
169
|
+
addSlot({ id: slotId, transport, hidden: opts.hidden });
|
|
170
|
+
(0, import_platform_sdk_core.createFrameOrchestrator)({
|
|
171
|
+
transport,
|
|
172
|
+
channelId: opts.channelId,
|
|
173
|
+
url: opts.url,
|
|
174
|
+
container: null,
|
|
175
|
+
hidden: opts.hidden,
|
|
176
|
+
handshakeTimeout: opts.handshakeTimeout ?? 15e3
|
|
177
|
+
}).then((handle) => resolve({ handle, slotId })).catch((e) => {
|
|
178
|
+
removeSlot(slotId);
|
|
179
|
+
reject(e);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
return { promise, transport };
|
|
183
|
+
}
|
|
184
|
+
async function getConnection() {
|
|
185
|
+
const { privateKey, publicKey } = (0, import_platform_sdk_core.generateKeyPair)();
|
|
186
|
+
const channelId = `check-${Date.now()}`;
|
|
187
|
+
const url = (0, import_platform_sdk_core.buildFrameUrl)(
|
|
188
|
+
import_platform_sdk_core.FRAME_PATHS.checkConnection,
|
|
189
|
+
{ sessionToken, channelId, publicKey },
|
|
190
|
+
{ frameBaseUrl }
|
|
191
|
+
);
|
|
192
|
+
try {
|
|
193
|
+
const { promise } = createManagedFrame({
|
|
194
|
+
url,
|
|
195
|
+
channelId,
|
|
196
|
+
hidden: true,
|
|
197
|
+
handshakeTimeout: 1e4
|
|
198
|
+
});
|
|
199
|
+
const { handle, slotId } = await promise;
|
|
200
|
+
return new Promise((resolve) => {
|
|
201
|
+
const timeout = setTimeout(() => {
|
|
202
|
+
handle.dispose();
|
|
203
|
+
removeSlot(slotId);
|
|
204
|
+
resolve((0, import_platform_protocol.err)({ message: "Get connection timed out" }));
|
|
205
|
+
}, 1e4);
|
|
206
|
+
handle.onMessage((msg) => {
|
|
207
|
+
if (msg.kind === "error") {
|
|
208
|
+
clearTimeout(timeout);
|
|
209
|
+
handle.dispose();
|
|
210
|
+
removeSlot(slotId);
|
|
211
|
+
const payload = msg.payload;
|
|
212
|
+
resolve((0, import_platform_protocol.err)({ message: payload.message }));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (msg.kind === "complete") {
|
|
216
|
+
clearTimeout(timeout);
|
|
217
|
+
handle.dispose();
|
|
218
|
+
removeSlot(slotId);
|
|
219
|
+
const connection = msg.payload;
|
|
220
|
+
if (connection.status === import_platform_protocol.ConnectionStatus.active) {
|
|
221
|
+
const creds = (0, import_platform_sdk_core.decryptCredentials)(connection.credentials, privateKey);
|
|
222
|
+
core.context.setAccessToken(creds.accessToken);
|
|
223
|
+
core.context.setClientToken(creds.clientToken);
|
|
224
|
+
}
|
|
225
|
+
resolve((0, import_platform_protocol.ok)(connection));
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
} catch (e) {
|
|
230
|
+
return (0, import_platform_protocol.err)({
|
|
231
|
+
message: e instanceof Error ? e.message : "Failed to check connection"
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async function connect(opts) {
|
|
236
|
+
const { privateKey, publicKey } = (0, import_platform_sdk_core.generateKeyPair)();
|
|
237
|
+
const channelId = `connect-${Date.now()}`;
|
|
238
|
+
const url = (0, import_platform_sdk_core.buildFrameUrl)(
|
|
239
|
+
import_platform_sdk_core.FRAME_PATHS.connect,
|
|
240
|
+
{
|
|
241
|
+
sessionToken,
|
|
242
|
+
channelId,
|
|
243
|
+
publicKey,
|
|
244
|
+
...opts.theme?.appearance && { appearance: opts.theme.appearance }
|
|
245
|
+
},
|
|
246
|
+
{ frameBaseUrl }
|
|
247
|
+
);
|
|
248
|
+
try {
|
|
249
|
+
const { promise } = createManagedFrame({ url, channelId, hidden: false });
|
|
250
|
+
const { handle, slotId } = await promise;
|
|
251
|
+
return new Promise((resolve) => {
|
|
252
|
+
handle.onMessage((msg) => {
|
|
253
|
+
if (msg.kind === "ready") {
|
|
254
|
+
opts.onEvent?.({ kind: "ready" });
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (msg.kind === "error") {
|
|
258
|
+
const payload = msg.payload;
|
|
259
|
+
opts.onEvent?.({ kind: "error", payload });
|
|
260
|
+
handle.dispose();
|
|
261
|
+
removeSlot(slotId);
|
|
262
|
+
resolve((0, import_platform_protocol.err)({ message: "Connection error" }));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (msg.kind === "complete") {
|
|
266
|
+
const connection = msg.payload;
|
|
267
|
+
if (connection.status === import_platform_protocol.ConnectionStatus.active) {
|
|
268
|
+
const creds = (0, import_platform_sdk_core.decryptCredentials)(connection.credentials, privateKey);
|
|
269
|
+
core.context.setAccessToken(creds.accessToken);
|
|
270
|
+
core.context.setClientToken(creds.clientToken);
|
|
271
|
+
}
|
|
272
|
+
opts.onEvent?.({ kind: "complete", payload: connection });
|
|
273
|
+
resolve(
|
|
274
|
+
(0, import_platform_protocol.ok)({
|
|
275
|
+
dispose: () => {
|
|
276
|
+
handle.dispose();
|
|
277
|
+
removeSlot(slotId);
|
|
278
|
+
}
|
|
279
|
+
})
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
} catch (e) {
|
|
285
|
+
return (0, import_platform_protocol.err)({
|
|
286
|
+
message: e instanceof Error ? e.message : "Connect failed"
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
async function setupWidget(opts) {
|
|
291
|
+
const channelId = `widget-${Date.now()}`;
|
|
292
|
+
const url = (0, import_platform_sdk_core.buildFrameUrl)(
|
|
293
|
+
import_platform_sdk_core.FRAME_PATHS.widget,
|
|
294
|
+
{
|
|
295
|
+
flow: "buy",
|
|
296
|
+
clientToken: core.context.clientToken,
|
|
297
|
+
quoteSignature: opts.quote,
|
|
298
|
+
channelId
|
|
299
|
+
},
|
|
300
|
+
{ frameBaseUrl }
|
|
301
|
+
);
|
|
302
|
+
try {
|
|
303
|
+
const { promise } = createManagedFrame({ url, channelId, hidden: false });
|
|
304
|
+
const { handle, slotId } = await promise;
|
|
305
|
+
handle.onMessage((msg) => {
|
|
306
|
+
switch (msg.kind) {
|
|
307
|
+
case "ready":
|
|
308
|
+
opts.onEvent?.({ kind: "ready" });
|
|
309
|
+
break;
|
|
310
|
+
case "transactionCreated":
|
|
311
|
+
opts.onEvent?.({
|
|
312
|
+
kind: "transactionCreated",
|
|
313
|
+
payload: msg.payload
|
|
314
|
+
});
|
|
315
|
+
break;
|
|
316
|
+
case "complete":
|
|
317
|
+
opts.onEvent?.({
|
|
318
|
+
kind: "complete",
|
|
319
|
+
payload: msg.payload
|
|
320
|
+
});
|
|
321
|
+
break;
|
|
322
|
+
case "error": {
|
|
323
|
+
const payload = msg.payload;
|
|
324
|
+
opts.onEvent?.({
|
|
325
|
+
kind: "error",
|
|
326
|
+
payload: { code: payload.code, message: payload.message }
|
|
327
|
+
});
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
case "close":
|
|
331
|
+
opts.onEvent?.({ kind: "close" });
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
return (0, import_platform_protocol.ok)({
|
|
336
|
+
dispose: () => {
|
|
337
|
+
handle.dispose();
|
|
338
|
+
removeSlot(slotId);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
} catch (e) {
|
|
342
|
+
return (0, import_platform_protocol.err)({
|
|
343
|
+
kind: "genericError",
|
|
344
|
+
message: e instanceof Error ? e.message : "Widget setup failed"
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
async function setupApplePay(opts) {
|
|
349
|
+
const channelId = `applepay-${Date.now()}`;
|
|
350
|
+
const url = (0, import_platform_sdk_core.buildFrameUrl)(
|
|
351
|
+
import_platform_sdk_core.FRAME_PATHS.applePay,
|
|
352
|
+
{
|
|
353
|
+
clientToken: core.context.clientToken,
|
|
354
|
+
signature: opts.quote,
|
|
355
|
+
channelId
|
|
356
|
+
},
|
|
357
|
+
{ frameBaseUrl }
|
|
358
|
+
);
|
|
359
|
+
try {
|
|
360
|
+
const { promise } = createManagedFrame({ url, channelId, hidden: false });
|
|
361
|
+
const { handle, slotId } = await promise;
|
|
362
|
+
const setQuote = (signature) => {
|
|
363
|
+
handle.sendMessage({
|
|
364
|
+
version: 2,
|
|
365
|
+
meta: { channelId },
|
|
366
|
+
kind: "setQuote",
|
|
367
|
+
payload: { quote: { signature } }
|
|
368
|
+
});
|
|
369
|
+
};
|
|
370
|
+
handle.onMessage((msg) => {
|
|
371
|
+
switch (msg.kind) {
|
|
372
|
+
case "ready":
|
|
373
|
+
opts.onEvent?.({ kind: "ready" });
|
|
374
|
+
break;
|
|
375
|
+
case "complete":
|
|
376
|
+
opts.onEvent?.({
|
|
377
|
+
kind: "complete",
|
|
378
|
+
payload: msg.payload
|
|
379
|
+
});
|
|
380
|
+
break;
|
|
381
|
+
case "error": {
|
|
382
|
+
const payload = msg.payload;
|
|
383
|
+
if (payload.code === "quoteExpired") {
|
|
384
|
+
opts.onEvent?.({ kind: "quoteExpired", payload: { setQuote } });
|
|
385
|
+
} else if (payload.code === "applePayUnavailable") {
|
|
386
|
+
opts.onEvent?.({ kind: "unsupported" });
|
|
387
|
+
} else {
|
|
388
|
+
const kind = payload.code === "generic" ? "genericError" : payload.code;
|
|
389
|
+
opts.onEvent?.({
|
|
390
|
+
kind: "error",
|
|
391
|
+
payload: { kind, message: payload.message }
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
return (0, import_platform_protocol.ok)({
|
|
399
|
+
setQuote,
|
|
400
|
+
dispose: () => {
|
|
401
|
+
handle.dispose();
|
|
402
|
+
removeSlot(slotId);
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
} catch (e) {
|
|
406
|
+
return (0, import_platform_protocol.err)({
|
|
407
|
+
kind: "genericError",
|
|
408
|
+
message: e instanceof Error ? e.message : "Apple Pay setup failed"
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
async function setupBuy(opts) {
|
|
413
|
+
const channelId = `buy-${Date.now()}`;
|
|
414
|
+
const url = (0, import_platform_sdk_core.buildFrameUrl)(
|
|
415
|
+
import_platform_sdk_core.FRAME_PATHS.buy,
|
|
416
|
+
{
|
|
417
|
+
channelId,
|
|
418
|
+
clientToken: core.context.clientToken,
|
|
419
|
+
signature: opts.quote,
|
|
420
|
+
...opts.externalTransactionId && { externalTransactionId: opts.externalTransactionId }
|
|
421
|
+
},
|
|
422
|
+
{ frameBaseUrl }
|
|
423
|
+
);
|
|
424
|
+
try {
|
|
425
|
+
const { promise } = createManagedFrame({ url, channelId, hidden: true });
|
|
426
|
+
const { handle, slotId } = await promise;
|
|
427
|
+
const setQuote = (signature) => {
|
|
428
|
+
handle.sendMessage({
|
|
429
|
+
version: 2,
|
|
430
|
+
meta: { channelId },
|
|
431
|
+
kind: "setQuote",
|
|
432
|
+
payload: { quote: { signature } }
|
|
433
|
+
});
|
|
434
|
+
};
|
|
435
|
+
handle.onMessage((msg) => {
|
|
436
|
+
switch (msg.kind) {
|
|
437
|
+
case "ready":
|
|
438
|
+
opts.onEvent?.({ kind: "ready" });
|
|
439
|
+
break;
|
|
440
|
+
case "complete":
|
|
441
|
+
opts.onEvent?.({
|
|
442
|
+
kind: "complete",
|
|
443
|
+
payload: msg.payload
|
|
444
|
+
});
|
|
445
|
+
break;
|
|
446
|
+
case "challenge":
|
|
447
|
+
opts.onEvent?.({
|
|
448
|
+
kind: "challenge",
|
|
449
|
+
payload: msg.payload
|
|
450
|
+
});
|
|
451
|
+
break;
|
|
452
|
+
case "error":
|
|
453
|
+
opts.onEvent?.({
|
|
454
|
+
kind: "error",
|
|
455
|
+
payload: msg.payload
|
|
456
|
+
});
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
return (0, import_platform_protocol.ok)({
|
|
461
|
+
setQuote,
|
|
462
|
+
dispose: () => {
|
|
463
|
+
handle.dispose();
|
|
464
|
+
removeSlot(slotId);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
} catch (e) {
|
|
468
|
+
return (0, import_platform_protocol.err)({
|
|
469
|
+
kind: "genericError",
|
|
470
|
+
message: e instanceof Error ? e.message : "Buy setup failed"
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
async function setupBuyButton(opts) {
|
|
475
|
+
const channelId = `buy-button-${Date.now()}`;
|
|
476
|
+
const url = (0, import_platform_sdk_core.buildFrameUrl)(
|
|
477
|
+
import_platform_sdk_core.FRAME_PATHS.buyButton,
|
|
478
|
+
{
|
|
479
|
+
channelId,
|
|
480
|
+
clientToken: core.context.clientToken,
|
|
481
|
+
signature: opts.quote
|
|
482
|
+
},
|
|
483
|
+
{ frameBaseUrl }
|
|
484
|
+
);
|
|
485
|
+
try {
|
|
486
|
+
const { promise } = createManagedFrame({ url, channelId, hidden: false });
|
|
487
|
+
const { handle, slotId } = await promise;
|
|
488
|
+
const setQuote = (signature) => {
|
|
489
|
+
handle.sendMessage({
|
|
490
|
+
version: 2,
|
|
491
|
+
meta: { channelId },
|
|
492
|
+
kind: "setQuote",
|
|
493
|
+
payload: { quote: { signature } }
|
|
494
|
+
});
|
|
495
|
+
};
|
|
496
|
+
handle.onMessage((msg) => {
|
|
497
|
+
switch (msg.kind) {
|
|
498
|
+
case "complete":
|
|
499
|
+
opts.onEvent?.({
|
|
500
|
+
kind: "complete",
|
|
501
|
+
payload: msg.payload
|
|
502
|
+
});
|
|
503
|
+
break;
|
|
504
|
+
case "challenge":
|
|
505
|
+
opts.onEvent?.({
|
|
506
|
+
kind: "challenge",
|
|
507
|
+
payload: msg.payload
|
|
508
|
+
});
|
|
509
|
+
break;
|
|
510
|
+
case "error":
|
|
511
|
+
opts.onEvent?.({
|
|
512
|
+
kind: "error",
|
|
513
|
+
payload: msg.payload
|
|
514
|
+
});
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
return (0, import_platform_protocol.ok)({
|
|
519
|
+
setQuote,
|
|
520
|
+
dispose: () => {
|
|
521
|
+
handle.dispose();
|
|
522
|
+
removeSlot(slotId);
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
} catch (e) {
|
|
526
|
+
return (0, import_platform_protocol.err)({
|
|
527
|
+
kind: "genericError",
|
|
528
|
+
message: e instanceof Error ? e.message : "Buy button setup failed"
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
async function setupGooglePay(opts) {
|
|
533
|
+
const channelId = `googlepay-${Date.now()}`;
|
|
534
|
+
const url = (0, import_platform_sdk_core.buildFrameUrl)(
|
|
535
|
+
import_platform_sdk_core.FRAME_PATHS.googlePay,
|
|
536
|
+
{
|
|
537
|
+
clientToken: core.context.clientToken,
|
|
538
|
+
signature: opts.quote,
|
|
539
|
+
channelId,
|
|
540
|
+
...opts.externalTransactionId && { externalTransactionId: opts.externalTransactionId }
|
|
541
|
+
},
|
|
542
|
+
{ frameBaseUrl }
|
|
543
|
+
);
|
|
544
|
+
try {
|
|
545
|
+
const { promise } = createManagedFrame({ url, channelId, hidden: false });
|
|
546
|
+
const { handle, slotId } = await promise;
|
|
547
|
+
const setQuote = (signature) => {
|
|
548
|
+
handle.sendMessage({
|
|
549
|
+
version: 2,
|
|
550
|
+
meta: { channelId },
|
|
551
|
+
kind: "setQuote",
|
|
552
|
+
payload: { quote: { signature } }
|
|
553
|
+
});
|
|
554
|
+
};
|
|
555
|
+
handle.onMessage((msg) => {
|
|
556
|
+
switch (msg.kind) {
|
|
557
|
+
case "ready":
|
|
558
|
+
opts.onEvent?.({ kind: "ready" });
|
|
559
|
+
break;
|
|
560
|
+
case "complete":
|
|
561
|
+
opts.onEvent?.({
|
|
562
|
+
kind: "complete",
|
|
563
|
+
payload: msg.payload
|
|
564
|
+
});
|
|
565
|
+
break;
|
|
566
|
+
case "challenge":
|
|
567
|
+
opts.onEvent?.({
|
|
568
|
+
kind: "challenge",
|
|
569
|
+
payload: msg.payload
|
|
570
|
+
});
|
|
571
|
+
break;
|
|
572
|
+
case "error": {
|
|
573
|
+
const payload = msg.payload;
|
|
574
|
+
if (payload.code === "quoteExpired") {
|
|
575
|
+
opts.onEvent?.({ kind: "quoteExpired", payload: { setQuote } });
|
|
576
|
+
} else if (payload.code === "googlePayUnavailable") {
|
|
577
|
+
opts.onEvent?.({ kind: "unsupported" });
|
|
578
|
+
} else {
|
|
579
|
+
const kind = payload.code === "generic" ? "genericError" : payload.code;
|
|
580
|
+
opts.onEvent?.({
|
|
581
|
+
kind: "error",
|
|
582
|
+
payload: { kind, message: payload.message }
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
break;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
return (0, import_platform_protocol.ok)({
|
|
590
|
+
setQuote,
|
|
591
|
+
dispose: () => {
|
|
592
|
+
handle.dispose();
|
|
593
|
+
removeSlot(slotId);
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
} catch (e) {
|
|
597
|
+
return (0, import_platform_protocol.err)({
|
|
598
|
+
kind: "genericError",
|
|
599
|
+
message: e instanceof Error ? e.message : "Google Pay setup failed"
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
async function setupChallenge(opts) {
|
|
604
|
+
let channelId;
|
|
605
|
+
try {
|
|
606
|
+
channelId = new URL(opts.url).searchParams.get("channelId") ?? "";
|
|
607
|
+
if (!channelId)
|
|
608
|
+
throw new Error("missing channelId");
|
|
609
|
+
} catch {
|
|
610
|
+
return (0, import_platform_protocol.err)({ kind: "configurationError", message: "Challenge URL is missing channelId" });
|
|
611
|
+
}
|
|
612
|
+
try {
|
|
613
|
+
const { promise } = createManagedFrame({ url: opts.url, channelId, hidden: false });
|
|
614
|
+
const { handle, slotId } = await promise;
|
|
615
|
+
handle.onMessage((msg) => {
|
|
616
|
+
switch (msg.kind) {
|
|
617
|
+
case "ready":
|
|
618
|
+
opts.onEvent?.({ kind: "ready" });
|
|
619
|
+
break;
|
|
620
|
+
case "complete":
|
|
621
|
+
opts.onEvent?.({
|
|
622
|
+
kind: "complete",
|
|
623
|
+
payload: msg.payload
|
|
624
|
+
});
|
|
625
|
+
break;
|
|
626
|
+
case "cancelled":
|
|
627
|
+
opts.onEvent?.({
|
|
628
|
+
kind: "cancelled",
|
|
629
|
+
payload: msg.payload
|
|
630
|
+
});
|
|
631
|
+
break;
|
|
632
|
+
case "error":
|
|
633
|
+
opts.onEvent?.({
|
|
634
|
+
kind: "error",
|
|
635
|
+
payload: msg.payload
|
|
636
|
+
});
|
|
637
|
+
break;
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
return (0, import_platform_protocol.ok)({
|
|
641
|
+
dispose: () => {
|
|
642
|
+
handle.dispose();
|
|
643
|
+
removeSlot(slotId);
|
|
644
|
+
}
|
|
645
|
+
});
|
|
646
|
+
} catch (e) {
|
|
647
|
+
return (0, import_platform_protocol.err)({
|
|
648
|
+
kind: "genericError",
|
|
649
|
+
message: e instanceof Error ? e.message : "Challenge setup failed"
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
async function setupAddCard(opts) {
|
|
654
|
+
const channelId = `add-card-${Date.now()}`;
|
|
655
|
+
const url = (0, import_platform_sdk_core.buildFrameUrl)(
|
|
656
|
+
import_platform_sdk_core.FRAME_PATHS.addCard,
|
|
657
|
+
{ channelId, clientToken: core.context.clientToken },
|
|
658
|
+
{ frameBaseUrl }
|
|
659
|
+
);
|
|
660
|
+
try {
|
|
661
|
+
const { promise } = createManagedFrame({ url, channelId, hidden: false });
|
|
662
|
+
const { handle, slotId } = await promise;
|
|
663
|
+
handle.onMessage((msg) => {
|
|
664
|
+
switch (msg.kind) {
|
|
665
|
+
case "complete":
|
|
666
|
+
opts.onEvent?.({ kind: "complete", payload: msg.payload });
|
|
667
|
+
break;
|
|
668
|
+
case "error":
|
|
669
|
+
opts.onEvent?.({
|
|
670
|
+
kind: "error",
|
|
671
|
+
payload: msg.payload
|
|
672
|
+
});
|
|
673
|
+
break;
|
|
674
|
+
}
|
|
675
|
+
});
|
|
676
|
+
return (0, import_platform_protocol.ok)({
|
|
677
|
+
dispose: () => {
|
|
678
|
+
handle.dispose();
|
|
679
|
+
removeSlot(slotId);
|
|
680
|
+
}
|
|
681
|
+
});
|
|
682
|
+
} catch (e) {
|
|
683
|
+
return (0, import_platform_protocol.err)({
|
|
684
|
+
kind: "genericError",
|
|
685
|
+
message: e instanceof Error ? e.message : "Add card setup failed"
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
return {
|
|
690
|
+
getConnection,
|
|
691
|
+
connect,
|
|
692
|
+
getPaymentMethods: () => core.getPaymentMethods(),
|
|
693
|
+
getQuote: (params) => core.getQuote(params),
|
|
694
|
+
listTransactions: (params) => core.listTransactions(params),
|
|
695
|
+
getTransaction: (id) => core.getTransaction(id),
|
|
696
|
+
setupWidget,
|
|
697
|
+
setupApplePay,
|
|
698
|
+
setupBuy,
|
|
699
|
+
setupBuyButton,
|
|
700
|
+
setupGooglePay,
|
|
701
|
+
setupChallenge,
|
|
702
|
+
setupAddCard
|
|
703
|
+
};
|
|
704
|
+
}, [sessionToken, frameBaseUrl, core, addSlot, removeSlot]);
|
|
705
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(MoonPayContext.Provider, { value: { client }, children: [
|
|
706
|
+
children,
|
|
707
|
+
frameSlots.map((slot) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(MoonPayFrame, { transport: slot.transport, hidden: slot.hidden }, slot.id))
|
|
708
|
+
] });
|
|
709
|
+
}
|
|
710
|
+
function useMoonPay() {
|
|
711
|
+
const ctx = (0, import_react2.useContext)(MoonPayContext);
|
|
712
|
+
if (!ctx) {
|
|
713
|
+
throw new Error("useMoonPay must be used within a <MoonPayProvider>");
|
|
714
|
+
}
|
|
715
|
+
return ctx;
|
|
716
|
+
}
|
|
717
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
718
|
+
0 && (module.exports = {
|
|
719
|
+
MoonPayFrame,
|
|
720
|
+
MoonPayProvider,
|
|
721
|
+
WebViewTransport,
|
|
722
|
+
useMoonPay
|
|
723
|
+
});
|
|
724
|
+
//# sourceMappingURL=index.cjs.map
|