@reevit/vue 0.4.6 → 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.
@@ -49,6 +49,7 @@ export declare function useReevit(options: UseReevitOptions): {
49
49
  readonly fontFamily?: string | undefined;
50
50
  readonly darkMode?: boolean | undefined;
51
51
  readonly logoUrl?: string | undefined;
52
+ readonly companyName?: string | undefined;
52
53
  readonly pspSelectorBgColor?: string | undefined;
53
54
  readonly pspSelectorTextColor?: string | undefined;
54
55
  readonly pspSelectorBorderColor?: string | undefined;
@@ -94,6 +95,7 @@ export declare function useReevit(options: UseReevitOptions): {
94
95
  readonly fontFamily?: string | undefined;
95
96
  readonly darkMode?: boolean | undefined;
96
97
  readonly logoUrl?: string | undefined;
98
+ readonly companyName?: string | undefined;
97
99
  readonly pspSelectorBgColor?: string | undefined;
98
100
  readonly pspSelectorTextColor?: string | undefined;
99
101
  readonly pspSelectorBorderColor?: string | undefined;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),k=require("@reevit/core"),le="https://api.reevit.io";function ce(t,o){return{code:o?.code||"payment_link_error",message:o?.message||"Payment link request failed",recoverable:!0,details:{httpStatus:t.status,...o?.details||{}}}}function de(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 ue(t){const o=t.toLowerCase().trim();return o==="card"?"card":o==="mobile_money"||o==="momo"||o==="mobilemoney"?"mobile_money":o==="bank"||o==="bank_transfer"||o==="transfer"?"bank_transfer":null}function me(t){if(!(!t||t.length===0))return t.map(o=>{const n=o.methods.map(c=>ue(c)).filter(Boolean);return{provider:o.provider,name:o.name,methods:n,countries:o.countries}}).filter(o=>o.methods.length>0)}function pe(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:de(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,availableProviders:me(t.available_psps),branding:t.branding}}function J(t){const{config:o,onSuccess:n,onError:c,onClose:i,onStateChange:m,apiBaseUrl:u}=t,s=e.ref(k.createInitialState());if(o.initialPaymentIntent){const y=o.initialPaymentIntent;s.value={...s.value,status:"ready",paymentIntent:y,selectedMethod:y.availableMethods?.length===1?y.availableMethods[0]:null}}const p=new k.ReevitAPIClient({publicKey:o.publicKey,baseUrl:u}),r=y=>{s.value=k.reevitReducer(s.value,y)};e.watch(()=>s.value.status,y=>{m?.(y)});const l=async(y,f)=>{r({type:"INIT_START"});try{const E=o.reference||k.generateReference(),C=k.detectCountryFromCurrency(o.currency),M=o.paymentMethods&&o.paymentMethods.length===1?o.paymentMethods[0]:void 0,S=y??M;let L,P;if(o.paymentLinkCode){const N=await fetch(`${u||le}/v1/pay/${o.paymentLinkCode}/pay`,{method:"POST",headers:{"Content-Type":"application/json","Idempotency-Key":`${Date.now()}-${Math.random().toString(36).substring(2,15)}`},body:JSON.stringify({amount:o.amount,email:o.email||"",name:o.customerName||"",phone:o.phone||"",method:S,country:C,provider:f?.preferredProvider||f?.allowedProviders?.[0],custom_fields:o.customFields})}),d=await N.json().catch(()=>({}));N.ok?L=d:P=ce(N,d)}else{const N=await p.createPaymentIntent({...o,reference:E},S,C,{preferredProviders:f?.preferredProvider?[f.preferredProvider]:void 0,allowedProviders:f?.allowedProviders});L=N.data,P=N.error}if(P){r({type:"INIT_ERROR",payload:P}),c?.(P);return}if(!L){const N={code:"INIT_FAILED",message:"No data received from API",recoverable:!0};r({type:"INIT_ERROR",payload:N}),c?.(N);return}const T=pe(L,{...o,reference:E});r({type:"INIT_SUCCESS",payload:T})}catch(E){const C={code:"INIT_FAILED",message:E instanceof Error?E.message:"Failed to initialize checkout",recoverable:!0,originalError:E};r({type:"INIT_ERROR",payload:C}),c?.(C)}},h=y=>{r({type:"SELECT_METHOD",payload:y})},I=async y=>{if(!(!s.value.paymentIntent||!s.value.selectedMethod)){r({type:"PROCESS_START"});try{let f;if(s.value.paymentIntent.clientSecret){const{data:C,error:M}=await p.confirmPaymentIntent(s.value.paymentIntent.id,s.value.paymentIntent.clientSecret);if(M){r({type:"PROCESS_ERROR",payload:M}),c?.(M);return}f=C}else{const{data:C,error:M}=await p.confirmPayment(s.value.paymentIntent.id);if(M){r({type:"PROCESS_ERROR",payload:M}),c?.(M);return}f=C}const E={paymentId:s.value.paymentIntent.id,reference:y.reference||s.value.paymentIntent.reference||s.value.paymentIntent.metadata?.reference||"",amount:s.value.paymentIntent.amount,currency:s.value.paymentIntent.currency,paymentMethod:s.value.selectedMethod,psp:s.value.paymentIntent.recommendedPsp,pspReference:y.pspReference||f?.provider_ref_id||"",status:"success",metadata:y};r({type:"PROCESS_SUCCESS",payload:E}),n?.(E)}catch(f){const E={code:"PAYMENT_FAILED",message:f instanceof Error?f.message:"Payment failed",recoverable:!0,originalError:f};r({type:"PROCESS_ERROR",payload:E}),c?.(E)}}},B=async y=>{await I(y)},K=y=>{r({type:"PROCESS_ERROR",payload:y}),c?.(y)},U=()=>{r({type:"RESET"})},V=async()=>{if(s.value.paymentIntent&&s.value.status!=="success")try{await p.cancelPaymentIntent(s.value.paymentIntent.id)}catch{}r({type:"CLOSE"}),i?.()},g=e.computed(()=>s.value.status),F=e.computed(()=>s.value.paymentIntent),A=e.computed(()=>s.value.selectedMethod),D=e.computed(()=>s.value.error),R=e.computed(()=>s.value.result),$=e.computed(()=>s.value.status==="loading"||s.value.status==="processing"),w=e.computed(()=>s.value.status==="ready"||s.value.status==="method_selected"||s.value.status==="processing"),j=e.computed(()=>s.value.status==="success"),H=e.computed(()=>s.value.error?.recoverable??!1);return{status:e.readonly(g),paymentIntent:e.readonly(F),selectedMethod:e.readonly(A),error:e.readonly(D),result:e.readonly(R),initialize:l,selectMethod:h,processPayment:I,handlePspSuccess:B,handlePspError:K,reset:U,close:V,isLoading:e.readonly($),isReady:e.readonly(w),isComplete:e.readonly(j),canRetry:e.readonly(H)}}const ve={key:0,class:"reevit-method-selector__label"},ye=["onClick"],he={class:"reevit-method-option__icon-wrapper"},be={class:"reevit-method-option__icon"},fe={class:"reevit-method-option__content"},ke={class:"reevit-method-option__label"},_e={key:0,class:"reevit-method-option__description"},Ee={key:0,class:"reevit-method-option__check"},Pe={key:1,class:"reevit-method-option__chevron"},Y=e.defineComponent({__name:"PaymentMethodSelector",props:{methods:{},selected:{},provider:{},layout:{},showLabel:{type:Boolean}},emits:["select"],setup(t,{emit:o}){const n=t,{showLabel:c=!0}=n,i=o,m=e.computed(()=>(n.layout||"list")==="grid"),u=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(s=>n.methods.includes(s.id)));return(s,p)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["reevit-method-selector",{"reevit-method-selector--grid":m.value}])},[e.unref(c)?(e.openBlock(),e.createElementBlock("div",ve,"Select payment method")):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["reevit-method-selector__options",m.value?"reevit-method-selector__options--grid":"reevit-method-selector__options--list"])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,(r,l)=>(e.openBlock(),e.createElementBlock("button",{key:r.id,type:"button",class:e.normalizeClass(["reevit-method-option",[m.value?"reevit-method-option--grid":"reevit-method-option--list",{"reevit-method-option--selected":t.selected===r.id}]]),style:e.normalizeStyle({animationDelay:`${l*.05}s`}),onClick:h=>i("select",r.id)},[e.createElementVNode("span",he,[e.createElementVNode("span",be,e.toDisplayString(r.icon),1)]),e.createElementVNode("div",fe,[e.createElementVNode("span",ke,e.toDisplayString(r.name),1),m.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",_e,e.toDisplayString(r.description),1))]),m.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[t.selected===r.id?(e.openBlock(),e.createElementBlock("span",Ee,[...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",Pe,[...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,ye))),128))],2)],2))}}),we={class:"reevit-psp-selector"},ge={class:"reevit-psp-selector__options"},Ce=["disabled","aria-expanded","onClick"],Se={class:"reevit-psp-option__logo","aria-hidden":"true"},Me=["src"],Ne={key:1,class:"reevit-psp-option__logo-fallback"},Ie={class:"reevit-psp-option__content"},Be={class:"reevit-psp-option__name"},Ve={class:"reevit-psp-option__methods"},Re={key:0,class:"reevit-psp-accordion__content reevit-animate-fade-in"},$e={class:"reevit-psp-methods"},W=e.defineComponent({__name:"ProviderSelector",props:{providers:{},selectedProvider:{},disabled:{type:Boolean},theme:{},selectedMethod:{}},emits:["select","methodSelect"],setup(t,{emit:o}){const n=o,c={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"},i={card:"Card",mobile_money:"Mobile Money",bank_transfer:"Bank Transfer"},m=s=>s.length?s.map(p=>i[p]).join(", "):"Payment methods",u=(s,p)=>s.toLowerCase().includes("hubtel")?p.filter(r=>r==="card"||r==="mobile_money"):p;return(s,p)=>(e.openBlock(),e.createElementBlock("div",we,[p[1]||(p[1]=e.createElementVNode("div",{class:"reevit-psp-selector__label"},"Select payment provider",-1)),e.createElementVNode("div",ge,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.providers,r=>(e.openBlock(),e.createElementBlock("div",{key:r.provider,class:"reevit-psp-accordion"},[e.createElementVNode("button",{type:"button",class:e.normalizeClass(e.unref(k.cn)("reevit-psp-option",t.selectedProvider===r.provider&&"reevit-psp-option--selected",t.disabled&&"reevit-psp-option--disabled")),disabled:t.disabled,"aria-expanded":t.selectedProvider===r.provider,onClick:l=>n("select",r.provider)},[e.createElementVNode("span",Se,[c[r.provider]?(e.openBlock(),e.createElementBlock("img",{key:0,src:c[r.provider],alt:"",class:"reevit-psp-option__logo-img",loading:"lazy"},null,8,Me)):(e.openBlock(),e.createElementBlock("span",Ne,e.toDisplayString(r.name.slice(0,1).toUpperCase()),1))]),e.createElementVNode("div",Ie,[e.createElementVNode("span",Be,e.toDisplayString(r.name),1),e.createElementVNode("span",Ve,e.toDisplayString(m(u(r.provider,r.methods))),1)])],10,Ce),t.selectedProvider===r.provider?(e.openBlock(),e.createElementBlock("div",Re,[e.createElementVNode("div",$e,[e.createVNode(Y,{methods:u(r.provider,r.methods),selected:t.selectedMethod||null,provider:r.provider,"show-label":!1,layout:"list",onSelect:p[0]||(p[0]=l=>n("methodSelect",l))},null,8,["methods","selected","provider"])]),e.renderSlot(s.$slots,"method-content")])):e.createCommentVNode("",!0)]))),128))])]))}}),Le={class:"reevit-form-group"},xe=["disabled"],Te={class:"reevit-network-selector"},Oe={class:"reevit-networks-grid"},Fe=["onClick","disabled"],De={key:0,class:"reevit-error-message"},Ue={class:"reevit-momo-form__actions"},Ae=["disabled"],je=["disabled"],ze={key:0,class:"reevit-spinner"},Ke={key:1},q=e.defineComponent({__name:"MobileMoneyForm",props:{initialPhone:{},loading:{type:Boolean},hideCancel:{type:Boolean}},emits:["submit","cancel"],setup(t,{emit:o}){const n=t,c=o,i=e.ref(n.initialPhone||""),m=e.ref(null),u=e.ref(null);e.watch(i,r=>{const l=k.detectNetwork(r);l&&(m.value=l),u.value&&(u.value=null)});const s=()=>{if(!k.validatePhone(i.value)){u.value="Please enter a valid phone number";return}if(!m.value){u.value="Please select your mobile network";return}c("submit",{phone:i.value,network:m.value})},p=[{id:"mtn",name:"MTN",color:"#FFCC00"},{id:"vodafone",name:"Vodafone",color:"#E60000"},{id:"airteltigo",name:"AirtelTigo",color:"#005596"}];return(r,l)=>(e.openBlock(),e.createElementBlock("form",{class:"reevit-momo-form",onSubmit:e.withModifiers(s,["prevent"])},[e.createElementVNode("div",Le,[l[2]||(l[2]=e.createElementVNode("label",{class:"reevit-label",for:"reevit-phone"},"Phone Number",-1)),e.withDirectives(e.createElementVNode("input",{id:"reevit-phone","onUpdate:modelValue":l[0]||(l[0]=h=>i.value=h),type:"tel",class:e.normalizeClass(["reevit-input",{"reevit-input--error":u.value&&!e.unref(k.validatePhone)(i.value)}]),placeholder:"e.g. 024 123 4567",disabled:t.loading,autocomplete:"tel"},null,10,xe),[[e.vModelText,i.value]])]),e.createElementVNode("div",Te,[l[3]||(l[3]=e.createElementVNode("label",{class:"reevit-label"},"Select Network",-1)),e.createElementVNode("div",Oe,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(p,h=>e.createElementVNode("button",{key:h.id,type:"button",class:e.normalizeClass(e.unref(k.cn)("reevit-network-btn",m.value===h.id&&"reevit-network-btn--selected")),onClick:I=>m.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,Fe)),64))])]),u.value?(e.openBlock(),e.createElementBlock("p",De,e.toDisplayString(u.value),1)):e.createCommentVNode("",!0),e.createElementVNode("div",Ue,[t.hideCancel?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"reevit-btn reevit-btn--secondary",onClick:l[1]||(l[1]=h=>c("cancel")),disabled:t.loading}," Back ",8,Ae)),e.createElementVNode("button",{type:"submit",class:"reevit-btn reevit-btn--primary",disabled:t.loading||!i.value},[t.loading?(e.openBlock(),e.createElementBlock("span",ze)):(e.openBlock(),e.createElementBlock("span",Ke,"Continue"))],8,je)]),l[4]||(l[4]=e.createElementVNode("p",{class:"reevit-secure-text"}," 🔒 Secure mobile money payment via Reevit ",-1))],32))}});class He{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 c=this.createCheckoutUrl(o,n),i=window.open(c);if(!i||i.closed||typeof i.closed>"u")throw new Error("Popup was blocked by the browser. Please allow popups for this site.")}initIframe({purchaseInfo:o,callBacks:n,config:c,iframeStyle:i}){var m,u,s;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 r=document.createElement("div");r.textContent="Loading...",p.appendChild(r);const l=document.createElement("iframe");l.setAttribute("id","hubtel-iframe-element"),l.src=this.createCheckoutUrl(o,c),l.style.display="none",l.style.width=(m=i?.width)!==null&&m!==void 0?m:"100%",l.style.height=(u=i?.height)!==null&&u!==void 0?u:"100%",l.style.minHeight=i?.minHeight||"400px",l.style.border=(s=i?.border)!==null&&s!==void 0?s:"none",l.onload=()=>{var h;p.removeChild(r),l.style.display="block",(h=n.onLoad)===null||h===void 0||h.call(n)},p.appendChild(l)}openModal({purchaseInfo:o,callBacks:n,config:c}){this.injectStyles(),this.createIframe(),this.handleBackButton(),this.registerEvents(n),this.renderWebpageInPopup(this.createCheckoutUrl(o,c),n.onClose,n.onLoad)}createCheckoutUrl(o,n){const c=Object.assign(Object.assign({},o),n),i=Object.keys(c).reduce((r,l)=>(c[l]!==null&&c[l]!==void 0&&(r[l]=c[l]),r),{}),m=Object.keys(i).map(r=>`${r}=${encodeURIComponent(i[r])}`).join("&"),u=this.encodeBase64(m),s=encodeURIComponent(u);return`${i?.branding==="disabled"?`${this.baseUrl}/pay/direct`:`${this.baseUrl}/pay`}?p=${s}`}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=c=>{var i,m,u,s,p,r;if(c.origin!==this.baseUrl)return;const{data:l}=c;if(l.success===!0)(i=o.onPaymentSuccess)===null||i===void 0||i.call(o,l);else if(l.success===!1)(m=o.onPaymentFailure)===null||m===void 0||m.call(o,l);else if(l.initialized)(u=o.init)===null||u===void 0||u.call(o,l),(s=o.onInit)===null||s===void 0||s.call(o,l);else if(l.feesChanged)(p=o.onFeesChanged)===null||p===void 0||p.call(o,l.fees);else if(l.resize){const h=document.getElementById("hubtel-iframe-element");h&&(h.style.height=l.height+"px"),(r=o?.onResize)===null||r===void 0||r.call(o,l)}};this.messageHandler=n,window.addEventListener("message",n,!1)}destroy(){this.messageHandler&&(window.removeEventListener("message",this.messageHandler,!1),this.messageHandler=null)}renderWebpageInPopup(o,n,c){const i=document.createElement("div");i.classList.add("checkout-modal");const m=document.createElement("div");m.setAttribute("id","checkout-close-icon"),m.innerHTML="×",m.classList.add("close-icon"),m.addEventListener("click",()=>{this.closePopUp(),n?.()}),i.appendChild(m);const u=document.createElement("iframe");u.src=o,history.pushState({modalOpen:!0},""),u.classList.add("iframe"),i.appendChild(u),document.body.appendChild(i),i.style.opacity="0",u.addEventListener("load",()=>{i.style.opacity="1",c?.()})}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="×",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 G=new Map;function z(t,o){const n=G.get(o);if(n)return n;const c=new Promise((i,m)=>{if(document.getElementById(o)){i();return}const u=document.createElement("script");u.id=o,u.src=t,u.async=!0,u.onload=()=>i(),u.onerror=()=>m(new Error(`Failed to load ${o} script`)),document.head.appendChild(u)});return G.set(o,c),c}function Q(){return z("https://js.paystack.co/v1/inline.js","paystack-script")}function qe(){return Promise.resolve()}function X(){return z("https://checkout.flutterwave.com/v3.js","flutterwave-script")}function Z(){return z("https://js.stripe.com/v3/","stripe-script")}function ee(){return z("https://sdk.monnify.com/plugin/monnify.js","monnify-script")}async function te(t){if(await Q(),!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 oe(t){const o=new He,n=t.preferredMethod==="mobile_money"?"momo":t.preferredMethod==="card"?"card":void 0,c={amount:t.amount,purchaseDescription:t.purchaseDescription,customerPhoneNumber:t.customerPhone||"",clientReference:`hubtel_${Date.now()}`,...n?{paymentMethod:n}:{}},i=t.hubtelSessionToken||t.basicAuth||"",m={branding:"enabled",callbackUrl:t.callbackUrl||(typeof window<"u"?window.location.href:""),merchantAccount:typeof t.clientId=="string"?parseInt(t.clientId,10):t.clientId,basicAuth:i,...n?{paymentMethod:n}:{}};o.openModal({purchaseInfo:c,config:m,callBacks:{onPaymentSuccess:u=>{t.onSuccess(u),o.closePopUp()},onPaymentFailure:()=>{t.onClose()},onClose:()=>{t.onClose()}}})}async function ne(t){if(await X(),!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 re(t){if(await Z(),!window.Stripe)throw new Error("Stripe.js not loaded");return window.Stripe(t)}async function Ye(t){const n=await(await re(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 ae(t){if(await ee(),!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 se(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 m=(await n.json().catch(()=>({}))).message||"Failed to initiate M-Pesa payment";return t.onError({message:m}),{status:"failed",message:m}}const c=await n.json();return{status:"initiated",message:"Please check your phone and enter your M-Pesa PIN to complete the payment.",transactionId:c.checkout_request_id||c.transaction_id}}catch(n){const c=n instanceof Error?n.message:"Network error";return t.onError({message:c}),{status:"failed",message:c}}}const Ge=["disabled"],Je={key:0,class:"reevit-spinner"},We={class:"reevit-modal-header"},Qe=["src"],Xe={class:"reevit-modal-body"},Ze={key:0,class:"reevit-loading-state"},et={key:1,class:"reevit-error-state"},tt={key:2,class:"reevit-success-state"},ot={key:3,class:"reevit-method-step reevit-animate-slide-up"},nt={key:0,class:"reevit-inline-action reevit-animate-fade-in"},rt=["disabled"],at={key:1,class:"reevit-inline-action reevit-animate-fade-in"},st={class:"reevit-inline-action__hint"},it=["disabled"],lt={key:0,class:"reevit-method-step__actions reevit-animate-slide-up"},ct={key:0},dt={key:1,class:"reevit-card-info reevit-animate-fade-in"},ut={class:"reevit-info-text"},mt=["disabled"],pt={key:0,class:"reevit-spinner"},vt={key:1},yt=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(t,{emit:o}){const n=t,c=o,{status:i,paymentIntent:m,selectedMethod:u,error:s,isLoading:p,isReady:r,initialize:l,selectMethod:h,handlePspSuccess:I,handlePspError:B,close:K,reset:U}=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:d=>c("success",d),onError:d=>c("error",d),onClose:()=>c("close")}),V=e.ref(n.isOpen??!1),g=e.ref(null),F={hubtel:"Hubtel",paystack:"Paystack",flutterwave:"Flutterwave",monnify:"Monnify",mpesa:"M-Pesa",stripe:"Stripe"};e.watch(()=>n.isOpen,d=>{d!==void 0&&(V.value=d)});const A=()=>{V.value=!0,g.value=null,!m.value&&i.value==="idle"&&l()};e.watch([V,m,u],([d,a,b])=>{if(d&&a&&b){const v=(g.value||a.recommendedPsp||"paystack").toLowerCase().includes("mpesa");(b==="card"||b==="mobile_money"&&(!v||n.phone))&&f(null)}});const D=()=>{V.value=!1,K(),g.value=null},R=e.computed(()=>n.paymentMethods?.length?n.paymentMethods:["card","mobile_money"]),$=e.computed(()=>{const d=m.value;if(!d)return[];const a=new Set(R.value),b=(d.availableProviders||[]).map(v=>{const x=v.provider.toLowerCase().includes("hubtel")?v.methods.filter(O=>O==="card"||O==="mobile_money"):v.methods;return{...v,methods:x.filter(O=>a.has(O))}}).filter(v=>v.methods.length>0);if(b.length>0)return b;const _=d.recommendedPsp.toLowerCase().includes("hubtel")?R.value.filter(v=>v==="card"||v==="mobile_money"):R.value;return[{provider:d.recommendedPsp,name:F[d.recommendedPsp]||d.recommendedPsp,methods:_}]}),w=e.computed(()=>{const d=m.value;return g.value||d?.recommendedPsp||"paystack"}),j=e.computed(()=>{const d=$.value.find(a=>a.provider===w.value);return d?.methods.length?d.methods:R.value});e.watch(()=>$.value,d=>{d.length&&(g.value&&d.some(a=>a.provider===g.value)||(d.length===1?g.value=d[0].provider:g.value=null))},{immediate:!0}),e.watch([j,u],([d,a])=>{!a||d.length===0||d.includes(a)||h(d[0])});const H=d=>{if(d===g.value){g.value=null,U();return}const a=$.value.find(v=>v.provider===d),b=a?.methods.length?a.methods:R.value,_=u.value&&b.includes(u.value)?u.value:b[0];g.value=d,U(),l(_,{preferredProvider:d,allowedProviders:[d]})},y=d=>{h(d)},f=async d=>{const a=m.value;if(!a)return;const b=w.value;try{if(b==="paystack")await te({key:a.pspPublicKey||n.publicKey||"",email:n.email||"",amount:n.amount,currency:n.currency,ref:a.id,onSuccess:_=>I(_),onClose:()=>{}});else if(b==="hubtel"){const _=k.createReevitClient({publicKey:n.publicKey,baseUrl:n.apiBaseUrl}),{data:v,error:x}=await _.createHubtelSession(a.id,a.clientSecret);if(x||!v?.basicAuth){B({code:x?.code||"hubtel_session_error",message:x?.message||"Failed to create Hubtel session"});return}const O=P.value==="card"||P.value==="mobile_money"?P.value:void 0;await oe({clientId:v.merchantAccount||a.pspCredentials?.merchantAccount||n.publicKey||"",purchaseDescription:`Payment for ${n.amount} ${n.currency}`,amount:n.amount,customerPhone:d?.phone||n.phone,customerEmail:n.email,basicAuth:v.basicAuth,preferredMethod:O,onSuccess:ie=>I(ie),onClose:()=>{}})}else if(b==="flutterwave")await ne({public_key:a.pspPublicKey||n.publicKey||"",tx_ref:a.id,amount:n.amount,currency:n.currency,customer:{email:n.email||"",phone_number:d?.phone||n.phone},callback:_=>I(_),onclose:()=>{}});else if(b==="monnify"){const _=a.pspPublicKey||n.publicKey||"",v=n.metadata?.contract_code||n.publicKey||"";if(!_||!v){B({code:"MONNIFY_CONFIG_MISSING",message:"Monnify configuration is missing. Please check your API key and contract code."});return}await ae({apiKey:_,contractCode:v,amount:n.amount,currency:n.currency,reference:a.reference||a.id,customerName:n.metadata?.customer_name||n.email||"",customerEmail:n.email||"",customerPhone:d?.phone||n.phone,metadata:n.metadata,onSuccess:x=>I(x),onClose:()=>{}})}else if(b==="mpesa"){const _=`${n.apiBaseUrl||"https://api.reevit.io"}/v1/payments/${a.id}/mpesa`;await se({phoneNumber:d?.phone||n.phone||"",amount:n.amount,reference:a.reference||a.id,description:`Payment ${a.reference||""}`,onInitiated:()=>{},onSuccess:v=>I(v),onError:v=>B({code:"MPESA_ERROR",message:v.message})},_)}else B(b==="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 "${b}" is not supported in this checkout.`})}catch(_){B({code:"BRIDGE_ERROR",message:_ instanceof Error?_.message:"Failed to open payment gateway"})}},E=e.computed(()=>({...m.value?.branding||{},...n.theme||{}})),C=e.computed(()=>k.createThemeVariables(E.value)),M=e.computed(()=>E.value?.darkMode);e.watch(V,d=>{d?document.body.style.overflow="hidden":document.body.style.overflow=""}),e.onUnmounted(()=>{document.body.style.overflow=""});const S=e.computed(()=>i.value),L=e.computed(()=>s.value),P=e.computed(()=>u.value),T=e.computed(()=>p.value),N=e.computed(()=>r.value);return(d,a)=>(e.openBlock(),e.createElementBlock("div",{class:"reevit-sdk-container",style:e.normalizeStyle(C.value)},[e.renderSlot(d.$slots,"default",{open:A,isLoading:T.value},()=>[e.createElementVNode("button",{type:"button",class:"reevit-pay-button",onClick:A,disabled:T.value},[T.value?(e.openBlock(),e.createElementBlock("span",Je)):e.renderSlot(d.$slots,"button-text",{key:1},()=>[a[5]||(a[5]=e.createTextVNode("Pay Now",-1))])],8,Ge)]),(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[V.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"reevit-modal-overlay",onClick:e.withModifiers(D,["self"])},[e.createElementVNode("div",{class:e.normalizeClass(["reevit-modal-content",{"reevit-modal--dark":M.value}]),style:e.normalizeStyle(C.value)},[e.createElementVNode("button",{class:"reevit-modal-close",onClick:D,"aria-label":"Close"}," × "),e.createElementVNode("div",We,[e.createElementVNode("img",{src:E.value.logoUrl||"https://i.imgur.com/bzUR5Lm.png",alt:"Checkout",class:"reevit-modal__logo"},null,8,Qe)]),e.createElementVNode("div",Xe,[S.value==="loading"?(e.openBlock(),e.createElementBlock("div",Ze,[...a[6]||(a[6]=[e.createElementVNode("div",{class:"reevit-spinner reevit-spinner--large"},null,-1),e.createElementVNode("p",null,"Initializing payment...",-1)])])):S.value==="failed"&&L.value?(e.openBlock(),e.createElementBlock("div",et,[a[7]||(a[7]=e.createElementVNode("div",{class:"reevit-error-icon"},"⚠️",-1)),a[8]||(a[8]=e.createElementVNode("h3",null,"Payment Failed",-1)),e.createElementVNode("p",null,e.toDisplayString(L.value.message),1),e.createElementVNode("button",{class:"reevit-retry-btn",onClick:a[0]||(a[0]=b=>e.unref(l)())},"Retry")])):S.value==="success"?(e.openBlock(),e.createElementBlock("div",tt,[a[9]||(a[9]=e.createElementVNode("div",{class:"reevit-success-icon"},"✅",-1)),a[10]||(a[10]=e.createElementVNode("h3",null,"Payment Successful",-1)),a[11]||(a[11]=e.createElementVNode("p",null,"Thank you for your payment.",-1)),e.createElementVNode("button",{class:"reevit-done-btn",onClick:D},"Done")])):N.value?(e.openBlock(),e.createElementBlock("div",ot,[$.value.length>1?(e.openBlock(),e.createBlock(W,{key:0,providers:$.value,"selected-provider":g.value,disabled:T.value,theme:E.value,"selected-method":P.value,onSelect:H,onMethodSelect:y},{"method-content":e.withCtx(()=>[P.value==="card"?(e.openBlock(),e.createElementBlock("div",nt,[a[12]||(a[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:a[1]||(a[1]=b=>f(null)),disabled:S.value==="processing"}," Pay with Card ",8,rt)])):P.value==="mobile_money"?(e.openBlock(),e.createElementBlock("div",at,[w.value.includes("mpesa")&&!n.phone?(e.openBlock(),e.createBlock(q,{key:0,"initial-phone":n.phone,loading:S.value==="processing","hide-cancel":"",onSubmit:f},null,8,["initial-phone","loading"])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("p",st,e.toDisplayString(w.value.includes("hubtel")?"Opens the Hubtel checkout with Mobile Money selected.":`Continue to pay securely with Mobile Money via ${F[w.value]||w.value}.`),1),e.createElementVNode("button",{class:"reevit-btn reevit-btn--primary",onClick:a[2]||(a[2]=b=>f(null)),disabled:S.value==="processing"},e.toDisplayString(w.value.includes("hubtel")?"Continue with Hubtel":"Pay with Mobile Money"),9,it)],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:j.value,selected:P.value,provider:w.value,"show-label":!1,layout:"grid",onSelect:y},null,8,["methods","selected","provider"]),P.value?(e.openBlock(),e.createElementBlock("div",lt,[P.value==="mobile_money"&&w.value.includes("mpesa")&&!n.phone?(e.openBlock(),e.createElementBlock("div",ct,[e.createVNode(q,{"initial-phone":n.phone,loading:S.value==="processing",onSubmit:f,onCancel:a[3]||(a[3]=b=>e.unref(h)(null))},null,8,["initial-phone","loading"])])):(e.openBlock(),e.createElementBlock("div",dt,[e.createElementVNode("p",ut,e.toDisplayString(P.value==="card"?"You will be redirected to complete your card payment securely.":w.value.includes("hubtel")?"Opens the Hubtel checkout with Mobile Money selected.":`Continue to pay securely via ${F[w.value]||w.value}.`),1),e.createElementVNode("button",{class:"reevit-submit-btn",onClick:a[4]||(a[4]=b=>f(null)),disabled:S.value==="processing"},[S.value==="processing"?(e.openBlock(),e.createElementBlock("span",pt)):(e.openBlock(),e.createElementBlock("span",vt,e.toDisplayString(P.value==="card"?"Pay with Card":w.value.includes("hubtel")?"Continue with Hubtel":"Pay with Mobile Money"),1))],8,mt)]))])):e.createCommentVNode("",!0)],64))])):e.createCommentVNode("",!0)]),a[13]||(a[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:()=>k.ReevitAPIClient});Object.defineProperty(exports,"cn",{enumerable:!0,get:()=>k.cn});Object.defineProperty(exports,"createReevitClient",{enumerable:!0,get:()=>k.createReevitClient});Object.defineProperty(exports,"detectCountryFromCurrency",{enumerable:!0,get:()=>k.detectCountryFromCurrency});Object.defineProperty(exports,"detectNetwork",{enumerable:!0,get:()=>k.detectNetwork});Object.defineProperty(exports,"formatAmount",{enumerable:!0,get:()=>k.formatAmount});Object.defineProperty(exports,"formatPhone",{enumerable:!0,get:()=>k.formatPhone});Object.defineProperty(exports,"validatePhone",{enumerable:!0,get:()=>k.validatePhone});exports.MobileMoneyForm=q;exports.PaymentMethodSelector=Y;exports.ProviderSelector=W;exports.ReevitCheckout=yt;exports.confirmStripePayment=Ye;exports.createStripeInstance=re;exports.initiateMPesaSTKPush=se;exports.loadFlutterwaveScript=X;exports.loadHubtelScript=qe;exports.loadMonnifyScript=ee;exports.loadPaystackScript=Q;exports.loadStripeScript=Z;exports.openFlutterwaveModal=ne;exports.openHubtelPopup=oe;exports.openMonnifyModal=ae;exports.openPaystackPopup=te;exports.useReevit=J;
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;