@cimplify/sdk 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -717,6 +717,105 @@ var CartOperations = class {
717
717
  }
718
718
  };
719
719
 
720
+ // src/constants.ts
721
+ var CHECKOUT_MODE = {
722
+ LINK: "link",
723
+ GUEST: "guest"
724
+ };
725
+ var ORDER_TYPE = {
726
+ DELIVERY: "delivery",
727
+ PICKUP: "pickup",
728
+ DINE_IN: "dine-in",
729
+ WALK_IN: "walk-in"
730
+ };
731
+ var PAYMENT_METHOD = {
732
+ MOBILE_MONEY: "mobile_money",
733
+ CARD: "card"
734
+ };
735
+ var CHECKOUT_STEP = {
736
+ AUTHENTICATION: "authentication",
737
+ ORDER_DETAILS: "order_details",
738
+ PAYMENT_METHOD: "payment_method",
739
+ PAYMENT: "payment",
740
+ CONFIRMATION: "confirmation"
741
+ };
742
+ var PAYMENT_STATE = {
743
+ INITIAL: "initial",
744
+ PREPARING: "preparing",
745
+ PROCESSING: "processing",
746
+ VERIFYING: "verifying",
747
+ AWAITING_AUTHORIZATION: "awaiting_authorization",
748
+ SUCCESS: "success",
749
+ ERROR: "error",
750
+ TIMEOUT: "timeout"
751
+ };
752
+ var PICKUP_TIME_TYPE = {
753
+ ASAP: "asap",
754
+ SCHEDULED: "scheduled"
755
+ };
756
+ var MOBILE_MONEY_PROVIDER = {
757
+ MTN: "mtn",
758
+ VODAFONE: "vodafone",
759
+ AIRTEL: "airtel"
760
+ };
761
+ var AUTHORIZATION_TYPE = {
762
+ OTP: "otp",
763
+ PIN: "pin",
764
+ PHONE: "phone",
765
+ BIRTHDAY: "birthday",
766
+ ADDRESS: "address"
767
+ };
768
+ var DEVICE_TYPE = {
769
+ MOBILE: "mobile",
770
+ DESKTOP: "desktop",
771
+ TABLET: "tablet"
772
+ };
773
+ var CONTACT_TYPE = {
774
+ PHONE: "phone",
775
+ EMAIL: "email"
776
+ };
777
+ var LINK_QUERY = {
778
+ DATA: "link.data",
779
+ ADDRESSES: "link.addresses",
780
+ MOBILE_MONEY: "link.mobile_money",
781
+ PREFERENCES: "link.preferences",
782
+ SESSIONS: "link.sessions"
783
+ };
784
+ var LINK_MUTATION = {
785
+ CHECK_STATUS: "link.check_status",
786
+ ENROLL: "link.enroll",
787
+ ENROLL_AND_LINK_ORDER: "link.enroll_and_link_order",
788
+ UPDATE_PREFERENCES: "link.update_preferences",
789
+ CREATE_ADDRESS: "link.create_address",
790
+ UPDATE_ADDRESS: "link.update_address",
791
+ DELETE_ADDRESS: "link.delete_address",
792
+ SET_DEFAULT_ADDRESS: "link.set_default_address",
793
+ TRACK_ADDRESS_USAGE: "link.track_address_usage",
794
+ CREATE_MOBILE_MONEY: "link.create_mobile_money",
795
+ DELETE_MOBILE_MONEY: "link.delete_mobile_money",
796
+ SET_DEFAULT_MOBILE_MONEY: "link.set_default_mobile_money",
797
+ TRACK_MOBILE_MONEY_USAGE: "link.track_mobile_money_usage",
798
+ VERIFY_MOBILE_MONEY: "link.verify_mobile_money",
799
+ REVOKE_SESSION: "link.revoke_session",
800
+ REVOKE_ALL_SESSIONS: "link.revoke_all_sessions"
801
+ };
802
+ var AUTH_MUTATION = {
803
+ REQUEST_OTP: "auth.request_otp",
804
+ VERIFY_OTP: "auth.verify_otp"
805
+ };
806
+ var CHECKOUT_MUTATION = {
807
+ PROCESS: "checkout.process"
808
+ };
809
+ var PAYMENT_MUTATION = {
810
+ SUBMIT_AUTHORIZATION: "payment.submit_authorization",
811
+ CHECK_STATUS: "order.poll_payment_status"
812
+ };
813
+ var ORDER_MUTATION = {
814
+ UPDATE_CUSTOMER: "order.update_order_customer"
815
+ };
816
+ var DEFAULT_CURRENCY = "GHS";
817
+ var DEFAULT_COUNTRY = "GHA";
818
+
720
819
  // src/utils/price.ts
721
820
  var CURRENCY_SYMBOLS = {
722
821
  // Major world currencies
@@ -1274,6 +1373,10 @@ async function openCardPopup(provider, checkoutResult, email, currency, signal)
1274
1373
  }
1275
1374
  return { success: false, error: "PROVIDER_UNAVAILABLE" };
1276
1375
  }
1376
+ var VALID_MOBILE_MONEY_PROVIDERS = new Set(Object.values(MOBILE_MONEY_PROVIDER));
1377
+ function isValidMobileMoneyProvider(value) {
1378
+ return VALID_MOBILE_MONEY_PROVIDERS.has(value);
1379
+ }
1277
1380
  function normalizeAuthorizationType(value) {
1278
1381
  return value === "otp" || value === "pin" ? value : void 0;
1279
1382
  }
@@ -1506,6 +1609,16 @@ var CheckoutResolver = class {
1506
1609
  }
1507
1610
  await this.wait(this.pollIntervalMs);
1508
1611
  }
1612
+ try {
1613
+ const finalResult = await this.client.checkout.pollPaymentStatus(input.orderId);
1614
+ if (finalResult.ok) {
1615
+ const normalized = normalizeStatusResponse(finalResult.value);
1616
+ if (normalized.paid || isPaymentStatusSuccess(normalized.status)) {
1617
+ return this.finalizeSuccess(latestCheckoutResult);
1618
+ }
1619
+ }
1620
+ } catch {
1621
+ }
1509
1622
  return this.fail(
1510
1623
  "PAYMENT_TIMEOUT",
1511
1624
  "Payment confirmation timed out. Please retry checkout.",
@@ -1636,7 +1749,7 @@ var CheckoutResolver = class {
1636
1749
  };
1637
1750
  }
1638
1751
  getEnrollmentMobileMoney() {
1639
- if (this.paymentData?.type === "mobile_money" && this.paymentData.phone_number && this.paymentData.provider) {
1752
+ if (this.paymentData?.type === "mobile_money" && this.paymentData.phone_number && this.paymentData.provider && isValidMobileMoneyProvider(this.paymentData.provider)) {
1640
1753
  return {
1641
1754
  phone_number: this.paymentData.phone_number,
1642
1755
  provider: this.paymentData.provider,
@@ -2591,6 +2704,7 @@ var MESSAGE_TYPES = {
2591
2704
  // Parent → Iframe
2592
2705
  INIT: "init",
2593
2706
  SET_TOKEN: "set_token",
2707
+ SET_CART: "set_cart",
2594
2708
  GET_DATA: "get_data",
2595
2709
  REFRESH_TOKEN: "refresh_token",
2596
2710
  LOGOUT: "logout",
@@ -2610,7 +2724,8 @@ var MESSAGE_TYPES = {
2610
2724
  CONTACT_PROVIDED: "contact_provided",
2611
2725
  CHECKOUT_STATUS: "checkout_status",
2612
2726
  CHECKOUT_COMPLETE: "checkout_complete",
2613
- ORDER_TYPE_CHANGED: "order_type_changed"
2727
+ ORDER_TYPE_CHANGED: "order_type_changed",
2728
+ REQUEST_SUBMIT: "request_submit"
2614
2729
  };
2615
2730
  var EVENT_TYPES = {
2616
2731
  READY: "ready",
@@ -2620,7 +2735,8 @@ var EVENT_TYPES = {
2620
2735
  CHANGE: "change",
2621
2736
  BLUR: "blur",
2622
2737
  FOCUS: "focus",
2623
- ORDER_TYPE_CHANGED: "order_type_changed"
2738
+ ORDER_TYPE_CHANGED: "order_type_changed",
2739
+ REQUEST_SUBMIT: "request_submit"
2624
2740
  };
2625
2741
 
2626
2742
  // src/elements.ts
@@ -2753,8 +2869,10 @@ var CimplifyElements = class {
2753
2869
  false
2754
2870
  );
2755
2871
  }
2872
+ this.checkoutInProgress = true;
2756
2873
  if (!options.cart_id) {
2757
2874
  console.debug("[cimplify:checkout] BLOCKED: no cart_id");
2875
+ this.checkoutInProgress = false;
2758
2876
  return toCheckoutError(
2759
2877
  "INVALID_CART",
2760
2878
  "A valid cart is required before checkout can start.",
@@ -2763,6 +2881,7 @@ var CimplifyElements = class {
2763
2881
  }
2764
2882
  if (!options.order_type) {
2765
2883
  console.debug("[cimplify:checkout] BLOCKED: no order_type");
2884
+ this.checkoutInProgress = false;
2766
2885
  return toCheckoutError(
2767
2886
  "ORDER_TYPE_REQUIRED",
2768
2887
  "Order type is required before checkout can start.",
@@ -2772,6 +2891,7 @@ var CimplifyElements = class {
2772
2891
  const checkoutElement = this.elements.get(ELEMENT_TYPES.CHECKOUT) || this.elements.get(ELEMENT_TYPES.PAYMENT);
2773
2892
  if (!checkoutElement) {
2774
2893
  console.debug("[cimplify:checkout] BLOCKED: no checkout element");
2894
+ this.checkoutInProgress = false;
2775
2895
  return toCheckoutError(
2776
2896
  "NO_PAYMENT_ELEMENT",
2777
2897
  "Checkout element must be mounted before checkout.",
@@ -2780,6 +2900,7 @@ var CimplifyElements = class {
2780
2900
  }
2781
2901
  if (!checkoutElement.isMounted()) {
2782
2902
  console.debug("[cimplify:checkout] BLOCKED: checkout element not mounted");
2903
+ this.checkoutInProgress = false;
2783
2904
  return toCheckoutError(
2784
2905
  "PAYMENT_NOT_MOUNTED",
2785
2906
  "Checkout element must be mounted before checkout.",
@@ -2791,6 +2912,7 @@ var CimplifyElements = class {
2791
2912
  const authElement = this.elements.get(ELEMENT_TYPES.AUTH);
2792
2913
  if (authElement && !this.accessToken) {
2793
2914
  console.debug("[cimplify:checkout] BLOCKED: auth incomplete");
2915
+ this.checkoutInProgress = false;
2794
2916
  return toCheckoutError(
2795
2917
  "AUTH_INCOMPLETE",
2796
2918
  "Authentication must complete before checkout can start.",
@@ -2828,7 +2950,6 @@ var CimplifyElements = class {
2828
2950
  };
2829
2951
  const timeoutMs = options.timeout_ms ?? 18e4;
2830
2952
  const paymentWindow = checkoutElement.getContentWindow();
2831
- this.checkoutInProgress = true;
2832
2953
  return new Promise((resolve) => {
2833
2954
  let settled = false;
2834
2955
  const cleanup = () => {
@@ -3123,6 +3244,9 @@ var CimplifyElement = class {
3123
3244
  this.sendMessage({ type: MESSAGE_TYPES.GET_DATA });
3124
3245
  });
3125
3246
  }
3247
+ setCart(cart) {
3248
+ this.sendMessage({ type: MESSAGE_TYPES.SET_CART, cart });
3249
+ }
3126
3250
  sendMessage(message) {
3127
3251
  if (this.iframe?.contentWindow) {
3128
3252
  this.iframe.contentWindow.postMessage(message, this.linkUrl);
@@ -3178,7 +3302,8 @@ var CimplifyElement = class {
3178
3302
  prefillEmail: this.options.prefillEmail,
3179
3303
  appearance: this.parent.getAppearance(),
3180
3304
  orderTypes: this.options.orderTypes,
3181
- defaultOrderType: this.options.defaultOrderType
3305
+ defaultOrderType: this.options.defaultOrderType,
3306
+ renderSubmitButton: true
3182
3307
  });
3183
3308
  const token = this.parent.getAccessToken();
3184
3309
  if (token && this.type !== ELEMENT_TYPES.AUTH) {
@@ -3245,6 +3370,9 @@ var CimplifyElement = class {
3245
3370
  case MESSAGE_TYPES.ORDER_TYPE_CHANGED:
3246
3371
  this.emit(EVENT_TYPES.ORDER_TYPE_CHANGED, { orderType: message.orderType });
3247
3372
  break;
3373
+ case MESSAGE_TYPES.REQUEST_SUBMIT:
3374
+ this.emit(EVENT_TYPES.REQUEST_SUBMIT, {});
3375
+ break;
3248
3376
  }
3249
3377
  }
3250
3378
  emit(event, data) {
@@ -3267,6 +3395,7 @@ var ACCESS_TOKEN_STORAGE_KEY = "cimplify_access_token";
3267
3395
  var SESSION_TOKEN_STORAGE_KEY = "cimplify_session_token";
3268
3396
  var ORDER_TOKEN_PREFIX = "cimplify_ot_";
3269
3397
  var SESSION_TOKEN_HEADER = "x-session-token";
3398
+ var ORDER_TOKEN_TTL_MS = 24 * 60 * 60 * 1e3;
3270
3399
  var DEFAULT_TIMEOUT_MS = 3e4;
3271
3400
  var DEFAULT_MAX_RETRIES = 3;
3272
3401
  var DEFAULT_RETRY_DELAY_MS = 1e3;
@@ -3416,12 +3545,27 @@ var CimplifyClient = class {
3416
3545
  }
3417
3546
  setOrderToken(orderId, token) {
3418
3547
  if (typeof window !== "undefined" && window.localStorage) {
3419
- localStorage.setItem(`${ORDER_TOKEN_PREFIX}${orderId}`, token);
3548
+ try {
3549
+ const entry = JSON.stringify({ token, storedAt: Date.now() });
3550
+ localStorage.setItem(`${ORDER_TOKEN_PREFIX}${orderId}`, entry);
3551
+ } catch {
3552
+ }
3420
3553
  }
3421
3554
  }
3422
3555
  getOrderToken(orderId) {
3423
3556
  if (typeof window !== "undefined" && window.localStorage) {
3424
- return localStorage.getItem(`${ORDER_TOKEN_PREFIX}${orderId}`);
3557
+ try {
3558
+ const raw = localStorage.getItem(`${ORDER_TOKEN_PREFIX}${orderId}`);
3559
+ if (!raw) return null;
3560
+ const entry = JSON.parse(raw);
3561
+ if (Date.now() - entry.storedAt > ORDER_TOKEN_TTL_MS) {
3562
+ localStorage.removeItem(`${ORDER_TOKEN_PREFIX}${orderId}`);
3563
+ return null;
3564
+ }
3565
+ return entry.token;
3566
+ } catch {
3567
+ return null;
3568
+ }
3425
3569
  }
3426
3570
  return null;
3427
3571
  }
@@ -3497,10 +3641,13 @@ var CimplifyClient = class {
3497
3641
  }
3498
3642
  saveAccessToken(token) {
3499
3643
  if (typeof window !== "undefined" && window.localStorage) {
3500
- if (token) {
3501
- localStorage.setItem(ACCESS_TOKEN_STORAGE_KEY, token);
3502
- } else {
3503
- localStorage.removeItem(ACCESS_TOKEN_STORAGE_KEY);
3644
+ try {
3645
+ if (token) {
3646
+ localStorage.setItem(ACCESS_TOKEN_STORAGE_KEY, token);
3647
+ } else {
3648
+ localStorage.removeItem(ACCESS_TOKEN_STORAGE_KEY);
3649
+ }
3650
+ } catch {
3504
3651
  }
3505
3652
  }
3506
3653
  }
@@ -3573,6 +3720,19 @@ var CimplifyClient = class {
3573
3720
  });
3574
3721
  return response;
3575
3722
  }
3723
+ if (response.status === 429 && attempt < this.maxRetries) {
3724
+ retryCount++;
3725
+ const retryAfter = response.headers.get("Retry-After");
3726
+ const delay = retryAfter ? Math.min(parseInt(retryAfter, 10) * 1e3, 3e4) || this.retryDelay * Math.pow(2, attempt) : this.retryDelay * Math.pow(2, attempt);
3727
+ this.hooks.onRetry?.({
3728
+ ...context,
3729
+ attempt: retryCount,
3730
+ delayMs: delay,
3731
+ error: new Error(`Rate limited: ${response.status}`)
3732
+ });
3733
+ await sleep(delay);
3734
+ continue;
3735
+ }
3576
3736
  if (response.status >= 400 && response.status < 500) {
3577
3737
  this.hooks.onRequestError?.({
3578
3738
  ...context,
@@ -3923,105 +4083,6 @@ function query(entity) {
3923
4083
  return new QueryBuilder(entity);
3924
4084
  }
3925
4085
 
3926
- // src/constants.ts
3927
- var CHECKOUT_MODE = {
3928
- LINK: "link",
3929
- GUEST: "guest"
3930
- };
3931
- var ORDER_TYPE = {
3932
- DELIVERY: "delivery",
3933
- PICKUP: "pickup",
3934
- DINE_IN: "dine-in",
3935
- WALK_IN: "walk-in"
3936
- };
3937
- var PAYMENT_METHOD = {
3938
- MOBILE_MONEY: "mobile_money",
3939
- CARD: "card"
3940
- };
3941
- var CHECKOUT_STEP = {
3942
- AUTHENTICATION: "authentication",
3943
- ORDER_DETAILS: "order_details",
3944
- PAYMENT_METHOD: "payment_method",
3945
- PAYMENT: "payment",
3946
- CONFIRMATION: "confirmation"
3947
- };
3948
- var PAYMENT_STATE = {
3949
- INITIAL: "initial",
3950
- PREPARING: "preparing",
3951
- PROCESSING: "processing",
3952
- VERIFYING: "verifying",
3953
- AWAITING_AUTHORIZATION: "awaiting_authorization",
3954
- SUCCESS: "success",
3955
- ERROR: "error",
3956
- TIMEOUT: "timeout"
3957
- };
3958
- var PICKUP_TIME_TYPE = {
3959
- ASAP: "asap",
3960
- SCHEDULED: "scheduled"
3961
- };
3962
- var MOBILE_MONEY_PROVIDER = {
3963
- MTN: "mtn",
3964
- VODAFONE: "vodafone",
3965
- AIRTEL: "airtel"
3966
- };
3967
- var AUTHORIZATION_TYPE = {
3968
- OTP: "otp",
3969
- PIN: "pin",
3970
- PHONE: "phone",
3971
- BIRTHDAY: "birthday",
3972
- ADDRESS: "address"
3973
- };
3974
- var DEVICE_TYPE = {
3975
- MOBILE: "mobile",
3976
- DESKTOP: "desktop",
3977
- TABLET: "tablet"
3978
- };
3979
- var CONTACT_TYPE = {
3980
- PHONE: "phone",
3981
- EMAIL: "email"
3982
- };
3983
- var LINK_QUERY = {
3984
- DATA: "link.data",
3985
- ADDRESSES: "link.addresses",
3986
- MOBILE_MONEY: "link.mobile_money",
3987
- PREFERENCES: "link.preferences",
3988
- SESSIONS: "link.sessions"
3989
- };
3990
- var LINK_MUTATION = {
3991
- CHECK_STATUS: "link.check_status",
3992
- ENROLL: "link.enroll",
3993
- ENROLL_AND_LINK_ORDER: "link.enroll_and_link_order",
3994
- UPDATE_PREFERENCES: "link.update_preferences",
3995
- CREATE_ADDRESS: "link.create_address",
3996
- UPDATE_ADDRESS: "link.update_address",
3997
- DELETE_ADDRESS: "link.delete_address",
3998
- SET_DEFAULT_ADDRESS: "link.set_default_address",
3999
- TRACK_ADDRESS_USAGE: "link.track_address_usage",
4000
- CREATE_MOBILE_MONEY: "link.create_mobile_money",
4001
- DELETE_MOBILE_MONEY: "link.delete_mobile_money",
4002
- SET_DEFAULT_MOBILE_MONEY: "link.set_default_mobile_money",
4003
- TRACK_MOBILE_MONEY_USAGE: "link.track_mobile_money_usage",
4004
- VERIFY_MOBILE_MONEY: "link.verify_mobile_money",
4005
- REVOKE_SESSION: "link.revoke_session",
4006
- REVOKE_ALL_SESSIONS: "link.revoke_all_sessions"
4007
- };
4008
- var AUTH_MUTATION = {
4009
- REQUEST_OTP: "auth.request_otp",
4010
- VERIFY_OTP: "auth.verify_otp"
4011
- };
4012
- var CHECKOUT_MUTATION = {
4013
- PROCESS: "checkout.process"
4014
- };
4015
- var PAYMENT_MUTATION = {
4016
- SUBMIT_AUTHORIZATION: "payment.submit_authorization",
4017
- CHECK_STATUS: "order.poll_payment_status"
4018
- };
4019
- var ORDER_MUTATION = {
4020
- UPDATE_CUSTOMER: "order.update_order_customer"
4021
- };
4022
- var DEFAULT_CURRENCY = "GHS";
4023
- var DEFAULT_COUNTRY = "GHA";
4024
-
4025
4086
  exports.AUTHORIZATION_TYPE = AUTHORIZATION_TYPE;
4026
4087
  exports.AUTH_MUTATION = AUTH_MUTATION;
4027
4088
  exports.AuthService = AuthService;