Package not found. Please check the package name and try again.
@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.d.mts +33 -10
- package/dist/index.d.ts +33 -10
- package/dist/index.js +297 -198
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +297 -198
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +268 -69
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -132,8 +132,8 @@ function createPaymentError(response, errorData) {
|
|
|
132
132
|
}
|
|
133
133
|
var ReevitAPIClient = class {
|
|
134
134
|
constructor(config) {
|
|
135
|
-
this.publicKey = config.publicKey;
|
|
136
|
-
this.baseUrl = config.baseUrl || (isSandboxKey(config.publicKey) ? API_BASE_URL_SANDBOX : API_BASE_URL_PRODUCTION);
|
|
135
|
+
this.publicKey = config.publicKey || "";
|
|
136
|
+
this.baseUrl = config.baseUrl || (config.publicKey && isSandboxKey(config.publicKey) ? API_BASE_URL_SANDBOX : API_BASE_URL_PRODUCTION);
|
|
137
137
|
this.timeout = config.timeout || DEFAULT_TIMEOUT;
|
|
138
138
|
}
|
|
139
139
|
/**
|
|
@@ -144,10 +144,12 @@ var ReevitAPIClient = class {
|
|
|
144
144
|
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
145
145
|
const headers = {
|
|
146
146
|
"Content-Type": "application/json",
|
|
147
|
-
"X-Reevit-Key": this.publicKey,
|
|
148
147
|
"X-Reevit-Client": "@reevit/react",
|
|
149
148
|
"X-Reevit-Client-Version": "0.3.2"
|
|
150
149
|
};
|
|
150
|
+
if (this.publicKey) {
|
|
151
|
+
headers["X-Reevit-Key"] = this.publicKey;
|
|
152
|
+
}
|
|
151
153
|
if (method === "POST" || method === "PATCH" || method === "PUT") {
|
|
152
154
|
headers["Idempotency-Key"] = `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;
|
|
153
155
|
}
|
|
@@ -254,8 +256,9 @@ var ReevitAPIClient = class {
|
|
|
254
256
|
* @param paymentId - The payment intent ID for Hubtel checkout
|
|
255
257
|
* @returns Hubtel session with token, merchant account, and expiry information
|
|
256
258
|
*/
|
|
257
|
-
async createHubtelSession(paymentId) {
|
|
258
|
-
|
|
259
|
+
async createHubtelSession(paymentId, clientSecret) {
|
|
260
|
+
const query = clientSecret ? `?client_secret=${encodeURIComponent(clientSecret)}` : "";
|
|
261
|
+
return this.request("POST", `/v1/payments/hubtel/sessions/${paymentId}${query}`);
|
|
259
262
|
}
|
|
260
263
|
/**
|
|
261
264
|
* Maps SDK payment method to backend format
|
|
@@ -285,6 +288,18 @@ var initialState = {
|
|
|
285
288
|
error: null,
|
|
286
289
|
result: null
|
|
287
290
|
};
|
|
291
|
+
var DEFAULT_PUBLIC_API_BASE_URL = "https://api.reevit.io";
|
|
292
|
+
function buildPaymentLinkError(response, data) {
|
|
293
|
+
return {
|
|
294
|
+
code: data?.code || "payment_link_error",
|
|
295
|
+
message: data?.message || "Payment link request failed",
|
|
296
|
+
recoverable: true,
|
|
297
|
+
details: {
|
|
298
|
+
httpStatus: response.status,
|
|
299
|
+
...data?.details || {}
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
}
|
|
288
303
|
function reevitReducer(state, action) {
|
|
289
304
|
switch (action.type) {
|
|
290
305
|
case "INIT_START":
|
|
@@ -408,15 +423,48 @@ function useReevit(options) {
|
|
|
408
423
|
const reference = config.reference || generateReference();
|
|
409
424
|
const country = detectCountryFromCurrency(config.currency);
|
|
410
425
|
const paymentMethod = method || config.paymentMethods?.[0] || "card";
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
426
|
+
let data;
|
|
427
|
+
let error;
|
|
428
|
+
if (config.paymentLinkCode) {
|
|
429
|
+
const response = await fetch(
|
|
430
|
+
`${apiBaseUrl || DEFAULT_PUBLIC_API_BASE_URL}/v1/pay/${config.paymentLinkCode}/pay`,
|
|
431
|
+
{
|
|
432
|
+
method: "POST",
|
|
433
|
+
headers: {
|
|
434
|
+
"Content-Type": "application/json",
|
|
435
|
+
"Idempotency-Key": `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`
|
|
436
|
+
},
|
|
437
|
+
body: JSON.stringify({
|
|
438
|
+
amount: config.amount,
|
|
439
|
+
email: config.email || "",
|
|
440
|
+
name: config.customerName || "",
|
|
441
|
+
phone: config.phone || "",
|
|
442
|
+
method: paymentMethod,
|
|
443
|
+
country,
|
|
444
|
+
provider: options2?.preferredProvider || options2?.allowedProviders?.[0],
|
|
445
|
+
custom_fields: config.customFields
|
|
446
|
+
})
|
|
447
|
+
}
|
|
448
|
+
);
|
|
449
|
+
const responseData = await response.json().catch(() => ({}));
|
|
450
|
+
if (!response.ok) {
|
|
451
|
+
error = buildPaymentLinkError(response, responseData);
|
|
452
|
+
} else {
|
|
453
|
+
data = responseData;
|
|
418
454
|
}
|
|
419
|
-
|
|
455
|
+
} else {
|
|
456
|
+
const result = await apiClient.createPaymentIntent(
|
|
457
|
+
{ ...config, reference },
|
|
458
|
+
paymentMethod,
|
|
459
|
+
country,
|
|
460
|
+
{
|
|
461
|
+
preferredProviders: options2?.preferredProvider ? [options2.preferredProvider] : void 0,
|
|
462
|
+
allowedProviders: options2?.allowedProviders
|
|
463
|
+
}
|
|
464
|
+
);
|
|
465
|
+
data = result.data;
|
|
466
|
+
error = result.error;
|
|
467
|
+
}
|
|
420
468
|
if (error) {
|
|
421
469
|
dispatch({ type: "INIT_ERROR", payload: error });
|
|
422
470
|
onError?.(error);
|
|
@@ -581,14 +629,6 @@ function detectCountryFromCurrency(currency) {
|
|
|
581
629
|
};
|
|
582
630
|
return currencyToCountry[currency.toUpperCase()] || "GH";
|
|
583
631
|
}
|
|
584
|
-
var pspNames = {
|
|
585
|
-
hubtel: "Hubtel",
|
|
586
|
-
paystack: "Paystack",
|
|
587
|
-
flutterwave: "Flutterwave",
|
|
588
|
-
monnify: "Monnify",
|
|
589
|
-
mpesa: "M-Pesa",
|
|
590
|
-
stripe: "Stripe"
|
|
591
|
-
};
|
|
592
632
|
var methodConfig = {
|
|
593
633
|
card: {
|
|
594
634
|
label: "Card",
|
|
@@ -611,28 +651,31 @@ function PaymentMethodSelector({
|
|
|
611
651
|
selectedMethod,
|
|
612
652
|
onSelect,
|
|
613
653
|
disabled = false,
|
|
614
|
-
provider
|
|
654
|
+
provider,
|
|
655
|
+
layout = "list",
|
|
656
|
+
showLabel = true
|
|
615
657
|
}) {
|
|
616
658
|
const getMethodLabel = (method, psp) => {
|
|
617
659
|
const config = methodConfig[method];
|
|
618
|
-
if (psp?.toLowerCase().includes("hubtel") && method === "mobile_money") {
|
|
619
|
-
return `Pay with ${pspNames[psp.toLowerCase()] || "Hubtel"}`;
|
|
620
|
-
}
|
|
621
660
|
return config.label;
|
|
622
661
|
};
|
|
623
662
|
const getMethodDescription = (method, psp) => {
|
|
624
663
|
const config = methodConfig[method];
|
|
625
664
|
if (psp?.toLowerCase().includes("hubtel")) {
|
|
626
|
-
return
|
|
665
|
+
return config.description;
|
|
627
666
|
}
|
|
628
667
|
return config.description;
|
|
629
668
|
};
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
/* @__PURE__ */ jsx("div", { className: "reevit-method-
|
|
669
|
+
const isGrid = layout === "grid";
|
|
670
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("reevit-method-selector", isGrid && "reevit-method-selector--grid"), children: [
|
|
671
|
+
showLabel && /* @__PURE__ */ jsx("div", { className: "reevit-method-selector__label", children: "Select payment method" }),
|
|
672
|
+
/* @__PURE__ */ jsx("div", { className: cn(
|
|
673
|
+
"reevit-method-selector__options",
|
|
674
|
+
isGrid ? "reevit-method-selector__options--grid" : "reevit-method-selector__options--list"
|
|
675
|
+
), children: methods.map((method, index) => {
|
|
633
676
|
const config = methodConfig[method];
|
|
634
677
|
const isSelected = selectedMethod === method;
|
|
635
|
-
const methodLabel = getMethodLabel(method
|
|
678
|
+
const methodLabel = getMethodLabel(method);
|
|
636
679
|
const methodDescription = getMethodDescription(method, provider);
|
|
637
680
|
return /* @__PURE__ */ jsxs(
|
|
638
681
|
"button",
|
|
@@ -640,28 +683,24 @@ function PaymentMethodSelector({
|
|
|
640
683
|
type: "button",
|
|
641
684
|
className: cn(
|
|
642
685
|
"reevit-method-option",
|
|
686
|
+
isGrid ? "reevit-method-option--grid" : "reevit-method-option--list",
|
|
643
687
|
isSelected && "reevit-method-option--selected",
|
|
644
688
|
disabled && "reevit-method-option--disabled"
|
|
645
689
|
),
|
|
690
|
+
style: {
|
|
691
|
+
animationDelay: `${index * 0.05}s`
|
|
692
|
+
},
|
|
646
693
|
onClick: () => onSelect(method),
|
|
647
694
|
disabled,
|
|
648
695
|
"aria-pressed": isSelected,
|
|
649
696
|
children: [
|
|
650
|
-
/* @__PURE__ */ jsx("span", { className: "reevit-method-option__icon", children: config.icon }),
|
|
697
|
+
/* @__PURE__ */ jsx("span", { className: "reevit-method-option__icon-wrapper", children: /* @__PURE__ */ jsx("span", { className: "reevit-method-option__icon", children: config.icon }) }),
|
|
651
698
|
/* @__PURE__ */ jsxs("div", { className: "reevit-method-option__content", children: [
|
|
652
699
|
/* @__PURE__ */ jsx("span", { className: "reevit-method-option__label", children: methodLabel }),
|
|
653
|
-
/* @__PURE__ */ jsx("span", { className: "reevit-method-option__description", children: methodDescription })
|
|
700
|
+
!isGrid && /* @__PURE__ */ jsx("span", { className: "reevit-method-option__description", children: methodDescription })
|
|
654
701
|
] }),
|
|
655
|
-
isSelected && /* @__PURE__ */ jsx("span", { className: "reevit-method-option__check", children: /* @__PURE__ */ jsx("svg", { width: "20", height: "20", viewBox: "0 0
|
|
656
|
-
|
|
657
|
-
{
|
|
658
|
-
d: "M16.667 5L7.5 14.167 3.333 10",
|
|
659
|
-
stroke: "currentColor",
|
|
660
|
-
strokeWidth: "2",
|
|
661
|
-
strokeLinecap: "round",
|
|
662
|
-
strokeLinejoin: "round"
|
|
663
|
-
}
|
|
664
|
-
) }) })
|
|
702
|
+
!isGrid && isSelected && /* @__PURE__ */ jsx("span", { className: "reevit-method-option__check", children: /* @__PURE__ */ jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" }) }) }),
|
|
703
|
+
!isGrid && !isSelected && /* @__PURE__ */ jsx("span", { className: "reevit-method-option__chevron", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "9 18 15 12 9 6" }) }) })
|
|
665
704
|
]
|
|
666
705
|
},
|
|
667
706
|
method
|
|
@@ -678,7 +717,8 @@ function MobileMoneyForm({
|
|
|
678
717
|
onSubmit,
|
|
679
718
|
onCancel,
|
|
680
719
|
isLoading = false,
|
|
681
|
-
initialPhone = ""
|
|
720
|
+
initialPhone = "",
|
|
721
|
+
hideCancel = false
|
|
682
722
|
}) {
|
|
683
723
|
const [phone, setPhone] = useState(initialPhone);
|
|
684
724
|
const [network, setNetwork] = useState(null);
|
|
@@ -763,7 +803,7 @@ function MobileMoneyForm({
|
|
|
763
803
|
)) })
|
|
764
804
|
] }),
|
|
765
805
|
/* @__PURE__ */ jsxs("div", { className: "reevit-momo-form__actions", children: [
|
|
766
|
-
/* @__PURE__ */ jsx(
|
|
806
|
+
!hideCancel && /* @__PURE__ */ jsx(
|
|
767
807
|
"button",
|
|
768
808
|
{
|
|
769
809
|
type: "button",
|
|
@@ -805,11 +845,11 @@ var paystack_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMOCA
|
|
|
805
845
|
// src/assets/providers/stripe.png
|
|
806
846
|
var stripe_default = "data:image/png;base64,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";
|
|
807
847
|
var providerMeta = {
|
|
808
|
-
paystack: { logo: paystack_default, hint: "Card &
|
|
848
|
+
paystack: { logo: paystack_default, hint: "Card & Mobile Money" },
|
|
809
849
|
stripe: { logo: stripe_default, hint: "Card payments" },
|
|
810
850
|
flutterwave: { logo: flutterwave_default, hint: "Global methods" },
|
|
811
|
-
hubtel: { logo: hubtel_default, hint: "Mobile
|
|
812
|
-
monnify: { logo: monnify_default, hint: "Bank &
|
|
851
|
+
hubtel: { logo: hubtel_default, hint: "Mobile Money & Card" },
|
|
852
|
+
monnify: { logo: monnify_default, hint: "Bank & Card" },
|
|
813
853
|
mpesa: { logo: mpesa_default, hint: "M-Pesa" }
|
|
814
854
|
};
|
|
815
855
|
var methodLabels = {
|
|
@@ -819,54 +859,100 @@ var methodLabels = {
|
|
|
819
859
|
};
|
|
820
860
|
function formatMethods(methods) {
|
|
821
861
|
if (!methods.length) return "Payment methods";
|
|
822
|
-
return methods.map((method) => methodLabels[method]).join("
|
|
862
|
+
return methods.map((method) => methodLabels[method]).join(", ");
|
|
863
|
+
}
|
|
864
|
+
function sanitizeMethods(providerId, methods) {
|
|
865
|
+
if (providerId.toLowerCase().includes("hubtel")) {
|
|
866
|
+
return methods.filter((method) => method === "card" || method === "mobile_money");
|
|
867
|
+
}
|
|
868
|
+
return methods;
|
|
823
869
|
}
|
|
824
870
|
function ProviderSelector({
|
|
825
871
|
providers,
|
|
826
872
|
selectedProvider,
|
|
827
873
|
onSelect,
|
|
828
|
-
disabled = false
|
|
874
|
+
disabled = false,
|
|
875
|
+
theme,
|
|
876
|
+
selectedMethod,
|
|
877
|
+
onMethodSelect,
|
|
878
|
+
renderMethodContent
|
|
829
879
|
}) {
|
|
880
|
+
const useBorder = theme?.pspSelectorUseBorder ?? false;
|
|
881
|
+
const bgColor = theme?.pspSelectorBgColor || "#0a0a0a";
|
|
882
|
+
const textColor = theme?.pspSelectorTextColor || "#ffffff";
|
|
883
|
+
const borderColor = theme?.pspSelectorBorderColor || "#374151";
|
|
884
|
+
const getOptionStyle = (isSelected) => {
|
|
885
|
+
if (useBorder) {
|
|
886
|
+
return {
|
|
887
|
+
backgroundColor: "transparent",
|
|
888
|
+
border: `2px solid ${isSelected ? borderColor : "#374151"}`,
|
|
889
|
+
color: isSelected ? textColor : "var(--reevit-text)"
|
|
890
|
+
};
|
|
891
|
+
}
|
|
892
|
+
return {
|
|
893
|
+
backgroundColor: isSelected ? bgColor : "transparent",
|
|
894
|
+
border: `2px solid ${isSelected ? bgColor : "#374151"}`,
|
|
895
|
+
color: isSelected ? textColor : "var(--reevit-text)"
|
|
896
|
+
};
|
|
897
|
+
};
|
|
830
898
|
return /* @__PURE__ */ jsxs("div", { className: "reevit-psp-selector", children: [
|
|
831
|
-
/* @__PURE__ */ jsx("div", { className: "reevit-psp-selector__label", children: "
|
|
899
|
+
/* @__PURE__ */ jsx("div", { className: "reevit-psp-selector__label", children: "Select payment provider" }),
|
|
832
900
|
/* @__PURE__ */ jsx("div", { className: "reevit-psp-selector__options", children: providers.map((provider) => {
|
|
833
901
|
const meta = providerMeta[provider.provider] || {
|
|
834
902
|
logo: void 0,
|
|
835
903
|
hint: "Payment methods"
|
|
836
904
|
};
|
|
905
|
+
const providerMethods = sanitizeMethods(provider.provider, provider.methods);
|
|
837
906
|
const isSelected = selectedProvider === provider.provider;
|
|
838
907
|
const fallbackInitial = provider.name.slice(0, 1).toUpperCase();
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
"
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
/* @__PURE__ */ jsx("span", { className: "reevit-psp-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
908
|
+
const optionStyle = getOptionStyle(isSelected);
|
|
909
|
+
return /* @__PURE__ */ jsxs("div", { className: "reevit-psp-accordion", children: [
|
|
910
|
+
/* @__PURE__ */ jsxs(
|
|
911
|
+
"button",
|
|
912
|
+
{
|
|
913
|
+
type: "button",
|
|
914
|
+
className: cn(
|
|
915
|
+
"reevit-psp-option",
|
|
916
|
+
isSelected && "reevit-psp-option--selected",
|
|
917
|
+
disabled && "reevit-psp-option--disabled"
|
|
918
|
+
),
|
|
919
|
+
style: optionStyle,
|
|
920
|
+
onClick: () => onSelect(provider.provider),
|
|
921
|
+
disabled,
|
|
922
|
+
"aria-expanded": isSelected,
|
|
923
|
+
children: [
|
|
924
|
+
/* @__PURE__ */ jsx("span", { className: "reevit-psp-option__logo", "aria-hidden": "true", children: meta.logo ? /* @__PURE__ */ jsx(
|
|
925
|
+
"img",
|
|
926
|
+
{
|
|
927
|
+
src: meta.logo,
|
|
928
|
+
alt: "",
|
|
929
|
+
className: "reevit-psp-option__logo-img",
|
|
930
|
+
loading: "lazy"
|
|
931
|
+
}
|
|
932
|
+
) : /* @__PURE__ */ jsx("span", { className: "reevit-psp-option__logo-fallback", children: fallbackInitial }) }),
|
|
933
|
+
/* @__PURE__ */ jsxs("div", { className: "reevit-psp-option__content", children: [
|
|
934
|
+
/* @__PURE__ */ jsx("span", { className: "reevit-psp-option__name", children: provider.name }),
|
|
935
|
+
/* @__PURE__ */ jsx("span", { className: "reevit-psp-option__methods", children: formatMethods(providerMethods) || meta.hint })
|
|
936
|
+
] })
|
|
937
|
+
]
|
|
938
|
+
}
|
|
939
|
+
),
|
|
940
|
+
isSelected && onMethodSelect && /* @__PURE__ */ jsxs("div", { className: "reevit-psp-accordion__content", children: [
|
|
941
|
+
/* @__PURE__ */ jsx("div", { className: "reevit-psp-methods", children: /* @__PURE__ */ jsx(
|
|
942
|
+
PaymentMethodSelector,
|
|
943
|
+
{
|
|
944
|
+
methods: providerMethods,
|
|
945
|
+
selectedMethod: selectedMethod || null,
|
|
946
|
+
onSelect: onMethodSelect,
|
|
947
|
+
disabled,
|
|
948
|
+
provider: provider.provider,
|
|
949
|
+
layout: "list",
|
|
950
|
+
showLabel: false
|
|
951
|
+
}
|
|
952
|
+
) }),
|
|
953
|
+
selectedMethod && renderMethodContent && /* @__PURE__ */ jsx("div", { className: "reevit-psp-accordion__method-content", children: renderMethodContent(provider.provider, selectedMethod) })
|
|
954
|
+
] })
|
|
955
|
+
] }, provider.provider);
|
|
870
956
|
}) })
|
|
871
957
|
] });
|
|
872
958
|
}
|
|
@@ -998,8 +1084,11 @@ function HubtelBridge({
|
|
|
998
1084
|
phone,
|
|
999
1085
|
description = "Payment",
|
|
1000
1086
|
callbackUrl,
|
|
1087
|
+
apiBaseUrl,
|
|
1088
|
+
clientSecret,
|
|
1001
1089
|
hubtelSessionToken,
|
|
1002
1090
|
basicAuth,
|
|
1091
|
+
preferredMethod,
|
|
1003
1092
|
onSuccess,
|
|
1004
1093
|
onError,
|
|
1005
1094
|
onClose,
|
|
@@ -1009,13 +1098,17 @@ function HubtelBridge({
|
|
|
1009
1098
|
const checkoutRef = useRef(null);
|
|
1010
1099
|
const [authValue, setAuthValue] = useState("");
|
|
1011
1100
|
const [isLoading, setIsLoading] = useState(false);
|
|
1101
|
+
const [resolvedMerchantAccount, setResolvedMerchantAccount] = useState(merchantAccount);
|
|
1102
|
+
useEffect(() => {
|
|
1103
|
+
setResolvedMerchantAccount(merchantAccount);
|
|
1104
|
+
}, [merchantAccount]);
|
|
1012
1105
|
useEffect(() => {
|
|
1013
1106
|
const fetchAuth = async () => {
|
|
1014
1107
|
if (hubtelSessionToken) {
|
|
1015
1108
|
setIsLoading(true);
|
|
1016
1109
|
try {
|
|
1017
|
-
const client = createReevitClient({ publicKey });
|
|
1018
|
-
const { data, error } = await client.createHubtelSession(paymentId);
|
|
1110
|
+
const client = createReevitClient({ publicKey, baseUrl: apiBaseUrl });
|
|
1111
|
+
const { data, error } = await client.createHubtelSession(paymentId, clientSecret);
|
|
1019
1112
|
if (error) {
|
|
1020
1113
|
onError({
|
|
1021
1114
|
code: "SESSION_ERROR",
|
|
@@ -1026,6 +1119,9 @@ function HubtelBridge({
|
|
|
1026
1119
|
}
|
|
1027
1120
|
if (data) {
|
|
1028
1121
|
setAuthValue(data.token);
|
|
1122
|
+
if (data.merchantAccount) {
|
|
1123
|
+
setResolvedMerchantAccount(data.merchantAccount);
|
|
1124
|
+
}
|
|
1029
1125
|
}
|
|
1030
1126
|
} catch (err) {
|
|
1031
1127
|
onError({
|
|
@@ -1042,7 +1138,7 @@ function HubtelBridge({
|
|
|
1042
1138
|
}
|
|
1043
1139
|
};
|
|
1044
1140
|
fetchAuth();
|
|
1045
|
-
}, [paymentId, publicKey, hubtelSessionToken, basicAuth, onError]);
|
|
1141
|
+
}, [paymentId, publicKey, apiBaseUrl, clientSecret, hubtelSessionToken, basicAuth, onError]);
|
|
1046
1142
|
const startPayment = useCallback(async () => {
|
|
1047
1143
|
if (isLoading || !authValue) {
|
|
1048
1144
|
return;
|
|
@@ -1050,20 +1146,23 @@ function HubtelBridge({
|
|
|
1050
1146
|
try {
|
|
1051
1147
|
const checkout = new CheckoutSdk();
|
|
1052
1148
|
checkoutRef.current = checkout;
|
|
1149
|
+
const methodPreference = preferredMethod === "mobile_money" ? "momo" : preferredMethod === "card" ? "card" : void 0;
|
|
1053
1150
|
const purchaseInfo = {
|
|
1054
1151
|
amount: amount / 100,
|
|
1055
1152
|
// Convert from minor to major units
|
|
1056
1153
|
purchaseDescription: description,
|
|
1057
1154
|
customerPhoneNumber: phone || "",
|
|
1058
|
-
clientReference: reference || `hubtel_${Date.now()}
|
|
1155
|
+
clientReference: reference || `hubtel_${Date.now()}`,
|
|
1156
|
+
...methodPreference ? { paymentMethod: methodPreference } : {}
|
|
1059
1157
|
};
|
|
1060
1158
|
const config = {
|
|
1061
1159
|
branding: "enabled",
|
|
1062
1160
|
callbackUrl: callbackUrl || window.location.href,
|
|
1063
|
-
merchantAccount: typeof
|
|
1161
|
+
merchantAccount: typeof resolvedMerchantAccount === "string" ? parseInt(resolvedMerchantAccount, 10) : resolvedMerchantAccount,
|
|
1064
1162
|
// Use session token or basicAuth for authentication
|
|
1065
1163
|
// Session tokens are base64-encoded credentials fetched securely from the server
|
|
1066
|
-
basicAuth: authValue || ""
|
|
1164
|
+
basicAuth: authValue || "",
|
|
1165
|
+
...methodPreference ? { paymentMethod: methodPreference } : {}
|
|
1067
1166
|
};
|
|
1068
1167
|
checkout.openModal({
|
|
1069
1168
|
purchaseInfo,
|
|
@@ -1107,7 +1206,7 @@ function HubtelBridge({
|
|
|
1107
1206
|
};
|
|
1108
1207
|
onError(error);
|
|
1109
1208
|
}
|
|
1110
|
-
}, [merchantAccount, amount, reference, phone, description, callbackUrl, authValue, isLoading, onSuccess, onError, onClose]);
|
|
1209
|
+
}, [merchantAccount, amount, reference, phone, description, callbackUrl, authValue, isLoading, preferredMethod, onSuccess, onError, onClose]);
|
|
1111
1210
|
useEffect(() => {
|
|
1112
1211
|
if (autoStart && !initialized.current && !isLoading && authValue) {
|
|
1113
1212
|
initialized.current = true;
|
|
@@ -1121,17 +1220,20 @@ function HubtelBridge({
|
|
|
1121
1220
|
}
|
|
1122
1221
|
function openHubtelPopup(config) {
|
|
1123
1222
|
const checkout = new CheckoutSdk();
|
|
1223
|
+
const methodPreference = config.preferredMethod === "mobile_money" ? "momo" : config.preferredMethod === "card" ? "card" : void 0;
|
|
1124
1224
|
const purchaseInfo = {
|
|
1125
1225
|
amount: config.amount,
|
|
1126
1226
|
purchaseDescription: config.description,
|
|
1127
1227
|
customerPhoneNumber: config.customerPhoneNumber || "",
|
|
1128
|
-
clientReference: config.clientReference || `hubtel_${Date.now()}
|
|
1228
|
+
clientReference: config.clientReference || `hubtel_${Date.now()}`,
|
|
1229
|
+
...methodPreference ? { paymentMethod: methodPreference } : {}
|
|
1129
1230
|
};
|
|
1130
1231
|
const checkoutConfig = {
|
|
1131
1232
|
branding: "enabled",
|
|
1132
1233
|
callbackUrl: config.callbackUrl || window.location.href,
|
|
1133
1234
|
merchantAccount: typeof config.merchantAccount === "string" ? parseInt(config.merchantAccount, 10) : config.merchantAccount,
|
|
1134
|
-
basicAuth: config.basicAuth || ""
|
|
1235
|
+
basicAuth: config.basicAuth || "",
|
|
1236
|
+
...methodPreference ? { paymentMethod: methodPreference } : {}
|
|
1135
1237
|
};
|
|
1136
1238
|
checkout.openModal({
|
|
1137
1239
|
purchaseInfo,
|
|
@@ -1824,6 +1926,14 @@ function useReevitContext() {
|
|
|
1824
1926
|
}
|
|
1825
1927
|
return context;
|
|
1826
1928
|
}
|
|
1929
|
+
var pspNames = {
|
|
1930
|
+
hubtel: "Hubtel",
|
|
1931
|
+
paystack: "Paystack",
|
|
1932
|
+
flutterwave: "Flutterwave",
|
|
1933
|
+
monnify: "Monnify",
|
|
1934
|
+
mpesa: "M-Pesa",
|
|
1935
|
+
stripe: "Stripe"
|
|
1936
|
+
};
|
|
1827
1937
|
function ReevitCheckout({
|
|
1828
1938
|
// Config
|
|
1829
1939
|
publicKey,
|
|
@@ -1831,8 +1941,11 @@ function ReevitCheckout({
|
|
|
1831
1941
|
currency,
|
|
1832
1942
|
email = "",
|
|
1833
1943
|
phone = "",
|
|
1944
|
+
customerName,
|
|
1834
1945
|
reference,
|
|
1835
1946
|
metadata,
|
|
1947
|
+
customFields,
|
|
1948
|
+
paymentLinkCode,
|
|
1836
1949
|
paymentMethods = ["card", "mobile_money"],
|
|
1837
1950
|
initialPaymentIntent,
|
|
1838
1951
|
// Callbacks
|
|
@@ -1883,8 +1996,11 @@ function ReevitCheckout({
|
|
|
1883
1996
|
currency,
|
|
1884
1997
|
email,
|
|
1885
1998
|
phone,
|
|
1999
|
+
customerName,
|
|
1886
2000
|
reference,
|
|
1887
2001
|
metadata,
|
|
2002
|
+
customFields,
|
|
2003
|
+
paymentLinkCode,
|
|
1888
2004
|
paymentMethods,
|
|
1889
2005
|
initialPaymentIntent
|
|
1890
2006
|
},
|
|
@@ -1912,7 +2028,8 @@ function ReevitCheckout({
|
|
|
1912
2028
|
const options = available.length > 0 ? available : fallbackProvider;
|
|
1913
2029
|
return options.map((provider) => {
|
|
1914
2030
|
const methods = provider.methods && provider.methods.length > 0 ? provider.methods : paymentMethods;
|
|
1915
|
-
const
|
|
2031
|
+
const sanitizedMethods = provider.provider.toLowerCase().includes("hubtel") ? methods.filter((method) => method === "card" || method === "mobile_money") : methods;
|
|
2032
|
+
const filteredMethods = sanitizedMethods.filter((method) => paymentMethods.includes(method));
|
|
1916
2033
|
return {
|
|
1917
2034
|
...provider,
|
|
1918
2035
|
methods: filteredMethods
|
|
@@ -1933,10 +2050,10 @@ function ReevitCheckout({
|
|
|
1933
2050
|
if (selectedProvider && providerOptions.some((provider) => provider.provider === selectedProvider)) {
|
|
1934
2051
|
return;
|
|
1935
2052
|
}
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
}, [
|
|
2053
|
+
if (providerOptions.length === 1) {
|
|
2054
|
+
setSelectedProvider(providerOptions[0].provider);
|
|
2055
|
+
}
|
|
2056
|
+
}, [providerOptions, selectedProvider]);
|
|
1940
2057
|
useEffect(() => {
|
|
1941
2058
|
if (!activeProvider || !selectedMethod) {
|
|
1942
2059
|
return;
|
|
@@ -1947,13 +2064,17 @@ function ReevitCheckout({
|
|
|
1947
2064
|
}, [activeProvider, selectedMethod, selectMethod]);
|
|
1948
2065
|
useEffect(() => {
|
|
1949
2066
|
if (isOpen && selectedMethod && paymentIntent && !showPSPBridge) {
|
|
2067
|
+
const psp = (selectedProvider || paymentIntent.recommendedPsp || "paystack").toLowerCase();
|
|
2068
|
+
const needsPhone = psp.includes("mpesa");
|
|
1950
2069
|
if (selectedMethod === "card") {
|
|
1951
2070
|
setShowPSPBridge(true);
|
|
1952
|
-
} else if (selectedMethod === "mobile_money"
|
|
1953
|
-
|
|
2071
|
+
} else if (selectedMethod === "mobile_money") {
|
|
2072
|
+
if (!needsPhone || (momoData?.phone || phone)) {
|
|
2073
|
+
setShowPSPBridge(true);
|
|
2074
|
+
}
|
|
1954
2075
|
}
|
|
1955
2076
|
}
|
|
1956
|
-
}, [isOpen, selectedMethod, showPSPBridge, paymentIntent, momoData, phone]);
|
|
2077
|
+
}, [isOpen, selectedMethod, showPSPBridge, paymentIntent, momoData, phone, selectedProvider]);
|
|
1957
2078
|
const handleOpen = useCallback(() => {
|
|
1958
2079
|
if (controlledIsOpen !== void 0) return;
|
|
1959
2080
|
setIsOpen(true);
|
|
@@ -1977,6 +2098,10 @@ function ReevitCheckout({
|
|
|
1977
2098
|
const handleProviderSelect = useCallback(
|
|
1978
2099
|
(provider) => {
|
|
1979
2100
|
if (provider === selectedProvider) {
|
|
2101
|
+
setSelectedProvider(null);
|
|
2102
|
+
reset();
|
|
2103
|
+
setShowPSPBridge(false);
|
|
2104
|
+
setMomoData(null);
|
|
1980
2105
|
return;
|
|
1981
2106
|
}
|
|
1982
2107
|
const providerMethods = providerOptions.find((option) => option.provider === provider)?.methods || paymentMethods;
|
|
@@ -1993,8 +2118,14 @@ function ReevitCheckout({
|
|
|
1993
2118
|
if (!selectedMethod) return;
|
|
1994
2119
|
if (selectedMethod === "card") {
|
|
1995
2120
|
setShowPSPBridge(true);
|
|
2121
|
+
} else if (selectedMethod === "mobile_money") {
|
|
2122
|
+
const psp = (selectedProvider || paymentIntent?.recommendedPsp || "paystack").toLowerCase();
|
|
2123
|
+
const needsPhone = psp.includes("mpesa");
|
|
2124
|
+
if (!needsPhone || (momoData?.phone || phone)) {
|
|
2125
|
+
setShowPSPBridge(true);
|
|
2126
|
+
}
|
|
1996
2127
|
}
|
|
1997
|
-
}, [selectedMethod]);
|
|
2128
|
+
}, [selectedMethod, selectedProvider, paymentIntent, momoData, phone]);
|
|
1998
2129
|
const handleMomoSubmit = useCallback(
|
|
1999
2130
|
(data) => {
|
|
2000
2131
|
setMomoData(data);
|
|
@@ -2051,13 +2182,13 @@ function ReevitCheckout({
|
|
|
2051
2182
|
] }) : null;
|
|
2052
2183
|
const renderContent = () => {
|
|
2053
2184
|
if (status === "loading" || status === "processing") {
|
|
2054
|
-
return /* @__PURE__ */ jsxs("div", { className: "reevit-loading", children: [
|
|
2185
|
+
return /* @__PURE__ */ jsxs("div", { className: "reevit-loading reevit-animate-fade-in", children: [
|
|
2055
2186
|
/* @__PURE__ */ jsx("div", { className: "reevit-spinner" }),
|
|
2056
2187
|
/* @__PURE__ */ jsx("p", { children: status === "loading" ? "Preparing checkout..." : "Processing payment..." })
|
|
2057
2188
|
] });
|
|
2058
2189
|
}
|
|
2059
2190
|
if (status === "success" && result) {
|
|
2060
|
-
return /* @__PURE__ */ jsxs("div", { className: "reevit-success", children: [
|
|
2191
|
+
return /* @__PURE__ */ jsxs("div", { className: "reevit-success reevit-animate-scale-in", children: [
|
|
2061
2192
|
/* @__PURE__ */ jsx("div", { className: "reevit-success__icon", children: "\u2713" }),
|
|
2062
2193
|
/* @__PURE__ */ jsx("h3", { children: "Payment Successful" }),
|
|
2063
2194
|
/* @__PURE__ */ jsxs("p", { children: [
|
|
@@ -2067,7 +2198,7 @@ function ReevitCheckout({
|
|
|
2067
2198
|
] });
|
|
2068
2199
|
}
|
|
2069
2200
|
if (status === "failed" && error && !error.recoverable) {
|
|
2070
|
-
return /* @__PURE__ */ jsxs("div", { className: "reevit-error", children: [
|
|
2201
|
+
return /* @__PURE__ */ jsxs("div", { className: "reevit-error reevit-animate-fade-in", children: [
|
|
2071
2202
|
/* @__PURE__ */ jsx("div", { className: "reevit-error__icon", children: "\u2715" }),
|
|
2072
2203
|
/* @__PURE__ */ jsx("h3", { children: "Payment Failed" }),
|
|
2073
2204
|
/* @__PURE__ */ jsx("p", { children: error.message }),
|
|
@@ -2075,17 +2206,16 @@ function ReevitCheckout({
|
|
|
2075
2206
|
] });
|
|
2076
2207
|
}
|
|
2077
2208
|
const psp = selectedProvider || paymentIntent?.recommendedPsp || "paystack";
|
|
2209
|
+
const pspLower = psp.toLowerCase();
|
|
2078
2210
|
if (showPSPBridge) {
|
|
2079
|
-
const pspKey = paymentIntent?.pspPublicKey || publicKey;
|
|
2211
|
+
const pspKey = paymentIntent?.pspPublicKey || publicKey || "";
|
|
2080
2212
|
const bridgeMetadata = {
|
|
2081
2213
|
...metadata,
|
|
2082
|
-
// Override with correct payment intent ID for webhook routing
|
|
2083
|
-
// This ensures webhook includes the correct ID to find the payment
|
|
2084
2214
|
payment_id: paymentIntent?.id,
|
|
2085
2215
|
connection_id: paymentIntent?.connectionId ?? metadata?.connection_id,
|
|
2086
2216
|
customer_phone: momoData?.phone || phone
|
|
2087
2217
|
};
|
|
2088
|
-
switch (
|
|
2218
|
+
switch (pspLower) {
|
|
2089
2219
|
case "paystack":
|
|
2090
2220
|
return /* @__PURE__ */ jsx(
|
|
2091
2221
|
PaystackBridge,
|
|
@@ -2118,6 +2248,9 @@ function ReevitCheckout({
|
|
|
2118
2248
|
phone: momoData?.phone || phone,
|
|
2119
2249
|
description: `Payment ${paymentIntent?.reference || reference || ""}`,
|
|
2120
2250
|
hubtelSessionToken: paymentIntent?.id ? paymentIntent.id : void 0,
|
|
2251
|
+
clientSecret: paymentIntent?.clientSecret,
|
|
2252
|
+
apiBaseUrl,
|
|
2253
|
+
preferredMethod: selectedMethod || void 0,
|
|
2121
2254
|
onSuccess: handlePSPSuccess,
|
|
2122
2255
|
onError: (err) => handlePSPError(err),
|
|
2123
2256
|
onClose: handlePSPClose
|
|
@@ -2135,7 +2268,7 @@ function ReevitCheckout({
|
|
|
2135
2268
|
phone: momoData?.phone || phone,
|
|
2136
2269
|
metadata: bridgeMetadata,
|
|
2137
2270
|
onSuccess: handlePSPSuccess,
|
|
2138
|
-
onError:
|
|
2271
|
+
onError: handlePSPError,
|
|
2139
2272
|
onClose: handlePSPClose
|
|
2140
2273
|
}
|
|
2141
2274
|
);
|
|
@@ -2152,21 +2285,8 @@ function ReevitCheckout({
|
|
|
2152
2285
|
customerEmail: email,
|
|
2153
2286
|
customerPhone: momoData?.phone || phone,
|
|
2154
2287
|
metadata: bridgeMetadata,
|
|
2155
|
-
onSuccess: (
|
|
2156
|
-
|
|
2157
|
-
reference: result2.paymentReference,
|
|
2158
|
-
amount: result2.amount,
|
|
2159
|
-
currency: paymentIntent?.currency ?? currency,
|
|
2160
|
-
paymentMethod: selectedMethod || "card",
|
|
2161
|
-
psp: "monnify",
|
|
2162
|
-
pspReference: result2.transactionReference,
|
|
2163
|
-
status: "success"
|
|
2164
|
-
}),
|
|
2165
|
-
onError: (err) => handlePSPError({
|
|
2166
|
-
code: err.code,
|
|
2167
|
-
message: err.message,
|
|
2168
|
-
recoverable: true
|
|
2169
|
-
}),
|
|
2288
|
+
onSuccess: (res) => handlePSPSuccess({ ...res, psp: "monnify" }),
|
|
2289
|
+
onError: handlePSPError,
|
|
2170
2290
|
onClose: handlePSPClose
|
|
2171
2291
|
}
|
|
2172
2292
|
);
|
|
@@ -2180,22 +2300,9 @@ function ReevitCheckout({
|
|
|
2180
2300
|
currency: paymentIntent?.currency ?? currency,
|
|
2181
2301
|
reference: paymentIntent?.reference || reference || `mpesa_${Date.now()}`,
|
|
2182
2302
|
description: `Payment ${paymentIntent?.reference || reference || ""}`,
|
|
2183
|
-
headers: { "x-reevit-public-key": publicKey },
|
|
2184
|
-
onSuccess:
|
|
2185
|
-
|
|
2186
|
-
reference: result2.reference,
|
|
2187
|
-
amount: paymentIntent?.amount ?? amount,
|
|
2188
|
-
currency: paymentIntent?.currency ?? currency,
|
|
2189
|
-
paymentMethod: "mobile_money",
|
|
2190
|
-
psp: "mpesa",
|
|
2191
|
-
pspReference: result2.transactionId,
|
|
2192
|
-
status: "success"
|
|
2193
|
-
}),
|
|
2194
|
-
onError: (err) => handlePSPError({
|
|
2195
|
-
code: err.code,
|
|
2196
|
-
message: err.message,
|
|
2197
|
-
recoverable: true
|
|
2198
|
-
})
|
|
2303
|
+
headers: { "x-reevit-public-key": publicKey || "" },
|
|
2304
|
+
onSuccess: handlePSPSuccess,
|
|
2305
|
+
onError: handlePSPError
|
|
2199
2306
|
}
|
|
2200
2307
|
);
|
|
2201
2308
|
case "stripe":
|
|
@@ -2206,58 +2313,60 @@ function ReevitCheckout({
|
|
|
2206
2313
|
clientSecret: paymentIntent?.clientSecret || "",
|
|
2207
2314
|
amount: paymentIntent?.amount ?? amount,
|
|
2208
2315
|
currency: paymentIntent?.currency ?? currency,
|
|
2209
|
-
onSuccess:
|
|
2210
|
-
|
|
2211
|
-
reference: paymentIntent?.reference || reference || result2.paymentIntentId,
|
|
2212
|
-
amount: paymentIntent?.amount ?? amount,
|
|
2213
|
-
currency: paymentIntent?.currency ?? currency,
|
|
2214
|
-
paymentMethod: selectedMethod || "card",
|
|
2215
|
-
psp: "stripe",
|
|
2216
|
-
pspReference: result2.paymentIntentId,
|
|
2217
|
-
status: result2.status === "succeeded" ? "success" : "pending"
|
|
2218
|
-
}),
|
|
2219
|
-
onError: (err) => handlePSPError({
|
|
2220
|
-
code: err.code,
|
|
2221
|
-
message: err.message,
|
|
2222
|
-
recoverable: true
|
|
2223
|
-
}),
|
|
2316
|
+
onSuccess: handlePSPSuccess,
|
|
2317
|
+
onError: handlePSPError,
|
|
2224
2318
|
onCancel: handlePSPClose
|
|
2225
2319
|
}
|
|
2226
2320
|
);
|
|
2227
2321
|
default:
|
|
2228
2322
|
return /* @__PURE__ */ jsxs("div", { className: "reevit-error", children: [
|
|
2229
2323
|
/* @__PURE__ */ jsx("div", { className: "reevit-error__icon", children: "\u26A0\uFE0F" }),
|
|
2230
|
-
/* @__PURE__ */ jsx("h3", { children: "
|
|
2324
|
+
/* @__PURE__ */ jsx("h3", { children: "Provider Not Supported" }),
|
|
2231
2325
|
/* @__PURE__ */ jsxs("p", { children: [
|
|
2232
|
-
"
|
|
2326
|
+
"Provider (",
|
|
2233
2327
|
psp,
|
|
2234
|
-
") is not
|
|
2328
|
+
") is not supported."
|
|
2235
2329
|
] }),
|
|
2236
2330
|
/* @__PURE__ */ jsx("button", { className: "reevit-btn reevit-btn--primary", onClick: handleBack, children: "Go Back" })
|
|
2237
2331
|
] });
|
|
2238
2332
|
}
|
|
2239
2333
|
}
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
isLoading,
|
|
2247
|
-
|
|
2334
|
+
const renderMethodContent = (provider, method) => {
|
|
2335
|
+
const pspLower2 = provider.toLowerCase();
|
|
2336
|
+
const needsPhone = pspLower2.includes("mpesa");
|
|
2337
|
+
if (method === "card") {
|
|
2338
|
+
return /* @__PURE__ */ jsxs("div", { className: "reevit-inline-action reevit-animate-fade-in", children: [
|
|
2339
|
+
/* @__PURE__ */ jsx("p", { className: "reevit-inline-action__hint", children: "You'll be redirected to complete your card payment securely." }),
|
|
2340
|
+
/* @__PURE__ */ jsx("button", { className: "reevit-btn reevit-btn--primary", onClick: handleContinue, disabled: isLoading, children: "Pay with Card" })
|
|
2341
|
+
] });
|
|
2342
|
+
}
|
|
2343
|
+
if (method === "mobile_money") {
|
|
2344
|
+
if (needsPhone && !phone) {
|
|
2345
|
+
return /* @__PURE__ */ jsx("div", { className: "reevit-inline-action reevit-animate-fade-in", children: /* @__PURE__ */ jsx(MobileMoneyForm, { onSubmit: handleMomoSubmit, onCancel: handleBack, isLoading, initialPhone: phone, hideCancel: true }) });
|
|
2248
2346
|
}
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2347
|
+
return /* @__PURE__ */ jsxs("div", { className: "reevit-inline-action reevit-animate-fade-in", children: [
|
|
2348
|
+
/* @__PURE__ */ 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)}.` }),
|
|
2349
|
+
/* @__PURE__ */ jsx("button", { className: "reevit-btn reevit-btn--primary", onClick: handleContinue, disabled: isLoading, children: pspLower2.includes("hubtel") ? "Continue with Hubtel" : "Pay with Mobile Money" })
|
|
2350
|
+
] });
|
|
2351
|
+
}
|
|
2352
|
+
return null;
|
|
2353
|
+
};
|
|
2354
|
+
if (providerOptions.length > 1) {
|
|
2355
|
+
return /* @__PURE__ */ jsx("div", { className: "reevit-method-step reevit-animate-slide-up", children: /* @__PURE__ */ jsx(
|
|
2253
2356
|
ProviderSelector,
|
|
2254
2357
|
{
|
|
2255
2358
|
providers: providerOptions,
|
|
2256
2359
|
selectedProvider,
|
|
2257
2360
|
onSelect: handleProviderSelect,
|
|
2258
|
-
disabled: isLoading
|
|
2361
|
+
disabled: isLoading,
|
|
2362
|
+
theme: resolvedTheme,
|
|
2363
|
+
selectedMethod,
|
|
2364
|
+
onMethodSelect: handleMethodSelect,
|
|
2365
|
+
renderMethodContent
|
|
2259
2366
|
}
|
|
2260
|
-
)
|
|
2367
|
+
) });
|
|
2368
|
+
}
|
|
2369
|
+
return /* @__PURE__ */ jsxs("div", { className: "reevit-method-step reevit-animate-slide-up", children: [
|
|
2261
2370
|
/* @__PURE__ */ jsx(
|
|
2262
2371
|
PaymentMethodSelector,
|
|
2263
2372
|
{
|
|
@@ -2265,21 +2374,26 @@ function ReevitCheckout({
|
|
|
2265
2374
|
selectedMethod,
|
|
2266
2375
|
onSelect: handleMethodSelect,
|
|
2267
2376
|
disabled: isLoading,
|
|
2268
|
-
provider:
|
|
2377
|
+
provider: psp,
|
|
2378
|
+
layout: "list",
|
|
2379
|
+
showLabel: false
|
|
2269
2380
|
}
|
|
2270
2381
|
),
|
|
2271
|
-
selectedMethod &&
|
|
2272
|
-
"
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2382
|
+
selectedMethod && /* @__PURE__ */ jsx("div", { className: "reevit-method-step__actions reevit-animate-slide-up", children: selectedMethod === "mobile_money" && pspLower.includes("mpesa") && !phone ? /* @__PURE__ */ jsx(MobileMoneyForm, { onSubmit: handleMomoSubmit, onCancel: () => selectMethod(null), isLoading, initialPhone: phone }) : /* @__PURE__ */ jsxs("div", { className: "reevit-card-info reevit-animate-fade-in", children: [
|
|
2383
|
+
/* @__PURE__ */ 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)}.` }),
|
|
2384
|
+
/* @__PURE__ */ jsx(
|
|
2385
|
+
"button",
|
|
2386
|
+
{
|
|
2387
|
+
className: "reevit-btn reevit-btn--primary",
|
|
2388
|
+
onClick: handleContinue,
|
|
2389
|
+
disabled: isLoading,
|
|
2390
|
+
children: selectedMethod === "card" ? "Pay with Card" : pspLower.includes("hubtel") ? "Continue with Hubtel" : "Pay with Mobile Money"
|
|
2391
|
+
}
|
|
2392
|
+
)
|
|
2393
|
+
] }) })
|
|
2280
2394
|
] });
|
|
2281
2395
|
};
|
|
2282
|
-
return /* @__PURE__ */ jsxs(ReevitContext.Provider, { value: { publicKey, amount, currency }, children: [
|
|
2396
|
+
return /* @__PURE__ */ jsxs(ReevitContext.Provider, { value: { publicKey: publicKey || "", amount, currency }, children: [
|
|
2283
2397
|
trigger,
|
|
2284
2398
|
isOpen && /* @__PURE__ */ jsx("div", { className: "reevit-overlay", onClick: handleClose, children: /* @__PURE__ */ jsxs(
|
|
2285
2399
|
"div",
|
|
@@ -2292,23 +2406,8 @@ function ReevitCheckout({
|
|
|
2292
2406
|
"aria-modal": "true",
|
|
2293
2407
|
children: [
|
|
2294
2408
|
/* @__PURE__ */ jsxs("div", { className: "reevit-modal__header", children: [
|
|
2295
|
-
/* @__PURE__ */ jsx("div", { className: "reevit-modal__branding", children: /* @__PURE__ */ jsx(
|
|
2296
|
-
|
|
2297
|
-
{
|
|
2298
|
-
src: "https://i.imgur.com/bzUR5Lm.png",
|
|
2299
|
-
alt: "Reevit",
|
|
2300
|
-
className: "reevit-modal__logo"
|
|
2301
|
-
}
|
|
2302
|
-
) }),
|
|
2303
|
-
/* @__PURE__ */ jsx(
|
|
2304
|
-
"button",
|
|
2305
|
-
{
|
|
2306
|
-
className: "reevit-modal__close",
|
|
2307
|
-
onClick: handleClose,
|
|
2308
|
-
"aria-label": "Close",
|
|
2309
|
-
children: "\u2715"
|
|
2310
|
-
}
|
|
2311
|
-
)
|
|
2409
|
+
/* @__PURE__ */ jsx("div", { className: "reevit-modal__branding", children: /* @__PURE__ */ jsx("img", { src: resolvedTheme?.logoUrl || "https://i.imgur.com/bzUR5Lm.png", alt: "Checkout", className: "reevit-modal__logo" }) }),
|
|
2410
|
+
/* @__PURE__ */ jsx("button", { className: "reevit-modal__close", onClick: handleClose, "aria-label": "Close", children: "\u2715" })
|
|
2312
2411
|
] }),
|
|
2313
2412
|
/* @__PURE__ */ jsxs("div", { className: "reevit-modal__amount", children: [
|
|
2314
2413
|
/* @__PURE__ */ jsx("span", { className: "reevit-modal__amount-label", children: "Amount" }),
|