@cimplify/sdk 0.3.6 → 0.4.0
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/client-Ug3b8v1t.d.mts +3166 -0
- package/dist/client-Ug3b8v1t.d.ts +3166 -0
- package/dist/index.d.mts +3 -2948
- package/dist/index.d.ts +3 -2948
- package/dist/index.js +325 -0
- package/dist/index.mjs +318 -1
- package/dist/react.d.mts +59 -0
- package/dist/react.d.ts +59 -0
- package/dist/react.js +144 -0
- package/dist/react.mjs +136 -0
- package/package.json +16 -1
package/dist/index.mjs
CHANGED
|
@@ -519,6 +519,15 @@ var AUTHORIZATION_TYPE = {
|
|
|
519
519
|
BIRTHDAY: "birthday",
|
|
520
520
|
ADDRESS: "address"
|
|
521
521
|
};
|
|
522
|
+
var DEVICE_TYPE = {
|
|
523
|
+
MOBILE: "mobile",
|
|
524
|
+
DESKTOP: "desktop",
|
|
525
|
+
TABLET: "tablet"
|
|
526
|
+
};
|
|
527
|
+
var CONTACT_TYPE = {
|
|
528
|
+
PHONE: "phone",
|
|
529
|
+
EMAIL: "email"
|
|
530
|
+
};
|
|
522
531
|
var LINK_QUERY = {
|
|
523
532
|
DATA: "link.data",
|
|
524
533
|
ADDRESSES: "link.addresses",
|
|
@@ -1219,6 +1228,297 @@ var LiteService = class {
|
|
|
1219
1228
|
}
|
|
1220
1229
|
};
|
|
1221
1230
|
|
|
1231
|
+
// src/types/elements.ts
|
|
1232
|
+
var ELEMENT_TYPES = {
|
|
1233
|
+
AUTH: "auth",
|
|
1234
|
+
ADDRESS: "address",
|
|
1235
|
+
PAYMENT: "payment"
|
|
1236
|
+
};
|
|
1237
|
+
var MESSAGE_TYPES = {
|
|
1238
|
+
// Parent → Iframe
|
|
1239
|
+
INIT: "init",
|
|
1240
|
+
SET_TOKEN: "set_token",
|
|
1241
|
+
GET_DATA: "get_data",
|
|
1242
|
+
REFRESH_TOKEN: "refresh_token",
|
|
1243
|
+
LOGOUT: "logout",
|
|
1244
|
+
// Iframe → Parent
|
|
1245
|
+
READY: "ready",
|
|
1246
|
+
HEIGHT_CHANGE: "height_change",
|
|
1247
|
+
AUTHENTICATED: "authenticated",
|
|
1248
|
+
REQUIRES_OTP: "requires_otp",
|
|
1249
|
+
ERROR: "error",
|
|
1250
|
+
ADDRESS_CHANGED: "address_changed",
|
|
1251
|
+
ADDRESS_SELECTED: "address_selected",
|
|
1252
|
+
PAYMENT_METHOD_SELECTED: "payment_method_selected",
|
|
1253
|
+
TOKEN_REFRESHED: "token_refreshed",
|
|
1254
|
+
LOGOUT_COMPLETE: "logout_complete"
|
|
1255
|
+
};
|
|
1256
|
+
var EVENT_TYPES = {
|
|
1257
|
+
READY: "ready",
|
|
1258
|
+
AUTHENTICATED: "authenticated",
|
|
1259
|
+
REQUIRES_OTP: "requires_otp",
|
|
1260
|
+
ERROR: "error",
|
|
1261
|
+
CHANGE: "change",
|
|
1262
|
+
BLUR: "blur",
|
|
1263
|
+
FOCUS: "focus"
|
|
1264
|
+
};
|
|
1265
|
+
|
|
1266
|
+
// src/elements.ts
|
|
1267
|
+
var DEFAULT_LINK_URL = "https://link.cimplify.io";
|
|
1268
|
+
var CimplifyElements = class {
|
|
1269
|
+
constructor(client, businessId, options = {}) {
|
|
1270
|
+
this.elements = /* @__PURE__ */ new Map();
|
|
1271
|
+
this.accessToken = null;
|
|
1272
|
+
this.accountId = null;
|
|
1273
|
+
this.customerId = null;
|
|
1274
|
+
this.addressData = null;
|
|
1275
|
+
this.paymentData = null;
|
|
1276
|
+
this.client = client;
|
|
1277
|
+
this.businessId = businessId;
|
|
1278
|
+
this.linkUrl = options.linkUrl || DEFAULT_LINK_URL;
|
|
1279
|
+
this.options = options;
|
|
1280
|
+
if (typeof window !== "undefined") {
|
|
1281
|
+
window.addEventListener("message", this.handleMessage.bind(this));
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
create(type, options = {}) {
|
|
1285
|
+
const existing = this.elements.get(type);
|
|
1286
|
+
if (existing) return existing;
|
|
1287
|
+
const element = new CimplifyElement(type, this.businessId, this.linkUrl, options, this);
|
|
1288
|
+
this.elements.set(type, element);
|
|
1289
|
+
return element;
|
|
1290
|
+
}
|
|
1291
|
+
getElement(type) {
|
|
1292
|
+
return this.elements.get(type);
|
|
1293
|
+
}
|
|
1294
|
+
destroy() {
|
|
1295
|
+
this.elements.forEach((element) => element.destroy());
|
|
1296
|
+
this.elements.clear();
|
|
1297
|
+
if (typeof window !== "undefined") {
|
|
1298
|
+
window.removeEventListener("message", this.handleMessage.bind(this));
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
async submitCheckout(data) {
|
|
1302
|
+
const addressElement = this.elements.get(ELEMENT_TYPES.ADDRESS);
|
|
1303
|
+
if (addressElement) await addressElement.getData();
|
|
1304
|
+
const paymentElement = this.elements.get(ELEMENT_TYPES.PAYMENT);
|
|
1305
|
+
if (paymentElement) await paymentElement.getData();
|
|
1306
|
+
const checkoutData = {
|
|
1307
|
+
...data,
|
|
1308
|
+
customer: this.accountId ? { account_id: this.accountId, customer_id: this.customerId } : void 0,
|
|
1309
|
+
address: this.addressData,
|
|
1310
|
+
payment_method: this.paymentData
|
|
1311
|
+
};
|
|
1312
|
+
const result = await this.client.checkout.process(checkoutData);
|
|
1313
|
+
if (result.ok) {
|
|
1314
|
+
return { success: true, order: result.value };
|
|
1315
|
+
}
|
|
1316
|
+
return {
|
|
1317
|
+
success: false,
|
|
1318
|
+
error: {
|
|
1319
|
+
code: result.error.code || "CHECKOUT_FAILED",
|
|
1320
|
+
message: result.error.message || "Checkout failed"
|
|
1321
|
+
}
|
|
1322
|
+
};
|
|
1323
|
+
}
|
|
1324
|
+
isAuthenticated() {
|
|
1325
|
+
return this.accessToken !== null;
|
|
1326
|
+
}
|
|
1327
|
+
getAccessToken() {
|
|
1328
|
+
return this.accessToken;
|
|
1329
|
+
}
|
|
1330
|
+
handleMessage(event) {
|
|
1331
|
+
if (!event.origin.includes("cimplify.io") && !event.origin.includes("localhost")) {
|
|
1332
|
+
return;
|
|
1333
|
+
}
|
|
1334
|
+
const message = event.data;
|
|
1335
|
+
if (!message?.type) return;
|
|
1336
|
+
switch (message.type) {
|
|
1337
|
+
case MESSAGE_TYPES.AUTHENTICATED:
|
|
1338
|
+
this.accessToken = message.token;
|
|
1339
|
+
this.accountId = message.accountId;
|
|
1340
|
+
this.customerId = message.customerId;
|
|
1341
|
+
this.elements.forEach((element, type) => {
|
|
1342
|
+
if (type !== ELEMENT_TYPES.AUTH) {
|
|
1343
|
+
element.sendMessage({ type: MESSAGE_TYPES.SET_TOKEN, token: message.token });
|
|
1344
|
+
}
|
|
1345
|
+
});
|
|
1346
|
+
break;
|
|
1347
|
+
case MESSAGE_TYPES.TOKEN_REFRESHED:
|
|
1348
|
+
this.accessToken = message.token;
|
|
1349
|
+
break;
|
|
1350
|
+
case MESSAGE_TYPES.ADDRESS_CHANGED:
|
|
1351
|
+
case MESSAGE_TYPES.ADDRESS_SELECTED:
|
|
1352
|
+
this.addressData = message.address;
|
|
1353
|
+
break;
|
|
1354
|
+
case MESSAGE_TYPES.PAYMENT_METHOD_SELECTED:
|
|
1355
|
+
this.paymentData = message.method;
|
|
1356
|
+
break;
|
|
1357
|
+
case MESSAGE_TYPES.LOGOUT_COMPLETE:
|
|
1358
|
+
this.accessToken = null;
|
|
1359
|
+
this.accountId = null;
|
|
1360
|
+
this.customerId = null;
|
|
1361
|
+
this.addressData = null;
|
|
1362
|
+
this.paymentData = null;
|
|
1363
|
+
break;
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1366
|
+
_setAddressData(data) {
|
|
1367
|
+
this.addressData = data;
|
|
1368
|
+
}
|
|
1369
|
+
_setPaymentData(data) {
|
|
1370
|
+
this.paymentData = data;
|
|
1371
|
+
}
|
|
1372
|
+
};
|
|
1373
|
+
var CimplifyElement = class {
|
|
1374
|
+
constructor(type, businessId, linkUrl, options, parent) {
|
|
1375
|
+
this.iframe = null;
|
|
1376
|
+
this.container = null;
|
|
1377
|
+
this.mounted = false;
|
|
1378
|
+
this.eventHandlers = /* @__PURE__ */ new Map();
|
|
1379
|
+
this.resolvers = /* @__PURE__ */ new Map();
|
|
1380
|
+
this.type = type;
|
|
1381
|
+
this.businessId = businessId;
|
|
1382
|
+
this.linkUrl = linkUrl;
|
|
1383
|
+
this.options = options;
|
|
1384
|
+
this.parent = parent;
|
|
1385
|
+
if (typeof window !== "undefined") {
|
|
1386
|
+
window.addEventListener("message", this.handleMessage.bind(this));
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
mount(container) {
|
|
1390
|
+
if (this.mounted) {
|
|
1391
|
+
console.warn(`Element ${this.type} is already mounted`);
|
|
1392
|
+
return;
|
|
1393
|
+
}
|
|
1394
|
+
const target = typeof container === "string" ? document.querySelector(container) : container;
|
|
1395
|
+
if (!target) {
|
|
1396
|
+
console.error(`Container not found: ${container}`);
|
|
1397
|
+
return;
|
|
1398
|
+
}
|
|
1399
|
+
this.container = target;
|
|
1400
|
+
this.createIframe();
|
|
1401
|
+
this.mounted = true;
|
|
1402
|
+
}
|
|
1403
|
+
destroy() {
|
|
1404
|
+
if (this.iframe) {
|
|
1405
|
+
this.iframe.remove();
|
|
1406
|
+
this.iframe = null;
|
|
1407
|
+
}
|
|
1408
|
+
this.container = null;
|
|
1409
|
+
this.mounted = false;
|
|
1410
|
+
this.eventHandlers.clear();
|
|
1411
|
+
if (typeof window !== "undefined") {
|
|
1412
|
+
window.removeEventListener("message", this.handleMessage.bind(this));
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
on(event, handler) {
|
|
1416
|
+
if (!this.eventHandlers.has(event)) {
|
|
1417
|
+
this.eventHandlers.set(event, /* @__PURE__ */ new Set());
|
|
1418
|
+
}
|
|
1419
|
+
this.eventHandlers.get(event).add(handler);
|
|
1420
|
+
}
|
|
1421
|
+
off(event, handler) {
|
|
1422
|
+
this.eventHandlers.get(event)?.delete(handler);
|
|
1423
|
+
}
|
|
1424
|
+
async getData() {
|
|
1425
|
+
return new Promise((resolve) => {
|
|
1426
|
+
const id = Math.random().toString(36).slice(2);
|
|
1427
|
+
this.resolvers.set(id, resolve);
|
|
1428
|
+
this.sendMessage({ type: MESSAGE_TYPES.GET_DATA });
|
|
1429
|
+
setTimeout(() => {
|
|
1430
|
+
if (this.resolvers.has(id)) {
|
|
1431
|
+
this.resolvers.delete(id);
|
|
1432
|
+
resolve(null);
|
|
1433
|
+
}
|
|
1434
|
+
}, 5e3);
|
|
1435
|
+
});
|
|
1436
|
+
}
|
|
1437
|
+
sendMessage(message) {
|
|
1438
|
+
if (this.iframe?.contentWindow) {
|
|
1439
|
+
this.iframe.contentWindow.postMessage(message, this.linkUrl);
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
createIframe() {
|
|
1443
|
+
if (!this.container) return;
|
|
1444
|
+
const iframe = document.createElement("iframe");
|
|
1445
|
+
const url = new URL(`${this.linkUrl}/elements/${this.type}`);
|
|
1446
|
+
url.searchParams.set("businessId", this.businessId);
|
|
1447
|
+
if (this.options.prefillEmail) url.searchParams.set("email", this.options.prefillEmail);
|
|
1448
|
+
if (this.options.mode) url.searchParams.set("mode", this.options.mode);
|
|
1449
|
+
iframe.src = url.toString();
|
|
1450
|
+
iframe.style.border = "none";
|
|
1451
|
+
iframe.style.width = "100%";
|
|
1452
|
+
iframe.style.display = "block";
|
|
1453
|
+
iframe.style.overflow = "hidden";
|
|
1454
|
+
iframe.setAttribute("allowtransparency", "true");
|
|
1455
|
+
iframe.setAttribute("frameborder", "0");
|
|
1456
|
+
iframe.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms allow-popups");
|
|
1457
|
+
this.iframe = iframe;
|
|
1458
|
+
this.container.appendChild(iframe);
|
|
1459
|
+
iframe.onload = () => {
|
|
1460
|
+
this.sendMessage({
|
|
1461
|
+
type: MESSAGE_TYPES.INIT,
|
|
1462
|
+
businessId: this.businessId,
|
|
1463
|
+
prefillEmail: this.options.prefillEmail
|
|
1464
|
+
});
|
|
1465
|
+
const token = this.parent.getAccessToken();
|
|
1466
|
+
if (token && this.type !== ELEMENT_TYPES.AUTH) {
|
|
1467
|
+
this.sendMessage({ type: MESSAGE_TYPES.SET_TOKEN, token });
|
|
1468
|
+
}
|
|
1469
|
+
};
|
|
1470
|
+
}
|
|
1471
|
+
handleMessage(event) {
|
|
1472
|
+
if (!event.origin.includes("cimplify.io") && !event.origin.includes("localhost")) {
|
|
1473
|
+
return;
|
|
1474
|
+
}
|
|
1475
|
+
const message = event.data;
|
|
1476
|
+
if (!message?.type) return;
|
|
1477
|
+
switch (message.type) {
|
|
1478
|
+
case MESSAGE_TYPES.READY:
|
|
1479
|
+
this.emit(EVENT_TYPES.READY, { height: message.height });
|
|
1480
|
+
break;
|
|
1481
|
+
case MESSAGE_TYPES.HEIGHT_CHANGE:
|
|
1482
|
+
if (this.iframe) this.iframe.style.height = `${message.height}px`;
|
|
1483
|
+
break;
|
|
1484
|
+
case MESSAGE_TYPES.AUTHENTICATED:
|
|
1485
|
+
this.emit(EVENT_TYPES.AUTHENTICATED, {
|
|
1486
|
+
accountId: message.accountId,
|
|
1487
|
+
customerId: message.customerId,
|
|
1488
|
+
token: message.token
|
|
1489
|
+
});
|
|
1490
|
+
break;
|
|
1491
|
+
case MESSAGE_TYPES.REQUIRES_OTP:
|
|
1492
|
+
this.emit(EVENT_TYPES.REQUIRES_OTP, { contactMasked: message.contactMasked });
|
|
1493
|
+
break;
|
|
1494
|
+
case MESSAGE_TYPES.ERROR:
|
|
1495
|
+
this.emit(EVENT_TYPES.ERROR, { code: message.code, message: message.message });
|
|
1496
|
+
break;
|
|
1497
|
+
case MESSAGE_TYPES.ADDRESS_CHANGED:
|
|
1498
|
+
case MESSAGE_TYPES.ADDRESS_SELECTED:
|
|
1499
|
+
this.parent._setAddressData(message.address);
|
|
1500
|
+
this.emit(EVENT_TYPES.CHANGE, { address: message.address });
|
|
1501
|
+
this.resolveData(message.address);
|
|
1502
|
+
break;
|
|
1503
|
+
case MESSAGE_TYPES.PAYMENT_METHOD_SELECTED:
|
|
1504
|
+
this.parent._setPaymentData(message.method);
|
|
1505
|
+
this.emit(EVENT_TYPES.CHANGE, { paymentMethod: message.method });
|
|
1506
|
+
this.resolveData(message.method);
|
|
1507
|
+
break;
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
emit(event, data) {
|
|
1511
|
+
this.eventHandlers.get(event)?.forEach((handler) => handler(data));
|
|
1512
|
+
}
|
|
1513
|
+
resolveData(data) {
|
|
1514
|
+
this.resolvers.forEach((resolve) => resolve(data));
|
|
1515
|
+
this.resolvers.clear();
|
|
1516
|
+
}
|
|
1517
|
+
};
|
|
1518
|
+
function createElements(client, businessId, options) {
|
|
1519
|
+
return new CimplifyElements(client, businessId, options);
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1222
1522
|
// src/client.ts
|
|
1223
1523
|
var SESSION_TOKEN_HEADER = "x-session-token";
|
|
1224
1524
|
var SESSION_STORAGE_KEY = "cimplify_session_token";
|
|
@@ -1630,6 +1930,23 @@ var CimplifyClient = class {
|
|
|
1630
1930
|
}
|
|
1631
1931
|
return this._lite;
|
|
1632
1932
|
}
|
|
1933
|
+
/**
|
|
1934
|
+
* Create a CimplifyElements instance for embedding checkout components.
|
|
1935
|
+
* Like Stripe's stripe.elements().
|
|
1936
|
+
*
|
|
1937
|
+
* @param businessId - The business ID for checkout context
|
|
1938
|
+
* @param options - Optional configuration for elements
|
|
1939
|
+
*
|
|
1940
|
+
* @example
|
|
1941
|
+
* ```ts
|
|
1942
|
+
* const elements = client.elements('bus_xxx');
|
|
1943
|
+
* const authElement = elements.create('auth');
|
|
1944
|
+
* authElement.mount('#auth-container');
|
|
1945
|
+
* ```
|
|
1946
|
+
*/
|
|
1947
|
+
elements(businessId, options) {
|
|
1948
|
+
return createElements(this, businessId, options);
|
|
1949
|
+
}
|
|
1633
1950
|
};
|
|
1634
1951
|
function createCimplifyClient(config) {
|
|
1635
1952
|
return new CimplifyClient(config);
|
|
@@ -2186,4 +2503,4 @@ function detectMobileMoneyProvider(phoneNumber) {
|
|
|
2186
2503
|
return null;
|
|
2187
2504
|
}
|
|
2188
2505
|
|
|
2189
|
-
export { AUTHORIZATION_TYPE, AUTH_MUTATION, AuthService, BusinessService, CHECKOUT_MODE, CHECKOUT_MUTATION, CHECKOUT_STEP, CURRENCY_SYMBOLS, CartOperations, CatalogueQueries, CheckoutService as CheckoutOperations, CheckoutService, CimplifyClient, CimplifyError, DEFAULT_COUNTRY, DEFAULT_CURRENCY, ErrorCode, InventoryService, LINK_MUTATION, LINK_QUERY, LinkService, LiteService, MOBILE_MONEY_PROVIDER, MOBILE_MONEY_PROVIDERS, ORDER_MUTATION, ORDER_TYPE, OrderQueries, PAYMENT_METHOD, PAYMENT_MUTATION, PAYMENT_STATE, PICKUP_TIME_TYPE, QueryBuilder, SchedulingService, categorizePaymentError, combine, combineObject, createCimplifyClient, detectMobileMoneyProvider, err, extractPriceInfo, flatMap, formatMoney, formatNumberCompact, formatPrice, formatPriceAdjustment, formatPriceCompact, formatProductPrice, fromPromise, generateIdempotencyKey, getBasePrice, getCurrencySymbol, getDiscountPercentage, getDisplayPrice, getMarkupPercentage, getOrElse, getProductCurrency, isCimplifyError, isErr, isOk, isOnSale, isRetryableError, mapError, mapResult, normalizePaymentResponse, normalizeStatusResponse, ok, parsePrice, parsePricePath, parsedPriceToPriceInfo, query, toNullable, tryCatch, unwrap };
|
|
2506
|
+
export { AUTHORIZATION_TYPE, AUTH_MUTATION, AuthService, BusinessService, CHECKOUT_MODE, CHECKOUT_MUTATION, CHECKOUT_STEP, CONTACT_TYPE, CURRENCY_SYMBOLS, CartOperations, CatalogueQueries, CheckoutService as CheckoutOperations, CheckoutService, CimplifyClient, CimplifyElement, CimplifyElements, CimplifyError, DEFAULT_COUNTRY, DEFAULT_CURRENCY, DEVICE_TYPE, ELEMENT_TYPES, EVENT_TYPES, ErrorCode, InventoryService, LINK_MUTATION, LINK_QUERY, LinkService, LiteService, MESSAGE_TYPES, MOBILE_MONEY_PROVIDER, MOBILE_MONEY_PROVIDERS, ORDER_MUTATION, ORDER_TYPE, OrderQueries, PAYMENT_METHOD, PAYMENT_MUTATION, PAYMENT_STATE, PICKUP_TIME_TYPE, QueryBuilder, SchedulingService, categorizePaymentError, combine, combineObject, createCimplifyClient, createElements, detectMobileMoneyProvider, err, extractPriceInfo, flatMap, formatMoney, formatNumberCompact, formatPrice, formatPriceAdjustment, formatPriceCompact, formatProductPrice, fromPromise, generateIdempotencyKey, getBasePrice, getCurrencySymbol, getDiscountPercentage, getDisplayPrice, getMarkupPercentage, getOrElse, getProductCurrency, isCimplifyError, isErr, isOk, isOnSale, isRetryableError, mapError, mapResult, normalizePaymentResponse, normalizeStatusResponse, ok, parsePrice, parsePricePath, parsedPriceToPriceInfo, query, toNullable, tryCatch, unwrap };
|
package/dist/react.d.mts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { r as CimplifyElements, C as CimplifyClient, v as ElementsOptions, eh as AuthenticatedData, ef as AddressInfo, eg as PaymentMethodInfo, ej as ElementsCheckoutResult } from './client-Ug3b8v1t.mjs';
|
|
2
|
+
import React, { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
declare function useElements(): CimplifyElements | null;
|
|
5
|
+
declare function useElementsReady(): boolean;
|
|
6
|
+
interface ElementsProviderProps {
|
|
7
|
+
client: CimplifyClient;
|
|
8
|
+
businessId: string;
|
|
9
|
+
options?: ElementsOptions;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
declare function ElementsProvider({ client, businessId, options, children, }: ElementsProviderProps): React.ReactElement;
|
|
13
|
+
interface BaseElementProps {
|
|
14
|
+
className?: string;
|
|
15
|
+
style?: React.CSSProperties;
|
|
16
|
+
onReady?: () => void;
|
|
17
|
+
onError?: (error: {
|
|
18
|
+
code: string;
|
|
19
|
+
message: string;
|
|
20
|
+
}) => void;
|
|
21
|
+
}
|
|
22
|
+
interface AuthElementProps extends BaseElementProps {
|
|
23
|
+
prefillEmail?: string;
|
|
24
|
+
onAuthenticated?: (data: AuthenticatedData) => void;
|
|
25
|
+
onRequiresOtp?: (data: {
|
|
26
|
+
contactMasked: string;
|
|
27
|
+
}) => void;
|
|
28
|
+
}
|
|
29
|
+
declare function AuthElement({ className, style, prefillEmail, onReady, onAuthenticated, onRequiresOtp, onError, }: AuthElementProps): React.ReactElement | null;
|
|
30
|
+
interface AddressElementProps extends BaseElementProps {
|
|
31
|
+
mode?: "shipping" | "billing";
|
|
32
|
+
onChange?: (data: {
|
|
33
|
+
address: AddressInfo;
|
|
34
|
+
saveToLink: boolean;
|
|
35
|
+
}) => void;
|
|
36
|
+
}
|
|
37
|
+
declare function AddressElement({ className, style, mode, onReady, onChange, onError, }: AddressElementProps): React.ReactElement | null;
|
|
38
|
+
interface PaymentElementProps extends BaseElementProps {
|
|
39
|
+
amount?: number;
|
|
40
|
+
currency?: string;
|
|
41
|
+
onChange?: (data: {
|
|
42
|
+
paymentMethod: PaymentMethodInfo;
|
|
43
|
+
saveToLink: boolean;
|
|
44
|
+
}) => void;
|
|
45
|
+
}
|
|
46
|
+
declare function PaymentElement({ className, style, amount, currency, onReady, onChange, onError, }: PaymentElementProps): React.ReactElement | null;
|
|
47
|
+
declare function useCheckout(): {
|
|
48
|
+
submit: (data: {
|
|
49
|
+
cart_id: string;
|
|
50
|
+
order_type?: "delivery" | "pickup" | "dine_in";
|
|
51
|
+
location_id?: string;
|
|
52
|
+
scheduled_time?: string;
|
|
53
|
+
tip_amount?: number;
|
|
54
|
+
notes?: string;
|
|
55
|
+
}) => Promise<ElementsCheckoutResult>;
|
|
56
|
+
isLoading: boolean;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export { AddressElement, AuthElement, ElementsProvider, PaymentElement, useCheckout, useElements, useElementsReady };
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { r as CimplifyElements, C as CimplifyClient, v as ElementsOptions, eh as AuthenticatedData, ef as AddressInfo, eg as PaymentMethodInfo, ej as ElementsCheckoutResult } from './client-Ug3b8v1t.js';
|
|
2
|
+
import React, { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
declare function useElements(): CimplifyElements | null;
|
|
5
|
+
declare function useElementsReady(): boolean;
|
|
6
|
+
interface ElementsProviderProps {
|
|
7
|
+
client: CimplifyClient;
|
|
8
|
+
businessId: string;
|
|
9
|
+
options?: ElementsOptions;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
declare function ElementsProvider({ client, businessId, options, children, }: ElementsProviderProps): React.ReactElement;
|
|
13
|
+
interface BaseElementProps {
|
|
14
|
+
className?: string;
|
|
15
|
+
style?: React.CSSProperties;
|
|
16
|
+
onReady?: () => void;
|
|
17
|
+
onError?: (error: {
|
|
18
|
+
code: string;
|
|
19
|
+
message: string;
|
|
20
|
+
}) => void;
|
|
21
|
+
}
|
|
22
|
+
interface AuthElementProps extends BaseElementProps {
|
|
23
|
+
prefillEmail?: string;
|
|
24
|
+
onAuthenticated?: (data: AuthenticatedData) => void;
|
|
25
|
+
onRequiresOtp?: (data: {
|
|
26
|
+
contactMasked: string;
|
|
27
|
+
}) => void;
|
|
28
|
+
}
|
|
29
|
+
declare function AuthElement({ className, style, prefillEmail, onReady, onAuthenticated, onRequiresOtp, onError, }: AuthElementProps): React.ReactElement | null;
|
|
30
|
+
interface AddressElementProps extends BaseElementProps {
|
|
31
|
+
mode?: "shipping" | "billing";
|
|
32
|
+
onChange?: (data: {
|
|
33
|
+
address: AddressInfo;
|
|
34
|
+
saveToLink: boolean;
|
|
35
|
+
}) => void;
|
|
36
|
+
}
|
|
37
|
+
declare function AddressElement({ className, style, mode, onReady, onChange, onError, }: AddressElementProps): React.ReactElement | null;
|
|
38
|
+
interface PaymentElementProps extends BaseElementProps {
|
|
39
|
+
amount?: number;
|
|
40
|
+
currency?: string;
|
|
41
|
+
onChange?: (data: {
|
|
42
|
+
paymentMethod: PaymentMethodInfo;
|
|
43
|
+
saveToLink: boolean;
|
|
44
|
+
}) => void;
|
|
45
|
+
}
|
|
46
|
+
declare function PaymentElement({ className, style, amount, currency, onReady, onChange, onError, }: PaymentElementProps): React.ReactElement | null;
|
|
47
|
+
declare function useCheckout(): {
|
|
48
|
+
submit: (data: {
|
|
49
|
+
cart_id: string;
|
|
50
|
+
order_type?: "delivery" | "pickup" | "dine_in";
|
|
51
|
+
location_id?: string;
|
|
52
|
+
scheduled_time?: string;
|
|
53
|
+
tip_amount?: number;
|
|
54
|
+
notes?: string;
|
|
55
|
+
}) => Promise<ElementsCheckoutResult>;
|
|
56
|
+
isLoading: boolean;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export { AddressElement, AuthElement, ElementsProvider, PaymentElement, useCheckout, useElements, useElementsReady };
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/react/index.tsx
|
|
7
|
+
|
|
8
|
+
// src/types/elements.ts
|
|
9
|
+
var ELEMENT_TYPES = {
|
|
10
|
+
AUTH: "auth",
|
|
11
|
+
ADDRESS: "address",
|
|
12
|
+
PAYMENT: "payment"
|
|
13
|
+
};
|
|
14
|
+
var EVENT_TYPES = {
|
|
15
|
+
READY: "ready",
|
|
16
|
+
AUTHENTICATED: "authenticated",
|
|
17
|
+
REQUIRES_OTP: "requires_otp",
|
|
18
|
+
ERROR: "error",
|
|
19
|
+
CHANGE: "change"};
|
|
20
|
+
var ElementsContext = react.createContext({
|
|
21
|
+
elements: null,
|
|
22
|
+
isReady: false
|
|
23
|
+
});
|
|
24
|
+
function useElements() {
|
|
25
|
+
return react.useContext(ElementsContext).elements;
|
|
26
|
+
}
|
|
27
|
+
function useElementsReady() {
|
|
28
|
+
return react.useContext(ElementsContext).isReady;
|
|
29
|
+
}
|
|
30
|
+
function ElementsProvider({
|
|
31
|
+
client,
|
|
32
|
+
businessId,
|
|
33
|
+
options,
|
|
34
|
+
children
|
|
35
|
+
}) {
|
|
36
|
+
const [elements, setElements] = react.useState(null);
|
|
37
|
+
const [isReady, setIsReady] = react.useState(false);
|
|
38
|
+
react.useEffect(() => {
|
|
39
|
+
const instance = client.elements(businessId, options);
|
|
40
|
+
setElements(instance);
|
|
41
|
+
setIsReady(true);
|
|
42
|
+
return () => instance.destroy();
|
|
43
|
+
}, [client, businessId, options]);
|
|
44
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ElementsContext.Provider, { value: { elements, isReady }, children });
|
|
45
|
+
}
|
|
46
|
+
function AuthElement({
|
|
47
|
+
className,
|
|
48
|
+
style,
|
|
49
|
+
prefillEmail,
|
|
50
|
+
onReady,
|
|
51
|
+
onAuthenticated,
|
|
52
|
+
onRequiresOtp,
|
|
53
|
+
onError
|
|
54
|
+
}) {
|
|
55
|
+
const containerRef = react.useRef(null);
|
|
56
|
+
const elementRef = react.useRef(null);
|
|
57
|
+
const elements = useElements();
|
|
58
|
+
react.useEffect(() => {
|
|
59
|
+
if (!elements || !containerRef.current) return;
|
|
60
|
+
const element = elements.create(ELEMENT_TYPES.AUTH, { prefillEmail });
|
|
61
|
+
elementRef.current = element;
|
|
62
|
+
element.on(EVENT_TYPES.READY, () => onReady?.());
|
|
63
|
+
element.on(EVENT_TYPES.AUTHENTICATED, (data) => onAuthenticated?.(data));
|
|
64
|
+
element.on(EVENT_TYPES.REQUIRES_OTP, (data) => onRequiresOtp?.(data));
|
|
65
|
+
element.on(EVENT_TYPES.ERROR, (data) => onError?.(data));
|
|
66
|
+
element.mount(containerRef.current);
|
|
67
|
+
return () => element.destroy();
|
|
68
|
+
}, [elements, prefillEmail, onReady, onAuthenticated, onRequiresOtp, onError]);
|
|
69
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className, style });
|
|
70
|
+
}
|
|
71
|
+
function AddressElement({
|
|
72
|
+
className,
|
|
73
|
+
style,
|
|
74
|
+
mode = "shipping",
|
|
75
|
+
onReady,
|
|
76
|
+
onChange,
|
|
77
|
+
onError
|
|
78
|
+
}) {
|
|
79
|
+
const containerRef = react.useRef(null);
|
|
80
|
+
const elementRef = react.useRef(null);
|
|
81
|
+
const elements = useElements();
|
|
82
|
+
react.useEffect(() => {
|
|
83
|
+
if (!elements || !containerRef.current) return;
|
|
84
|
+
const element = elements.create(ELEMENT_TYPES.ADDRESS, { mode });
|
|
85
|
+
elementRef.current = element;
|
|
86
|
+
element.on(EVENT_TYPES.READY, () => onReady?.());
|
|
87
|
+
element.on(EVENT_TYPES.CHANGE, (data) => onChange?.(data));
|
|
88
|
+
element.on(EVENT_TYPES.ERROR, (data) => onError?.(data));
|
|
89
|
+
element.mount(containerRef.current);
|
|
90
|
+
return () => element.destroy();
|
|
91
|
+
}, [elements, mode, onReady, onChange, onError]);
|
|
92
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className, style });
|
|
93
|
+
}
|
|
94
|
+
function PaymentElement({
|
|
95
|
+
className,
|
|
96
|
+
style,
|
|
97
|
+
amount,
|
|
98
|
+
currency,
|
|
99
|
+
onReady,
|
|
100
|
+
onChange,
|
|
101
|
+
onError
|
|
102
|
+
}) {
|
|
103
|
+
const containerRef = react.useRef(null);
|
|
104
|
+
const elementRef = react.useRef(null);
|
|
105
|
+
const elements = useElements();
|
|
106
|
+
react.useEffect(() => {
|
|
107
|
+
if (!elements || !containerRef.current) return;
|
|
108
|
+
const element = elements.create(ELEMENT_TYPES.PAYMENT, { amount, currency });
|
|
109
|
+
elementRef.current = element;
|
|
110
|
+
element.on(EVENT_TYPES.READY, () => onReady?.());
|
|
111
|
+
element.on(EVENT_TYPES.CHANGE, (data) => onChange?.(data));
|
|
112
|
+
element.on(EVENT_TYPES.ERROR, (data) => onError?.(data));
|
|
113
|
+
element.mount(containerRef.current);
|
|
114
|
+
return () => element.destroy();
|
|
115
|
+
}, [elements, amount, currency, onReady, onChange, onError]);
|
|
116
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className, style });
|
|
117
|
+
}
|
|
118
|
+
function useCheckout() {
|
|
119
|
+
const elements = useElements();
|
|
120
|
+
const [isLoading, setIsLoading] = react.useState(false);
|
|
121
|
+
const submit = react.useCallback(
|
|
122
|
+
async (data) => {
|
|
123
|
+
if (!elements) {
|
|
124
|
+
return { success: false, error: { code: "NO_ELEMENTS", message: "Elements not initialized" } };
|
|
125
|
+
}
|
|
126
|
+
setIsLoading(true);
|
|
127
|
+
try {
|
|
128
|
+
return await elements.submitCheckout(data);
|
|
129
|
+
} finally {
|
|
130
|
+
setIsLoading(false);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
[elements]
|
|
134
|
+
);
|
|
135
|
+
return { submit, isLoading };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
exports.AddressElement = AddressElement;
|
|
139
|
+
exports.AuthElement = AuthElement;
|
|
140
|
+
exports.ElementsProvider = ElementsProvider;
|
|
141
|
+
exports.PaymentElement = PaymentElement;
|
|
142
|
+
exports.useCheckout = useCheckout;
|
|
143
|
+
exports.useElements = useElements;
|
|
144
|
+
exports.useElementsReady = useElementsReady;
|