@cedros/pay-react 1.1.11 → 1.1.12

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.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/admin/plugin.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAiD,MAAM,SAAS,CAAC;AA4B1F;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,WAyE7B,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/admin/plugin.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAiD,MAAM,SAAS,CAAC;AAoC1F;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,WAyE7B,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-Dhf-hhsE.js"),C=require("react/jsx-runtime"),i=require("react"),t=require("./CedrosContext-C2v_s8cc.js");require("@solana/web3.js");require("./index-WcOlBYZJ.js");const Q=require("@solana/wallet-adapter-react"),ne=require("@solana/wallet-adapter-base"),be=require("@solana/wallet-adapter-react-ui"),ae=require("./walletPool-BZyAG4YS.js");function se(){const{subscriptionManager:n,x402Manager:d,walletManager:f}=t.useCedrosContext(),{publicKey:c,signTransaction:T}=Q.useWallet(),[h,m]=i.useState({status:"idle",error:null,sessionId:null,subscriptionStatus:null,expiresAt:null}),[x,E]=i.useState(null),R=i.useCallback(()=>{if(!c){const l="Wallet not connected";return m(o=>({...o,status:"error",error:l})),{valid:!1,error:l}}if(!T){const l="Wallet does not support signing";return m(o=>({...o,status:"error",error:l})),{valid:!1,error:l}}return{valid:!0}},[c,T]),W=i.useCallback(async l=>{if(!c)return m(o=>({...o,status:"error",error:"Wallet not connected"})),null;m(o=>({...o,status:"checking",error:null}));try{const o=await n.checkSubscriptionStatus({resource:l,userId:c.toString()});return m(a=>({...a,status:o.active?"success":"idle",subscriptionStatus:o.status,expiresAt:o.expiresAt||o.currentPeriodEnd||null})),o}catch(o){const a=t.formatError(o,"Failed to check subscription status");return m(u=>({...u,status:"error",error:a})),null}},[c,n]),k=i.useCallback(async(l,o,a)=>{m(u=>({...u,status:"loading",error:null}));try{const u=await n.requestSubscriptionQuote(l,o,a);return E(u),m(b=>({...b,status:"idle"})),u}catch(u){const b=t.formatError(u,"Failed to get subscription quote");return m(s=>({...s,status:"error",error:b})),null}},[n]),I=i.useCallback(async(l,o,a)=>{const u=R();if(!u.valid)return{success:!1,error:u.error};m(b=>({...b,status:"loading",error:null}));try{const b=await n.requestSubscriptionQuote(l,o,a);E(b);const s=b.requirement;if(!d.validateRequirement(s))throw new Error("Invalid subscription quote received from server");const w=!!s.extra?.feePayer;let P;if(w){const{transaction:y,blockhash:v}=await d.buildGaslessTransaction({resourceId:l,userWallet:c.toString(),feePayer:s.extra.feePayer,couponCode:a?.couponCode}),_=f.deserializeTransaction(y),j=await f.partiallySignTransaction({transaction:_,signTransaction:T,blockhash:v});P=await d.submitGaslessTransaction({resource:l,partialTx:j,couponCode:a?.couponCode,resourceType:"regular",requirement:s})}else{const y=await f.buildTransaction({requirement:s,payerPublicKey:c}),v=await f.signTransaction({transaction:y,signTransaction:T}),_=f.buildPaymentPayload({requirement:s,signedTx:v,payerPublicKey:c});P=await d.submitPayment({resource:l,payload:_,couponCode:a?.couponCode,resourceType:"regular"})}if(P.success){const y=await n.checkSubscriptionStatus({resource:l,userId:c.toString()});m({status:"success",error:null,sessionId:P.transactionId||null,subscriptionStatus:y.status,expiresAt:y.expiresAt||y.currentPeriodEnd||null})}else m(y=>({...y,status:"error",error:P.error||"Subscription payment failed"}));return P}catch(b){const s=t.formatError(b,"Subscription payment failed");return m(w=>({...w,status:"error",error:s})),{success:!1,error:s}}},[R,n,d,f,c,T]),S=i.useCallback(()=>{m({status:"idle",error:null,sessionId:null,subscriptionStatus:null,expiresAt:null}),E(null)},[]);return{...h,quote:x,checkStatus:W,requestQuote:k,processPayment:I,reset:S}}function Ce({resource:n,interval:d,intervalDays:f,couponCode:c,label:T,disabled:h=!1,onAttempt:m,onSuccess:x,onError:E,className:R="",testPageUrl:W,hideMessages:k=!1,autoCheckStatus:I=!0}){const{connected:S,connecting:l,connect:o,disconnect:a,select:u,wallets:b,wallet:s,publicKey:w}=Q.useWallet(),{status:P,error:y,subscriptionStatus:v,expiresAt:_,checkStatus:j,processPayment:O}=se(),g=t.useCedrosTheme(),{solanaError:L}=t.useCedrosContext(),{t:B,translations:F}=e.useTranslation(),ie=T||B("ui.subscribe_with_crypto"),U=i.useRef(O),G=i.useRef(j);i.useEffect(()=>{U.current=O,G.current=j},[O,j]);const le=y&&typeof y!="string"?y?.code??null:null,ce=L&&typeof L!="string"?L?.code??null:null,V=r=>{if(!r||!F)return"";const p=F.errors[r];return p?p.action?`${p.message} ${p.action}`:p.message:""},Y=y?typeof y=="string"?y:V(le):null,X=L?typeof L=="string"?L:V(ce):null,ue=i.useMemo(()=>b.map(r=>`${r.adapter.name}-${r.readyState}`).join(","),[b]),z=i.useMemo(()=>b.filter(({readyState:r})=>r===ne.WalletReadyState.Installed||r===ne.WalletReadyState.Loadable),[ue]);i.useEffect(()=>{I&&S&&w&&(t.getLogger().debug("[CryptoSubscribeButton] Auto-checking subscription status"),G.current(n))},[I,S,w,n]),i.useEffect(()=>{P==="success"&&v==="active"&&(e.emitPaymentSuccess("crypto","subscription-active",n),x&&x("subscription-active"))},[P,v,n,x]),i.useEffect(()=>{P==="error"&&y&&(e.emitPaymentError("crypto",y,n),E&&E(y))},[P,y,n,E]);const H=typeof window<"u"&&window.top!==window.self,[J,M]=i.useState(!1),[Z,K]=i.useState(!1),[ee,q]=i.useState(!1),A=L;i.useEffect(()=>{let r=!1;return r||(async()=>{if(Z&&s&&!S&&!l){t.getLogger().debug("[CryptoSubscribeButton] Wallet detected, attempting auto-connect:",s.adapter.name),K(!1),e.emitWalletConnect(s.adapter.name);try{await o(),r||t.getLogger().debug("[CryptoSubscribeButton] Auto-connect successful")}catch($){if(!r){t.getLogger().error("[CryptoSubscribeButton] Auto-connect failed:",$);const fe=$ instanceof Error?$.message:"Failed to connect wallet";e.emitWalletError(fe,s.adapter.name),q(!1)}}}})(),()=>{r=!0}},[s,Z,S,l,o]),i.useEffect(()=>{S&&ee&&w&&s&&(e.emitWalletConnected(s.adapter.name,w.toString()),t.getLogger().debug("[CryptoSubscribeButton] Processing pending subscription payment"),q(!1),M(!1),e.emitPaymentProcessing("crypto",n),U.current(n,d,{couponCode:c,intervalDays:f}))},[S,ee,w,s,n,d,c,f]);const te=i.useCallback(async()=>{if(t.getLogger().debug("[CryptoSubscribeButton] executeSubscriptionFlow called",{connected:S,wallet:s?.adapter.name,resource:n,interval:d}),e.emitPaymentStart("crypto",n),m&&m("crypto"),A){t.getLogger().error("[CryptoSubscribeButton] Solana dependencies missing:",A),e.emitPaymentError("crypto",A,n),E&&E(A);return}if(H){const r=W||window.location.href;try{if(new URL(r,window.location.origin).origin!==window.location.origin)throw t.getLogger().error("[CryptoSubscribeButton] Blocked attempt to open external URL:",r),new Error("Cannot open external URLs from embedded context");window.open(r,"_blank","noopener,noreferrer")}catch(p){throw t.getLogger().error("[CryptoSubscribeButton] URL validation failed:",p),p}return}if(S)e.emitPaymentProcessing("crypto",n),await O(n,d,{couponCode:c,intervalDays:f});else{q(!0);try{if(s)t.getLogger().debug("[CryptoSubscribeButton] Wallet already selected, connecting:",s.adapter.name),e.emitWalletConnect(s.adapter.name),await o();else{if(t.getLogger().debug("[CryptoSubscribeButton] No wallet selected, showing selector"),z.length===0){q(!1);const r="No wallets available";throw e.emitWalletError(r),new Error(r)}M(!0)}}catch(r){q(!1);const p=r instanceof Error?r.message:"Failed to connect wallet";t.getLogger().error("[CryptoSubscribeButton] Connection error:",p),e.emitWalletError(p,s?.adapter.name)}}},[S,s,n,d,c,f,H,W,z,o,O,A,m,E]),re=i.useMemo(()=>`crypto-subscribe-${n}-${d}`,[n,d]),de=i.useMemo(()=>e.createDedupedClickHandler(re,te,{cooldownMs:200,deduplicationWindowMs:0}),[re,te]),oe=P==="loading"||P==="checking",N=v==="active"||v==="trialing",ge=h||oe||l||!!A||N;let D=ie;if(oe)D=B("ui.processing");else if(N&&_){const r=new Date(_).toLocaleDateString();D=`${B("ui.subscribed_until")} ${r}`}else N&&(D=B("ui.subscribed"));const pe=i.useCallback(async()=>{try{K(!1),S&&await a(),u(null),M(!0)}catch(r){t.getLogger().error("Failed to change wallet:",r)}},[S,a,u]),me=i.useCallback(r=>{t.getLogger().debug("[CryptoSubscribeButton] Wallet clicked:",r),M(!1),u(r),K(!0)},[u]),ye=i.useCallback(async()=>{try{if(await a(),q(!1),typeof window<"u"&&window.localStorage)try{window.localStorage.removeItem("walletName")}catch(r){r instanceof Error&&r.name==="QuotaExceededError"?t.getLogger().warn("localStorage quota exceeded when removing wallet preference"):t.getLogger().error("Failed to clear wallet preference from localStorage:",r)}}catch(r){t.getLogger().error("Failed to disconnect wallet:",r)}},[a]);return C.jsxs("div",{className:g.unstyled?R:`${g.className} cedros-theme__crypto-button ${R||""}`,style:g.unstyled?{}:g.style,children:[C.jsx("button",{onClick:de,disabled:ge,className:g.unstyled?R:"cedros-theme__button cedros-theme__crypto",type:"button",children:D}),J&&!k&&C.jsx("div",{className:"cedros-modal-overlay",style:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:g.tokens.modalOverlay,display:"flex",alignItems:"center",justifyContent:"center",zIndex:9999,padding:"1rem"},onClick:()=>M(!1),children:C.jsxs("div",{className:"cedros-modal-content",style:{backgroundColor:g.tokens.modalBackground,borderRadius:"12px",padding:"2rem",maxWidth:"400px",width:"100%",boxShadow:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)",border:`1px solid ${g.tokens.modalBorder}`},onClick:r=>r.stopPropagation(),children:[C.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"1.5rem"},children:[C.jsx("h3",{style:{margin:0,fontSize:"1.25rem",fontWeight:600,color:g.tokens.surfaceText},children:B("wallet.select_wallet")}),C.jsx("button",{onClick:()=>M(!1),style:e.getModalCloseButtonStyles(g.tokens.surfaceText),"aria-label":"Close modal",type:"button",children:"×"})]}),C.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:z.map(r=>C.jsxs("button",{onClick:()=>me(r.adapter.name),style:{width:"100%",padding:"1rem",backgroundColor:g.tokens.surfaceBackground,border:`1px solid ${g.tokens.surfaceBorder}`,borderRadius:"0.5rem",cursor:"pointer",fontSize:"1rem",textAlign:"left",color:g.tokens.surfaceText,display:"flex",alignItems:"center",gap:"1rem",transition:"all 0.2s ease"},onMouseEnter:p=>{p.currentTarget.style.backgroundColor=g.tokens.modalBackground,p.currentTarget.style.borderColor=g.tokens.surfaceText,p.currentTarget.style.transform="translateY(-2px)"},onMouseLeave:p=>{p.currentTarget.style.backgroundColor=g.tokens.surfaceBackground,p.currentTarget.style.borderColor=g.tokens.surfaceBorder,p.currentTarget.style.transform="translateY(0)"},type:"button",children:[C.jsx(be.WalletIcon,{wallet:r,style:{width:"24px",height:"24px"}}),C.jsx("span",{style:{fontWeight:500},children:r.adapter.name})]},r.adapter.name))})]})}),S&&!k&&!J&&C.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:"0.5rem",fontSize:"0.75rem",color:g.tokens.surfaceText,opacity:.7},children:[C.jsx("button",{onClick:pe,style:{background:"none",border:"none",padding:0,color:"inherit",textDecoration:"none",cursor:"pointer",fontSize:"inherit"},type:"button",children:B("wallet.change")}),C.jsx("button",{onClick:ye,style:{background:"none",border:"none",padding:0,color:"inherit",textDecoration:"none",cursor:"pointer",fontSize:"inherit"},type:"button",children:B("ui.disconnect")})]}),!k&&X&&C.jsx("div",{className:g.unstyled?"":"cedros-theme__error",children:X}),!k&&Y&&C.jsx("div",{className:g.unstyled?"":"cedros-theme__error",children:Y}),!k&&N&&C.jsx("div",{className:g.unstyled?"":"cedros-theme__success",children:B("ui.subscription_active")})]})}function Se(){const{x402Manager:n,walletManager:d}=t.useCedrosContext(),{publicKey:f,signTransaction:c}=Q.useWallet(),[T,h]=i.useState({status:"idle",error:null,transactionId:null}),[m,x]=i.useState(null),[E,R]=i.useState(null),W=i.useCallback(async l=>{try{h(a=>({...a,status:"loading"}));const o=await n.requestQuote({resource:l});if(!n.validateRequirement(o))throw new Error("Invalid refund requirement received from server");return x(o),h(a=>({...a,status:"idle"})),o}catch(o){const a=t.formatError(o,"Failed to fetch refund requirement");throw h({status:"error",error:a,transactionId:null}),o}},[n]),k=i.useCallback(async(l,o)=>{if(!f||!c)throw new Error("Wallet not connected");try{h({status:"loading",error:null,transactionId:null});const a=await n.requestQuote({resource:l,couponCode:o});if(!n.validateRequirement(a))throw new Error("Invalid refund requirement received");x(a);const u=await d.buildTransaction({requirement:a,payerPublicKey:f}),b=await d.signTransaction({transaction:u,signTransaction:c}),s=d.buildPaymentPayload({requirement:a,signedTx:b,payerPublicKey:f}),w=await n.submitPayment({resource:l,payload:s,couponCode:o,metadata:void 0,resourceType:"refund"});return w.settlement&&R(w.settlement),h({status:"success",error:null,transactionId:w.transactionId||b.signature}),w}catch(a){const u=t.formatError(a,"Refund payment failed");throw h({status:"error",error:u,transactionId:null}),a}},[f,c,n,d]),I=i.useCallback(async l=>{if(!f||!c)throw new Error("Wallet not connected");try{h({status:"loading",error:null,transactionId:null});const o=await n.requestQuote({resource:l});if(!n.validateRequirement(o))throw new Error("Invalid refund requirement received");x(o);const{transaction:a}=await n.buildGaslessTransaction({resourceId:l,userWallet:f.toString(),feePayer:o.extra.feePayer}),u=d.deserializeTransaction(a),b=await d.partiallySignTransaction({transaction:u,signTransaction:c}),s=await n.submitGaslessTransaction({resource:l,partialTx:b,couponCode:void 0,metadata:void 0,resourceType:"refund",requirement:o});return s.settlement&&R(s.settlement),h({status:"success",error:null,transactionId:s.transactionId||"gasless-refund-tx"}),s}catch(o){const a=t.formatError(o,"Gasless refund payment failed");throw h({status:"error",error:a,transactionId:null}),o}},[f,c,n,d]),S=i.useCallback(()=>{h({status:"idle",error:null,transactionId:null}),x(null),R(null)},[]);return{state:T,requirement:m,settlement:E,fetchRefundQuote:W,processRefund:k,processGaslessRefund:I,reset:S}}exports.CEDROS_EVENTS=e.CEDROS_EVENTS;exports.CSP_PRESETS=e.CSP_PRESETS;exports.CedrosPay=e.CedrosPay;exports.CedrosPayAdminDashboard=e.CedrosPayAdminDashboard;exports.CreditsButton=e.CreditsButton;exports.CreditsSubscribeButton=e.CreditsSubscribeButton;exports.CryptoButton=e.CryptoButton;exports.ERROR_CATEGORIES=e.ERROR_CATEGORIES;exports.PaymentMethodBadge=e.PaymentMethodBadge;exports.PaymentModal=e.PaymentModal;exports.ProductPrice=e.ProductPrice;exports.PurchaseButton=e.PurchaseButton;exports.RPC_PROVIDERS=e.RPC_PROVIDERS;exports.SECURITY_RECOMMENDATIONS=e.SECURITY_RECOMMENDATIONS;exports.StripeButton=e.StripeButton;exports.SubscribeButton=e.SubscribeButton;exports.SubscriptionManagementPanel=e.SubscriptionManagementPanel;exports.calculateDiscountPercentage=e.calculateDiscountPercentage;exports.cedrosPayPlugin=e.cedrosPayPlugin;exports.createTranslator=e.createTranslator;exports.detectLocale=e.detectLocale;exports.ecommerce=e.index;exports.emitPaymentError=e.emitPaymentError;exports.emitPaymentProcessing=e.emitPaymentProcessing;exports.emitPaymentStart=e.emitPaymentStart;exports.emitPaymentSuccess=e.emitPaymentSuccess;exports.emitWalletConnect=e.emitWalletConnect;exports.emitWalletConnected=e.emitWalletConnected;exports.emitWalletError=e.emitWalletError;exports.formatCSP=e.formatCSP;exports.formatCouponCodes=e.formatCouponCodes;exports.generateCSP=e.generateCSP;exports.generateCSPDirectives=e.generateCSPDirectives;exports.getAvailableLocales=e.getAvailableLocales;exports.getLocalizedError=e.getLocalizedError;exports.getUserErrorMessage=e.getUserErrorMessage;exports.isRetryableError=e.isRetryableError;exports.loadLocale=e.loadLocale;exports.logSecurityReport=e.logSecurityReport;exports.parseCouponCodes=e.parseCouponCodes;exports.stackCheckoutCoupons=e.stackCheckoutCoupons;exports.useCreditsPayment=e.useCreditsPayment;exports.useCreditsSubscription=e.useCreditsSubscription;exports.useLocalizedError=e.useLocalizedError;exports.usePaymentMode=e.usePaymentMode;exports.useStripeCheckout=e.useStripeCheckout;exports.useSubscription=e.useSubscription;exports.useSubscriptionManagement=e.useSubscriptionManagement;exports.useTranslation=e.useTranslation;exports.useX402Payment=e.useX402Payment;exports.validateSecurity=e.validateSecurity;exports.CIRCUIT_BREAKER_PRESETS=t.CIRCUIT_BREAKER_PRESETS;exports.CedrosProvider=t.CedrosProvider;exports.CircuitBreakerOpenError=t.CircuitBreakerOpenError;exports.CircuitState=t.CircuitState;exports.KNOWN_STABLECOINS=t.KNOWN_STABLECOINS;exports.LogLevel=t.LogLevel;exports.Logger=t.Logger;exports.RATE_LIMITER_PRESETS=t.RATE_LIMITER_PRESETS;exports.RETRY_PRESETS=t.RETRY_PRESETS;exports.createCircuitBreaker=t.createCircuitBreaker;exports.createLogger=t.createLogger;exports.createRateLimiter=t.createRateLimiter;exports.getLogger=t.getLogger;exports.retryWithBackoff=t.retryWithBackoff;exports.useCedrosContext=t.useCedrosContext;exports.useCedrosTheme=t.useCedrosTheme;exports.validateConfig=t.validateConfig;exports.validateTokenMint=t.validateTokenMint;exports.WalletPool=ae.WalletPool;exports.createWalletPool=ae.createWalletPool;exports.CryptoSubscribeButton=Ce;exports.useCryptoSubscription=se;exports.useRefundVerification=Se;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-UQAK8nZe.js"),C=require("react/jsx-runtime"),i=require("react"),t=require("./CedrosContext-C2v_s8cc.js");require("@solana/web3.js");require("./index-WcOlBYZJ.js");const Q=require("@solana/wallet-adapter-react"),ne=require("@solana/wallet-adapter-base"),be=require("@solana/wallet-adapter-react-ui"),ae=require("./walletPool-BZyAG4YS.js");function se(){const{subscriptionManager:n,x402Manager:d,walletManager:f}=t.useCedrosContext(),{publicKey:c,signTransaction:T}=Q.useWallet(),[h,m]=i.useState({status:"idle",error:null,sessionId:null,subscriptionStatus:null,expiresAt:null}),[x,E]=i.useState(null),R=i.useCallback(()=>{if(!c){const l="Wallet not connected";return m(o=>({...o,status:"error",error:l})),{valid:!1,error:l}}if(!T){const l="Wallet does not support signing";return m(o=>({...o,status:"error",error:l})),{valid:!1,error:l}}return{valid:!0}},[c,T]),W=i.useCallback(async l=>{if(!c)return m(o=>({...o,status:"error",error:"Wallet not connected"})),null;m(o=>({...o,status:"checking",error:null}));try{const o=await n.checkSubscriptionStatus({resource:l,userId:c.toString()});return m(a=>({...a,status:o.active?"success":"idle",subscriptionStatus:o.status,expiresAt:o.expiresAt||o.currentPeriodEnd||null})),o}catch(o){const a=t.formatError(o,"Failed to check subscription status");return m(u=>({...u,status:"error",error:a})),null}},[c,n]),k=i.useCallback(async(l,o,a)=>{m(u=>({...u,status:"loading",error:null}));try{const u=await n.requestSubscriptionQuote(l,o,a);return E(u),m(b=>({...b,status:"idle"})),u}catch(u){const b=t.formatError(u,"Failed to get subscription quote");return m(s=>({...s,status:"error",error:b})),null}},[n]),I=i.useCallback(async(l,o,a)=>{const u=R();if(!u.valid)return{success:!1,error:u.error};m(b=>({...b,status:"loading",error:null}));try{const b=await n.requestSubscriptionQuote(l,o,a);E(b);const s=b.requirement;if(!d.validateRequirement(s))throw new Error("Invalid subscription quote received from server");const w=!!s.extra?.feePayer;let P;if(w){const{transaction:y,blockhash:v}=await d.buildGaslessTransaction({resourceId:l,userWallet:c.toString(),feePayer:s.extra.feePayer,couponCode:a?.couponCode}),_=f.deserializeTransaction(y),j=await f.partiallySignTransaction({transaction:_,signTransaction:T,blockhash:v});P=await d.submitGaslessTransaction({resource:l,partialTx:j,couponCode:a?.couponCode,resourceType:"regular",requirement:s})}else{const y=await f.buildTransaction({requirement:s,payerPublicKey:c}),v=await f.signTransaction({transaction:y,signTransaction:T}),_=f.buildPaymentPayload({requirement:s,signedTx:v,payerPublicKey:c});P=await d.submitPayment({resource:l,payload:_,couponCode:a?.couponCode,resourceType:"regular"})}if(P.success){const y=await n.checkSubscriptionStatus({resource:l,userId:c.toString()});m({status:"success",error:null,sessionId:P.transactionId||null,subscriptionStatus:y.status,expiresAt:y.expiresAt||y.currentPeriodEnd||null})}else m(y=>({...y,status:"error",error:P.error||"Subscription payment failed"}));return P}catch(b){const s=t.formatError(b,"Subscription payment failed");return m(w=>({...w,status:"error",error:s})),{success:!1,error:s}}},[R,n,d,f,c,T]),S=i.useCallback(()=>{m({status:"idle",error:null,sessionId:null,subscriptionStatus:null,expiresAt:null}),E(null)},[]);return{...h,quote:x,checkStatus:W,requestQuote:k,processPayment:I,reset:S}}function Ce({resource:n,interval:d,intervalDays:f,couponCode:c,label:T,disabled:h=!1,onAttempt:m,onSuccess:x,onError:E,className:R="",testPageUrl:W,hideMessages:k=!1,autoCheckStatus:I=!0}){const{connected:S,connecting:l,connect:o,disconnect:a,select:u,wallets:b,wallet:s,publicKey:w}=Q.useWallet(),{status:P,error:y,subscriptionStatus:v,expiresAt:_,checkStatus:j,processPayment:O}=se(),g=t.useCedrosTheme(),{solanaError:L}=t.useCedrosContext(),{t:B,translations:F}=e.useTranslation(),ie=T||B("ui.subscribe_with_crypto"),U=i.useRef(O),G=i.useRef(j);i.useEffect(()=>{U.current=O,G.current=j},[O,j]);const le=y&&typeof y!="string"?y?.code??null:null,ce=L&&typeof L!="string"?L?.code??null:null,V=r=>{if(!r||!F)return"";const p=F.errors[r];return p?p.action?`${p.message} ${p.action}`:p.message:""},Y=y?typeof y=="string"?y:V(le):null,X=L?typeof L=="string"?L:V(ce):null,ue=i.useMemo(()=>b.map(r=>`${r.adapter.name}-${r.readyState}`).join(","),[b]),z=i.useMemo(()=>b.filter(({readyState:r})=>r===ne.WalletReadyState.Installed||r===ne.WalletReadyState.Loadable),[ue]);i.useEffect(()=>{I&&S&&w&&(t.getLogger().debug("[CryptoSubscribeButton] Auto-checking subscription status"),G.current(n))},[I,S,w,n]),i.useEffect(()=>{P==="success"&&v==="active"&&(e.emitPaymentSuccess("crypto","subscription-active",n),x&&x("subscription-active"))},[P,v,n,x]),i.useEffect(()=>{P==="error"&&y&&(e.emitPaymentError("crypto",y,n),E&&E(y))},[P,y,n,E]);const H=typeof window<"u"&&window.top!==window.self,[J,M]=i.useState(!1),[Z,K]=i.useState(!1),[ee,q]=i.useState(!1),A=L;i.useEffect(()=>{let r=!1;return r||(async()=>{if(Z&&s&&!S&&!l){t.getLogger().debug("[CryptoSubscribeButton] Wallet detected, attempting auto-connect:",s.adapter.name),K(!1),e.emitWalletConnect(s.adapter.name);try{await o(),r||t.getLogger().debug("[CryptoSubscribeButton] Auto-connect successful")}catch($){if(!r){t.getLogger().error("[CryptoSubscribeButton] Auto-connect failed:",$);const fe=$ instanceof Error?$.message:"Failed to connect wallet";e.emitWalletError(fe,s.adapter.name),q(!1)}}}})(),()=>{r=!0}},[s,Z,S,l,o]),i.useEffect(()=>{S&&ee&&w&&s&&(e.emitWalletConnected(s.adapter.name,w.toString()),t.getLogger().debug("[CryptoSubscribeButton] Processing pending subscription payment"),q(!1),M(!1),e.emitPaymentProcessing("crypto",n),U.current(n,d,{couponCode:c,intervalDays:f}))},[S,ee,w,s,n,d,c,f]);const te=i.useCallback(async()=>{if(t.getLogger().debug("[CryptoSubscribeButton] executeSubscriptionFlow called",{connected:S,wallet:s?.adapter.name,resource:n,interval:d}),e.emitPaymentStart("crypto",n),m&&m("crypto"),A){t.getLogger().error("[CryptoSubscribeButton] Solana dependencies missing:",A),e.emitPaymentError("crypto",A,n),E&&E(A);return}if(H){const r=W||window.location.href;try{if(new URL(r,window.location.origin).origin!==window.location.origin)throw t.getLogger().error("[CryptoSubscribeButton] Blocked attempt to open external URL:",r),new Error("Cannot open external URLs from embedded context");window.open(r,"_blank","noopener,noreferrer")}catch(p){throw t.getLogger().error("[CryptoSubscribeButton] URL validation failed:",p),p}return}if(S)e.emitPaymentProcessing("crypto",n),await O(n,d,{couponCode:c,intervalDays:f});else{q(!0);try{if(s)t.getLogger().debug("[CryptoSubscribeButton] Wallet already selected, connecting:",s.adapter.name),e.emitWalletConnect(s.adapter.name),await o();else{if(t.getLogger().debug("[CryptoSubscribeButton] No wallet selected, showing selector"),z.length===0){q(!1);const r="No wallets available";throw e.emitWalletError(r),new Error(r)}M(!0)}}catch(r){q(!1);const p=r instanceof Error?r.message:"Failed to connect wallet";t.getLogger().error("[CryptoSubscribeButton] Connection error:",p),e.emitWalletError(p,s?.adapter.name)}}},[S,s,n,d,c,f,H,W,z,o,O,A,m,E]),re=i.useMemo(()=>`crypto-subscribe-${n}-${d}`,[n,d]),de=i.useMemo(()=>e.createDedupedClickHandler(re,te,{cooldownMs:200,deduplicationWindowMs:0}),[re,te]),oe=P==="loading"||P==="checking",N=v==="active"||v==="trialing",ge=h||oe||l||!!A||N;let D=ie;if(oe)D=B("ui.processing");else if(N&&_){const r=new Date(_).toLocaleDateString();D=`${B("ui.subscribed_until")} ${r}`}else N&&(D=B("ui.subscribed"));const pe=i.useCallback(async()=>{try{K(!1),S&&await a(),u(null),M(!0)}catch(r){t.getLogger().error("Failed to change wallet:",r)}},[S,a,u]),me=i.useCallback(r=>{t.getLogger().debug("[CryptoSubscribeButton] Wallet clicked:",r),M(!1),u(r),K(!0)},[u]),ye=i.useCallback(async()=>{try{if(await a(),q(!1),typeof window<"u"&&window.localStorage)try{window.localStorage.removeItem("walletName")}catch(r){r instanceof Error&&r.name==="QuotaExceededError"?t.getLogger().warn("localStorage quota exceeded when removing wallet preference"):t.getLogger().error("Failed to clear wallet preference from localStorage:",r)}}catch(r){t.getLogger().error("Failed to disconnect wallet:",r)}},[a]);return C.jsxs("div",{className:g.unstyled?R:`${g.className} cedros-theme__crypto-button ${R||""}`,style:g.unstyled?{}:g.style,children:[C.jsx("button",{onClick:de,disabled:ge,className:g.unstyled?R:"cedros-theme__button cedros-theme__crypto",type:"button",children:D}),J&&!k&&C.jsx("div",{className:"cedros-modal-overlay",style:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:g.tokens.modalOverlay,display:"flex",alignItems:"center",justifyContent:"center",zIndex:9999,padding:"1rem"},onClick:()=>M(!1),children:C.jsxs("div",{className:"cedros-modal-content",style:{backgroundColor:g.tokens.modalBackground,borderRadius:"12px",padding:"2rem",maxWidth:"400px",width:"100%",boxShadow:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)",border:`1px solid ${g.tokens.modalBorder}`},onClick:r=>r.stopPropagation(),children:[C.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"1.5rem"},children:[C.jsx("h3",{style:{margin:0,fontSize:"1.25rem",fontWeight:600,color:g.tokens.surfaceText},children:B("wallet.select_wallet")}),C.jsx("button",{onClick:()=>M(!1),style:e.getModalCloseButtonStyles(g.tokens.surfaceText),"aria-label":"Close modal",type:"button",children:"×"})]}),C.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:z.map(r=>C.jsxs("button",{onClick:()=>me(r.adapter.name),style:{width:"100%",padding:"1rem",backgroundColor:g.tokens.surfaceBackground,border:`1px solid ${g.tokens.surfaceBorder}`,borderRadius:"0.5rem",cursor:"pointer",fontSize:"1rem",textAlign:"left",color:g.tokens.surfaceText,display:"flex",alignItems:"center",gap:"1rem",transition:"all 0.2s ease"},onMouseEnter:p=>{p.currentTarget.style.backgroundColor=g.tokens.modalBackground,p.currentTarget.style.borderColor=g.tokens.surfaceText,p.currentTarget.style.transform="translateY(-2px)"},onMouseLeave:p=>{p.currentTarget.style.backgroundColor=g.tokens.surfaceBackground,p.currentTarget.style.borderColor=g.tokens.surfaceBorder,p.currentTarget.style.transform="translateY(0)"},type:"button",children:[C.jsx(be.WalletIcon,{wallet:r,style:{width:"24px",height:"24px"}}),C.jsx("span",{style:{fontWeight:500},children:r.adapter.name})]},r.adapter.name))})]})}),S&&!k&&!J&&C.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:"0.5rem",fontSize:"0.75rem",color:g.tokens.surfaceText,opacity:.7},children:[C.jsx("button",{onClick:pe,style:{background:"none",border:"none",padding:0,color:"inherit",textDecoration:"none",cursor:"pointer",fontSize:"inherit"},type:"button",children:B("wallet.change")}),C.jsx("button",{onClick:ye,style:{background:"none",border:"none",padding:0,color:"inherit",textDecoration:"none",cursor:"pointer",fontSize:"inherit"},type:"button",children:B("ui.disconnect")})]}),!k&&X&&C.jsx("div",{className:g.unstyled?"":"cedros-theme__error",children:X}),!k&&Y&&C.jsx("div",{className:g.unstyled?"":"cedros-theme__error",children:Y}),!k&&N&&C.jsx("div",{className:g.unstyled?"":"cedros-theme__success",children:B("ui.subscription_active")})]})}function Se(){const{x402Manager:n,walletManager:d}=t.useCedrosContext(),{publicKey:f,signTransaction:c}=Q.useWallet(),[T,h]=i.useState({status:"idle",error:null,transactionId:null}),[m,x]=i.useState(null),[E,R]=i.useState(null),W=i.useCallback(async l=>{try{h(a=>({...a,status:"loading"}));const o=await n.requestQuote({resource:l});if(!n.validateRequirement(o))throw new Error("Invalid refund requirement received from server");return x(o),h(a=>({...a,status:"idle"})),o}catch(o){const a=t.formatError(o,"Failed to fetch refund requirement");throw h({status:"error",error:a,transactionId:null}),o}},[n]),k=i.useCallback(async(l,o)=>{if(!f||!c)throw new Error("Wallet not connected");try{h({status:"loading",error:null,transactionId:null});const a=await n.requestQuote({resource:l,couponCode:o});if(!n.validateRequirement(a))throw new Error("Invalid refund requirement received");x(a);const u=await d.buildTransaction({requirement:a,payerPublicKey:f}),b=await d.signTransaction({transaction:u,signTransaction:c}),s=d.buildPaymentPayload({requirement:a,signedTx:b,payerPublicKey:f}),w=await n.submitPayment({resource:l,payload:s,couponCode:o,metadata:void 0,resourceType:"refund"});return w.settlement&&R(w.settlement),h({status:"success",error:null,transactionId:w.transactionId||b.signature}),w}catch(a){const u=t.formatError(a,"Refund payment failed");throw h({status:"error",error:u,transactionId:null}),a}},[f,c,n,d]),I=i.useCallback(async l=>{if(!f||!c)throw new Error("Wallet not connected");try{h({status:"loading",error:null,transactionId:null});const o=await n.requestQuote({resource:l});if(!n.validateRequirement(o))throw new Error("Invalid refund requirement received");x(o);const{transaction:a}=await n.buildGaslessTransaction({resourceId:l,userWallet:f.toString(),feePayer:o.extra.feePayer}),u=d.deserializeTransaction(a),b=await d.partiallySignTransaction({transaction:u,signTransaction:c}),s=await n.submitGaslessTransaction({resource:l,partialTx:b,couponCode:void 0,metadata:void 0,resourceType:"refund",requirement:o});return s.settlement&&R(s.settlement),h({status:"success",error:null,transactionId:s.transactionId||"gasless-refund-tx"}),s}catch(o){const a=t.formatError(o,"Gasless refund payment failed");throw h({status:"error",error:a,transactionId:null}),o}},[f,c,n,d]),S=i.useCallback(()=>{h({status:"idle",error:null,transactionId:null}),x(null),R(null)},[]);return{state:T,requirement:m,settlement:E,fetchRefundQuote:W,processRefund:k,processGaslessRefund:I,reset:S}}exports.CEDROS_EVENTS=e.CEDROS_EVENTS;exports.CSP_PRESETS=e.CSP_PRESETS;exports.CedrosPay=e.CedrosPay;exports.CedrosPayAdminDashboard=e.CedrosPayAdminDashboard;exports.CreditsButton=e.CreditsButton;exports.CreditsSubscribeButton=e.CreditsSubscribeButton;exports.CryptoButton=e.CryptoButton;exports.ERROR_CATEGORIES=e.ERROR_CATEGORIES;exports.PaymentMethodBadge=e.PaymentMethodBadge;exports.PaymentModal=e.PaymentModal;exports.ProductPrice=e.ProductPrice;exports.PurchaseButton=e.PurchaseButton;exports.RPC_PROVIDERS=e.RPC_PROVIDERS;exports.SECURITY_RECOMMENDATIONS=e.SECURITY_RECOMMENDATIONS;exports.StripeButton=e.StripeButton;exports.SubscribeButton=e.SubscribeButton;exports.SubscriptionManagementPanel=e.SubscriptionManagementPanel;exports.calculateDiscountPercentage=e.calculateDiscountPercentage;exports.cedrosPayPlugin=e.cedrosPayPlugin;exports.createTranslator=e.createTranslator;exports.detectLocale=e.detectLocale;exports.ecommerce=e.index;exports.emitPaymentError=e.emitPaymentError;exports.emitPaymentProcessing=e.emitPaymentProcessing;exports.emitPaymentStart=e.emitPaymentStart;exports.emitPaymentSuccess=e.emitPaymentSuccess;exports.emitWalletConnect=e.emitWalletConnect;exports.emitWalletConnected=e.emitWalletConnected;exports.emitWalletError=e.emitWalletError;exports.formatCSP=e.formatCSP;exports.formatCouponCodes=e.formatCouponCodes;exports.generateCSP=e.generateCSP;exports.generateCSPDirectives=e.generateCSPDirectives;exports.getAvailableLocales=e.getAvailableLocales;exports.getLocalizedError=e.getLocalizedError;exports.getUserErrorMessage=e.getUserErrorMessage;exports.isRetryableError=e.isRetryableError;exports.loadLocale=e.loadLocale;exports.logSecurityReport=e.logSecurityReport;exports.parseCouponCodes=e.parseCouponCodes;exports.stackCheckoutCoupons=e.stackCheckoutCoupons;exports.useCreditsPayment=e.useCreditsPayment;exports.useCreditsSubscription=e.useCreditsSubscription;exports.useLocalizedError=e.useLocalizedError;exports.usePaymentMode=e.usePaymentMode;exports.useStripeCheckout=e.useStripeCheckout;exports.useSubscription=e.useSubscription;exports.useSubscriptionManagement=e.useSubscriptionManagement;exports.useTranslation=e.useTranslation;exports.useX402Payment=e.useX402Payment;exports.validateSecurity=e.validateSecurity;exports.CIRCUIT_BREAKER_PRESETS=t.CIRCUIT_BREAKER_PRESETS;exports.CedrosProvider=t.CedrosProvider;exports.CircuitBreakerOpenError=t.CircuitBreakerOpenError;exports.CircuitState=t.CircuitState;exports.KNOWN_STABLECOINS=t.KNOWN_STABLECOINS;exports.LogLevel=t.LogLevel;exports.Logger=t.Logger;exports.RATE_LIMITER_PRESETS=t.RATE_LIMITER_PRESETS;exports.RETRY_PRESETS=t.RETRY_PRESETS;exports.createCircuitBreaker=t.createCircuitBreaker;exports.createLogger=t.createLogger;exports.createRateLimiter=t.createRateLimiter;exports.getLogger=t.getLogger;exports.retryWithBackoff=t.retryWithBackoff;exports.useCedrosContext=t.useCedrosContext;exports.useCedrosTheme=t.useCedrosTheme;exports.validateConfig=t.validateConfig;exports.validateTokenMint=t.validateTokenMint;exports.WalletPool=ae.WalletPool;exports.createWalletPool=ae.createWalletPool;exports.CryptoSubscribeButton=Ce;exports.useCryptoSubscription=se;exports.useRefundVerification=Se;
@@ -1,5 +1,5 @@
1
- import { U as ke, F as Te, G as ue, A as Re, D as de, y as ve, z as pe, B as V, a0 as Be, a1 as Ie } from "./index-9OMDKaoz.mjs";
2
- import { x as Ue, w as Ve, C as Ye, a as He, b as Je, h as Xe, a2 as Ze, E as et, f as tt, d as rt, e as at, P as nt, R as st, L as ot, S as it, g as ct, i as lt, q as ut, c as dt, Q as pt, M as mt, W as ft, v as yt, o as bt, r as gt, t as wt, O as St, T as ht, I as Ct, H as xt, N as Pt, K as Et, p as kt, s as Tt, j as Rt, m as vt, V as Bt, k as It, u as Wt, l as qt, n as _t, a3 as Mt, J as Lt } from "./index-9OMDKaoz.mjs";
1
+ import { U as ke, F as Te, G as ue, A as Re, D as de, y as ve, z as pe, B as V, a0 as Be, a1 as Ie } from "./index-ByDbfwun.mjs";
2
+ import { x as Ue, w as Ve, C as Ye, a as He, b as Je, h as Xe, a2 as Ze, E as et, f as tt, d as rt, e as at, P as nt, R as st, L as ot, S as it, g as ct, i as lt, q as ut, c as dt, Q as pt, M as mt, W as ft, v as yt, o as bt, r as gt, t as wt, O as St, T as ht, I as Ct, H as xt, N as Pt, K as Et, p as kt, s as Tt, j as Rt, m as vt, V as Bt, k as It, u as Wt, l as qt, n as _t, a3 as Mt, J as Lt } from "./index-ByDbfwun.mjs";
3
3
  import { jsxs as O, jsx as x } from "react/jsx-runtime";
4
4
  import { useState as B, useCallback as h, useRef as me, useEffect as N, useMemo as F } from "react";
5
5
  import { u as Y, m as D, a as We, i as y } from "./CedrosContext-D7nh5-Zh.mjs";