@reevit/vue 0.4.1 → 0.4.8

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.
@@ -104,6 +104,7 @@ export interface HubtelConfig {
104
104
  customerEmail?: string;
105
105
  hubtelSessionToken?: string;
106
106
  basicAuth?: string;
107
+ preferredMethod?: 'card' | 'mobile_money';
107
108
  onSuccess: (response: Record<string, unknown>) => void;
108
109
  onClose: () => void;
109
110
  }
@@ -2,10 +2,13 @@ import { MobileMoneyFormData } from '../../../core/src/index.ts';
2
2
  type __VLS_Props = {
3
3
  initialPhone?: string;
4
4
  loading?: boolean;
5
+ hideCancel?: boolean;
5
6
  };
6
7
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
7
8
  submit: (data: MobileMoneyFormData) => any;
9
+ cancel: () => any;
8
10
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
9
11
  onSubmit?: ((data: MobileMoneyFormData) => any) | undefined;
12
+ onCancel?: (() => any) | undefined;
10
13
  }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLFormElement>;
11
14
  export default _default;
@@ -2,9 +2,9 @@ import { PaymentMethod } from '../../../core/src/index.ts';
2
2
  type __VLS_Props = {
3
3
  methods: PaymentMethod[];
4
4
  selected: PaymentMethod | null;
5
- amount: number;
6
- currency: string;
7
5
  provider?: string;
6
+ layout?: 'grid' | 'list';
7
+ showLabel?: boolean;
8
8
  };
9
9
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
10
10
  select: (method: PaymentMethod) => any;
@@ -0,0 +1,31 @@
1
+ import { CheckoutProviderOption, PaymentMethod, ReevitTheme } from '../../../core/src/index.ts';
2
+ type __VLS_Props = {
3
+ providers: CheckoutProviderOption[];
4
+ selectedProvider: string | null;
5
+ disabled?: boolean;
6
+ theme?: ReevitTheme;
7
+ selectedMethod?: PaymentMethod | null;
8
+ };
9
+ declare function __VLS_template(): {
10
+ attrs: Partial<{}>;
11
+ slots: {
12
+ 'method-content'?(_: {}): any;
13
+ };
14
+ refs: {};
15
+ rootEl: HTMLDivElement;
16
+ };
17
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
18
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
19
+ select: (provider: string) => any;
20
+ methodSelect: (method: PaymentMethod) => any;
21
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
22
+ onSelect?: ((provider: string) => any) | undefined;
23
+ onMethodSelect?: ((method: PaymentMethod) => any) | undefined;
24
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
25
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
26
+ export default _default;
27
+ type __VLS_WithTemplateSlots<T, S> = T & {
28
+ new (): {
29
+ $slots: S;
30
+ };
31
+ };
@@ -1,12 +1,15 @@
1
1
  import { ReevitTheme } from '../../../core/src/index.ts';
2
2
  type __VLS_Props = {
3
- publicKey: string;
3
+ publicKey?: string;
4
4
  amount: number;
5
5
  currency: string;
6
6
  email?: string;
7
7
  phone?: string;
8
+ customerName?: string;
8
9
  reference?: string;
9
10
  metadata?: Record<string, unknown>;
11
+ customFields?: Record<string, unknown>;
12
+ paymentLinkCode?: string;
10
13
  paymentMethods?: ('card' | 'mobile_money' | 'bank_transfer')[];
11
14
  theme?: ReevitTheme;
12
15
  isOpen?: boolean;
@@ -32,6 +32,29 @@ export declare function useReevit(options: UseReevitOptions): {
32
32
  readonly metadata?: {
33
33
  readonly [x: string]: Readonly<unknown>;
34
34
  } | undefined;
35
+ readonly availableProviders?: readonly {
36
+ readonly provider: string;
37
+ readonly name: string;
38
+ readonly methods: readonly PaymentMethod[];
39
+ readonly countries?: readonly string[] | undefined;
40
+ }[] | undefined;
41
+ readonly branding?: {
42
+ readonly primaryColor?: string | undefined;
43
+ readonly primaryForegroundColor?: string | undefined;
44
+ readonly backgroundColor?: string | undefined;
45
+ readonly surfaceColor?: string | undefined;
46
+ readonly textColor?: string | undefined;
47
+ readonly mutedTextColor?: string | undefined;
48
+ readonly borderRadius?: string | undefined;
49
+ readonly fontFamily?: string | undefined;
50
+ readonly darkMode?: boolean | undefined;
51
+ readonly logoUrl?: string | undefined;
52
+ readonly companyName?: string | undefined;
53
+ readonly pspSelectorBgColor?: string | undefined;
54
+ readonly pspSelectorTextColor?: string | undefined;
55
+ readonly pspSelectorBorderColor?: string | undefined;
56
+ readonly pspSelectorUseBorder?: boolean | undefined;
57
+ } | undefined;
35
58
  } | null, {
36
59
  readonly id: string;
37
60
  readonly clientSecret: string;
@@ -55,6 +78,29 @@ export declare function useReevit(options: UseReevitOptions): {
55
78
  readonly metadata?: {
56
79
  readonly [x: string]: Readonly<unknown>;
57
80
  } | undefined;
81
+ readonly availableProviders?: readonly {
82
+ readonly provider: string;
83
+ readonly name: string;
84
+ readonly methods: readonly PaymentMethod[];
85
+ readonly countries?: readonly string[] | undefined;
86
+ }[] | undefined;
87
+ readonly branding?: {
88
+ readonly primaryColor?: string | undefined;
89
+ readonly primaryForegroundColor?: string | undefined;
90
+ readonly backgroundColor?: string | undefined;
91
+ readonly surfaceColor?: string | undefined;
92
+ readonly textColor?: string | undefined;
93
+ readonly mutedTextColor?: string | undefined;
94
+ readonly borderRadius?: string | undefined;
95
+ readonly fontFamily?: string | undefined;
96
+ readonly darkMode?: boolean | undefined;
97
+ readonly logoUrl?: string | undefined;
98
+ readonly companyName?: string | undefined;
99
+ readonly pspSelectorBgColor?: string | undefined;
100
+ readonly pspSelectorTextColor?: string | undefined;
101
+ readonly pspSelectorBorderColor?: string | undefined;
102
+ readonly pspSelectorUseBorder?: boolean | undefined;
103
+ } | undefined;
58
104
  } | null>>;
59
105
  selectedMethod: Readonly<import('vue').Ref<PaymentMethod | null, PaymentMethod | null>>;
60
106
  error: Readonly<import('vue').Ref<{
@@ -105,7 +151,10 @@ export declare function useReevit(options: UseReevitOptions): {
105
151
  readonly sourceId?: string | undefined;
106
152
  readonly sourceDescription?: string | undefined;
107
153
  } | null>>;
108
- initialize: (method?: PaymentMethod) => Promise<void>;
154
+ initialize: (method?: PaymentMethod, options?: {
155
+ preferredProvider?: string;
156
+ allowedProviders?: string[];
157
+ }) => Promise<void>;
109
158
  selectMethod: (method: PaymentMethod) => void;
110
159
  processPayment: (paymentData: Record<string, unknown>) => Promise<void>;
111
160
  handlePspSuccess: (pspData: Record<string, unknown>) => Promise<void>;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as ReevitCheckout } from './components/ReevitCheckout.vue';
2
+ export { default as ProviderSelector } from './components/ProviderSelector.vue';
2
3
  export { default as PaymentMethodSelector } from './components/PaymentMethodSelector.vue';
3
4
  export { default as MobileMoneyForm } from './components/MobileMoneyForm.vue';
4
5
  export { useReevit } from './composables';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),v=require("@reevit/core");function Q(t){const o=t.toLowerCase();return o.includes("paystack")?"paystack":o.includes("hubtel")?"hubtel":o.includes("flutterwave")?"flutterwave":o.includes("stripe")?"stripe":o.includes("monnify")?"monnify":o.includes("mpesa")||o.includes("m-pesa")?"mpesa":"paystack"}function X(t,o){return{id:t.id,clientSecret:t.client_secret,pspPublicKey:t.psp_public_key,pspCredentials:t.psp_credentials,amount:t.amount,currency:t.currency,status:t.status,recommendedPsp:Q(t.provider),availableMethods:o.paymentMethods||["card","mobile_money"],reference:t.reference||o.reference,connectionId:t.connection_id,provider:t.provider,feeAmount:t.fee_amount,feeCurrency:t.fee_currency,netAmount:t.net_amount,metadata:o.metadata}}function L(t){const{config:o,onSuccess:n,onError:l,onClose:r,onStateChange:d,apiBaseUrl:u}=t,i=e.ref(v.createInitialState());if(o.initialPaymentIntent){const c=o.initialPaymentIntent;i.value={...i.value,status:"ready",paymentIntent:c,selectedMethod:c.availableMethods?.length===1?c.availableMethods[0]:null}}const p=new v.ReevitAPIClient({publicKey:o.publicKey,baseUrl:u}),m=c=>{i.value=v.reevitReducer(i.value,c)};e.watch(()=>i.value.status,c=>{d?.(c)});const a=async c=>{m({type:"INIT_START"});try{const s=o.reference||v.generateReference(),y=v.detectCountryFromCurrency(o.currency),f=c||o.paymentMethods?.[0]||"card",{data:k,error:x}=await p.createPaymentIntent({...o,reference:s},f,y);if(x){m({type:"INIT_ERROR",payload:x}),l?.(x);return}if(!k){const $={code:"INIT_FAILED",message:"No data received from API",recoverable:!0};m({type:"INIT_ERROR",payload:$}),l?.($);return}const J=X(k,{...o,reference:s});m({type:"INIT_SUCCESS",payload:J})}catch(s){const y={code:"INIT_FAILED",message:s instanceof Error?s.message:"Failed to initialize checkout",recoverable:!0,originalError:s};m({type:"INIT_ERROR",payload:y}),l?.(y)}},h=c=>{m({type:"SELECT_METHOD",payload:c})},E=async c=>{if(!(!i.value.paymentIntent||!i.value.selectedMethod)){m({type:"PROCESS_START"});try{let s;if(i.value.paymentIntent.clientSecret){const{data:f,error:k}=await p.confirmPaymentIntent(i.value.paymentIntent.id,i.value.paymentIntent.clientSecret);if(k){m({type:"PROCESS_ERROR",payload:k}),l?.(k);return}s=f}else{const{data:f,error:k}=await p.confirmPayment(i.value.paymentIntent.id);if(k){m({type:"PROCESS_ERROR",payload:k}),l?.(k);return}s=f}const y={paymentId:i.value.paymentIntent.id,reference:c.reference||i.value.paymentIntent.reference||i.value.paymentIntent.metadata?.reference||"",amount:i.value.paymentIntent.amount,currency:i.value.paymentIntent.currency,paymentMethod:i.value.selectedMethod,psp:i.value.paymentIntent.recommendedPsp,pspReference:c.pspReference||s?.provider_ref_id||"",status:"success",metadata:c};m({type:"PROCESS_SUCCESS",payload:y}),n?.(y)}catch(s){const y={code:"PAYMENT_FAILED",message:s instanceof Error?s.message:"Payment failed",recoverable:!0,originalError:s};m({type:"PROCESS_ERROR",payload:y}),l?.(y)}}},P=async c=>{await E(c)},R=c=>{m({type:"PROCESS_ERROR",payload:c}),l?.(c)},w=()=>{m({type:"RESET"})},I=async()=>{if(i.value.paymentIntent&&i.value.status!=="success")try{await p.cancelPaymentIntent(i.value.paymentIntent.id)}catch{}m({type:"CLOSE"}),r?.()},C=e.computed(()=>i.value.status),V=e.computed(()=>i.value.paymentIntent),S=e.computed(()=>i.value.selectedMethod),B=e.computed(()=>i.value.error),b=e.computed(()=>i.value.result),N=e.computed(()=>i.value.status==="loading"||i.value.status==="processing"),_=e.computed(()=>i.value.status==="ready"||i.value.status==="method_selected"||i.value.status==="processing"),g=e.computed(()=>i.value.status==="success"),T=e.computed(()=>i.value.error?.recoverable??!1);return{status:e.readonly(C),paymentIntent:e.readonly(V),selectedMethod:e.readonly(S),error:e.readonly(B),result:e.readonly(b),initialize:a,selectMethod:h,processPayment:E,handlePspSuccess:P,handlePspError:R,reset:w,close:I,isLoading:e.readonly(N),isReady:e.readonly(_),isComplete:e.readonly(g),canRetry:e.readonly(T)}}const Z={class:"reevit-method-selector"},ee={class:"reevit-amount-display"},te={class:"reevit-methods-grid"},ne=["onClick"],oe={class:"reevit-method-icon"},re={class:"reevit-method-info"},ae={class:"reevit-method-name"},se={class:"reevit-method-description"},ie={class:"reevit-method-radio"},le={key:0,class:"reevit-radio-inner"},D=e.defineComponent({__name:"PaymentMethodSelector",props:{methods:{},selected:{},amount:{},currency:{},provider:{}},emits:["select"],setup(t,{emit:o}){const n=t,l=o,r={hubtel:"Hubtel",paystack:"Paystack",flutterwave:"Flutterwave",monnify:"Monnify",mpesa:"M-Pesa",stripe:"Stripe"},d=p=>n.provider?.toLowerCase().includes("hubtel")&&p==="mobile_money"?`Pay with ${r[n.provider.toLowerCase()]||"Hubtel"}`:{card:"Card",mobile_money:"Mobile Money",bank_transfer:"Bank Transfer"}[p],u=p=>n.provider?.toLowerCase().includes("hubtel")?"Card, Mobile Money, and Bank Transfer":{card:"Visa, Mastercard, Maestro",mobile_money:"MTN, Vodafone, AirtelTigo",bank_transfer:"Transfer directly from your bank"}[p],i=e.computed(()=>[{id:"card",name:d("card"),description:u("card"),icon:"💳"},{id:"mobile_money",name:d("mobile_money"),description:u("mobile_money"),icon:"📱"},{id:"bank_transfer",name:d("bank_transfer"),description:u("bank_transfer"),icon:"🏦"}].filter(p=>n.methods.includes(p.id)));return(p,m)=>(e.openBlock(),e.createElementBlock("div",Z,[m[0]||(m[0]=e.createElementVNode("h3",{class:"reevit-section-title"},"Select Payment Method",-1)),e.createElementVNode("p",ee," Pay "+e.toDisplayString(e.unref(v.formatAmount)(t.amount,t.currency)),1),e.createElementVNode("div",te,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.value,a=>(e.openBlock(),e.createElementBlock("button",{key:a.id,type:"button",class:e.normalizeClass(e.unref(v.cn)("reevit-method-card",t.selected===a.id&&"reevit-method-card--selected")),onClick:h=>l("select",a.id)},[e.createElementVNode("span",oe,e.toDisplayString(a.icon),1),e.createElementVNode("div",re,[e.createElementVNode("span",ae,e.toDisplayString(a.name),1),e.createElementVNode("span",se,e.toDisplayString(a.description),1)]),e.createElementVNode("div",ie,[t.selected===a.id?(e.openBlock(),e.createElementBlock("div",le)):e.createCommentVNode("",!0)])],10,ne))),128))])]))}}),ce={class:"reevit-form-group"},de=["disabled"],ue={class:"reevit-network-selector"},me={class:"reevit-networks-grid"},pe=["onClick","disabled"],ye={key:0,class:"reevit-error-message"},ve=["disabled"],he={key:0,class:"reevit-spinner"},fe={key:1},U=e.defineComponent({__name:"MobileMoneyForm",props:{initialPhone:{},loading:{type:Boolean}},emits:["submit"],setup(t,{emit:o}){const n=t,l=o,r=e.ref(n.initialPhone||""),d=e.ref(null),u=e.ref(null);e.watch(r,m=>{const a=v.detectNetwork(m);a&&(d.value=a),u.value&&(u.value=null)});const i=()=>{if(!v.validatePhone(r.value)){u.value="Please enter a valid phone number";return}if(!d.value){u.value="Please select your mobile network";return}l("submit",{phone:r.value,network:d.value})},p=[{id:"mtn",name:"MTN",color:"#FFCC00"},{id:"vodafone",name:"Vodafone",color:"#E60000"},{id:"airteltigo",name:"AirtelTigo",color:"#005596"}];return(m,a)=>(e.openBlock(),e.createElementBlock("form",{class:"reevit-momo-form",onSubmit:e.withModifiers(i,["prevent"])},[e.createElementVNode("div",ce,[a[1]||(a[1]=e.createElementVNode("label",{class:"reevit-label",for:"reevit-phone"},"Phone Number",-1)),e.withDirectives(e.createElementVNode("input",{id:"reevit-phone","onUpdate:modelValue":a[0]||(a[0]=h=>r.value=h),type:"tel",class:e.normalizeClass(["reevit-input",{"reevit-input--error":u.value&&!e.unref(v.validatePhone)(r.value)}]),placeholder:"e.g. 024 123 4567",disabled:t.loading,autocomplete:"tel"},null,10,de),[[e.vModelText,r.value]])]),e.createElementVNode("div",ue,[a[2]||(a[2]=e.createElementVNode("label",{class:"reevit-label"},"Select Network",-1)),e.createElementVNode("div",me,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(p,h=>e.createElementVNode("button",{key:h.id,type:"button",class:e.normalizeClass(e.unref(v.cn)("reevit-network-btn",d.value===h.id&&"reevit-network-btn--selected")),onClick:E=>d.value=h.id,disabled:t.loading},[e.createElementVNode("div",{class:"reevit-network-dot",style:e.normalizeStyle({backgroundColor:h.color})},null,4),e.createTextVNode(" "+e.toDisplayString(h.name),1)],10,pe)),64))])]),u.value?(e.openBlock(),e.createElementBlock("p",ye,e.toDisplayString(u.value),1)):e.createCommentVNode("",!0),e.createElementVNode("button",{type:"submit",class:"reevit-submit-btn",disabled:t.loading||!r.value},[t.loading?(e.openBlock(),e.createElementBlock("span",he)):(e.openBlock(),e.createElementBlock("span",fe,"Continue"))],8,ve),a[3]||(a[3]=e.createElementVNode("p",{class:"reevit-secure-text"}," 🔒 Secure mobile money payment via Reevit ",-1))],32))}});class be{constructor(o){this.baseUrl="https://unified-pay.hubtel.com",this.messageHandler=null,this.stylesInjected=!1,o&&(this.baseUrl=o)}redirect({purchaseInfo:o,config:n}){const l=this.createCheckoutUrl(o,n),r=window.open(l);if(!r||r.closed||typeof r.closed>"u")throw new Error("Popup was blocked by the browser. Please allow popups for this site.")}initIframe({purchaseInfo:o,callBacks:n,config:l,iframeStyle:r}){var d,u,i;this.registerEvents(n);const p=document.getElementById("hubtel-checkout-iframe");if(!p)throw new Error('Container element with id "hubtel-checkout-iframe" not found in the DOM.');p.innerHTML="";const m=document.createElement("div");m.textContent="Loading...",p.appendChild(m);const a=document.createElement("iframe");a.setAttribute("id","hubtel-iframe-element"),a.src=this.createCheckoutUrl(o,l),a.style.display="none",a.style.width=(d=r?.width)!==null&&d!==void 0?d:"100%",a.style.height=(u=r?.height)!==null&&u!==void 0?u:"100%",a.style.minHeight=r?.minHeight||"400px",a.style.border=(i=r?.border)!==null&&i!==void 0?i:"none",a.onload=()=>{var h;p.removeChild(m),a.style.display="block",(h=n.onLoad)===null||h===void 0||h.call(n)},p.appendChild(a)}openModal({purchaseInfo:o,callBacks:n,config:l}){this.injectStyles(),this.createIframe(),this.handleBackButton(),this.registerEvents(n),this.renderWebpageInPopup(this.createCheckoutUrl(o,l),n.onClose,n.onLoad)}createCheckoutUrl(o,n){const l=Object.assign(Object.assign({},o),n),r=Object.keys(l).reduce((m,a)=>(l[a]!==null&&l[a]!==void 0&&(m[a]=l[a]),m),{}),d=Object.keys(r).map(m=>`${m}=${encodeURIComponent(r[m])}`).join("&"),u=this.encodeBase64(d),i=encodeURIComponent(u);return`${r?.branding==="disabled"?`${this.baseUrl}/pay/direct`:`${this.baseUrl}/pay`}?p=${i}`}encodeBase64(o){return btoa(unescape(encodeURIComponent(o)))}handleBackButton(){window.addEventListener("popstate",()=>{this.closePopUp()})}createIframe(){const o=document.createElement("div");o.setAttribute("id","backdrop"),o.classList.add("backdrop");const n=document.createElement("span");n.classList.add("checkout-loader"),o.appendChild(n),document.body.appendChild(o)}registerEvents(o){this.messageHandler&&window.removeEventListener("message",this.messageHandler,!1);const n=l=>{var r,d,u,i,p,m;if(l.origin!==this.baseUrl)return;const{data:a}=l;if(a.success===!0)(r=o.onPaymentSuccess)===null||r===void 0||r.call(o,a);else if(a.success===!1)(d=o.onPaymentFailure)===null||d===void 0||d.call(o,a);else if(a.initialized)(u=o.init)===null||u===void 0||u.call(o,a),(i=o.onInit)===null||i===void 0||i.call(o,a);else if(a.feesChanged)(p=o.onFeesChanged)===null||p===void 0||p.call(o,a.fees);else if(a.resize){const h=document.getElementById("hubtel-iframe-element");h&&(h.style.height=a.height+"px"),(m=o?.onResize)===null||m===void 0||m.call(o,a)}};this.messageHandler=n,window.addEventListener("message",n,!1)}destroy(){this.messageHandler&&(window.removeEventListener("message",this.messageHandler,!1),this.messageHandler=null)}renderWebpageInPopup(o,n,l){const r=document.createElement("div");r.classList.add("checkout-modal");const d=document.createElement("div");d.setAttribute("id","checkout-close-icon"),d.innerHTML="&times;",d.classList.add("close-icon"),d.addEventListener("click",()=>{this.closePopUp(),n?.()}),r.appendChild(d);const u=document.createElement("iframe");u.src=o,history.pushState({modalOpen:!0},""),u.classList.add("iframe"),r.appendChild(u),document.body.appendChild(r),r.style.opacity="0",u.addEventListener("load",()=>{r.style.opacity="1",l?.()})}closePopUp(){const o=document.querySelector(".backdrop"),n=document.querySelector(".checkout-modal");o&&document.body.removeChild(o),n&&document.body.removeChild(n),history.replaceState(null,""),window.removeEventListener("popstate",this.closePopUp)}injectStyles(){if(this.stylesInjected)return;const o=document.createElement("style");o.type="text/css",o.setAttribute("data-hubtel-checkout","true"),o.innerHTML=`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),_=require("@reevit/core"),ie="https://api.reevit.io";function ce(o,t){return{code:t?.code||"payment_link_error",message:t?.message||"Payment link request failed",recoverable:!0,details:{httpStatus:o.status,...t?.details||{}}}}function de(o){const t=o.toLowerCase();return t.includes("paystack")?"paystack":t.includes("hubtel")?"hubtel":t.includes("flutterwave")?"flutterwave":t.includes("stripe")?"stripe":t.includes("monnify")?"monnify":t.includes("mpesa")||t.includes("m-pesa")?"mpesa":"paystack"}function ue(o){const t=o.toLowerCase().trim();return t==="card"?"card":t==="mobile_money"||t==="momo"||t==="mobilemoney"?"mobile_money":t==="bank"||t==="bank_transfer"||t==="transfer"?"bank_transfer":null}function me(o){if(!(!o||o.length===0))return o.map(t=>{const n=t.methods.map(s=>ue(s)).filter(Boolean);return{provider:t.provider,name:t.name,methods:n,countries:t.countries}}).filter(t=>t.methods.length>0)}function pe(o){if(!o)return{};const t=o,n={...t},s=d=>typeof d=="string"?d:void 0,c=d=>typeof d=="boolean"?d:void 0,l=(d,i)=>{i!==void 0&&(n[d]=i)};return l("logoUrl",s(t.logoUrl??t.logo_url)),l("companyName",s(t.companyName??t.company_name)),l("primaryColor",s(t.primaryColor??t.primary_color)),l("primaryForegroundColor",s(t.primaryForegroundColor??t.primary_foreground_color)),l("backgroundColor",s(t.backgroundColor??t.background_color)),l("surfaceColor",s(t.surfaceColor??t.surface_color)),l("textColor",s(t.textColor??t.text_color)),l("mutedTextColor",s(t.mutedTextColor??t.muted_text_color)),l("borderRadius",s(t.borderRadius??t.border_radius)),l("fontFamily",s(t.fontFamily??t.font_family)),l("darkMode",c(t.darkMode??t.dark_mode)),l("pspSelectorBgColor",s(t.pspSelectorBgColor??t.psp_selector_bg_color)),l("pspSelectorTextColor",s(t.pspSelectorTextColor??t.psp_selector_text_color)),l("pspSelectorBorderColor",s(t.pspSelectorBorderColor??t.psp_selector_border_color)),l("pspSelectorUseBorder",c(t.pspSelectorUseBorder??t.psp_selector_use_border)),n}function ve(o,t){return{id:o.id,clientSecret:o.client_secret,pspPublicKey:o.psp_public_key,pspCredentials:o.psp_credentials,amount:o.amount,currency:o.currency,status:o.status,recommendedPsp:de(o.provider),availableMethods:t.paymentMethods||["card","mobile_money"],reference:o.reference||t.reference,connectionId:o.connection_id,provider:o.provider,feeAmount:o.fee_amount,feeCurrency:o.fee_currency,netAmount:o.net_amount,metadata:t.metadata,availableProviders:me(o.available_psps),branding:pe(o.branding)}}function J(o){const{config:t,onSuccess:n,onError:s,onClose:c,onStateChange:l,apiBaseUrl:d}=o,i=e.ref(_.createInitialState()),p=e.ref(0);if(t.initialPaymentIntent){const v=t.initialPaymentIntent;i.value={...i.value,status:"ready",paymentIntent:v,selectedMethod:v.availableMethods?.length===1?v.availableMethods[0]:null}}const u=new _.ReevitAPIClient({publicKey:t.publicKey,baseUrl:d}),a=v=>{i.value=_.reevitReducer(i.value,v)};e.watch(()=>i.value.status,v=>{l?.(v)});const f=async(v,k)=>{const S=++p.value;a({type:"INIT_START"});try{const w=t.reference||_.generateReference(),b=_.detectCountryFromCurrency(t.currency),A=t.paymentMethods&&t.paymentMethods.length===1?t.paymentMethods[0]:void 0,P=v??A;let M,$;if(t.paymentLinkCode){const r=await fetch(`${d||ie}/v1/pay/${t.paymentLinkCode}/pay`,{method:"POST",headers:{"Content-Type":"application/json","Idempotency-Key":`${Date.now()}-${Math.random().toString(36).substring(2,15)}`},body:JSON.stringify({amount:t.amount,email:t.email||"",name:t.customerName||"",phone:t.phone||"",method:P,country:b,provider:k?.preferredProvider||k?.allowedProviders?.[0],custom_fields:t.customFields})}),y=await r.json().catch(()=>({}));r.ok?M=y:$=ce(r,y)}else{const r=await u.createPaymentIntent({...t,reference:w},P,b,{preferredProviders:k?.preferredProvider?[k.preferredProvider]:void 0,allowedProviders:k?.allowedProviders});M=r.data,$=r.error}if(S!==p.value)return;if($){a({type:"INIT_ERROR",payload:$}),s?.($);return}if(!M){const r={code:"INIT_FAILED",message:"No data received from API",recoverable:!0};a({type:"INIT_ERROR",payload:r}),s?.(r);return}const m=ve(M,{...t,reference:w});a({type:"INIT_SUCCESS",payload:m})}catch(w){if(S!==p.value)return;const b={code:"INIT_FAILED",message:w instanceof Error?w.message:"Failed to initialize checkout",recoverable:!0,originalError:w};a({type:"INIT_ERROR",payload:b}),s?.(b)}},I=v=>{a({type:"SELECT_METHOD",payload:v})},N=async v=>{if(!(!i.value.paymentIntent||!i.value.selectedMethod)){a({type:"PROCESS_START"});try{let k;if(i.value.paymentIntent.clientSecret){const{data:w,error:b}=await u.confirmPaymentIntent(i.value.paymentIntent.id,i.value.paymentIntent.clientSecret);if(b){a({type:"PROCESS_ERROR",payload:b}),s?.(b);return}k=w}else{const{data:w,error:b}=await u.confirmPayment(i.value.paymentIntent.id);if(b){a({type:"PROCESS_ERROR",payload:b}),s?.(b);return}k=w}const S={paymentId:i.value.paymentIntent.id,reference:v.reference||i.value.paymentIntent.reference||i.value.paymentIntent.metadata?.reference||"",amount:i.value.paymentIntent.amount,currency:i.value.paymentIntent.currency,paymentMethod:i.value.selectedMethod,psp:i.value.paymentIntent.recommendedPsp,pspReference:v.pspReference||k?.provider_ref_id||"",status:"success",metadata:v};a({type:"PROCESS_SUCCESS",payload:S}),n?.(S)}catch(k){const S={code:"PAYMENT_FAILED",message:k instanceof Error?k.message:"Payment failed",recoverable:!0,originalError:k};a({type:"PROCESS_ERROR",payload:S}),s?.(S)}}},K=async v=>{await N(v)},O=v=>{a({type:"PROCESS_ERROR",payload:v}),s?.(v)},B=()=>{p.value+=1,a({type:"RESET"})},C=async()=>{if(i.value.paymentIntent&&i.value.status!=="success")try{await u.cancelPaymentIntent(i.value.paymentIntent.id)}catch{}a({type:"CLOSE"}),c?.()},L=e.computed(()=>i.value.status),U=e.computed(()=>i.value.paymentIntent),F=e.computed(()=>i.value.selectedMethod),V=e.computed(()=>i.value.error),R=e.computed(()=>i.value.result),g=e.computed(()=>i.value.status==="loading"||i.value.status==="processing"),D=e.computed(()=>i.value.status==="ready"||i.value.status==="method_selected"||i.value.status==="processing"),H=e.computed(()=>i.value.status==="success"),z=e.computed(()=>i.value.error?.recoverable??!1);return{status:e.readonly(L),paymentIntent:e.readonly(U),selectedMethod:e.readonly(F),error:e.readonly(V),result:e.readonly(R),initialize:f,selectMethod:I,processPayment:N,handlePspSuccess:K,handlePspError:O,reset:B,close:C,isLoading:e.readonly(g),isReady:e.readonly(D),isComplete:e.readonly(H),canRetry:e.readonly(z)}}const ye={key:0,class:"reevit-method-selector__label"},he=["onClick"],be={class:"reevit-method-option__icon-wrapper"},fe={class:"reevit-method-option__icon"},ke={class:"reevit-method-option__content"},_e={class:"reevit-method-option__label"},Ee={key:0,class:"reevit-method-option__description"},ge={key:0,class:"reevit-method-option__check"},Ce={key:1,class:"reevit-method-option__chevron"},Y=e.defineComponent({__name:"PaymentMethodSelector",props:{methods:{},selected:{},provider:{},layout:{},showLabel:{type:Boolean}},emits:["select"],setup(o,{emit:t}){const n=o,{showLabel:s=!0}=n,c=t,l=e.computed(()=>(n.layout||"list")==="grid"),d=e.computed(()=>[{id:"card",name:"Card",icon:"💳",description:"Pay with Visa, Mastercard, or other cards"},{id:"mobile_money",name:"Mobile Money",icon:"📱",description:"MTN, Vodafone Cash, AirtelTigo Money"},{id:"bank_transfer",name:"Bank Transfer",icon:"🏦",description:"Pay directly from your bank account"}].filter(i=>n.methods.includes(i.id)));return(i,p)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["reevit-method-selector",{"reevit-method-selector--grid":l.value}])},[e.unref(s)?(e.openBlock(),e.createElementBlock("div",ye,"Select payment method")):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["reevit-method-selector__options",l.value?"reevit-method-selector__options--grid":"reevit-method-selector__options--list"])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,(u,a)=>(e.openBlock(),e.createElementBlock("button",{key:u.id,type:"button",class:e.normalizeClass(["reevit-method-option",[l.value?"reevit-method-option--grid":"reevit-method-option--list",{"reevit-method-option--selected":o.selected===u.id}]]),style:e.normalizeStyle({animationDelay:`${a*.05}s`}),onClick:f=>c("select",u.id)},[e.createElementVNode("span",be,[e.createElementVNode("span",fe,e.toDisplayString(u.icon),1)]),e.createElementVNode("div",ke,[e.createElementVNode("span",_e,e.toDisplayString(u.name),1),l.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Ee,e.toDisplayString(u.description),1))]),l.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[o.selected===u.id?(e.openBlock(),e.createElementBlock("span",ge,[...p[0]||(p[0]=[e.createElementVNode("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"3","stroke-linecap":"round","stroke-linejoin":"round"},[e.createElementVNode("polyline",{points:"20 6 9 17 4 12"})],-1)])])):(e.openBlock(),e.createElementBlock("span",Ce,[...p[1]||(p[1]=[e.createElementVNode("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},[e.createElementVNode("polyline",{points:"9 18 15 12 9 6"})],-1)])]))],64))],14,he))),128))],2)],2))}}),Pe={class:"reevit-psp-selector"},we={class:"reevit-psp-selector__options"},Se=["disabled","aria-expanded","onClick"],Ne={class:"reevit-psp-option__logo","aria-hidden":"true"},Me=["src"],Ie={key:1,class:"reevit-psp-option__logo-fallback"},Be={class:"reevit-psp-option__content"},Ve={class:"reevit-psp-option__name"},Re={class:"reevit-psp-option__methods"},$e={key:0,class:"reevit-psp-accordion__content reevit-animate-fade-in"},xe={class:"reevit-psp-methods"},W=e.defineComponent({__name:"ProviderSelector",props:{providers:{},selectedProvider:{},disabled:{type:Boolean},theme:{},selectedMethod:{}},emits:["select","methodSelect"],setup(o,{emit:t}){const n=t,s={paystack:"https://reevit.io/images/providers/paystack.png",stripe:"https://reevit.io/images/providers/stripe.png",flutterwave:"https://reevit.io/images/providers/flutterwave.png",hubtel:"https://reevit.io/images/providers/hubtel.png",monnify:"https://reevit.io/images/providers/monnify.png",mpesa:"https://reevit.io/images/providers/mpesa.png"},c={card:"Card",mobile_money:"Mobile Money",bank_transfer:"Bank Transfer"},l=i=>i.length?i.map(p=>c[p]).join(", "):"Payment methods",d=(i,p)=>i.toLowerCase().includes("hubtel")?p.filter(u=>u==="card"||u==="mobile_money"):p;return(i,p)=>(e.openBlock(),e.createElementBlock("div",Pe,[p[1]||(p[1]=e.createElementVNode("div",{class:"reevit-psp-selector__label"},"Select payment provider",-1)),e.createElementVNode("div",we,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.providers,u=>(e.openBlock(),e.createElementBlock("div",{key:u.provider,class:"reevit-psp-accordion"},[e.createElementVNode("button",{type:"button",class:e.normalizeClass(e.unref(_.cn)("reevit-psp-option",o.selectedProvider===u.provider&&"reevit-psp-option--selected",o.disabled&&"reevit-psp-option--disabled")),disabled:o.disabled,"aria-expanded":o.selectedProvider===u.provider,onClick:a=>n("select",u.provider)},[e.createElementVNode("span",Ne,[s[u.provider]?(e.openBlock(),e.createElementBlock("img",{key:0,src:s[u.provider],alt:"",class:"reevit-psp-option__logo-img",loading:"lazy"},null,8,Me)):(e.openBlock(),e.createElementBlock("span",Ie,e.toDisplayString(u.name.slice(0,1).toUpperCase()),1))]),e.createElementVNode("div",Be,[e.createElementVNode("span",Ve,e.toDisplayString(u.name),1),e.createElementVNode("span",Re,e.toDisplayString(l(d(u.provider,u.methods))),1)])],10,Se),o.selectedProvider===u.provider?(e.openBlock(),e.createElementBlock("div",$e,[e.createElementVNode("div",xe,[e.createVNode(Y,{methods:d(u.provider,u.methods),selected:o.selectedMethod||null,provider:u.provider,"show-label":!1,layout:"list",onSelect:p[0]||(p[0]=a=>n("methodSelect",a))},null,8,["methods","selected","provider"])]),e.renderSlot(i.$slots,"method-content")])):e.createCommentVNode("",!0)]))),128))])]))}}),Te={class:"reevit-form-group"},Le=["disabled"],Fe={class:"reevit-network-selector"},Oe={class:"reevit-networks-grid"},Ue=["onClick","disabled"],De={key:0,class:"reevit-error-message"},ze={class:"reevit-momo-form__actions"},Ae=["disabled"],je=["disabled"],Ke={key:0,class:"reevit-spinner"},He={key:1},q=e.defineComponent({__name:"MobileMoneyForm",props:{initialPhone:{},loading:{type:Boolean},hideCancel:{type:Boolean}},emits:["submit","cancel"],setup(o,{emit:t}){const n=o,s=t,c=e.ref(n.initialPhone||""),l=e.ref(null),d=e.ref(null);e.watch(c,u=>{const a=_.detectNetwork(u);a&&(l.value=a),d.value&&(d.value=null)});const i=()=>{if(!_.validatePhone(c.value)){d.value="Please enter a valid phone number";return}if(!l.value){d.value="Please select your mobile network";return}s("submit",{phone:c.value,network:l.value})},p=[{id:"mtn",name:"MTN",color:"#FFCC00"},{id:"vodafone",name:"Vodafone",color:"#E60000"},{id:"airteltigo",name:"AirtelTigo",color:"#005596"}];return(u,a)=>(e.openBlock(),e.createElementBlock("form",{class:"reevit-momo-form",onSubmit:e.withModifiers(i,["prevent"])},[e.createElementVNode("div",Te,[a[2]||(a[2]=e.createElementVNode("label",{class:"reevit-label",for:"reevit-phone"},"Phone Number",-1)),e.withDirectives(e.createElementVNode("input",{id:"reevit-phone","onUpdate:modelValue":a[0]||(a[0]=f=>c.value=f),type:"tel",class:e.normalizeClass(["reevit-input",{"reevit-input--error":d.value&&!e.unref(_.validatePhone)(c.value)}]),placeholder:"e.g. 024 123 4567",disabled:o.loading,autocomplete:"tel"},null,10,Le),[[e.vModelText,c.value]])]),e.createElementVNode("div",Fe,[a[3]||(a[3]=e.createElementVNode("label",{class:"reevit-label"},"Select Network",-1)),e.createElementVNode("div",Oe,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(p,f=>e.createElementVNode("button",{key:f.id,type:"button",class:e.normalizeClass(e.unref(_.cn)("reevit-network-btn",l.value===f.id&&"reevit-network-btn--selected")),onClick:I=>l.value=f.id,disabled:o.loading},[e.createElementVNode("div",{class:"reevit-network-dot",style:e.normalizeStyle({backgroundColor:f.color})},null,4),e.createTextVNode(" "+e.toDisplayString(f.name),1)],10,Ue)),64))])]),d.value?(e.openBlock(),e.createElementBlock("p",De,e.toDisplayString(d.value),1)):e.createCommentVNode("",!0),e.createElementVNode("div",ze,[o.hideCancel?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"reevit-btn reevit-btn--secondary",onClick:a[1]||(a[1]=f=>s("cancel")),disabled:o.loading}," Back ",8,Ae)),e.createElementVNode("button",{type:"submit",class:"reevit-btn reevit-btn--primary",disabled:o.loading||!c.value},[o.loading?(e.openBlock(),e.createElementBlock("span",Ke)):(e.openBlock(),e.createElementBlock("span",He,"Continue"))],8,je)]),a[4]||(a[4]=e.createElementVNode("p",{class:"reevit-secure-text"}," 🔒 Secure mobile money payment via Reevit ",-1))],32))}});class qe{constructor(t){this.baseUrl="https://unified-pay.hubtel.com",this.messageHandler=null,this.stylesInjected=!1,t&&(this.baseUrl=t)}redirect({purchaseInfo:t,config:n}){const s=this.createCheckoutUrl(t,n),c=window.open(s);if(!c||c.closed||typeof c.closed>"u")throw new Error("Popup was blocked by the browser. Please allow popups for this site.")}initIframe({purchaseInfo:t,callBacks:n,config:s,iframeStyle:c}){var l,d,i;this.registerEvents(n);const p=document.getElementById("hubtel-checkout-iframe");if(!p)throw new Error('Container element with id "hubtel-checkout-iframe" not found in the DOM.');p.innerHTML="";const u=document.createElement("div");u.textContent="Loading...",p.appendChild(u);const a=document.createElement("iframe");a.setAttribute("id","hubtel-iframe-element"),a.src=this.createCheckoutUrl(t,s),a.style.display="none",a.style.width=(l=c?.width)!==null&&l!==void 0?l:"100%",a.style.height=(d=c?.height)!==null&&d!==void 0?d:"100%",a.style.minHeight=c?.minHeight||"400px",a.style.border=(i=c?.border)!==null&&i!==void 0?i:"none",a.onload=()=>{var f;p.removeChild(u),a.style.display="block",(f=n.onLoad)===null||f===void 0||f.call(n)},p.appendChild(a)}openModal({purchaseInfo:t,callBacks:n,config:s}){this.injectStyles(),this.createIframe(),this.handleBackButton(),this.registerEvents(n),this.renderWebpageInPopup(this.createCheckoutUrl(t,s),n.onClose,n.onLoad)}createCheckoutUrl(t,n){const s=Object.assign(Object.assign({},t),n),c=Object.keys(s).reduce((u,a)=>(s[a]!==null&&s[a]!==void 0&&(u[a]=s[a]),u),{}),l=Object.keys(c).map(u=>`${u}=${encodeURIComponent(c[u])}`).join("&"),d=this.encodeBase64(l),i=encodeURIComponent(d);return`${c?.branding==="disabled"?`${this.baseUrl}/pay/direct`:`${this.baseUrl}/pay`}?p=${i}`}encodeBase64(t){return btoa(unescape(encodeURIComponent(t)))}handleBackButton(){window.addEventListener("popstate",()=>{this.closePopUp()})}createIframe(){const t=document.createElement("div");t.setAttribute("id","backdrop"),t.classList.add("backdrop");const n=document.createElement("span");n.classList.add("checkout-loader"),t.appendChild(n),document.body.appendChild(t)}registerEvents(t){this.messageHandler&&window.removeEventListener("message",this.messageHandler,!1);const n=s=>{var c,l,d,i,p,u;if(s.origin!==this.baseUrl)return;const{data:a}=s;if(a.success===!0)(c=t.onPaymentSuccess)===null||c===void 0||c.call(t,a);else if(a.success===!1)(l=t.onPaymentFailure)===null||l===void 0||l.call(t,a);else if(a.initialized)(d=t.init)===null||d===void 0||d.call(t,a),(i=t.onInit)===null||i===void 0||i.call(t,a);else if(a.feesChanged)(p=t.onFeesChanged)===null||p===void 0||p.call(t,a.fees);else if(a.resize){const f=document.getElementById("hubtel-iframe-element");f&&(f.style.height=a.height+"px"),(u=t?.onResize)===null||u===void 0||u.call(t,a)}};this.messageHandler=n,window.addEventListener("message",n,!1)}destroy(){this.messageHandler&&(window.removeEventListener("message",this.messageHandler,!1),this.messageHandler=null)}renderWebpageInPopup(t,n,s){const c=document.createElement("div");c.classList.add("checkout-modal");const l=document.createElement("div");l.setAttribute("id","checkout-close-icon"),l.innerHTML="&times;",l.classList.add("close-icon"),l.addEventListener("click",()=>{this.closePopUp(),n?.()}),c.appendChild(l);const d=document.createElement("iframe");d.src=t,history.pushState({modalOpen:!0},""),d.classList.add("iframe"),c.appendChild(d),document.body.appendChild(c),c.style.opacity="0",d.addEventListener("load",()=>{c.style.opacity="1",s?.()})}closePopUp(){const t=document.querySelector(".backdrop"),n=document.querySelector(".checkout-modal");t&&document.body.removeChild(t),n&&document.body.removeChild(n),history.replaceState(null,""),window.removeEventListener("popstate",this.closePopUp)}injectStyles(){if(this.stylesInjected)return;const t=document.createElement("style");t.type="text/css",t.setAttribute("data-hubtel-checkout","true"),t.innerHTML=`
2
2
  .backdrop {
3
3
  position: fixed;
4
4
  left: 0;
@@ -98,4 +98,4 @@
98
98
 
99
99
  }
100
100
  }
101
- `,document.head.appendChild(o),this.stylesInjected=!0}}const O=new Map;function M(t,o){const n=O.get(o);if(n)return n;const l=new Promise((r,d)=>{if(document.getElementById(o)){r();return}const u=document.createElement("script");u.id=o,u.src=t,u.async=!0,u.onload=()=>r(),u.onerror=()=>d(new Error(`Failed to load ${o} script`)),document.head.appendChild(u)});return O.set(o,l),l}function F(){return M("https://js.paystack.co/v1/inline.js","paystack-script")}function ke(){return Promise.resolve()}function j(){return M("https://checkout.flutterwave.com/v3.js","flutterwave-script")}function A(){return M("https://js.stripe.com/v3/","stripe-script")}function z(){return M("https://sdk.monnify.com/plugin/monnify.js","monnify-script")}async function K(t){if(await F(),!window.PaystackPop)throw new Error("Paystack script not loaded");window.PaystackPop.setup({key:t.key,email:t.email,amount:t.amount,currency:t.currency,ref:t.ref,metadata:t.metadata,callback:t.onSuccess,onClose:t.onClose}).openIframe()}async function H(t){const o=new be,n={amount:t.amount,purchaseDescription:t.purchaseDescription,customerPhoneNumber:t.customerPhone||"",clientReference:`hubtel_${Date.now()}`},l=t.hubtelSessionToken||t.basicAuth||"",r={branding:"enabled",callbackUrl:t.callbackUrl||(typeof window<"u"?window.location.href:""),merchantAccount:typeof t.clientId=="string"?parseInt(t.clientId,10):t.clientId,basicAuth:l};o.openModal({purchaseInfo:n,config:r,callBacks:{onPaymentSuccess:d=>{t.onSuccess(d),o.closePopUp()},onPaymentFailure:()=>{t.onClose()},onClose:()=>{t.onClose()}}})}async function q(t){if(await j(),!window.FlutterwaveCheckout)throw new Error("Flutterwave script not loaded");window.FlutterwaveCheckout({public_key:t.public_key,tx_ref:t.tx_ref,amount:t.amount,currency:t.currency,customer:t.customer,payment_options:t.payment_options,customizations:t.customizations,callback:t.callback,onclose:t.onclose})}async function Y(t){if(await A(),!window.Stripe)throw new Error("Stripe.js not loaded");return window.Stripe(t)}async function Ee(t){const n=await(await Y(t.publishableKey)).confirmPayment({elements:t.elements,clientSecret:t.clientSecret,redirect:"if_required"});n.error?t.onError({message:n.error.message||"Payment failed"}):n.paymentIntent&&t.onSuccess({paymentIntentId:n.paymentIntent.id,status:n.paymentIntent.status})}async function W(t){if(await z(),!window.MonnifySDK)throw new Error("Monnify SDK not loaded");window.MonnifySDK.initialize({amount:t.amount,currency:t.currency,reference:t.reference,customerName:t.customerName,customerEmail:t.customerEmail,customerMobileNumber:t.customerPhone,apiKey:t.apiKey,contractCode:t.contractCode,paymentDescription:t.paymentDescription||"Payment",isTestMode:t.isTestMode??!1,metadata:t.metadata,onComplete:o=>{o.status==="SUCCESS"?t.onSuccess({transactionReference:o.transactionReference,paymentReference:o.paymentReference,...o}):t.onError?.({message:o.message||"Payment failed"})},onClose:t.onClose})}async function G(t,o){t.onInitiated();try{const n=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({phone_number:t.phoneNumber,amount:t.amount,reference:t.reference,description:t.description})});if(!n.ok){const d=(await n.json().catch(()=>({}))).message||"Failed to initiate M-Pesa payment";return t.onError({message:d}),{status:"failed",message:d}}const l=await n.json();return{status:"initiated",message:"Please check your phone and enter your M-Pesa PIN to complete the payment.",transactionId:l.checkout_request_id||l.transaction_id}}catch(n){const l=n instanceof Error?n.message:"Network error";return t.onError({message:l}),{status:"failed",message:l}}}const we=["disabled"],Pe={key:0,class:"reevit-spinner"},Ce={class:"reevit-modal-body"},Se={key:0,class:"reevit-loading-state"},_e={key:1,class:"reevit-error-state"},ge={key:2,class:"reevit-success-state"},Ie={key:1,class:"reevit-method-form-container"},Ne={key:2,class:"reevit-card-info"},Me=["disabled"],Re={key:0,class:"reevit-spinner"},Ve={key:1},Be=e.defineComponent({__name:"ReevitCheckout",props:{publicKey:{},amount:{},currency:{},email:{},phone:{},reference:{},metadata:{},paymentMethods:{},theme:{},isOpen:{type:Boolean},apiBaseUrl:{},initialPaymentIntent:{}},emits:["success","error","close"],setup(t,{emit:o}){const n=t,l=o,{status:r,paymentIntent:d,selectedMethod:u,error:i,isLoading:p,isReady:m,initialize:a,selectMethod:h,handlePspSuccess:E,handlePspError:P,close:R}=L({config:{publicKey:n.publicKey,amount:n.amount,currency:n.currency,email:n.email,phone:n.phone,reference:n.reference,metadata:n.metadata,paymentMethods:n.paymentMethods,initialPaymentIntent:n.initialPaymentIntent},apiBaseUrl:n.apiBaseUrl,onSuccess:c=>l("success",c),onError:c=>l("error",c),onClose:()=>l("close")}),w=e.ref(n.isOpen??!1);e.watch(()=>n.isOpen,c=>{c!==void 0&&(w.value=c)});const I=()=>{w.value=!0,!d.value&&r.value==="idle"&&a()};e.watch([w,d,u],([c,s,y])=>{c&&s&&y&&y==="card"&&S(null)});const C=()=>{w.value=!1,R()},V=c=>{h(c)},S=async c=>{const s=d.value;if(!s)return;const y=s.recommendedPsp;try{if(y==="paystack")await K({key:n.publicKey,email:n.email||"",amount:n.amount,currency:n.currency,ref:s.id,onSuccess:f=>E(f),onClose:()=>{}});else if(y==="hubtel")await H({clientId:s.pspCredentials?.merchantAccount||n.publicKey,purchaseDescription:`Payment for ${n.amount} ${n.currency}`,amount:n.amount,customerPhone:c?.phone||n.phone,customerEmail:n.email,hubtelSessionToken:s.id,onSuccess:f=>E(f),onClose:()=>{}});else if(y==="flutterwave")await q({public_key:n.publicKey,tx_ref:s.id,amount:n.amount,currency:n.currency,customer:{email:n.email||"",phone_number:c?.phone||n.phone},callback:f=>E(f),onclose:()=>{}});else if(y==="monnify")await W({apiKey:s.pspPublicKey||n.publicKey,contractCode:n.metadata?.contract_code||n.publicKey,amount:n.amount,currency:n.currency,reference:s.reference||s.id,customerName:n.metadata?.customer_name||n.email||"",customerEmail:n.email||"",customerPhone:c?.phone||n.phone,metadata:n.metadata,onSuccess:f=>E(f),onClose:()=>{}});else if(y==="mpesa"){const f=`${n.apiBaseUrl||"https://api.reevit.io"}/v1/payments/${s.id}/mpesa`;await G({phoneNumber:c?.phone||n.phone||"",amount:n.amount,reference:s.reference||s.id,description:`Payment ${s.reference||""}`,onInitiated:()=>{},onSuccess:k=>E(k),onError:k=>P({code:"MPESA_ERROR",message:k.message})},f)}else P(y==="stripe"?{code:"STRIPE_NOT_IMPLEMENTED",message:"Stripe integration requires custom Elements setup. Please use the React SDK or implement custom Stripe Elements."}:{code:"UNSUPPORTED_PSP",message:`Payment provider "${y}" is not supported in this checkout.`})}catch(f){P({code:"BRIDGE_ERROR",message:f instanceof Error?f.message:"Failed to open payment gateway"})}},B=e.computed(()=>v.createThemeVariables(n.theme||{}));e.watch(w,c=>{c?document.body.style.overflow="hidden":document.body.style.overflow=""}),e.onUnmounted(()=>{document.body.style.overflow=""});const b=e.computed(()=>r.value),N=e.computed(()=>i.value),_=e.computed(()=>u.value),g=e.computed(()=>p.value),T=e.computed(()=>m.value);return(c,s)=>(e.openBlock(),e.createElementBlock("div",{class:"reevit-sdk-container",style:e.normalizeStyle(B.value)},[e.renderSlot(c.$slots,"default",{open:I,isLoading:g.value},()=>[e.createElementVNode("button",{type:"button",class:"reevit-pay-button",onClick:I,disabled:g.value},[g.value?(e.openBlock(),e.createElementBlock("span",Pe)):e.renderSlot(c.$slots,"button-text",{key:1},()=>[s[1]||(s[1]=e.createTextVNode("Pay Now",-1))])],8,we)]),(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[w.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"reevit-modal-overlay",onClick:e.withModifiers(C,["self"])},[e.createElementVNode("div",{class:e.normalizeClass(["reevit-modal-content",{"reevit-modal--dark":n.theme?.darkMode}])},[e.createElementVNode("button",{class:"reevit-modal-close",onClick:C,"aria-label":"Close"}," × "),s[9]||(s[9]=e.createElementVNode("div",{class:"reevit-modal-header"},[e.createElementVNode("img",{src:"https://i.imgur.com/bzUR5Lm.png",alt:"Reevit",class:"reevit-modal__logo"})],-1)),e.createElementVNode("div",Ce,[b.value==="loading"?(e.openBlock(),e.createElementBlock("div",Se,[...s[2]||(s[2]=[e.createElementVNode("div",{class:"reevit-spinner reevit-spinner--large"},null,-1),e.createElementVNode("p",null,"Initializing payment...",-1)])])):b.value==="failed"&&N.value?(e.openBlock(),e.createElementBlock("div",_e,[s[3]||(s[3]=e.createElementVNode("div",{class:"reevit-error-icon"},"⚠️",-1)),s[4]||(s[4]=e.createElementVNode("h3",null,"Payment Failed",-1)),e.createElementVNode("p",null,e.toDisplayString(N.value.message),1),e.createElementVNode("button",{class:"reevit-retry-btn",onClick:s[0]||(s[0]=y=>e.unref(a)())},"Retry")])):b.value==="success"?(e.openBlock(),e.createElementBlock("div",ge,[s[5]||(s[5]=e.createElementVNode("div",{class:"reevit-success-icon"},"✅",-1)),s[6]||(s[6]=e.createElementVNode("h3",null,"Payment Successful",-1)),s[7]||(s[7]=e.createElementVNode("p",null,"Thank you for your payment.",-1)),e.createElementVNode("button",{class:"reevit-done-btn",onClick:C},"Done")])):T.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[b.value==="ready"||b.value==="method_selected"||b.value==="processing"?(e.openBlock(),e.createBlock(D,{key:0,methods:n.paymentMethods||["card","mobile_money"],selected:_.value,amount:n.amount,currency:n.currency,provider:c.psp,onSelect:V},null,8,["methods","selected","amount","currency","provider"])):e.createCommentVNode("",!0),(b.value==="method_selected"||b.value==="processing")&&_.value==="mobile_money"?(e.openBlock(),e.createElementBlock("div",Ie,[e.createVNode(U,{"initial-phone":n.phone,loading:b.value==="processing",onSubmit:S},null,8,["initial-phone","loading"])])):e.createCommentVNode("",!0),(b.value==="method_selected"||b.value==="processing")&&_.value==="card"?(e.openBlock(),e.createElementBlock("div",Ne,[s[8]||(s[8]=e.createElementVNode("p",{class:"reevit-info-text"},"You will be redirected to our secure payment partner to complete your card payment.",-1)),e.createElementVNode("button",{class:"reevit-submit-btn",onClick:S,disabled:b.value==="processing"},[b.value==="processing"?(e.openBlock(),e.createElementBlock("span",Re)):(e.openBlock(),e.createElementBlock("span",Ve,"Proceed to Card Payment"))],8,Me)])):e.createCommentVNode("",!0)],64)):e.createCommentVNode("",!0)]),s[10]||(s[10]=e.createElementVNode("div",{class:"reevit-modal-footer"},[e.createElementVNode("div",{class:"reevit-trust-badges"},[e.createElementVNode("span",null,"PCI DSS Compliant"),e.createElementVNode("span",null,"•"),e.createElementVNode("span",null,"SSL Secure")])],-1))],2)])):e.createCommentVNode("",!0)]))],4))}});Object.defineProperty(exports,"ReevitAPIClient",{enumerable:!0,get:()=>v.ReevitAPIClient});Object.defineProperty(exports,"cn",{enumerable:!0,get:()=>v.cn});Object.defineProperty(exports,"createReevitClient",{enumerable:!0,get:()=>v.createReevitClient});Object.defineProperty(exports,"detectCountryFromCurrency",{enumerable:!0,get:()=>v.detectCountryFromCurrency});Object.defineProperty(exports,"detectNetwork",{enumerable:!0,get:()=>v.detectNetwork});Object.defineProperty(exports,"formatAmount",{enumerable:!0,get:()=>v.formatAmount});Object.defineProperty(exports,"formatPhone",{enumerable:!0,get:()=>v.formatPhone});Object.defineProperty(exports,"validatePhone",{enumerable:!0,get:()=>v.validatePhone});exports.MobileMoneyForm=U;exports.PaymentMethodSelector=D;exports.ReevitCheckout=Be;exports.confirmStripePayment=Ee;exports.createStripeInstance=Y;exports.initiateMPesaSTKPush=G;exports.loadFlutterwaveScript=j;exports.loadHubtelScript=ke;exports.loadMonnifyScript=z;exports.loadPaystackScript=F;exports.loadStripeScript=A;exports.openFlutterwaveModal=q;exports.openHubtelPopup=H;exports.openMonnifyModal=W;exports.openPaystackPopup=K;exports.useReevit=L;
101
+ `,document.head.appendChild(t),this.stylesInjected=!0}}const G=new Map;function j(o,t){const n=G.get(t);if(n)return n;const s=new Promise((c,l)=>{if(document.getElementById(t)){c();return}const d=document.createElement("script");d.id=t,d.src=o,d.async=!0,d.onload=()=>c(),d.onerror=()=>l(new Error(`Failed to load ${t} script`)),document.head.appendChild(d)});return G.set(t,s),s}function Q(){return j("https://js.paystack.co/v1/inline.js","paystack-script")}function Ye(){return Promise.resolve()}function X(){return j("https://checkout.flutterwave.com/v3.js","flutterwave-script")}function Z(){return j("https://js.stripe.com/v3/","stripe-script")}function ee(){return j("https://sdk.monnify.com/plugin/monnify.js","monnify-script")}async function te(o){if(await Q(),!window.PaystackPop)throw new Error("Paystack script not loaded");window.PaystackPop.setup({key:o.key,email:o.email,amount:o.amount,currency:o.currency,ref:o.ref,metadata:o.metadata,callback:o.onSuccess,onClose:o.onClose}).openIframe()}async function oe(o){const t=new qe,n=o.preferredMethod==="mobile_money"?"momo":o.preferredMethod==="card"?"card":void 0,s={amount:o.amount,purchaseDescription:o.purchaseDescription,customerPhoneNumber:o.customerPhone||"",clientReference:`hubtel_${Date.now()}`,...n?{paymentMethod:n}:{}},c=o.hubtelSessionToken||o.basicAuth||"",l={branding:"enabled",callbackUrl:o.callbackUrl||(typeof window<"u"?window.location.href:""),merchantAccount:typeof o.clientId=="string"?parseInt(o.clientId,10):o.clientId,basicAuth:c,...n?{paymentMethod:n}:{}};t.openModal({purchaseInfo:s,config:l,callBacks:{onPaymentSuccess:d=>{o.onSuccess(d),t.closePopUp()},onPaymentFailure:()=>{o.onClose()},onClose:()=>{o.onClose()}}})}async function ne(o){if(await X(),!window.FlutterwaveCheckout)throw new Error("Flutterwave script not loaded");window.FlutterwaveCheckout({public_key:o.public_key,tx_ref:o.tx_ref,amount:o.amount,currency:o.currency,customer:o.customer,payment_options:o.payment_options,customizations:o.customizations,callback:o.callback,onclose:o.onclose})}async function re(o){if(await Z(),!window.Stripe)throw new Error("Stripe.js not loaded");return window.Stripe(o)}async function Ge(o){const n=await(await re(o.publishableKey)).confirmPayment({elements:o.elements,clientSecret:o.clientSecret,redirect:"if_required"});n.error?o.onError({message:n.error.message||"Payment failed"}):n.paymentIntent&&o.onSuccess({paymentIntentId:n.paymentIntent.id,status:n.paymentIntent.status})}async function ae(o){if(await ee(),!window.MonnifySDK)throw new Error("Monnify SDK not loaded");window.MonnifySDK.initialize({amount:o.amount,currency:o.currency,reference:o.reference,customerName:o.customerName,customerEmail:o.customerEmail,customerMobileNumber:o.customerPhone,apiKey:o.apiKey,contractCode:o.contractCode,paymentDescription:o.paymentDescription||"Payment",isTestMode:o.isTestMode??!1,metadata:o.metadata,onComplete:t=>{t.status==="SUCCESS"?o.onSuccess({transactionReference:t.transactionReference,paymentReference:t.paymentReference,...t}):o.onError?.({message:t.message||"Payment failed"})},onClose:o.onClose})}async function se(o,t){o.onInitiated();try{const n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({phone_number:o.phoneNumber,amount:o.amount,reference:o.reference,description:o.description})});if(!n.ok){const l=(await n.json().catch(()=>({}))).message||"Failed to initiate M-Pesa payment";return o.onError({message:l}),{status:"failed",message:l}}const s=await n.json();return{status:"initiated",message:"Please check your phone and enter your M-Pesa PIN to complete the payment.",transactionId:s.checkout_request_id||s.transaction_id}}catch(n){const s=n instanceof Error?n.message:"Network error";return o.onError({message:s}),{status:"failed",message:s}}}const Je=["disabled"],We={key:0,class:"reevit-spinner"},Qe={class:"reevit-modal-header"},Xe={class:"reevit-modal__branding"},Ze=["src","alt"],et={key:0,class:"reevit-modal__brand-name"},tt={class:"reevit-modal-body"},ot={key:0,class:"reevit-loading-state"},nt={key:1,class:"reevit-error-state"},rt={key:2,class:"reevit-success-state"},at={key:3,class:"reevit-method-step reevit-animate-slide-up"},st={key:0,class:"reevit-inline-action reevit-animate-fade-in"},lt=["disabled"],it={key:1,class:"reevit-inline-action reevit-animate-fade-in"},ct={class:"reevit-inline-action__hint"},dt=["disabled"],ut={key:0,class:"reevit-method-step__actions reevit-animate-slide-up"},mt={key:0},pt={key:1,class:"reevit-card-info reevit-animate-fade-in"},vt={class:"reevit-info-text"},yt=["disabled"],ht={key:0,class:"reevit-spinner"},bt={key:1},ft=e.defineComponent({__name:"ReevitCheckout",props:{publicKey:{},amount:{},currency:{},email:{},phone:{},customerName:{},reference:{},metadata:{},customFields:{},paymentLinkCode:{},paymentMethods:{},theme:{},isOpen:{type:Boolean},apiBaseUrl:{},initialPaymentIntent:{}},emits:["success","error","close"],setup(o,{emit:t}){const n=o,s=t,{status:c,paymentIntent:l,selectedMethod:d,error:i,isLoading:p,isReady:u,initialize:a,selectMethod:f,handlePspSuccess:I,handlePspError:N,close:K,reset:O}=J({config:{publicKey:n.publicKey,amount:n.amount,currency:n.currency,email:n.email,phone:n.phone,customerName:n.customerName,reference:n.reference,metadata:n.metadata,customFields:n.customFields,paymentLinkCode:n.paymentLinkCode,paymentMethods:n.paymentMethods,initialPaymentIntent:n.initialPaymentIntent},apiBaseUrl:n.apiBaseUrl,onSuccess:m=>s("success",m),onError:m=>s("error",m),onClose:()=>s("close")}),B=e.ref(n.isOpen??!1),C=e.ref(null),L={hubtel:"Hubtel",paystack:"Paystack",flutterwave:"Flutterwave",monnify:"Monnify",mpesa:"M-Pesa",stripe:"Stripe"};e.watch(()=>n.isOpen,m=>{m!==void 0&&(B.value=m)});const U=()=>{B.value=!0,C.value=null,!l.value&&c.value==="idle"&&a()};e.watch([B,l,d],([m,r,y])=>{if(m&&r&&y){const h=(C.value||r.recommendedPsp||"paystack").toLowerCase().includes("mpesa");(y==="card"||y==="mobile_money"&&(!h||n.phone))&&v(null)}});const F=()=>{B.value=!1,K(),C.value=null},V=e.computed(()=>n.paymentMethods?.length?n.paymentMethods:["card","mobile_money"]),R=e.computed(()=>{const m=l.value;if(!m)return[];const r=new Set(V.value),y=(m.availableProviders||[]).map(h=>{const x=h.provider.toLowerCase().includes("hubtel")?h.methods.filter(T=>T==="card"||T==="mobile_money"):h.methods;return{...h,methods:x.filter(T=>r.has(T))}}).filter(h=>h.methods.length>0);if(y.length>0)return y;const E=m.recommendedPsp.toLowerCase().includes("hubtel")?V.value.filter(h=>h==="card"||h==="mobile_money"):V.value;return[{provider:m.recommendedPsp,name:L[m.recommendedPsp]||m.recommendedPsp,methods:E}]}),g=e.computed(()=>{const m=l.value;return C.value||m?.recommendedPsp||"paystack"}),D=e.computed(()=>{const m=R.value.find(r=>r.provider===g.value);return m?.methods.length?m.methods:V.value});e.watch(()=>R.value,m=>{m.length&&(C.value&&m.some(r=>r.provider===C.value)||(m.length===1?C.value=m[0].provider:C.value=null))},{immediate:!0}),e.watch([D,d],([m,r])=>{!r||m.length===0||m.includes(r)||f(m[0])});const H=m=>{if(m===C.value){C.value=null,O();return}const r=R.value.find(h=>h.provider===m),y=r?.methods.length?r.methods:V.value,E=d.value&&y.includes(d.value)?d.value:y[0];C.value=m,O(),a(E,{preferredProvider:m,allowedProviders:[m]})},z=m=>{f(m)},v=async m=>{const r=l.value;if(!r)return;const y=g.value;try{if(y==="paystack")await te({key:r.pspPublicKey||n.publicKey||"",email:n.email||"",amount:n.amount,currency:n.currency,ref:r.id,onSuccess:E=>I(E),onClose:()=>{}});else if(y==="hubtel"){const E=_.createReevitClient({publicKey:n.publicKey,baseUrl:n.apiBaseUrl}),{data:h,error:x}=await E.createHubtelSession(r.id,r.clientSecret);if(x||!h?.basicAuth){N({code:x?.code||"hubtel_session_error",message:x?.message||"Failed to create Hubtel session"});return}const T=P.value==="card"||P.value==="mobile_money"?P.value:void 0;await oe({clientId:h.merchantAccount||r.pspCredentials?.merchantAccount||n.publicKey||"",purchaseDescription:`Payment for ${n.amount} ${n.currency}`,amount:n.amount,customerPhone:m?.phone||n.phone,customerEmail:n.email,basicAuth:h.basicAuth,preferredMethod:T,onSuccess:le=>I(le),onClose:()=>{}})}else if(y==="flutterwave")await ne({public_key:r.pspPublicKey||n.publicKey||"",tx_ref:r.id,amount:n.amount,currency:n.currency,customer:{email:n.email||"",phone_number:m?.phone||n.phone},callback:E=>I(E),onclose:()=>{}});else if(y==="monnify"){const E=r.pspPublicKey||n.publicKey||"",h=n.metadata?.contract_code||n.publicKey||"";if(!E||!h){N({code:"MONNIFY_CONFIG_MISSING",message:"Monnify configuration is missing. Please check your API key and contract code."});return}await ae({apiKey:E,contractCode:h,amount:n.amount,currency:n.currency,reference:r.reference||r.id,customerName:n.metadata?.customer_name||n.email||"",customerEmail:n.email||"",customerPhone:m?.phone||n.phone,metadata:n.metadata,onSuccess:x=>I(x),onClose:()=>{}})}else if(y==="mpesa"){const E=`${n.apiBaseUrl||"https://api.reevit.io"}/v1/payments/${r.id}/mpesa`;await se({phoneNumber:m?.phone||n.phone||"",amount:n.amount,reference:r.reference||r.id,description:`Payment ${r.reference||""}`,onInitiated:()=>{},onSuccess:h=>I(h),onError:h=>N({code:"MPESA_ERROR",message:h.message})},E)}else N(y==="stripe"?{code:"STRIPE_NOT_IMPLEMENTED",message:"Stripe integration requires custom Elements setup. Please use the React SDK or implement custom Stripe Elements."}:{code:"UNSUPPORTED_PSP",message:`Payment provider "${y}" is not supported in this checkout.`})}catch(E){N({code:"BRIDGE_ERROR",message:E instanceof Error?E.message:"Failed to open payment gateway"})}},k=e.computed(()=>({...l.value?.branding||{},...n.theme||{}})),S=e.computed(()=>_.createThemeVariables(k.value)),w=e.computed(()=>k.value?.darkMode);e.watch(B,m=>{m?document.body.style.overflow="hidden":document.body.style.overflow=""}),e.onUnmounted(()=>{document.body.style.overflow=""});const b=e.computed(()=>c.value),A=e.computed(()=>i.value),P=e.computed(()=>d.value),M=e.computed(()=>p.value),$=e.computed(()=>u.value);return(m,r)=>(e.openBlock(),e.createElementBlock("div",{class:"reevit-sdk-container",style:e.normalizeStyle(S.value)},[e.renderSlot(m.$slots,"default",{open:U,isLoading:M.value},()=>[e.createElementVNode("button",{type:"button",class:"reevit-pay-button",onClick:U,disabled:M.value},[M.value?(e.openBlock(),e.createElementBlock("span",We)):e.renderSlot(m.$slots,"button-text",{key:1},()=>[r[5]||(r[5]=e.createTextVNode("Pay Now",-1))])],8,Je)]),(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[B.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"reevit-modal-overlay",onClick:e.withModifiers(F,["self"])},[e.createElementVNode("div",{class:e.normalizeClass(["reevit-modal-content",{"reevit-modal--dark":w.value}]),style:e.normalizeStyle(S.value)},[e.createElementVNode("button",{class:"reevit-modal-close",onClick:F,"aria-label":"Close"}," × "),e.createElementVNode("div",Qe,[e.createElementVNode("div",Xe,[e.createElementVNode("img",{src:k.value.logoUrl||"https://i.imgur.com/bzUR5Lm.png",alt:k.value.companyName||"Reevit",class:"reevit-modal__logo"},null,8,Ze),k.value.companyName?(e.openBlock(),e.createElementBlock("span",et,e.toDisplayString(k.value.companyName),1)):e.createCommentVNode("",!0)])]),e.createElementVNode("div",tt,[b.value==="loading"?(e.openBlock(),e.createElementBlock("div",ot,[...r[6]||(r[6]=[e.createElementVNode("div",{class:"reevit-spinner reevit-spinner--large"},null,-1),e.createElementVNode("p",null,"Initializing payment...",-1)])])):b.value==="failed"&&A.value?(e.openBlock(),e.createElementBlock("div",nt,[r[7]||(r[7]=e.createElementVNode("div",{class:"reevit-error-icon"},"⚠️",-1)),r[8]||(r[8]=e.createElementVNode("h3",null,"Payment Failed",-1)),e.createElementVNode("p",null,e.toDisplayString(A.value.message),1),e.createElementVNode("button",{class:"reevit-retry-btn",onClick:r[0]||(r[0]=y=>e.unref(a)())},"Retry")])):b.value==="success"?(e.openBlock(),e.createElementBlock("div",rt,[r[9]||(r[9]=e.createElementVNode("div",{class:"reevit-success-icon"},"✅",-1)),r[10]||(r[10]=e.createElementVNode("h3",null,"Payment Successful",-1)),r[11]||(r[11]=e.createElementVNode("p",null,"Thank you for your payment.",-1)),e.createElementVNode("button",{class:"reevit-done-btn",onClick:F},"Done")])):$.value?(e.openBlock(),e.createElementBlock("div",at,[R.value.length>1?(e.openBlock(),e.createBlock(W,{key:0,providers:R.value,"selected-provider":C.value,disabled:M.value,theme:k.value,"selected-method":P.value,onSelect:H,onMethodSelect:z},{"method-content":e.withCtx(()=>[P.value==="card"?(e.openBlock(),e.createElementBlock("div",st,[r[12]||(r[12]=e.createElementVNode("p",{class:"reevit-inline-action__hint"}," You'll be redirected to complete your card payment securely. ",-1)),e.createElementVNode("button",{class:"reevit-btn reevit-btn--primary",onClick:r[1]||(r[1]=y=>v(null)),disabled:b.value==="processing"}," Pay with Card ",8,lt)])):P.value==="mobile_money"?(e.openBlock(),e.createElementBlock("div",it,[g.value.includes("mpesa")&&!n.phone?(e.openBlock(),e.createBlock(q,{key:0,"initial-phone":n.phone,loading:b.value==="processing","hide-cancel":"",onSubmit:v},null,8,["initial-phone","loading"])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("p",ct,e.toDisplayString(g.value.includes("hubtel")?"Opens the Hubtel checkout with Mobile Money selected.":`Continue to pay securely with Mobile Money via ${L[g.value]||g.value}.`),1),e.createElementVNode("button",{class:"reevit-btn reevit-btn--primary",onClick:r[2]||(r[2]=y=>v(null)),disabled:b.value==="processing"},e.toDisplayString(g.value.includes("hubtel")?"Continue with Hubtel":"Pay with Mobile Money"),9,dt)],64))])):e.createCommentVNode("",!0)]),_:1},8,["providers","selected-provider","disabled","theme","selected-method"])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createVNode(Y,{methods:D.value,selected:P.value,provider:g.value,"show-label":!1,layout:"grid",onSelect:z},null,8,["methods","selected","provider"]),P.value?(e.openBlock(),e.createElementBlock("div",ut,[P.value==="mobile_money"&&g.value.includes("mpesa")&&!n.phone?(e.openBlock(),e.createElementBlock("div",mt,[e.createVNode(q,{"initial-phone":n.phone,loading:b.value==="processing",onSubmit:v,onCancel:r[3]||(r[3]=y=>e.unref(f)(null))},null,8,["initial-phone","loading"])])):(e.openBlock(),e.createElementBlock("div",pt,[e.createElementVNode("p",vt,e.toDisplayString(P.value==="card"?"You will be redirected to complete your card payment securely.":g.value.includes("hubtel")?"Opens the Hubtel checkout with Mobile Money selected.":`Continue to pay securely via ${L[g.value]||g.value}.`),1),e.createElementVNode("button",{class:"reevit-submit-btn",onClick:r[4]||(r[4]=y=>v(null)),disabled:b.value==="processing"},[b.value==="processing"?(e.openBlock(),e.createElementBlock("span",ht)):(e.openBlock(),e.createElementBlock("span",bt,e.toDisplayString(P.value==="card"?"Pay with Card":g.value.includes("hubtel")?"Continue with Hubtel":"Pay with Mobile Money"),1))],8,yt)]))])):e.createCommentVNode("",!0)],64))])):e.createCommentVNode("",!0)]),r[13]||(r[13]=e.createElementVNode("div",{class:"reevit-modal-footer"},[e.createElementVNode("div",{class:"reevit-trust-badges"},[e.createElementVNode("span",null,"PCI DSS Compliant"),e.createElementVNode("span",null,"•"),e.createElementVNode("span",null,"SSL Secure")])],-1))],6)])):e.createCommentVNode("",!0)]))],4))}});Object.defineProperty(exports,"ReevitAPIClient",{enumerable:!0,get:()=>_.ReevitAPIClient});Object.defineProperty(exports,"cn",{enumerable:!0,get:()=>_.cn});Object.defineProperty(exports,"createReevitClient",{enumerable:!0,get:()=>_.createReevitClient});Object.defineProperty(exports,"detectCountryFromCurrency",{enumerable:!0,get:()=>_.detectCountryFromCurrency});Object.defineProperty(exports,"detectNetwork",{enumerable:!0,get:()=>_.detectNetwork});Object.defineProperty(exports,"formatAmount",{enumerable:!0,get:()=>_.formatAmount});Object.defineProperty(exports,"formatPhone",{enumerable:!0,get:()=>_.formatPhone});Object.defineProperty(exports,"validatePhone",{enumerable:!0,get:()=>_.validatePhone});exports.MobileMoneyForm=q;exports.PaymentMethodSelector=Y;exports.ProviderSelector=W;exports.ReevitCheckout=ft;exports.confirmStripePayment=Ge;exports.createStripeInstance=re;exports.initiateMPesaSTKPush=se;exports.loadFlutterwaveScript=X;exports.loadHubtelScript=Ye;exports.loadMonnifyScript=ee;exports.loadPaystackScript=Q;exports.loadStripeScript=Z;exports.openFlutterwaveModal=ne;exports.openHubtelPopup=oe;exports.openMonnifyModal=ae;exports.openPaystackPopup=te;exports.useReevit=J;