@reevit/react 0.4.2 → 0.4.4

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
@@ -138,8 +138,8 @@ function createPaymentError(response, errorData) {
138
138
  }
139
139
  var ReevitAPIClient = class {
140
140
  constructor(config) {
141
- this.publicKey = config.publicKey;
142
- this.baseUrl = config.baseUrl || (isSandboxKey(config.publicKey) ? API_BASE_URL_SANDBOX : API_BASE_URL_PRODUCTION);
141
+ this.publicKey = config.publicKey || "";
142
+ this.baseUrl = config.baseUrl || (config.publicKey && isSandboxKey(config.publicKey) ? API_BASE_URL_SANDBOX : API_BASE_URL_PRODUCTION);
143
143
  this.timeout = config.timeout || DEFAULT_TIMEOUT;
144
144
  }
145
145
  /**
@@ -150,10 +150,12 @@ var ReevitAPIClient = class {
150
150
  const timeoutId = setTimeout(() => controller.abort(), this.timeout);
151
151
  const headers = {
152
152
  "Content-Type": "application/json",
153
- "X-Reevit-Key": this.publicKey,
154
153
  "X-Reevit-Client": "@reevit/react",
155
154
  "X-Reevit-Client-Version": "0.3.2"
156
155
  };
156
+ if (this.publicKey) {
157
+ headers["X-Reevit-Key"] = this.publicKey;
158
+ }
157
159
  if (method === "POST" || method === "PATCH" || method === "PUT") {
158
160
  headers["Idempotency-Key"] = `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;
159
161
  }
@@ -260,8 +262,9 @@ var ReevitAPIClient = class {
260
262
  * @param paymentId - The payment intent ID for Hubtel checkout
261
263
  * @returns Hubtel session with token, merchant account, and expiry information
262
264
  */
263
- async createHubtelSession(paymentId) {
264
- return this.request("POST", `/v1/payments/hubtel/sessions/${paymentId}`);
265
+ async createHubtelSession(paymentId, clientSecret) {
266
+ const query = clientSecret ? `?client_secret=${encodeURIComponent(clientSecret)}` : "";
267
+ return this.request("POST", `/v1/payments/hubtel/sessions/${paymentId}${query}`);
265
268
  }
266
269
  /**
267
270
  * Maps SDK payment method to backend format
@@ -291,6 +294,18 @@ var initialState = {
291
294
  error: null,
292
295
  result: null
293
296
  };
297
+ var DEFAULT_PUBLIC_API_BASE_URL = "https://api.reevit.io";
298
+ function buildPaymentLinkError(response, data) {
299
+ return {
300
+ code: data?.code || "payment_link_error",
301
+ message: data?.message || "Payment link request failed",
302
+ recoverable: true,
303
+ details: {
304
+ httpStatus: response.status,
305
+ ...data?.details || {}
306
+ }
307
+ };
308
+ }
294
309
  function reevitReducer(state, action) {
295
310
  switch (action.type) {
296
311
  case "INIT_START":
@@ -414,15 +429,48 @@ function useReevit(options) {
414
429
  const reference = config.reference || generateReference();
415
430
  const country = detectCountryFromCurrency(config.currency);
416
431
  const paymentMethod = method || config.paymentMethods?.[0] || "card";
417
- const { data, error } = await apiClient.createPaymentIntent(
418
- { ...config, reference },
419
- paymentMethod,
420
- country,
421
- {
422
- preferredProviders: options2?.preferredProvider ? [options2.preferredProvider] : void 0,
423
- allowedProviders: options2?.allowedProviders
432
+ let data;
433
+ let error;
434
+ if (config.paymentLinkCode) {
435
+ const response = await fetch(
436
+ `${apiBaseUrl || DEFAULT_PUBLIC_API_BASE_URL}/v1/pay/${config.paymentLinkCode}/pay`,
437
+ {
438
+ method: "POST",
439
+ headers: {
440
+ "Content-Type": "application/json",
441
+ "Idempotency-Key": `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`
442
+ },
443
+ body: JSON.stringify({
444
+ amount: config.amount,
445
+ email: config.email || "",
446
+ name: config.customerName || "",
447
+ phone: config.phone || "",
448
+ method: paymentMethod,
449
+ country,
450
+ provider: options2?.preferredProvider || options2?.allowedProviders?.[0],
451
+ custom_fields: config.customFields
452
+ })
453
+ }
454
+ );
455
+ const responseData = await response.json().catch(() => ({}));
456
+ if (!response.ok) {
457
+ error = buildPaymentLinkError(response, responseData);
458
+ } else {
459
+ data = responseData;
424
460
  }
425
- );
461
+ } else {
462
+ const result = await apiClient.createPaymentIntent(
463
+ { ...config, reference },
464
+ paymentMethod,
465
+ country,
466
+ {
467
+ preferredProviders: options2?.preferredProvider ? [options2.preferredProvider] : void 0,
468
+ allowedProviders: options2?.allowedProviders
469
+ }
470
+ );
471
+ data = result.data;
472
+ error = result.error;
473
+ }
426
474
  if (error) {
427
475
  dispatch({ type: "INIT_ERROR", payload: error });
428
476
  onError?.(error);
@@ -587,14 +635,6 @@ function detectCountryFromCurrency(currency) {
587
635
  };
588
636
  return currencyToCountry[currency.toUpperCase()] || "GH";
589
637
  }
590
- var pspNames = {
591
- hubtel: "Hubtel",
592
- paystack: "Paystack",
593
- flutterwave: "Flutterwave",
594
- monnify: "Monnify",
595
- mpesa: "M-Pesa",
596
- stripe: "Stripe"
597
- };
598
638
  var methodConfig = {
599
639
  card: {
600
640
  label: "Card",
@@ -617,28 +657,31 @@ function PaymentMethodSelector({
617
657
  selectedMethod,
618
658
  onSelect,
619
659
  disabled = false,
620
- provider
660
+ provider,
661
+ layout = "list",
662
+ showLabel = true
621
663
  }) {
622
664
  const getMethodLabel = (method, psp) => {
623
665
  const config = methodConfig[method];
624
- if (psp?.toLowerCase().includes("hubtel") && method === "mobile_money") {
625
- return `Pay with ${pspNames[psp.toLowerCase()] || "Hubtel"}`;
626
- }
627
666
  return config.label;
628
667
  };
629
668
  const getMethodDescription = (method, psp) => {
630
669
  const config = methodConfig[method];
631
670
  if (psp?.toLowerCase().includes("hubtel")) {
632
- return "Card, Mobile Money, and Bank Transfer";
671
+ return config.description;
633
672
  }
634
673
  return config.description;
635
674
  };
636
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-method-selector", children: [
637
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-method-selector__label", children: "Select payment method" }),
638
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-method-selector__options", children: methods.map((method) => {
675
+ const isGrid = layout === "grid";
676
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("reevit-method-selector", isGrid && "reevit-method-selector--grid"), children: [
677
+ showLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-method-selector__label", children: "Select payment method" }),
678
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(
679
+ "reevit-method-selector__options",
680
+ isGrid ? "reevit-method-selector__options--grid" : "reevit-method-selector__options--list"
681
+ ), children: methods.map((method, index) => {
639
682
  const config = methodConfig[method];
640
683
  const isSelected = selectedMethod === method;
641
- const methodLabel = getMethodLabel(method, provider);
684
+ const methodLabel = getMethodLabel(method);
642
685
  const methodDescription = getMethodDescription(method, provider);
643
686
  return /* @__PURE__ */ jsxRuntime.jsxs(
644
687
  "button",
@@ -646,28 +689,24 @@ function PaymentMethodSelector({
646
689
  type: "button",
647
690
  className: cn(
648
691
  "reevit-method-option",
692
+ isGrid ? "reevit-method-option--grid" : "reevit-method-option--list",
649
693
  isSelected && "reevit-method-option--selected",
650
694
  disabled && "reevit-method-option--disabled"
651
695
  ),
696
+ style: {
697
+ animationDelay: `${index * 0.05}s`
698
+ },
652
699
  onClick: () => onSelect(method),
653
700
  disabled,
654
701
  "aria-pressed": isSelected,
655
702
  children: [
656
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__icon", children: config.icon }),
703
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__icon-wrapper", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__icon", children: config.icon }) }),
657
704
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-method-option__content", children: [
658
705
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__label", children: methodLabel }),
659
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__description", children: methodDescription })
706
+ !isGrid && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__description", children: methodDescription })
660
707
  ] }),
661
- isSelected && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__check", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
662
- "path",
663
- {
664
- d: "M16.667 5L7.5 14.167 3.333 10",
665
- stroke: "currentColor",
666
- strokeWidth: "2",
667
- strokeLinecap: "round",
668
- strokeLinejoin: "round"
669
- }
670
- ) }) })
708
+ !isGrid && isSelected && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__check", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" }) }) }),
709
+ !isGrid && !isSelected && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-method-option__chevron", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "9 18 15 12 9 6" }) }) })
671
710
  ]
672
711
  },
673
712
  method
@@ -684,7 +723,8 @@ function MobileMoneyForm({
684
723
  onSubmit,
685
724
  onCancel,
686
725
  isLoading = false,
687
- initialPhone = ""
726
+ initialPhone = "",
727
+ hideCancel = false
688
728
  }) {
689
729
  const [phone, setPhone] = react.useState(initialPhone);
690
730
  const [network, setNetwork] = react.useState(null);
@@ -769,7 +809,7 @@ function MobileMoneyForm({
769
809
  )) })
770
810
  ] }),
771
811
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-momo-form__actions", children: [
772
- /* @__PURE__ */ jsxRuntime.jsx(
812
+ !hideCancel && /* @__PURE__ */ jsxRuntime.jsx(
773
813
  "button",
774
814
  {
775
815
  type: "button",
@@ -811,11 +851,11 @@ var paystack_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMOCA
811
851
  // src/assets/providers/stripe.png
812
852
  var stripe_default = "data:image/png;base64,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";
813
853
  var providerMeta = {
814
- paystack: { logo: paystack_default, hint: "Card & MoMo" },
854
+ paystack: { logo: paystack_default, hint: "Card & Mobile Money" },
815
855
  stripe: { logo: stripe_default, hint: "Card payments" },
816
856
  flutterwave: { logo: flutterwave_default, hint: "Global methods" },
817
- hubtel: { logo: hubtel_default, hint: "Mobile money" },
818
- monnify: { logo: monnify_default, hint: "Bank & card" },
857
+ hubtel: { logo: hubtel_default, hint: "Mobile Money & Card" },
858
+ monnify: { logo: monnify_default, hint: "Bank & Card" },
819
859
  mpesa: { logo: mpesa_default, hint: "M-Pesa" }
820
860
  };
821
861
  var methodLabels = {
@@ -825,54 +865,100 @@ var methodLabels = {
825
865
  };
826
866
  function formatMethods(methods) {
827
867
  if (!methods.length) return "Payment methods";
828
- return methods.map((method) => methodLabels[method]).join(" \u2022 ");
868
+ return methods.map((method) => methodLabels[method]).join(", ");
869
+ }
870
+ function sanitizeMethods(providerId, methods) {
871
+ if (providerId.toLowerCase().includes("hubtel")) {
872
+ return methods.filter((method) => method === "card" || method === "mobile_money");
873
+ }
874
+ return methods;
829
875
  }
830
876
  function ProviderSelector({
831
877
  providers,
832
878
  selectedProvider,
833
879
  onSelect,
834
- disabled = false
880
+ disabled = false,
881
+ theme,
882
+ selectedMethod,
883
+ onMethodSelect,
884
+ renderMethodContent
835
885
  }) {
886
+ const useBorder = theme?.pspSelectorUseBorder ?? false;
887
+ const bgColor = theme?.pspSelectorBgColor || "#0a0a0a";
888
+ const textColor = theme?.pspSelectorTextColor || "#ffffff";
889
+ const borderColor = theme?.pspSelectorBorderColor || "#374151";
890
+ const getOptionStyle = (isSelected) => {
891
+ if (useBorder) {
892
+ return {
893
+ backgroundColor: "transparent",
894
+ border: `2px solid ${isSelected ? borderColor : "#374151"}`,
895
+ color: isSelected ? textColor : "var(--reevit-text)"
896
+ };
897
+ }
898
+ return {
899
+ backgroundColor: isSelected ? bgColor : "transparent",
900
+ border: `2px solid ${isSelected ? bgColor : "#374151"}`,
901
+ color: isSelected ? textColor : "var(--reevit-text)"
902
+ };
903
+ };
836
904
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-psp-selector", children: [
837
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-psp-selector__label", children: "Choose your payment provider" }),
905
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-psp-selector__label", children: "Select payment provider" }),
838
906
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-psp-selector__options", children: providers.map((provider) => {
839
907
  const meta = providerMeta[provider.provider] || {
840
908
  logo: void 0,
841
909
  hint: "Payment methods"
842
910
  };
911
+ const providerMethods = sanitizeMethods(provider.provider, provider.methods);
843
912
  const isSelected = selectedProvider === provider.provider;
844
913
  const fallbackInitial = provider.name.slice(0, 1).toUpperCase();
845
- return /* @__PURE__ */ jsxRuntime.jsxs(
846
- "button",
847
- {
848
- type: "button",
849
- className: cn(
850
- "reevit-psp-option",
851
- isSelected && "reevit-psp-option--selected",
852
- disabled && "reevit-psp-option--disabled"
853
- ),
854
- onClick: () => onSelect(provider.provider),
855
- disabled,
856
- "aria-pressed": isSelected,
857
- children: [
858
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__logo", "aria-hidden": "true", children: meta.logo ? /* @__PURE__ */ jsxRuntime.jsx(
859
- "img",
860
- {
861
- src: meta.logo,
862
- alt: "",
863
- className: "reevit-psp-option__logo-img",
864
- loading: "lazy"
865
- }
866
- ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__logo-fallback", children: fallbackInitial }) }),
867
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-psp-option__content", children: [
868
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__name", children: provider.name }),
869
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__methods", children: formatMethods(provider.methods) || meta.hint })
870
- ] }),
871
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__check", "aria-hidden": "true", children: isSelected ? "Selected" : "Select" })
872
- ]
873
- },
874
- provider.provider
875
- );
914
+ const optionStyle = getOptionStyle(isSelected);
915
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-psp-accordion", children: [
916
+ /* @__PURE__ */ jsxRuntime.jsxs(
917
+ "button",
918
+ {
919
+ type: "button",
920
+ className: cn(
921
+ "reevit-psp-option",
922
+ isSelected && "reevit-psp-option--selected",
923
+ disabled && "reevit-psp-option--disabled"
924
+ ),
925
+ style: optionStyle,
926
+ onClick: () => onSelect(provider.provider),
927
+ disabled,
928
+ "aria-expanded": isSelected,
929
+ children: [
930
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__logo", "aria-hidden": "true", children: meta.logo ? /* @__PURE__ */ jsxRuntime.jsx(
931
+ "img",
932
+ {
933
+ src: meta.logo,
934
+ alt: "",
935
+ className: "reevit-psp-option__logo-img",
936
+ loading: "lazy"
937
+ }
938
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__logo-fallback", children: fallbackInitial }) }),
939
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-psp-option__content", children: [
940
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__name", children: provider.name }),
941
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-psp-option__methods", children: formatMethods(providerMethods) || meta.hint })
942
+ ] })
943
+ ]
944
+ }
945
+ ),
946
+ isSelected && onMethodSelect && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-psp-accordion__content", children: [
947
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-psp-methods", children: /* @__PURE__ */ jsxRuntime.jsx(
948
+ PaymentMethodSelector,
949
+ {
950
+ methods: providerMethods,
951
+ selectedMethod: selectedMethod || null,
952
+ onSelect: onMethodSelect,
953
+ disabled,
954
+ provider: provider.provider,
955
+ layout: "list",
956
+ showLabel: false
957
+ }
958
+ ) }),
959
+ selectedMethod && renderMethodContent && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-psp-accordion__method-content", children: renderMethodContent(provider.provider, selectedMethod) })
960
+ ] })
961
+ ] }, provider.provider);
876
962
  }) })
877
963
  ] });
878
964
  }
@@ -1004,8 +1090,11 @@ function HubtelBridge({
1004
1090
  phone,
1005
1091
  description = "Payment",
1006
1092
  callbackUrl,
1093
+ apiBaseUrl,
1094
+ clientSecret,
1007
1095
  hubtelSessionToken,
1008
1096
  basicAuth,
1097
+ preferredMethod,
1009
1098
  onSuccess,
1010
1099
  onError,
1011
1100
  onClose,
@@ -1015,13 +1104,17 @@ function HubtelBridge({
1015
1104
  const checkoutRef = react.useRef(null);
1016
1105
  const [authValue, setAuthValue] = react.useState("");
1017
1106
  const [isLoading, setIsLoading] = react.useState(false);
1107
+ const [resolvedMerchantAccount, setResolvedMerchantAccount] = react.useState(merchantAccount);
1108
+ react.useEffect(() => {
1109
+ setResolvedMerchantAccount(merchantAccount);
1110
+ }, [merchantAccount]);
1018
1111
  react.useEffect(() => {
1019
1112
  const fetchAuth = async () => {
1020
1113
  if (hubtelSessionToken) {
1021
1114
  setIsLoading(true);
1022
1115
  try {
1023
- const client = createReevitClient({ publicKey });
1024
- const { data, error } = await client.createHubtelSession(paymentId);
1116
+ const client = createReevitClient({ publicKey, baseUrl: apiBaseUrl });
1117
+ const { data, error } = await client.createHubtelSession(paymentId, clientSecret);
1025
1118
  if (error) {
1026
1119
  onError({
1027
1120
  code: "SESSION_ERROR",
@@ -1032,6 +1125,9 @@ function HubtelBridge({
1032
1125
  }
1033
1126
  if (data) {
1034
1127
  setAuthValue(data.token);
1128
+ if (data.merchantAccount) {
1129
+ setResolvedMerchantAccount(data.merchantAccount);
1130
+ }
1035
1131
  }
1036
1132
  } catch (err) {
1037
1133
  onError({
@@ -1048,7 +1144,7 @@ function HubtelBridge({
1048
1144
  }
1049
1145
  };
1050
1146
  fetchAuth();
1051
- }, [paymentId, publicKey, hubtelSessionToken, basicAuth, onError]);
1147
+ }, [paymentId, publicKey, apiBaseUrl, clientSecret, hubtelSessionToken, basicAuth, onError]);
1052
1148
  const startPayment = react.useCallback(async () => {
1053
1149
  if (isLoading || !authValue) {
1054
1150
  return;
@@ -1056,20 +1152,23 @@ function HubtelBridge({
1056
1152
  try {
1057
1153
  const checkout = new CheckoutSdk__default.default();
1058
1154
  checkoutRef.current = checkout;
1155
+ const methodPreference = preferredMethod === "mobile_money" ? "momo" : preferredMethod === "card" ? "card" : void 0;
1059
1156
  const purchaseInfo = {
1060
1157
  amount: amount / 100,
1061
1158
  // Convert from minor to major units
1062
1159
  purchaseDescription: description,
1063
1160
  customerPhoneNumber: phone || "",
1064
- clientReference: reference || `hubtel_${Date.now()}`
1161
+ clientReference: reference || `hubtel_${Date.now()}`,
1162
+ ...methodPreference ? { paymentMethod: methodPreference } : {}
1065
1163
  };
1066
1164
  const config = {
1067
1165
  branding: "enabled",
1068
1166
  callbackUrl: callbackUrl || window.location.href,
1069
- merchantAccount: typeof merchantAccount === "string" ? parseInt(merchantAccount, 10) : merchantAccount,
1167
+ merchantAccount: typeof resolvedMerchantAccount === "string" ? parseInt(resolvedMerchantAccount, 10) : resolvedMerchantAccount,
1070
1168
  // Use session token or basicAuth for authentication
1071
1169
  // Session tokens are base64-encoded credentials fetched securely from the server
1072
- basicAuth: authValue || ""
1170
+ basicAuth: authValue || "",
1171
+ ...methodPreference ? { paymentMethod: methodPreference } : {}
1073
1172
  };
1074
1173
  checkout.openModal({
1075
1174
  purchaseInfo,
@@ -1113,7 +1212,7 @@ function HubtelBridge({
1113
1212
  };
1114
1213
  onError(error);
1115
1214
  }
1116
- }, [merchantAccount, amount, reference, phone, description, callbackUrl, authValue, isLoading, onSuccess, onError, onClose]);
1215
+ }, [merchantAccount, amount, reference, phone, description, callbackUrl, authValue, isLoading, preferredMethod, onSuccess, onError, onClose]);
1117
1216
  react.useEffect(() => {
1118
1217
  if (autoStart && !initialized.current && !isLoading && authValue) {
1119
1218
  initialized.current = true;
@@ -1127,17 +1226,20 @@ function HubtelBridge({
1127
1226
  }
1128
1227
  function openHubtelPopup(config) {
1129
1228
  const checkout = new CheckoutSdk__default.default();
1229
+ const methodPreference = config.preferredMethod === "mobile_money" ? "momo" : config.preferredMethod === "card" ? "card" : void 0;
1130
1230
  const purchaseInfo = {
1131
1231
  amount: config.amount,
1132
1232
  purchaseDescription: config.description,
1133
1233
  customerPhoneNumber: config.customerPhoneNumber || "",
1134
- clientReference: config.clientReference || `hubtel_${Date.now()}`
1234
+ clientReference: config.clientReference || `hubtel_${Date.now()}`,
1235
+ ...methodPreference ? { paymentMethod: methodPreference } : {}
1135
1236
  };
1136
1237
  const checkoutConfig = {
1137
1238
  branding: "enabled",
1138
1239
  callbackUrl: config.callbackUrl || window.location.href,
1139
1240
  merchantAccount: typeof config.merchantAccount === "string" ? parseInt(config.merchantAccount, 10) : config.merchantAccount,
1140
- basicAuth: config.basicAuth || ""
1241
+ basicAuth: config.basicAuth || "",
1242
+ ...methodPreference ? { paymentMethod: methodPreference } : {}
1141
1243
  };
1142
1244
  checkout.openModal({
1143
1245
  purchaseInfo,
@@ -1830,6 +1932,14 @@ function useReevitContext() {
1830
1932
  }
1831
1933
  return context;
1832
1934
  }
1935
+ var pspNames = {
1936
+ hubtel: "Hubtel",
1937
+ paystack: "Paystack",
1938
+ flutterwave: "Flutterwave",
1939
+ monnify: "Monnify",
1940
+ mpesa: "M-Pesa",
1941
+ stripe: "Stripe"
1942
+ };
1833
1943
  function ReevitCheckout({
1834
1944
  // Config
1835
1945
  publicKey,
@@ -1837,8 +1947,11 @@ function ReevitCheckout({
1837
1947
  currency,
1838
1948
  email = "",
1839
1949
  phone = "",
1950
+ customerName,
1840
1951
  reference,
1841
1952
  metadata,
1953
+ customFields,
1954
+ paymentLinkCode,
1842
1955
  paymentMethods = ["card", "mobile_money"],
1843
1956
  initialPaymentIntent,
1844
1957
  // Callbacks
@@ -1889,8 +2002,11 @@ function ReevitCheckout({
1889
2002
  currency,
1890
2003
  email,
1891
2004
  phone,
2005
+ customerName,
1892
2006
  reference,
1893
2007
  metadata,
2008
+ customFields,
2009
+ paymentLinkCode,
1894
2010
  paymentMethods,
1895
2011
  initialPaymentIntent
1896
2012
  },
@@ -1918,7 +2034,8 @@ function ReevitCheckout({
1918
2034
  const options = available.length > 0 ? available : fallbackProvider;
1919
2035
  return options.map((provider) => {
1920
2036
  const methods = provider.methods && provider.methods.length > 0 ? provider.methods : paymentMethods;
1921
- const filteredMethods = methods.filter((method) => paymentMethods.includes(method));
2037
+ const sanitizedMethods = provider.provider.toLowerCase().includes("hubtel") ? methods.filter((method) => method === "card" || method === "mobile_money") : methods;
2038
+ const filteredMethods = sanitizedMethods.filter((method) => paymentMethods.includes(method));
1922
2039
  return {
1923
2040
  ...provider,
1924
2041
  methods: filteredMethods
@@ -1939,10 +2056,10 @@ function ReevitCheckout({
1939
2056
  if (selectedProvider && providerOptions.some((provider) => provider.provider === selectedProvider)) {
1940
2057
  return;
1941
2058
  }
1942
- const recommended = paymentIntent?.recommendedPsp;
1943
- const resolved = providerOptions.find((provider) => provider.provider === recommended)?.provider || providerOptions[0].provider;
1944
- setSelectedProvider(resolved);
1945
- }, [paymentIntent?.recommendedPsp, providerOptions, selectedProvider]);
2059
+ if (providerOptions.length === 1) {
2060
+ setSelectedProvider(providerOptions[0].provider);
2061
+ }
2062
+ }, [providerOptions, selectedProvider]);
1946
2063
  react.useEffect(() => {
1947
2064
  if (!activeProvider || !selectedMethod) {
1948
2065
  return;
@@ -1953,13 +2070,17 @@ function ReevitCheckout({
1953
2070
  }, [activeProvider, selectedMethod, selectMethod]);
1954
2071
  react.useEffect(() => {
1955
2072
  if (isOpen && selectedMethod && paymentIntent && !showPSPBridge) {
2073
+ const psp = (selectedProvider || paymentIntent.recommendedPsp || "paystack").toLowerCase();
2074
+ const needsPhone = psp.includes("mpesa");
1956
2075
  if (selectedMethod === "card") {
1957
2076
  setShowPSPBridge(true);
1958
- } else if (selectedMethod === "mobile_money" && (momoData?.phone || phone)) {
1959
- setShowPSPBridge(true);
2077
+ } else if (selectedMethod === "mobile_money") {
2078
+ if (!needsPhone || (momoData?.phone || phone)) {
2079
+ setShowPSPBridge(true);
2080
+ }
1960
2081
  }
1961
2082
  }
1962
- }, [isOpen, selectedMethod, showPSPBridge, paymentIntent, momoData, phone]);
2083
+ }, [isOpen, selectedMethod, showPSPBridge, paymentIntent, momoData, phone, selectedProvider]);
1963
2084
  const handleOpen = react.useCallback(() => {
1964
2085
  if (controlledIsOpen !== void 0) return;
1965
2086
  setIsOpen(true);
@@ -1983,6 +2104,10 @@ function ReevitCheckout({
1983
2104
  const handleProviderSelect = react.useCallback(
1984
2105
  (provider) => {
1985
2106
  if (provider === selectedProvider) {
2107
+ setSelectedProvider(null);
2108
+ reset();
2109
+ setShowPSPBridge(false);
2110
+ setMomoData(null);
1986
2111
  return;
1987
2112
  }
1988
2113
  const providerMethods = providerOptions.find((option) => option.provider === provider)?.methods || paymentMethods;
@@ -1999,8 +2124,14 @@ function ReevitCheckout({
1999
2124
  if (!selectedMethod) return;
2000
2125
  if (selectedMethod === "card") {
2001
2126
  setShowPSPBridge(true);
2127
+ } else if (selectedMethod === "mobile_money") {
2128
+ const psp = (selectedProvider || paymentIntent?.recommendedPsp || "paystack").toLowerCase();
2129
+ const needsPhone = psp.includes("mpesa");
2130
+ if (!needsPhone || (momoData?.phone || phone)) {
2131
+ setShowPSPBridge(true);
2132
+ }
2002
2133
  }
2003
- }, [selectedMethod]);
2134
+ }, [selectedMethod, selectedProvider, paymentIntent, momoData, phone]);
2004
2135
  const handleMomoSubmit = react.useCallback(
2005
2136
  (data) => {
2006
2137
  setMomoData(data);
@@ -2057,13 +2188,13 @@ function ReevitCheckout({
2057
2188
  ] }) : null;
2058
2189
  const renderContent = () => {
2059
2190
  if (status === "loading" || status === "processing") {
2060
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-loading", children: [
2191
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-loading reevit-animate-fade-in", children: [
2061
2192
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-spinner" }),
2062
2193
  /* @__PURE__ */ jsxRuntime.jsx("p", { children: status === "loading" ? "Preparing checkout..." : "Processing payment..." })
2063
2194
  ] });
2064
2195
  }
2065
2196
  if (status === "success" && result) {
2066
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-success", children: [
2197
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-success reevit-animate-scale-in", children: [
2067
2198
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-success__icon", children: "\u2713" }),
2068
2199
  /* @__PURE__ */ jsxRuntime.jsx("h3", { children: "Payment Successful" }),
2069
2200
  /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
@@ -2073,7 +2204,7 @@ function ReevitCheckout({
2073
2204
  ] });
2074
2205
  }
2075
2206
  if (status === "failed" && error && !error.recoverable) {
2076
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-error", children: [
2207
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-error reevit-animate-fade-in", children: [
2077
2208
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-error__icon", children: "\u2715" }),
2078
2209
  /* @__PURE__ */ jsxRuntime.jsx("h3", { children: "Payment Failed" }),
2079
2210
  /* @__PURE__ */ jsxRuntime.jsx("p", { children: error.message }),
@@ -2081,17 +2212,16 @@ function ReevitCheckout({
2081
2212
  ] });
2082
2213
  }
2083
2214
  const psp = selectedProvider || paymentIntent?.recommendedPsp || "paystack";
2215
+ const pspLower = psp.toLowerCase();
2084
2216
  if (showPSPBridge) {
2085
- const pspKey = paymentIntent?.pspPublicKey || publicKey;
2217
+ const pspKey = paymentIntent?.pspPublicKey || publicKey || "";
2086
2218
  const bridgeMetadata = {
2087
2219
  ...metadata,
2088
- // Override with correct payment intent ID for webhook routing
2089
- // This ensures webhook includes the correct ID to find the payment
2090
2220
  payment_id: paymentIntent?.id,
2091
2221
  connection_id: paymentIntent?.connectionId ?? metadata?.connection_id,
2092
2222
  customer_phone: momoData?.phone || phone
2093
2223
  };
2094
- switch (psp) {
2224
+ switch (pspLower) {
2095
2225
  case "paystack":
2096
2226
  return /* @__PURE__ */ jsxRuntime.jsx(
2097
2227
  PaystackBridge,
@@ -2124,6 +2254,9 @@ function ReevitCheckout({
2124
2254
  phone: momoData?.phone || phone,
2125
2255
  description: `Payment ${paymentIntent?.reference || reference || ""}`,
2126
2256
  hubtelSessionToken: paymentIntent?.id ? paymentIntent.id : void 0,
2257
+ clientSecret: paymentIntent?.clientSecret,
2258
+ apiBaseUrl,
2259
+ preferredMethod: selectedMethod || void 0,
2127
2260
  onSuccess: handlePSPSuccess,
2128
2261
  onError: (err) => handlePSPError(err),
2129
2262
  onClose: handlePSPClose
@@ -2141,7 +2274,7 @@ function ReevitCheckout({
2141
2274
  phone: momoData?.phone || phone,
2142
2275
  metadata: bridgeMetadata,
2143
2276
  onSuccess: handlePSPSuccess,
2144
- onError: (err) => handlePSPError(err),
2277
+ onError: handlePSPError,
2145
2278
  onClose: handlePSPClose
2146
2279
  }
2147
2280
  );
@@ -2158,21 +2291,8 @@ function ReevitCheckout({
2158
2291
  customerEmail: email,
2159
2292
  customerPhone: momoData?.phone || phone,
2160
2293
  metadata: bridgeMetadata,
2161
- onSuccess: (result2) => handlePSPSuccess({
2162
- paymentId: result2.transactionReference,
2163
- reference: result2.paymentReference,
2164
- amount: result2.amount,
2165
- currency: paymentIntent?.currency ?? currency,
2166
- paymentMethod: selectedMethod || "card",
2167
- psp: "monnify",
2168
- pspReference: result2.transactionReference,
2169
- status: "success"
2170
- }),
2171
- onError: (err) => handlePSPError({
2172
- code: err.code,
2173
- message: err.message,
2174
- recoverable: true
2175
- }),
2294
+ onSuccess: (res) => handlePSPSuccess({ ...res, psp: "monnify" }),
2295
+ onError: handlePSPError,
2176
2296
  onClose: handlePSPClose
2177
2297
  }
2178
2298
  );
@@ -2186,22 +2306,9 @@ function ReevitCheckout({
2186
2306
  currency: paymentIntent?.currency ?? currency,
2187
2307
  reference: paymentIntent?.reference || reference || `mpesa_${Date.now()}`,
2188
2308
  description: `Payment ${paymentIntent?.reference || reference || ""}`,
2189
- headers: { "x-reevit-public-key": publicKey },
2190
- onSuccess: (result2) => handlePSPSuccess({
2191
- paymentId: result2.transactionId,
2192
- reference: result2.reference,
2193
- amount: paymentIntent?.amount ?? amount,
2194
- currency: paymentIntent?.currency ?? currency,
2195
- paymentMethod: "mobile_money",
2196
- psp: "mpesa",
2197
- pspReference: result2.transactionId,
2198
- status: "success"
2199
- }),
2200
- onError: (err) => handlePSPError({
2201
- code: err.code,
2202
- message: err.message,
2203
- recoverable: true
2204
- })
2309
+ headers: { "x-reevit-public-key": publicKey || "" },
2310
+ onSuccess: handlePSPSuccess,
2311
+ onError: handlePSPError
2205
2312
  }
2206
2313
  );
2207
2314
  case "stripe":
@@ -2212,58 +2319,60 @@ function ReevitCheckout({
2212
2319
  clientSecret: paymentIntent?.clientSecret || "",
2213
2320
  amount: paymentIntent?.amount ?? amount,
2214
2321
  currency: paymentIntent?.currency ?? currency,
2215
- onSuccess: (result2) => handlePSPSuccess({
2216
- paymentId: result2.paymentIntentId,
2217
- reference: paymentIntent?.reference || reference || result2.paymentIntentId,
2218
- amount: paymentIntent?.amount ?? amount,
2219
- currency: paymentIntent?.currency ?? currency,
2220
- paymentMethod: selectedMethod || "card",
2221
- psp: "stripe",
2222
- pspReference: result2.paymentIntentId,
2223
- status: result2.status === "succeeded" ? "success" : "pending"
2224
- }),
2225
- onError: (err) => handlePSPError({
2226
- code: err.code,
2227
- message: err.message,
2228
- recoverable: true
2229
- }),
2322
+ onSuccess: handlePSPSuccess,
2323
+ onError: handlePSPError,
2230
2324
  onCancel: handlePSPClose
2231
2325
  }
2232
2326
  );
2233
2327
  default:
2234
2328
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-error", children: [
2235
2329
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-error__icon", children: "\u26A0\uFE0F" }),
2236
- /* @__PURE__ */ jsxRuntime.jsx("h3", { children: "Payment Provider Not Supported" }),
2330
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { children: "Provider Not Supported" }),
2237
2331
  /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
2238
- "The selected payment provider (",
2332
+ "Provider (",
2239
2333
  psp,
2240
- ") is not currently supported in this checkout."
2334
+ ") is not supported."
2241
2335
  ] }),
2242
2336
  /* @__PURE__ */ jsxRuntime.jsx("button", { className: "reevit-btn reevit-btn--primary", onClick: handleBack, children: "Go Back" })
2243
2337
  ] });
2244
2338
  }
2245
2339
  }
2246
- if (selectedMethod === "mobile_money" && !showPSPBridge) {
2247
- return /* @__PURE__ */ jsxRuntime.jsx(
2248
- MobileMoneyForm,
2249
- {
2250
- onSubmit: handleMomoSubmit,
2251
- onCancel: handleBack,
2252
- isLoading,
2253
- initialPhone: phone
2340
+ const renderMethodContent = (provider, method) => {
2341
+ const pspLower2 = provider.toLowerCase();
2342
+ const needsPhone = pspLower2.includes("mpesa");
2343
+ if (method === "card") {
2344
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-inline-action reevit-animate-fade-in", children: [
2345
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "reevit-inline-action__hint", children: "You'll be redirected to complete your card payment securely." }),
2346
+ /* @__PURE__ */ jsxRuntime.jsx("button", { className: "reevit-btn reevit-btn--primary", onClick: handleContinue, disabled: isLoading, children: "Pay with Card" })
2347
+ ] });
2348
+ }
2349
+ if (method === "mobile_money") {
2350
+ if (needsPhone && !phone) {
2351
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-inline-action reevit-animate-fade-in", children: /* @__PURE__ */ jsxRuntime.jsx(MobileMoneyForm, { onSubmit: handleMomoSubmit, onCancel: handleBack, isLoading, initialPhone: phone, hideCancel: true }) });
2254
2352
  }
2255
- );
2256
- }
2257
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-method-step", children: [
2258
- providerOptions.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(
2353
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-inline-action reevit-animate-fade-in", children: [
2354
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "reevit-inline-action__hint", children: pspLower2.includes("hubtel") ? "Opens the Hubtel checkout with Mobile Money selected." : `Continue to pay securely with Mobile Money via ${pspNames[pspLower2] || pspLower2.charAt(0).toUpperCase() + pspLower2.slice(1)}.` }),
2355
+ /* @__PURE__ */ jsxRuntime.jsx("button", { className: "reevit-btn reevit-btn--primary", onClick: handleContinue, disabled: isLoading, children: pspLower2.includes("hubtel") ? "Continue with Hubtel" : "Pay with Mobile Money" })
2356
+ ] });
2357
+ }
2358
+ return null;
2359
+ };
2360
+ if (providerOptions.length > 1) {
2361
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-method-step reevit-animate-slide-up", children: /* @__PURE__ */ jsxRuntime.jsx(
2259
2362
  ProviderSelector,
2260
2363
  {
2261
2364
  providers: providerOptions,
2262
2365
  selectedProvider,
2263
2366
  onSelect: handleProviderSelect,
2264
- disabled: isLoading
2367
+ disabled: isLoading,
2368
+ theme: resolvedTheme,
2369
+ selectedMethod,
2370
+ onMethodSelect: handleMethodSelect,
2371
+ renderMethodContent
2265
2372
  }
2266
- ),
2373
+ ) });
2374
+ }
2375
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-method-step reevit-animate-slide-up", children: [
2267
2376
  /* @__PURE__ */ jsxRuntime.jsx(
2268
2377
  PaymentMethodSelector,
2269
2378
  {
@@ -2271,21 +2380,26 @@ function ReevitCheckout({
2271
2380
  selectedMethod,
2272
2381
  onSelect: handleMethodSelect,
2273
2382
  disabled: isLoading,
2274
- provider: activeProvider?.provider || psp
2383
+ provider: psp,
2384
+ layout: "list",
2385
+ showLabel: false
2275
2386
  }
2276
2387
  ),
2277
- selectedMethod && selectedMethod !== "mobile_money" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-method-step__actions", children: /* @__PURE__ */ jsxRuntime.jsx(
2278
- "button",
2279
- {
2280
- className: "reevit-btn reevit-btn--primary",
2281
- onClick: handleContinue,
2282
- disabled: isLoading,
2283
- children: "Continue"
2284
- }
2285
- ) })
2388
+ selectedMethod && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-method-step__actions reevit-animate-slide-up", children: selectedMethod === "mobile_money" && pspLower.includes("mpesa") && !phone ? /* @__PURE__ */ jsxRuntime.jsx(MobileMoneyForm, { onSubmit: handleMomoSubmit, onCancel: () => selectMethod(null), isLoading, initialPhone: phone }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-card-info reevit-animate-fade-in", children: [
2389
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "reevit-info-text", children: selectedMethod === "card" ? "You will be redirected to complete your card payment securely." : pspLower.includes("hubtel") ? "Opens the Hubtel checkout with Mobile Money selected." : `Continue to pay securely via ${pspNames[pspLower] || pspLower.charAt(0).toUpperCase() + pspLower.slice(1)}.` }),
2390
+ /* @__PURE__ */ jsxRuntime.jsx(
2391
+ "button",
2392
+ {
2393
+ className: "reevit-btn reevit-btn--primary",
2394
+ onClick: handleContinue,
2395
+ disabled: isLoading,
2396
+ children: selectedMethod === "card" ? "Pay with Card" : pspLower.includes("hubtel") ? "Continue with Hubtel" : "Pay with Mobile Money"
2397
+ }
2398
+ )
2399
+ ] }) })
2286
2400
  ] });
2287
2401
  };
2288
- return /* @__PURE__ */ jsxRuntime.jsxs(ReevitContext.Provider, { value: { publicKey, amount, currency }, children: [
2402
+ return /* @__PURE__ */ jsxRuntime.jsxs(ReevitContext.Provider, { value: { publicKey: publicKey || "", amount, currency }, children: [
2289
2403
  trigger,
2290
2404
  isOpen && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-overlay", onClick: handleClose, children: /* @__PURE__ */ jsxRuntime.jsxs(
2291
2405
  "div",
@@ -2298,23 +2412,8 @@ function ReevitCheckout({
2298
2412
  "aria-modal": "true",
2299
2413
  children: [
2300
2414
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-modal__header", children: [
2301
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-modal__branding", children: /* @__PURE__ */ jsxRuntime.jsx(
2302
- "img",
2303
- {
2304
- src: "https://i.imgur.com/bzUR5Lm.png",
2305
- alt: "Reevit",
2306
- className: "reevit-modal__logo"
2307
- }
2308
- ) }),
2309
- /* @__PURE__ */ jsxRuntime.jsx(
2310
- "button",
2311
- {
2312
- className: "reevit-modal__close",
2313
- onClick: handleClose,
2314
- "aria-label": "Close",
2315
- children: "\u2715"
2316
- }
2317
- )
2415
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "reevit-modal__branding", children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: resolvedTheme?.logoUrl || "https://i.imgur.com/bzUR5Lm.png", alt: "Checkout", className: "reevit-modal__logo" }) }),
2416
+ /* @__PURE__ */ jsxRuntime.jsx("button", { className: "reevit-modal__close", onClick: handleClose, "aria-label": "Close", children: "\u2715" })
2318
2417
  ] }),
2319
2418
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "reevit-modal__amount", children: [
2320
2419
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "reevit-modal__amount-label", children: "Amount" }),