@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/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 };
@@ -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 };
@@ -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;