@cedros/pay-react 1.1.20 → 1.1.21

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.
Files changed (42) hide show
  1. package/README.md +2 -0
  2. package/dist/{AISettingsSection-BH-RXvk1.mjs → AISettingsSection-8eDaxYp8.mjs} +2 -2
  3. package/dist/{AISettingsSection-f5K0nUoQ.js → AISettingsSection-BXWZcMQT.js} +1 -1
  4. package/dist/{AutosaveIndicator-DTOaopUP.mjs → AutosaveIndicator-3S7EvXip.mjs} +1 -1
  5. package/dist/{AutosaveIndicator-CpTVtJIz.js → AutosaveIndicator-DW4IPbZ5.js} +1 -1
  6. package/dist/{FAQSection-BO7ZfQMN.mjs → FAQSection-Dg-I7Z-N.mjs} +1 -1
  7. package/dist/{FAQSection-CVJ5w6cB.js → FAQSection-r6eKjfdO.js} +1 -1
  8. package/dist/MessagingSection-Cld5Q7ZM.js +1 -0
  9. package/dist/{MessagingSection-CmFYFdaw.mjs → MessagingSection-D39EuOLN.mjs} +143 -96
  10. package/dist/{PaymentSettingsSection-BKDiep-C.js → PaymentSettingsSection-B-MRsh1K.js} +1 -1
  11. package/dist/{PaymentSettingsSection-VDcgpOkp.mjs → PaymentSettingsSection-CEGHN6VI.mjs} +1 -1
  12. package/dist/{SettingsSection-B0TpaIOG.mjs → SettingsSection-CPFOuoZG.mjs} +1 -1
  13. package/dist/{SettingsSection-DSlW47o4.js → SettingsSection-ZrzfLBlS.js} +1 -1
  14. package/dist/{SingleCategorySettings-Cwlehl0u.mjs → SingleCategorySettings-DhHGIGwB.mjs} +50 -46
  15. package/dist/SingleCategorySettings-DxjCafCk.js +3 -0
  16. package/dist/{StorefrontSection-DfN5yxkV.js → StorefrontSection-DGVcJu1T.js} +1 -1
  17. package/dist/{StorefrontSection-BAY9V1j6.mjs → StorefrontSection-f54ySA6i.mjs} +2 -2
  18. package/dist/{SubscriptionsSection-D_RKCILr.mjs → SubscriptionsSection-F2IiU2jv.mjs} +1 -1
  19. package/dist/{SubscriptionsSection-BboudRYv.js → SubscriptionsSection-fzbL5DGC.js} +1 -1
  20. package/dist/crypto-only.js +1 -1
  21. package/dist/crypto-only.mjs +133 -130
  22. package/dist/{index-B5ck27xb.js → index-7YUxR4u5.js} +10 -10
  23. package/dist/{index-75RhiLDq.mjs → index-bqhsxBTY.mjs} +3116 -3099
  24. package/dist/index.js +1 -1
  25. package/dist/index.mjs +51 -48
  26. package/dist/sections-CiAMjlPd.mjs +8 -0
  27. package/dist/{sections-BCdzdqlG.js → sections-Dh0qFSUW.js} +1 -1
  28. package/dist/src/admin/index.d.ts +2 -0
  29. package/dist/src/admin/index.d.ts.map +1 -1
  30. package/dist/src/admin/sectionIds.d.ts +43 -0
  31. package/dist/src/admin/sectionIds.d.ts.map +1 -0
  32. package/dist/src/components/admin/MessagingSection.d.ts.map +1 -1
  33. package/dist/src/components/admin/configApi.d.ts.map +1 -1
  34. package/dist/src/components/admin/emailProviders.d.ts +18 -0
  35. package/dist/src/components/admin/emailProviders.d.ts.map +1 -0
  36. package/dist/src/ecommerce/adapters/paywall/paywallAdapter.d.ts.map +1 -1
  37. package/dist/src/index.d.ts +1 -1
  38. package/dist/src/index.d.ts.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/MessagingSection-CRFtSoE8.js +0 -1
  41. package/dist/SingleCategorySettings-BTXR7zex.js +0 -3
  42. package/dist/sections-BIBMX6KS.mjs +0 -8
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./styles-BWrLnaUW.js"),t=require("./CedrosContext-D-lnoEkR.js"),Q=require("./index-B5ck27xb.js"),ce=require("./CryptoButton-Dy-g3bR0.js"),C=require("react/jsx-runtime"),a=require("react"),F=require("@solana/wallet-adapter-react"),ie=require("@solana/wallet-adapter-base"),Pe=require("@solana/wallet-adapter-react-ui"),le=require("./walletPool-BqNfOhB0.js");function ue(){const{subscriptionManager:o,x402Manager:d,walletManager:f}=t.useCedrosContext(),{publicKey:u,signTransaction:T}=F.useWallet(),[P,y]=a.useState({status:"idle",error:null,sessionId:null,subscriptionStatus:null,expiresAt:null}),[k,R]=a.useState(null),x=a.useRef(!1),E=a.useCallback(()=>{if(!u){const c="Wallet not connected";return y(n=>({...n,status:"error",error:c})),{valid:!1,error:c}}if(!T){const c="Wallet does not support signing";return y(n=>({...n,status:"error",error:c})),{valid:!1,error:c}}return{valid:!0}},[u,T]),B=a.useCallback(async c=>{if(!u)return y(n=>({...n,status:"error",error:"Wallet not connected"})),null;y(n=>({...n,status:"checking",error:null}));try{const n=await o.checkSubscriptionStatus({resource:c,userId:u.toString()});return y(s=>({...s,status:n.active?"success":"idle",subscriptionStatus:n.status,expiresAt:n.expiresAt||n.currentPeriodEnd||null})),n}catch(n){const s=t.formatError(n,"Failed to check subscription status");return y(g=>({...g,status:"error",error:s})),null}},[u,o]),I=a.useCallback(async(c,n,s)=>{y(g=>({...g,status:"loading",error:null}));try{const g=await o.requestSubscriptionQuote(c,n,s);return R(g),y(i=>({...i,status:"idle"})),g}catch(g){const i=t.formatError(g,"Failed to get subscription quote");return y(l=>({...l,status:"error",error:i})),null}},[o]),S=a.useCallback(async(c,n,s)=>{if(x.current)return{success:!1,error:"Payment already in progress"};const g=E();if(!g.valid)return{success:!1,error:g.error};x.current=!0,y(i=>({...i,status:"loading",error:null}));try{const i=await o.requestSubscriptionQuote(c,n,s);R(i);const l=i.requirement;if(!d.validateRequirement(l))throw new Error("Invalid subscription quote received from server");const w=!!l.extra?.feePayer;let b;if(w){const{transaction:h,blockhash:_}=await d.buildGaslessTransaction({resourceId:c,userWallet:u.toString(),feePayer:l.extra.feePayer,couponCode:s?.couponCode}),M=f.deserializeTransaction(h),q=await f.partiallySignTransaction({transaction:M,signTransaction:T,blockhash:_});b=await d.submitGaslessTransaction({resource:c,partialTx:q,couponCode:s?.couponCode,resourceType:"regular",requirement:l})}else{const h=await f.buildTransaction({requirement:l,payerPublicKey:u}),_=await f.signTransaction({transaction:h,signTransaction:T}),M=f.buildPaymentPayload({requirement:l,signedTx:_,payerPublicKey:u});b=await d.submitPayment({resource:c,payload:M,couponCode:s?.couponCode,resourceType:"regular"})}if(b.success){const h=await o.checkSubscriptionStatus({resource:c,userId:u.toString()});y({status:"success",error:null,sessionId:b.transactionId||null,subscriptionStatus:h.status,expiresAt:h.expiresAt||h.currentPeriodEnd||null})}else y(h=>({...h,status:"error",error:b.error||"Subscription payment failed"}));return b}catch(i){const l=t.formatError(i,"Subscription payment failed");return y(w=>({...w,status:"error",error:l})),{success:!1,error:l}}finally{x.current=!1}},[E,o,d,f,u,T]),L=a.useCallback(()=>{y({status:"idle",error:null,sessionId:null,subscriptionStatus:null,expiresAt:null}),R(null)},[]);return{...P,quote:k,checkStatus:B,requestQuote:I,processPayment:S,reset:L}}function he({resource:o,interval:d,intervalDays:f,couponCode:u,label:T,disabled:P=!1,onAttempt:y,onSuccess:k,onError:R,className:x="",testPageUrl:E,hideMessages:B=!1,autoCheckStatus:I=!0}){const{connected:S,connecting:L,connect:c,disconnect:n,select:s,wallets:g,wallet:i,publicKey:l}=F.useWallet(),{status:w,error:b,subscriptionStatus:h,expiresAt:_,checkStatus:M,processPayment:q}=ue(),p=t.useCedrosTheme(),{solanaError:W}=t.useCedrosContext(),{t:v,translations:U}=e.useTranslation(),de=T||v("ui.subscribe_with_crypto"),G=a.useRef(k),V=a.useRef(R),Y=a.useRef(q),X=a.useRef(M);G.current=k,V.current=R,Y.current=q,X.current=M;const ge=b&&typeof b!="string"?b?.code??null:null,pe=W&&typeof W!="string"?W?.code??null:null,H=r=>{if(!r||!U)return"";const m=U.errors[r];return m?m.action?`${m.message} ${m.action}`:m.message:""},J=b?typeof b=="string"?b:H(ge):null,Z=W?typeof W=="string"?W:H(pe):null,me=a.useMemo(()=>g.map(r=>`${r.adapter.name}-${r.readyState}`).join(","),[g]),z=a.useMemo(()=>g.filter(({readyState:r})=>r===ie.WalletReadyState.Installed||r===ie.WalletReadyState.Loadable),[me]);a.useEffect(()=>{I&&S&&l&&(t.getLogger().debug("[CryptoSubscribeButton] Auto-checking subscription status"),X.current(o))},[I,S,l,o]),a.useEffect(()=>{w==="success"&&h==="active"&&(e.emitPaymentSuccess("crypto","subscription-active",o),G.current?.("subscription-active"))},[w,h,o]),a.useEffect(()=>{w==="error"&&b&&(e.emitPaymentError("crypto",b,o),V.current?.(b))},[w,b,o]);const ee=typeof window<"u"&&window.top!==window.self,[te,A]=a.useState(!1),[re,K]=a.useState(!1),[ne,j]=a.useState(!1),O=W;a.useEffect(()=>{let r=!1;return r||(async()=>{if(re&&i&&!S&&!L){t.getLogger().debug("[CryptoSubscribeButton] Wallet detected, attempting auto-connect:",i.adapter.name),K(!1),e.emitWalletConnect(i.adapter.name);try{await c(),r||t.getLogger().debug("[CryptoSubscribeButton] Auto-connect successful")}catch($){if(!r){t.getLogger().error("[CryptoSubscribeButton] Auto-connect failed:",$);const we=$ instanceof Error?$.message:"Failed to connect wallet";e.emitWalletError(we,i.adapter.name),j(!1)}}}})(),()=>{r=!0}},[i,re,S,L,c]),a.useEffect(()=>{S&&ne&&l&&i&&(e.emitWalletConnected(i.adapter.name,l.toString()),t.getLogger().debug("[CryptoSubscribeButton] Processing pending subscription payment"),j(!1),A(!1),e.emitPaymentProcessing("crypto",o),Y.current(o,d,{couponCode:u,intervalDays:f}))},[S,ne,l,i,o,d,u,f]);const oe=a.useCallback(async()=>{if(t.getLogger().debug("[CryptoSubscribeButton] executeSubscriptionFlow called",{connected:S,wallet:i?.adapter.name,resource:o,interval:d}),e.emitPaymentStart("crypto",o),y&&y("crypto"),O){t.getLogger().error("[CryptoSubscribeButton] Solana dependencies missing:",O),e.emitPaymentError("crypto",O,o),R&&R(O);return}if(ee){const r=E||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(m){throw t.getLogger().error("[CryptoSubscribeButton] URL validation failed:",m),m}return}if(S)e.emitPaymentProcessing("crypto",o),await q(o,d,{couponCode:u,intervalDays:f});else{j(!0);try{if(i)t.getLogger().debug("[CryptoSubscribeButton] Wallet already selected, connecting:",i.adapter.name),e.emitWalletConnect(i.adapter.name),await c();else{if(t.getLogger().debug("[CryptoSubscribeButton] No wallet selected, showing selector"),z.length===0){j(!1);const r="No wallets available";throw e.emitWalletError(r),new Error(r)}A(!0)}}catch(r){j(!1);const m=r instanceof Error?r.message:"Failed to connect wallet";t.getLogger().error("[CryptoSubscribeButton] Connection error:",m),e.emitWalletError(m,i?.adapter.name)}}},[S,i,o,d,u,f,ee,E,z,c,q,O,y,R]),ae=a.useMemo(()=>`crypto-subscribe-${o}-${d}`,[o,d]),ye=a.useMemo(()=>e.createDedupedClickHandler(ae,oe,{cooldownMs:200,deduplicationWindowMs:0}),[ae,oe]),se=w==="loading"||w==="checking",N=h==="active"||h==="trialing",fe=P||se||L||!!O||N;let D=de;if(se)D=v("ui.processing");else if(N&&_){const r=new Date(_).toLocaleDateString();D=`${v("ui.subscribed_until")} ${r}`}else N&&(D=v("ui.subscribed"));const be=a.useCallback(async()=>{try{K(!1),S&&await n(),s(null),A(!0)}catch(r){t.getLogger().error("Failed to change wallet:",r)}},[S,n,s]),Ce=a.useCallback(r=>{t.getLogger().debug("[CryptoSubscribeButton] Wallet clicked:",r),A(!1),s(r),K(!0)},[s]),Se=a.useCallback(async()=>{try{if(await n(),j(!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)}},[n]);return C.jsxs("div",{className:p.unstyled?x:`${p.className} cedros-theme__crypto-button ${x||""}`,style:p.unstyled?{}:p.style,children:[C.jsx("button",{onClick:ye,disabled:fe,className:p.unstyled?x:"cedros-theme__button cedros-theme__crypto",type:"button",children:D}),te&&!B&&C.jsx("div",{className:"cedros-modal-overlay",style:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:p.tokens.modalOverlay,display:"flex",alignItems:"center",justifyContent:"center",zIndex:9999,padding:"1rem"},onClick:()=>A(!1),children:C.jsxs("div",{className:"cedros-modal-content",style:{backgroundColor:p.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 ${p.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:p.tokens.surfaceText},children:v("wallet.select_wallet")}),C.jsx("button",{onClick:()=>A(!1),style:e.getModalCloseButtonStyles(p.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:()=>Ce(r.adapter.name),style:{width:"100%",padding:"1rem",backgroundColor:p.tokens.surfaceBackground,border:`1px solid ${p.tokens.surfaceBorder}`,borderRadius:"0.5rem",cursor:"pointer",fontSize:"1rem",textAlign:"left",color:p.tokens.surfaceText,display:"flex",alignItems:"center",gap:"1rem",transition:"all 0.2s ease"},onMouseEnter:m=>{m.currentTarget.style.backgroundColor=p.tokens.modalBackground,m.currentTarget.style.borderColor=p.tokens.surfaceText,m.currentTarget.style.transform="translateY(-2px)"},onMouseLeave:m=>{m.currentTarget.style.backgroundColor=p.tokens.surfaceBackground,m.currentTarget.style.borderColor=p.tokens.surfaceBorder,m.currentTarget.style.transform="translateY(0)"},type:"button",children:[C.jsx(Pe.WalletIcon,{wallet:r,style:{width:"24px",height:"24px"}}),C.jsx("span",{style:{fontWeight:500},children:r.adapter.name})]},r.adapter.name))})]})}),S&&!B&&!te&&C.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:"0.5rem",fontSize:"0.75rem",color:p.tokens.surfaceText,opacity:.7},children:[C.jsx("button",{onClick:be,style:{background:"none",border:"none",padding:0,color:"inherit",textDecoration:"none",cursor:"pointer",fontSize:"inherit"},type:"button",children:v("wallet.change")}),C.jsx("button",{onClick:Se,style:{background:"none",border:"none",padding:0,color:"inherit",textDecoration:"none",cursor:"pointer",fontSize:"inherit"},type:"button",children:v("ui.disconnect")})]}),!B&&Z&&C.jsx("div",{className:p.unstyled?"":"cedros-theme__error",children:Z}),!B&&J&&C.jsx("div",{className:p.unstyled?"":"cedros-theme__error",children:J}),!B&&N&&C.jsx("div",{className:p.unstyled?"":"cedros-theme__success",children:v("ui.subscription_active")})]})}function Ee(){const{x402Manager:o,walletManager:d}=t.useCedrosContext(),{publicKey:f,signTransaction:u}=F.useWallet(),[T,P]=a.useState({status:"idle",error:null,transactionId:null}),[y,k]=a.useState(null),[R,x]=a.useState(null),E=a.useRef(!1),B=a.useCallback(async c=>{try{P(s=>({...s,status:"loading"}));const n=await o.requestQuote({resource:c});if(!o.validateRequirement(n))throw new Error("Invalid refund requirement received from server");return k(n),P(s=>({...s,status:"idle"})),n}catch(n){const s=t.formatError(n,"Failed to fetch refund requirement");throw P({status:"error",error:s,transactionId:null}),n}},[o]),I=a.useCallback(async(c,n)=>{if(E.current)throw new Error("Refund already in progress");if(!f||!u)throw new Error("Wallet not connected");E.current=!0;try{P({status:"loading",error:null,transactionId:null});const s=await o.requestQuote({resource:c,couponCode:n});if(!o.validateRequirement(s))throw new Error("Invalid refund requirement received");k(s);const g=await d.buildTransaction({requirement:s,payerPublicKey:f}),i=await d.signTransaction({transaction:g,signTransaction:u}),l=d.buildPaymentPayload({requirement:s,signedTx:i,payerPublicKey:f}),w=await o.submitPayment({resource:c,payload:l,couponCode:n,metadata:void 0,resourceType:"refund"});return w.settlement&&x(w.settlement),P({status:"success",error:null,transactionId:w.transactionId||i.signature}),w}catch(s){const g=t.formatError(s,"Refund payment failed");throw P({status:"error",error:g,transactionId:null}),s}finally{E.current=!1}},[f,u,o,d]),S=a.useCallback(async c=>{if(E.current)throw new Error("Refund already in progress");if(!f||!u)throw new Error("Wallet not connected");E.current=!0;try{P({status:"loading",error:null,transactionId:null});const n=await o.requestQuote({resource:c});if(!o.validateRequirement(n))throw new Error("Invalid refund requirement received");k(n);const{transaction:s}=await o.buildGaslessTransaction({resourceId:c,userWallet:f.toString(),feePayer:n.extra.feePayer}),g=d.deserializeTransaction(s),i=await d.partiallySignTransaction({transaction:g,signTransaction:u}),l=await o.submitGaslessTransaction({resource:c,partialTx:i,couponCode:void 0,metadata:void 0,resourceType:"refund",requirement:n});return l.settlement&&x(l.settlement),P({status:"success",error:null,transactionId:l.transactionId||"gasless-refund-tx"}),l}catch(n){const s=t.formatError(n,"Gasless refund payment failed");throw P({status:"error",error:s,transactionId:null}),n}finally{E.current=!1}},[f,u,o,d]),L=a.useCallback(()=>{P({status:"idle",error:null,transactionId:null}),k(null),x(null)},[]);return{state:T,requirement:y,settlement:R,fetchRefundQuote:B,processRefund:I,processGaslessRefund:S,reset:L}}exports.CEDROS_EVENTS=e.CEDROS_EVENTS;exports.CSP_PRESETS=e.CSP_PRESETS;exports.CedrosPay=e.CedrosPay;exports.CreditsButton=e.CreditsButton;exports.CreditsSubscribeButton=e.CreditsSubscribeButton;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.createTranslator=e.createTranslator;exports.detectLocale=e.detectLocale;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.validateSecurity=e.validateSecurity;exports.CIRCUIT_BREAKER_PRESETS=t.CIRCUIT_BREAKER_PRESETS;exports.CedrosProvider=t.CedrosProvider;exports.CircuitBreakerOpenError=t.CircuitBreakerOpenError;exports.CircuitState=t.CircuitState;exports.ERROR_CATEGORIES=t.ERROR_CATEGORIES;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.CedrosPayAdminDashboard=Q.CedrosPayAdminDashboard;exports.cedrosPayPlugin=Q.cedrosPayPlugin;exports.ecommerce=Q.index;exports.CryptoButton=ce.CryptoButton;exports.useX402Payment=ce.useX402Payment;exports.WalletPool=le.WalletPool;exports.createWalletPool=le.createWalletPool;exports.CryptoSubscribeButton=he;exports.useCryptoSubscription=ue;exports.useRefundVerification=Ee;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./styles-BWrLnaUW.js"),t=require("./CedrosContext-D-lnoEkR.js"),N=require("./index-7YUxR4u5.js"),ce=require("./CryptoButton-Dy-g3bR0.js"),S=require("react/jsx-runtime"),a=require("react"),$=require("@solana/wallet-adapter-react"),ie=require("@solana/wallet-adapter-base"),Pe=require("@solana/wallet-adapter-react-ui"),le=require("./walletPool-BqNfOhB0.js");function ue(){const{subscriptionManager:o,x402Manager:d,walletManager:f}=t.useCedrosContext(),{publicKey:u,signTransaction:T}=$.useWallet(),[P,y]=a.useState({status:"idle",error:null,sessionId:null,subscriptionStatus:null,expiresAt:null}),[k,R]=a.useState(null),x=a.useRef(!1),h=a.useCallback(()=>{if(!u){const c="Wallet not connected";return y(n=>({...n,status:"error",error:c})),{valid:!1,error:c}}if(!T){const c="Wallet does not support signing";return y(n=>({...n,status:"error",error:c})),{valid:!1,error:c}}return{valid:!0}},[u,T]),_=a.useCallback(async c=>{if(!u)return y(n=>({...n,status:"error",error:"Wallet not connected"})),null;y(n=>({...n,status:"checking",error:null}));try{const n=await o.checkSubscriptionStatus({resource:c,userId:u.toString()});return y(s=>({...s,status:n.active?"success":"idle",subscriptionStatus:n.status,expiresAt:n.expiresAt||n.currentPeriodEnd||null})),n}catch(n){const s=t.formatError(n,"Failed to check subscription status");return y(g=>({...g,status:"error",error:s})),null}},[u,o]),L=a.useCallback(async(c,n,s)=>{y(g=>({...g,status:"loading",error:null}));try{const g=await o.requestSubscriptionQuote(c,n,s);return R(g),y(i=>({...i,status:"idle"})),g}catch(g){const i=t.formatError(g,"Failed to get subscription quote");return y(l=>({...l,status:"error",error:i})),null}},[o]),C=a.useCallback(async(c,n,s)=>{if(x.current)return{success:!1,error:"Payment already in progress"};const g=h();if(!g.valid)return{success:!1,error:g.error};x.current=!0,y(i=>({...i,status:"loading",error:null}));try{const i=await o.requestSubscriptionQuote(c,n,s);R(i);const l=i.requirement;if(!d.validateRequirement(l))throw new Error("Invalid subscription quote received from server");const E=!!l.extra?.feePayer;let b;if(E){const{transaction:w,blockhash:W}=await d.buildGaslessTransaction({resourceId:c,userWallet:u.toString(),feePayer:l.extra.feePayer,couponCode:s?.couponCode}),M=f.deserializeTransaction(w),q=await f.partiallySignTransaction({transaction:M,signTransaction:T,blockhash:W});b=await d.submitGaslessTransaction({resource:c,partialTx:q,couponCode:s?.couponCode,resourceType:"regular",requirement:l})}else{const w=await f.buildTransaction({requirement:l,payerPublicKey:u}),W=await f.signTransaction({transaction:w,signTransaction:T}),M=f.buildPaymentPayload({requirement:l,signedTx:W,payerPublicKey:u});b=await d.submitPayment({resource:c,payload:M,couponCode:s?.couponCode,resourceType:"regular"})}if(b.success){const w=await o.checkSubscriptionStatus({resource:c,userId:u.toString()});y({status:"success",error:null,sessionId:b.transactionId||null,subscriptionStatus:w.status,expiresAt:w.expiresAt||w.currentPeriodEnd||null})}else y(w=>({...w,status:"error",error:b.error||"Subscription payment failed"}));return b}catch(i){const l=t.formatError(i,"Subscription payment failed");return y(E=>({...E,status:"error",error:l})),{success:!1,error:l}}finally{x.current=!1}},[h,o,d,f,u,T]),v=a.useCallback(()=>{y({status:"idle",error:null,sessionId:null,subscriptionStatus:null,expiresAt:null}),R(null)},[]);return{...P,quote:k,checkStatus:_,requestQuote:L,processPayment:C,reset:v}}function we({resource:o,interval:d,intervalDays:f,couponCode:u,label:T,disabled:P=!1,onAttempt:y,onSuccess:k,onError:R,className:x="",testPageUrl:h,hideMessages:_=!1,autoCheckStatus:L=!0}){const{connected:C,connecting:v,connect:c,disconnect:n,select:s,wallets:g,wallet:i,publicKey:l}=$.useWallet(),{status:E,error:b,subscriptionStatus:w,expiresAt:W,checkStatus:M,processPayment:q}=ue(),p=t.useCedrosTheme(),{solanaError:I}=t.useCedrosContext(),{t:B,translations:G}=e.useTranslation(),de=T||B("ui.subscribe_with_crypto"),Q=a.useRef(k),F=a.useRef(R),V=a.useRef(q),X=a.useRef(M);Q.current=k,F.current=R,V.current=q,X.current=M;const ge=b&&typeof b!="string"?b?.code??null:null,pe=I&&typeof I!="string"?I?.code??null:null,H=r=>{if(!r||!G)return"";const m=G.errors[r];return m?m.action?`${m.message} ${m.action}`:m.message:""},J=b?typeof b=="string"?b:H(ge):null,Z=I?typeof I=="string"?I:H(pe):null,me=a.useMemo(()=>g.map(r=>`${r.adapter.name}-${r.readyState}`).join(","),[g]),K=a.useMemo(()=>g.filter(({readyState:r})=>r===ie.WalletReadyState.Installed||r===ie.WalletReadyState.Loadable),[me]);a.useEffect(()=>{L&&C&&l&&(t.getLogger().debug("[CryptoSubscribeButton] Auto-checking subscription status"),X.current(o))},[L,C,l,o]),a.useEffect(()=>{E==="success"&&w==="active"&&(e.emitPaymentSuccess("crypto","subscription-active",o),Q.current?.("subscription-active"))},[E,w,o]),a.useEffect(()=>{E==="error"&&b&&(e.emitPaymentError("crypto",b,o),F.current?.(b))},[E,b,o]);const ee=typeof window<"u"&&window.top!==window.self,[te,O]=a.useState(!1),[re,U]=a.useState(!1),[ne,A]=a.useState(!1),D=I;a.useEffect(()=>{let r=!1;return r||(async()=>{if(re&&i&&!C&&!v){t.getLogger().debug("[CryptoSubscribeButton] Wallet detected, attempting auto-connect:",i.adapter.name),U(!1),e.emitWalletConnect(i.adapter.name);try{await c(),r||t.getLogger().debug("[CryptoSubscribeButton] Auto-connect successful")}catch(Y){if(!r){t.getLogger().error("[CryptoSubscribeButton] Auto-connect failed:",Y);const Ee=Y instanceof Error?Y.message:"Failed to connect wallet";e.emitWalletError(Ee,i.adapter.name),A(!1)}}}})(),()=>{r=!0}},[i,re,C,v,c]),a.useEffect(()=>{C&&ne&&l&&i&&(e.emitWalletConnected(i.adapter.name,l.toString()),t.getLogger().debug("[CryptoSubscribeButton] Processing pending subscription payment"),A(!1),O(!1),e.emitPaymentProcessing("crypto",o),V.current(o,d,{couponCode:u,intervalDays:f}))},[C,ne,l,i,o,d,u,f]);const oe=a.useCallback(async()=>{if(t.getLogger().debug("[CryptoSubscribeButton] executeSubscriptionFlow called",{connected:C,wallet:i?.adapter.name,resource:o,interval:d}),e.emitPaymentStart("crypto",o),y&&y("crypto"),D){t.getLogger().error("[CryptoSubscribeButton] Solana dependencies missing:",D),e.emitPaymentError("crypto",D,o),R&&R(D);return}if(ee){const r=h||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(m){throw t.getLogger().error("[CryptoSubscribeButton] URL validation failed:",m),m}return}if(C)e.emitPaymentProcessing("crypto",o),await q(o,d,{couponCode:u,intervalDays:f});else{A(!0);try{if(i)t.getLogger().debug("[CryptoSubscribeButton] Wallet already selected, connecting:",i.adapter.name),e.emitWalletConnect(i.adapter.name),await c();else{if(t.getLogger().debug("[CryptoSubscribeButton] No wallet selected, showing selector"),K.length===0){A(!1);const r="No wallets available";throw e.emitWalletError(r),new Error(r)}O(!0)}}catch(r){A(!1);const m=r instanceof Error?r.message:"Failed to connect wallet";t.getLogger().error("[CryptoSubscribeButton] Connection error:",m),e.emitWalletError(m,i?.adapter.name)}}},[C,i,o,d,u,f,ee,h,K,c,q,D,y,R]),ae=a.useMemo(()=>`crypto-subscribe-${o}-${d}`,[o,d]),ye=a.useMemo(()=>e.createDedupedClickHandler(ae,oe,{cooldownMs:200,deduplicationWindowMs:0}),[ae,oe]),se=E==="loading"||E==="checking",j=w==="active"||w==="trialing",fe=P||se||v||!!D||j;let z=de;if(se)z=B("ui.processing");else if(j&&W){const r=new Date(W).toLocaleDateString();z=`${B("ui.subscribed_until")} ${r}`}else j&&(z=B("ui.subscribed"));const be=a.useCallback(async()=>{try{U(!1),C&&await n(),s(null),O(!0)}catch(r){t.getLogger().error("Failed to change wallet:",r)}},[C,n,s]),Se=a.useCallback(r=>{t.getLogger().debug("[CryptoSubscribeButton] Wallet clicked:",r),O(!1),s(r),U(!0)},[s]),Ce=a.useCallback(async()=>{try{if(await n(),A(!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)}},[n]);return S.jsxs("div",{className:p.unstyled?x:`${p.className} cedros-theme__crypto-button ${x||""}`,style:p.unstyled?{}:p.style,children:[S.jsx("button",{onClick:ye,disabled:fe,className:p.unstyled?x:"cedros-theme__button cedros-theme__crypto",type:"button",children:z}),te&&!_&&S.jsx("div",{className:"cedros-modal-overlay",style:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:p.tokens.modalOverlay,display:"flex",alignItems:"center",justifyContent:"center",zIndex:9999,padding:"1rem"},onClick:()=>O(!1),children:S.jsxs("div",{className:"cedros-modal-content",style:{backgroundColor:p.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 ${p.tokens.modalBorder}`},onClick:r=>r.stopPropagation(),children:[S.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"1.5rem"},children:[S.jsx("h3",{style:{margin:0,fontSize:"1.25rem",fontWeight:600,color:p.tokens.surfaceText},children:B("wallet.select_wallet")}),S.jsx("button",{onClick:()=>O(!1),style:e.getModalCloseButtonStyles(p.tokens.surfaceText),"aria-label":"Close modal",type:"button",children:"×"})]}),S.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:K.map(r=>S.jsxs("button",{onClick:()=>Se(r.adapter.name),style:{width:"100%",padding:"1rem",backgroundColor:p.tokens.surfaceBackground,border:`1px solid ${p.tokens.surfaceBorder}`,borderRadius:"0.5rem",cursor:"pointer",fontSize:"1rem",textAlign:"left",color:p.tokens.surfaceText,display:"flex",alignItems:"center",gap:"1rem",transition:"all 0.2s ease"},onMouseEnter:m=>{m.currentTarget.style.backgroundColor=p.tokens.modalBackground,m.currentTarget.style.borderColor=p.tokens.surfaceText,m.currentTarget.style.transform="translateY(-2px)"},onMouseLeave:m=>{m.currentTarget.style.backgroundColor=p.tokens.surfaceBackground,m.currentTarget.style.borderColor=p.tokens.surfaceBorder,m.currentTarget.style.transform="translateY(0)"},type:"button",children:[S.jsx(Pe.WalletIcon,{wallet:r,style:{width:"24px",height:"24px"}}),S.jsx("span",{style:{fontWeight:500},children:r.adapter.name})]},r.adapter.name))})]})}),C&&!_&&!te&&S.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:"0.5rem",fontSize:"0.75rem",color:p.tokens.surfaceText,opacity:.7},children:[S.jsx("button",{onClick:be,style:{background:"none",border:"none",padding:0,color:"inherit",textDecoration:"none",cursor:"pointer",fontSize:"inherit"},type:"button",children:B("wallet.change")}),S.jsx("button",{onClick:Ce,style:{background:"none",border:"none",padding:0,color:"inherit",textDecoration:"none",cursor:"pointer",fontSize:"inherit"},type:"button",children:B("ui.disconnect")})]}),!_&&Z&&S.jsx("div",{className:p.unstyled?"":"cedros-theme__error",children:Z}),!_&&J&&S.jsx("div",{className:p.unstyled?"":"cedros-theme__error",children:J}),!_&&j&&S.jsx("div",{className:p.unstyled?"":"cedros-theme__success",children:B("ui.subscription_active")})]})}function he(){const{x402Manager:o,walletManager:d}=t.useCedrosContext(),{publicKey:f,signTransaction:u}=$.useWallet(),[T,P]=a.useState({status:"idle",error:null,transactionId:null}),[y,k]=a.useState(null),[R,x]=a.useState(null),h=a.useRef(!1),_=a.useCallback(async c=>{try{P(s=>({...s,status:"loading"}));const n=await o.requestQuote({resource:c});if(!o.validateRequirement(n))throw new Error("Invalid refund requirement received from server");return k(n),P(s=>({...s,status:"idle"})),n}catch(n){const s=t.formatError(n,"Failed to fetch refund requirement");throw P({status:"error",error:s,transactionId:null}),n}},[o]),L=a.useCallback(async(c,n)=>{if(h.current)throw new Error("Refund already in progress");if(!f||!u)throw new Error("Wallet not connected");h.current=!0;try{P({status:"loading",error:null,transactionId:null});const s=await o.requestQuote({resource:c,couponCode:n});if(!o.validateRequirement(s))throw new Error("Invalid refund requirement received");k(s);const g=await d.buildTransaction({requirement:s,payerPublicKey:f}),i=await d.signTransaction({transaction:g,signTransaction:u}),l=d.buildPaymentPayload({requirement:s,signedTx:i,payerPublicKey:f}),E=await o.submitPayment({resource:c,payload:l,couponCode:n,metadata:void 0,resourceType:"refund"});return E.settlement&&x(E.settlement),P({status:"success",error:null,transactionId:E.transactionId||i.signature}),E}catch(s){const g=t.formatError(s,"Refund payment failed");throw P({status:"error",error:g,transactionId:null}),s}finally{h.current=!1}},[f,u,o,d]),C=a.useCallback(async c=>{if(h.current)throw new Error("Refund already in progress");if(!f||!u)throw new Error("Wallet not connected");h.current=!0;try{P({status:"loading",error:null,transactionId:null});const n=await o.requestQuote({resource:c});if(!o.validateRequirement(n))throw new Error("Invalid refund requirement received");k(n);const{transaction:s}=await o.buildGaslessTransaction({resourceId:c,userWallet:f.toString(),feePayer:n.extra.feePayer}),g=d.deserializeTransaction(s),i=await d.partiallySignTransaction({transaction:g,signTransaction:u}),l=await o.submitGaslessTransaction({resource:c,partialTx:i,couponCode:void 0,metadata:void 0,resourceType:"refund",requirement:n});return l.settlement&&x(l.settlement),P({status:"success",error:null,transactionId:l.transactionId||"gasless-refund-tx"}),l}catch(n){const s=t.formatError(n,"Gasless refund payment failed");throw P({status:"error",error:s,transactionId:null}),n}finally{h.current=!1}},[f,u,o,d]),v=a.useCallback(()=>{P({status:"idle",error:null,transactionId:null}),k(null),x(null)},[]);return{state:T,requirement:y,settlement:R,fetchRefundQuote:_,processRefund:L,processGaslessRefund:C,reset:v}}exports.CEDROS_EVENTS=e.CEDROS_EVENTS;exports.CSP_PRESETS=e.CSP_PRESETS;exports.CedrosPay=e.CedrosPay;exports.CreditsButton=e.CreditsButton;exports.CreditsSubscribeButton=e.CreditsSubscribeButton;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.createTranslator=e.createTranslator;exports.detectLocale=e.detectLocale;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.validateSecurity=e.validateSecurity;exports.CIRCUIT_BREAKER_PRESETS=t.CIRCUIT_BREAKER_PRESETS;exports.CedrosProvider=t.CedrosProvider;exports.CircuitBreakerOpenError=t.CircuitBreakerOpenError;exports.CircuitState=t.CircuitState;exports.ERROR_CATEGORIES=t.ERROR_CATEGORIES;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.CEDROS_PAY_GROUPS=N.CEDROS_PAY_GROUPS;exports.CEDROS_PAY_SECTIONS=N.CEDROS_PAY_SECTIONS;exports.CEDROS_PAY_SECTION_IDS=N.CEDROS_PAY_SECTION_IDS;exports.CedrosPayAdminDashboard=N.CedrosPayAdminDashboard;exports.cedrosPayPlugin=N.cedrosPayPlugin;exports.ecommerce=N.index;exports.CryptoButton=ce.CryptoButton;exports.useX402Payment=ce.useX402Payment;exports.WalletPool=le.WalletPool;exports.createWalletPool=le.createWalletPool;exports.CryptoSubscribeButton=we;exports.useCryptoSubscription=ue;exports.useRefundVerification=he;