PageSourceSearch

https://www.twinr.ai/_next/static/chunks/8cb4f71e312e2a66.js

js twinr.ai collected 2026-10-05 15:15:08 UTC 34,288 bytes, 5 lines download raw bytes

1;!function(){try { var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&((e._debugIds|| (e._debugIds={}))[n]="250f1275-61d3-0789-c6d8-47ca11c19f84")}catch(e){}}();
2(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,43004,e=>{"use strict";let t=[{id:"starter",tokens:250,bonusTokens:0,priceGbp:5,pricePerToken:.02,description:"Perfect for trying out"},{id:"basic",tokens:900,bonusTokens:50,priceGbp:15,pricePerToken:.017,description:"Great for casual use"},{id:"standard",tokens:2e3,bonusTokens:200,priceGbp:30,pricePerToken:.015,description:"Best value for regular users",popular:!0,badge:"⭐"},{id:"super_fan",tokens:3800,bonusTokens:500,priceGbp:50,pricePerToken:.013,description:"For dedicated fans"},{id:"ultimate",tokens:8500,bonusTokens:1500,priceGbp:100,pricePerToken:.012,description:"Maximum value",badge:"💎"}];function n(e){return t.find(t=>t.id===e)}function r(e){return e.tokens+e.bonusTokens}function a(e){return Math.floor(r(e)/40)}e.s(["TOKEN_PACKAGES",0,t,"getPackage",()=>n,"getTotalTokens",()=>r,"getVoiceMinutes",()=>a])},894845,e=>{"use strict";var t=e.i(266033),n=e.i(454267),r=e.i(852747),a=e.i(43004);function s({pack:e,isSelected:s,onSelect:o}){var l;let i=(0,a.getTotalTokens)(e),c=(0,a.getVoiceMinutes)(e),u=Math.round((.02-e.pricePerToken)/.02*100),d=c>=60?`~${Math.floor(c/60)} hrs voice`:`~${c} min voice`;return(0,t.jsxs)("button",{type:"button",onClick:o,className:(0,r.cn)("w-full rounded-xl border-2 p-4 text-left transition-all duration-200","hover:border-coral-300 focus:outline-none focus:ring-2 focus:ring-coral-500 focus:ring-offset-2",s?"border-coral-500 bg-coral-50":"border-stone-200 bg-white",e.popular&&"ring-2 ring-coral-500 ring-offset-2"),"aria-pressed":s,children:[e.popular&&(0,t.jsxs)("span",{className:"mb-2 inline-block rounded-full bg-coral-500 px-2 py-0.5 text-xs font-medium text-white",children:[e.badge," Best Value"]}),"ultimate"===e.id&&!e.popular&&(0,t.jsxs)("span",{className:"mb-2 inline-block rounded-full bg-violet-500 px-2 py-0.5 text-xs font-medium text-white",children:[e.badge," Best Deal"]}),(0,t.jsxs)("div",{className:"flex items-start justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"font-semibold text-stone-900",children:"super_fan"===e.id?"Super Fan":(l=e.id).charAt(0).toUpperCase()+l.slice(1)}),(0,t.jsxs)("p",{className:"text-sm text-stone-600",children:[i.toLocaleString()," tokens",e.bonusTokens>0&&(0,t.jsxs)("span",{className:"text-emerald-600",children:[" ","(+",e.bonusTokens.toLocaleString()," free)"]})]})]}),(0,t.jsxs)("span",{className:"text-xl font-bold text-stone-900",children:["£",e.priceGbp]})]}),(0,t.jsxs)("div",{className:"mt-2 flex items-center gap-2 text-sm text-stone-500",children:[(0,t.jsx)("span",{children:d}),u>0&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{"aria-hidden":"true",children:"•"}),(0,t.jsxs)("span",{className:"text-emerald-600",children:["Save ",u,"%"]})]})]}),(0,t.jsx)("div",{className:"mt-3 flex justify-end",children:(0,t.jsx)("span",{className:(0,r.cn)("flex h-5 w-5 items-center justify-center rounded-full border-2",s?"border-coral-500 bg-coral-500":"border-stone-300 bg-white"),"aria-hidden":"true",children:s&&(0,t.jsx)(n.Check,{className:"h-3 w-3 text-white"})})})]})}e.s(["PackageCard",()=>s])},517063,e=>{"use strict";var t=e.i(312829),n=e.i(351593);let r={enabled:!1,packageId:"standard",threshold:50,lastReplenishAt:null},a=(0,t.create)((e,t)=>({balance:null,isLoading:!0,autoReplenish:r,isModalOpen:!1,purchaseContext:null,selectedPackageId:"standard",setBalance:t=>e({balance:t}),deductTokens:t=>e(e=>({balance:null!==e.balance?Math.max(0,e.balance-t):null})),addTokens:t=>e(e=>({balance:null!==e.balance?e.balance+t:t})),fetchBalance:async t=>{e({isLoading:!0});try{let r=(0,n.createClient)(),{data:a,error:s}=await r.from("token_balances").select("balance, auto_replenish_enabled, auto_replenish_package_id, auto_replenish_threshold, last_auto_replenish_at").eq("user_id",t).single();if(s){console.error("Failed to fetch balance:",s),e({balance:0,isLoading:!1});return}e({balance:a?.balance??0,autoReplenish:{enabled:a?.auto_replenish_enabled??!1,packageId:a?.auto_replenish_package_id??"standard",threshold:a?.auto_replenish_threshold??50,lastReplenishAt:a?.last_auto_replenish_at??null},isLoading:!1})}catch{e({balance:0,isLoading:!1})}},setAutoReplenish:t=>e(e=>({autoReplenish:{...e.autoReplenish,...t}})),openModal:t=>e({isModalOpen:!0,purchaseContext:t??null,selectedPackageId:"standard"}),closeModal:()=>e({isModalOpen:!1,purchaseContext:null}),setSelectedPackage:t=>e({selectedPackageId:t})}));function s(e){return null===e||e<=0?0:Math.floor(e/40)}e.s(["getVoiceMinutesFromBalance",()=>s,"selectAutoReplenish",0,e=>e.autoReplenish,"selectBalance",0,e=>e.balance,"selectIsLoading",0,e=>e.isLoading,"selectIsModalOpen",0,e=>e.isModalOpen,"selectSelectedPackage",0,e=>e.selectedPackageId,"useTokenStore",0,a])},35305,(e,t,n)=>{"use strict";
2t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},561227,(e,t,n)=>{"use strict";var r=e.r(35305);function a(){}function s(){}s.resetWarningCache=a,t.exports=function(){function e(e,t,n,a,s,o){if(o!==r){var l=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:s,resetWarningCache:a};return n.PropTypes=n,n}},304153,(e,t,n)=>{t.exports=e.r(561227)()},25112,441230,820619,e=>{"use strict";var t,n=e.i(266033),r=e.i(382196),a=e.i(754219),s=e.i(805687),o=e.i(206471);let l=(0,o.createServerReference)("701a3aa7e8aed5b1828e8f05e066bce0a31ce2e5b0",o.callServer,void 0,o.findSourceMapURL,"updateAutoReplenishSettings");function i({enabled:e,onChange:t,selectedPackage:o,threshold:i=50}){let[c,u]=(0,r.useState)(!1),d=(0,r.useCallback)(async e=>{t(e),u(!0);let n=await l(e,o.id,i);u(!1),n.success||(t(!e),a.toast.error("Failed to save auto-replenish setting"))},[t,o.id,i]),p="super_fan"===o.id?"Super Fan":o.id.charAt(0).toUpperCase()+o.id.slice(1);return(0,n.jsxs)("div",{className:"flex items-start gap-3 rounded-xl bg-stone-50 p-4",children:[(0,n.jsx)(s.Switch,{checked:e,onCheckedChange:d,disabled:c,"aria-label":"Enable auto-replenish",className:"data-[state=checked]:bg-coral-500"}),(0,n.jsxs)("div",{className:"flex-1",children:[(0,n.jsx)("p",{className:"font-medium text-stone-900",children:"Auto-replenish when low"}),(0,n.jsxs)("p",{className:"mt-1 text-sm text-stone-500",children:["Automatically buy ",p," (£",o.priceGbp,") when your balance drops below ",i," tokens."]}),e?(0,n.jsx)("p",{className:"mt-2 text-xs text-stone-400",children:"Daily spending cap: £100. Disable anytime in Settings."}):null]})]})}e.s(["AutoReplenishToggle",()=>i],25112),e.i(21113);var c="clover",u="https://js.stripe.com",d="".concat(u,"/").concat(c,"/stripe.js"),p=/^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/,m=/^https:\/\/js\.stripe\.com\/(v3|[a-z]+)\/stripe\.js(\?.*)?$/,f=function(){for(var e=document.querySelectorAll('script[src^="'.concat(u,'"]')),t=0;t<e.length;t++){var n,r=e[t];if(n=r.src,p.test(n)||m.test(n))return r}return null},h=function(e){var t=e&&!e.advancedFraudSignals?"?advancedFraudSignals=false":"",n=document.createElement("script");n.src="".concat(d).concat(t);var r=document.head||document.body;if(!r)throw Error("Expected document.body not to be null. Stripe.js requires a <body> element.");return r.appendChild(n),n},x=function(e,t){e&&e._registerWrapper&&e._registerWrapper({name:"stripe-js",version:"8.6.0",startTime:t})},b=null,y=null,g=null,v=function(e,t,n){if(null===e)return null;var r,a=t[0].match(/^pk_test/),s=3===(r=e.version)?"v3":r;a&&s!==c&&console.warn("Stripe.js@".concat(s," was loaded on the page, but @stripe/stripe-js@").concat("8.6.0"," expected Stripe.js@").concat(c,". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning"));var o=e.apply(void 0,t);return x(o,n),o},j=!1,k=function(){return t?t:t=(null!==b?b:(b=new Promise(function(e,t){if("undefined"==typeof window||"undefined"==typeof document)return void e(null);if(window.Stripe,window.Stripe)return void e(window.Stripe);try{var n,r=f();r?r&&null!==g&&null!==y&&(r.removeEventListener("load",g),r.removeEventListener("error",y),null==(n=r.parentNode)||n.removeChild(r),r=h(null)):r=h(null),g=function(){window.Stripe?e(window.Stripe):t(Error("Stripe.js not available"))},y=function(e){t(Error("Failed to load Stripe.js",{cause:e}))},r.addEventListener("load",g),r.addEventListener("error",y)}catch(e){t(e);return}})).catch(function(e){return b=null,Promise.reject(e)})).catch(function(e){return t=null,Promise.reject(e)})};Promise.resolve().then(function(){return k()}).catch(function(e){j||console.warn(e)});var S=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];j=!0;var r=Date.now();return k().then(function(e){return v(e,t,r)})},w=e.i(304153);function N(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function C(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};
2t%2?N(Object(n),!0).forEach(function(t){E(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):N(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function P(e){return(P="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function E(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function T(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=e&&("undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"]);if(null!=a){var s=[],o=!0,l=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(s.push(n.value),!t||s.length!==t);o=!0);}catch(e){l=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(l)throw r}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return O(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return O(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function O(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var _=function(e,t,n){var a=!!n,s=r.default.useRef(n);r.default.useEffect(function(){s.current=n},[n]),r.default.useEffect(function(){if(!a||!e)return function(){};var n=function(){s.current&&s.current.apply(s,arguments)};return e.on(t,n),function(){e.off(t,n)}},[a,t,e,s])},A=function(e){var t=r.default.useRef(e);return r.default.useEffect(function(){t.current=e},[e]),t.current},F=function(e){return null!==e&&"object"===P(e)},I="[object Object]",L=function e(t,n){if(!F(t)||!F(n))return t===n;var r=Array.isArray(t);if(r!==Array.isArray(n))return!1;var a=Object.prototype.toString.call(t)===I;if(a!==(Object.prototype.toString.call(n)===I))return!1;if(!a&&!r)return t===n;var s=Object.keys(t),o=Object.keys(n);if(s.length!==o.length)return!1;for(var l={},i=0;i<s.length;i+=1)l[s[i]]=!0;for(var c=0;c<o.length;c+=1)l[o[c]]=!0;var u=Object.keys(l);return u.length===s.length&&u.every(function(r){return e(t[r],n[r])})},R=function(e,t,n){return F(e)?Object.keys(e).reduce(function(r,a){var s=!F(t)||!L(e[a],t[a]);return n.includes(a)?(s&&console.warn("Unsupported prop change: options.".concat(a," is not a mutable property.")),r):s?C(C({},r||{}),{},E({},a,e[a])):r},null):null},M="Invalid prop `stripe` supplied to `Elements`. We recommend using the `loadStripe` utility from `@stripe/stripe-js`. See https://stripe.com/docs/stripe-js/react#elements-props-stripe for details.",B=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:M;if(null===e||F(e)&&"function"==typeof e.elements&&"function"==typeof e.createToken&&"function"==typeof e.createPaymentMethod&&"function"==typeof e.confirmCardPayment)return e;throw Error(t)},G=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:M;if(F(e)&&"function"==typeof e.then)return{tag:"async",stripePromise:Promise.resolve(e).then(function(e){return B(e,t)})};var n=B(e,t);return null===n?{tag:"empty"}:{tag:"sync",stripe:n}},D=function(e){e&&e._registerWrapper&&e.registerAppInfo&&(e._registerWrapper({name:"react-stripe-js",version:"5.4.1"}),e.registerAppInfo({name:"react-stripe-js",version:"5.4.1",url:"https://stripe.com/docs/stripe-js/react"}))},U=r.default.createContext(null);U.displayName="ElementsContext";var q=function(e,t){if(!e)throw Error("Could not find Elements context; You need to wrap the part of your app that ".concat(t," in an <Elements> provider."));return e},V=function(e){var t=e.stripe,n=e.options,a=e.children,s=r.default.useMemo(function(){return G(t)},[t]),o=T(r.default.useState(function(){return{stripe:"sync"===s.tag?s.stripe:null,elements:"sync"===s.tag?s.stripe.elements(n):null}}),2),l=o[0],i=o[1];r.default.useEffect(function(){var e=!0,t=function(e){i(function(t){return t.stripe?t:{stripe:e,elements:e.elements(n)}})};return"async"!==s.tag||l.stripe?"sync"!==s.tag||l.stripe||t(s.stripe):s.stripePromise.then(function(n){n&&e&&t(n)}),function(){e=!1}},[s,l,n]);var c=A(t);r.default.useEffect(function(){null!==c&&c!==t&&console.warn("Unsupported prop change on Elements: You cannot change the `stripe` prop after setting it.")},[c,t]);var u=A(n);return r.default.useEffect(function(){if(l.elements){var e=R(n,u,["clientSecret","fonts"]);e&&l.elements.update(e)}},[n,u,l.elements]),r.default.useEffect(function(){D(l.stripe)},[l.stripe]),r.default.createElement(U.Provider,{value:l},a)};V.propTypes={stripe:w.default.any,options:w.default.object};var W=function(){var e;return(e="calls useElements()",q(r.default.useContext(U),e)).elements};w.default.func.isRequired;var K=r.default.createContext(null);K.displayName="CheckoutContext",w.default.any,w.default.shape({clientSecret:w.default.oneOfType([w.default.string,w.default.instanceOf(Promise)]).isRequired,elementsOptions:w.default.object}).isRequired;var Y=function(e){var t=r.default.useContext(K),n=r.default.useContext(U);if(!t)return q(n,e);if(!n)return t;throw Error("You cannot wrap the part of your app that ".concat(e," in both <CheckoutProvider> and <Elements> providers."))},J=["mode"],$=function(e,t){var n="".concat(e.charAt(0).toUpperCase()+e.slice(1),"Element"),a=t?function(e){Y("mounts <".concat(n,">"));var t=e.id,a=e.className;return r.default.createElement("div",{id:t,className:a})}:function(t){var a,s=t.id,o=t.className,l=t.options,i=void 0===l?{}:l,c=t.onBlur,u=t.onFocus,d=t.onReady,p=t.onChange,m=t.onEscape,f=t.onClick,h=t.onLoadError,x=t.onLoaderStart,b=t.onNetworksChange,y=t.onConfirm,g=t.onCancel,v=t.onShippingAddressChange,j=t.onShippingRateChange,k=t.onSavedPaymentMethodRemove,S=t.onSavedPaymentMethodUpdate,w=Y("mounts <".concat(n,">")),N="elements"in w?w.elements:null,C="checkoutState"in w?w.checkoutState:null,P=(null==C?void 0:C.type)==="success"||(null==C?void 0:C.type)==="loading"?C.sdk:null,E=T(r.default.useState(null),2),O=E[0],F=E[1],I=r.default.useRef(null),L=r.default.useRef(null);_(O,"blur",c),_(O,"focus",u),_(O,"escape",m),_(O,"click",f),_(O,"loaderror",h),_(O,"loaderstart",x),_(O,"networksch
2ange",b),_(O,"confirm",y),_(O,"cancel",g),_(O,"shippingaddresschange",v),_(O,"shippingratechange",j),_(O,"savedpaymentmethodremove",k),_(O,"savedpaymentmethodupdate",S),_(O,"change",p),d&&(a="expressCheckout"===e?d:function(){d(O)}),_(O,"ready",a),r.default.useLayoutEffect(function(){if(null===I.current&&null!==L.current&&(N||P)){var t=null;if(P)switch(e){case"paymentForm":t=P.createPaymentFormElement();break;case"payment":t=P.createPaymentElement(i);break;case"address":if("mode"in i){var r=i.mode,a=function(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},s=Object.keys(e);for(r=0;r<s.length;r++)n=s[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r<s.length;r++)n=s[r],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}(i,J);if("shipping"===r)t=P.createShippingAddressElement(a);else if("billing"===r)t=P.createBillingAddressElement(a);else throw Error("Invalid options.mode. mode must be 'billing' or 'shipping'.")}else throw Error("You must supply options.mode. mode must be 'billing' or 'shipping'.");break;case"expressCheckout":t=P.createExpressCheckoutElement(i);break;case"currencySelector":t=P.createCurrencySelectorElement();break;case"taxId":t=P.createTaxIdElement(i);break;default:throw Error("Invalid Element type ".concat(n,". You must use either the <PaymentElement />, <AddressElement options={{mode: 'shipping'}} />, <AddressElement options={{mode: 'billing'}} />, or <ExpressCheckoutElement />."))}else N&&(t=N.create(e,i));I.current=t,F(t),t&&t.mount(L.current)}},[N,P,i]);var M=A(i);return r.default.useEffect(function(){if(I.current){var e=R(i,M,["paymentRequest"]);e&&"update"in I.current&&I.current.update(e)}},[i,M]),r.default.useLayoutEffect(function(){return function(){if(I.current&&"function"==typeof I.current.destroy)try{I.current.destroy(),I.current=null}catch(e){}}},[]),r.default.createElement("div",{id:s,className:o,ref:L})};return a.propTypes={id:w.default.string,className:w.default.string,onChange:w.default.func,onBlur:w.default.func,onFocus:w.default.func,onReady:w.default.func,onEscape:w.default.func,onClick:w.default.func,onLoadError:w.default.func,onLoaderStart:w.default.func,onNetworksChange:w.default.func,onConfirm:w.default.func,onCancel:w.default.func,onShippingAddressChange:w.default.func,onShippingRateChange:w.default.func,onSavedPaymentMethodRemove:w.default.func,onSavedPaymentMethodUpdate:w.default.func,options:w.default.object},a.displayName=n,a.__elementType=e,a},z="undefined"==typeof window;r.default.createContext(null).displayName="EmbeddedCheckoutProviderContext";var H=function(){return Y("calls useStripe()").stripe};$("auBankAccount",z),$("card",z),$("cardNumber",z),$("cardExpiry",z),$("cardCvc",z),$("iban",z);var Z=$("payment",z);$("expressCheckout",z),$("paymentRequestButton",z),$("linkAuthentication",z),$("address",z),$("shippingAddress",z),$("paymentMethodMessaging",z),$("taxId",z),e.s(["Elements",()=>V,"PaymentElement",()=>Z,"useElements",()=>W,"useStripe",()=>H],441230);let X=null;function Q({clientSecret:e,children:t}){let[a,s]=(0,r.useState)(null);return((0,r.useEffect)(()=>{(!X&&(X=S("pk_test_51SkZspEGnD52MuszZo3dWKqvwbudO2bDWmxSul5J53zbBnOWKwhk9uXQ9bGZAlyra3nNqIms7HgGeJX40L2kf0E800UN3tnvqy")),X).then(s)},[]),a)?(0,n.jsx)(V,{stripe:a,options:{clientSecret:e,appearance:{theme:"stripe",variables:{colorPrimary:"#FF6B6B",colorText:"#1c1917",colorDanger:"#ef4444",fontFamily:"system-ui, sans-serif",borderRadius:"12px",spacingUnit:"4px"},rules:{".Input":{border:"1px solid #d6d3d1",boxShadow:"none",padding:"12px"},".Input:focus":{border:"1px solid #FF6B6B",boxShadow:"0 0 0 1px #FF6B6B"},".Label":{fontWeight:"500",fontSize:"14px"}}}},children:t}):null}e.s(["StripeElementsProvider",()=>Q],820619)},698227,e=>{"use strict";let t=(0,e.i(198631).default)("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);e.s(["Lock",()=>t],698227)},239153,781184,e=>{"use strict";var t=e.i(266033),n=e.i(382196),r=e.i(791392),a=e.i(179278),s=e.i(698227),o=e.i(754219),l=e.i(610499),i=e.i(43004),c=e.i(517063),u=e.i(1579),d=e.i(894845),p=e.i(25112),m=e.i(820619),f=e.i(441230),h=e.i(931016),x=e.i(852747);function b({pack:e,onSuccess:r,onError:o}
2){let i=(0,f.useStripe)(),c=(0,f.useElements)(),[d,p]=(0,n.useState)("form"),[m,b]=(0,n.useState)(null),y=e.tokens+e.bonusTokens,g=(0,n.useCallback)(async t=>{if(t.preventDefault(),!i||!c)return;p("processing"),b(null);let{error:n,paymentIntent:a}=await i.confirmPayment({elements:c,confirmParams:{return_url:`${window.location.origin}/tokens/success`},redirect:"if_required"});if(n){p("error"),b(n.message??"Payment failed"),(0,u.trackPurchaseFailed)({package_id:e.id,error_code:n.code??"unknown",error_message:n.message}),o(n.code??"unknown",n.message??"Payment failed");return}a?.status==="succeeded"&&(p("succeeded"),(0,u.trackPurchaseCompleted)({package_id:e.id,tokens:y,amount_gbp:e.priceGbp,auto_replenish_enabled:!1}),r(y))},[i,c,e,y,r,o]);return"succeeded"===d?(0,t.jsxs)("div",{className:"py-8 text-center",children:[(0,t.jsx)(h.CheckCircle,{className:"mx-auto mb-3 h-12 w-12 text-emerald-500"}),(0,t.jsx)("p",{className:"font-semibold text-stone-900",children:"Payment successful!"}),(0,t.jsxs)("p",{className:"mt-1 text-sm text-stone-500",children:[y.toLocaleString()," tokens added"]})]}):(0,t.jsxs)("form",{onSubmit:g,className:"space-y-4",children:[(0,t.jsxs)("div",{className:"rounded-xl bg-stone-50 p-3",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("span",{className:"text-sm text-stone-600",children:[y.toLocaleString()," tokens"]}),(0,t.jsxs)("span",{className:"font-semibold text-stone-900",children:["£",e.priceGbp.toFixed(2)]})]}),e.bonusTokens>0&&(0,t.jsxs)("p",{className:"mt-1 text-xs text-emerald-600",children:["Includes ",e.bonusTokens.toLocaleString()," bonus tokens"]})]}),(0,t.jsx)(f.PaymentElement,{options:{layout:"tabs",defaultValues:{billingDetails:{address:{country:"GB"}}}}}),m?(0,t.jsx)("div",{className:"rounded-lg bg-red-50 p-3 text-sm text-red-700",children:m}):null,(0,t.jsx)(l.Button,{type:"submit",disabled:!i||"processing"===d,className:(0,x.cn)("w-full py-6 text-lg font-semibold","bg-coral-500 hover:bg-coral-600"),children:"processing"===d?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.Loader2,{className:"mr-2 h-5 w-5 animate-spin"}),"Processing..."]}):"error"===d?(0,t.jsxs)(t.Fragment,{children:["Try Again — £",e.priceGbp.toFixed(2)]}):(0,t.jsxs)(t.Fragment,{children:["Pay £",e.priceGbp.toFixed(2)]})}),(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 text-xs text-stone-400",children:[(0,t.jsx)(s.Lock,{className:"h-3 w-3"}),(0,t.jsx)("span",{children:"Secured by Stripe · Card saved for future purchases"})]})]})}function y({onSaved:e}){let r=(0,f.useStripe)(),s=(0,f.useElements)(),[o,i]=(0,n.useState)(!1),[c,u]=(0,n.use
2State)(null),d=async t=>{if(t.preventDefault(),!r||!s)return;i(!0),u(null);let{error:n}=await r.confirmSetup({elements:s,confirmParams:{return_url:`${window.location.origin}/tokens`},redirect:"if_required"});if(n){u(n.message??"Failed to save card"),i(!1);return}i(!1),e()};return(0,t.jsxs)("form",{onSubmit:d,className:"space-y-4",children:[(0,t.jsx)(f.PaymentElement,{options:{layout:"tabs",defaultValues:{billingDetails:{address:{country:"GB"}}}}}),c?(0,t.jsx)("div",{className:"rounded-lg bg-red-50 p-3 text-sm text-red-700",children:c}):null,(0,t.jsx)(l.Button,{type:"submit",disabled:!r||o,className:"bg-coral-500 hover:bg-coral-600 w-full py-5 font-semibold",children:o?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.Loader2,{className:"mr-2 h-4 w-4 animate-spin"}),"Saving..."]}):"Save Card"})]})}e.s(["EmbeddedCheckoutForm",()=>b],781184);var g=e.i(454267),v=e.i(735226),j=e.i(443293),k=e.i(984294),S=e.i(814136);function w({cards:e,defaultCardId:n,selectedCardId:r,showNewCardForm:s,deletingCardId:o,settingDefaultId:l,isCreatingIntent:i,onSelectCard:c,onDeleteCard:u,onSetDefault:d,onAddNewCard:p}){return(0,t.jsxs)("div",{className:"space-y-2",children:[e.map(e=>(0,t.jsxs)("div",{className:(0,x.cn)("flex items-center gap-3 rounded-xl border-2 p-4 transition-all",r!==e.id||s?"border-stone-200":"border-coral-500 bg-coral-50"),children:[(0,t.jsxs)("button",{type:"button",onClick:()=>c(e.id),className:"flex flex-1 items-center gap-3 text-left",children:[(0,t.jsx)(v.Credit
2Card,{className:"h-5 w-5 shrink-0 text-stone-500"}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-stone-900 capitalize",children:e.brand}),(0,t.jsxs)("span",{className:"ml-2 text-sm text-stone-500",children:["•••• ",e.last4]}),e.expMonth&&e.expYear?(0,t.jsxs)("span",{className:"ml-2 text-xs text-stone-400",children:[String(e.expMonth).padStart(2,"0"),"/",String(e.expYear).slice(-2)]}):null,e.id===n?(0,t.jsxs)("span",{className:"ml-2 inline-flex items-center gap-0.5 text-xs text-amber-600",children:[(0,t.jsx)(k.Star,{className:"h-3 w-3"})," Default"]}):null]}),r!==e.id||s?null:(0,t.jsx)(g.Check,{className:"text-coral-500 h-4 w-4 shrink-0"})]}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[e.id!==n?(0,t.jsx)("button",{type:"button",onClick:()=>d(e.id),disabled:l===e.id,className:"rounded p-1.5 text-stone-400 transition-colors hover:bg-stone-100 hover:text-amber-600",title:"Set as default",children:l===e.id?(0,t.jsx)(a.Loader2,{className:"h-4 w-4 animate-spin"}):(0,t.jsx)(k.Star,{className:"h-4 w-4"})}):null,(0,t.jsx)("button",{type:"button",onClick:()=>u(e.id),disabled:o===e.id,className:"rounded p-1.5 text-stone-400 transition-colors hover:bg-red-50 hover:text-red-500",title:"Remove card",children:o===e.id?(0,t.jsx)(a.Loader2,{className:"h-4 w-4 animate-spin"}):(0,t.jsx)(S.Trash2,{className:"h-4 w-4"})})]})]},e.id)),s?null:(0,t.jsxs)("button",{type:"button",onClick:p,disabled:i,className:(0,x.cn)("flex w-full items-center gap-3 rounded-xl border-2 border-dashed p-4 text-left transition-all",0===e.length?"border-coral-300 bg-coral-50/50":"border-stone-300 hover:border-stone-400"),children:[i?(0,t.jsx)(a.Loader2,{className:"h-5 w-5 animate-spin text-stone-400"}):(0,t.jsx)(j.Plus,{className:"h-5 w-5 text-stone-500"}),(0,t.jsx)("span",{className:"text-sm font-medium text-stone-700",children:e.length>0?"Add another card":"Add a card"})]})]})}var N=e.i(627816);function C({userId:e,initialBalance:f}){let[h,x]=(0,n.useTransition)(),g=(0,c.useTokenStore)(e=>e.balance),v=(0,c.useTokenStore)(e=>e.isLoading),j=(0,c.useTokenStore)(e=>e.fetchBalance),k=(0,c.useTokenStore)(e=>e.setAutoReplenish),S=(0,c.useTokenStore)(e=>
2e.addTokens),[C,P]=(0,n.useState)("standard"),[E,T]=(0,n.useState)(!1),[O,_]=(0,n.useState)(null),[A,F]=(0,n.useState)(!1),[I,L]=(0,n.useState)(0),[R,M]=(0,n.useState)([]),[B,G]=(0,n.useState)(null),[D,U]=(0,n.useState)(null),[q,V]=(0,n.useState)(!!e),[W,K]=(0,n.useState)(null),[Y,J]=(0,n.useState)(null),[$,z]=(0,n.useState)(!1),[H,Z]=(0,n.useState)(null),[X,Q]=(0,n.useState)(null),[ee,et]=(0,n.useState)(!1),en=(0,n.useRef)(null),er=(0,i.getPackage)(C),ea=v?f:g,es=(0,c.getVoiceMinutesFromBalance)(ea??null),eo=R.length>0;(0,n.useEffect)(()=>{e&&j(e)},[e,j]);let el=(0,n.useCallback)(async e=>{try{let t=await fetch("/api/stripe/payment-intent",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({packId:e})});if(!t.ok)return;let n=await t.json();Z(n.clientSecret),Q("payment"),z(!0)}catch{}},[]),ei=(0,n.useCallback)(async()=>{try{let e=await fetch("/api/stripe/payment-methods");if(!e.ok)return;let t=await e.json(),n=t.cards??[];M(n),G(t.defaultPaymentMethodId??null),t.defaultPaymentMethodId?U(t.defaultPaymentMethodId):n.length>0&&n[0]&&U(n[0].id)}catch{}finally{V(!1)}},[]);(0,n.useEffect)(()=>{e&&ei()},[e,ei]),(0,n.useEffect)(()=>{q||eo||!e||el(C)},[C,q,eo,e,el]);let ec=()=>setTimeout(()=>en.current?.scrollIntoView({behavior:"smooth"}),100),eu=(0,n.useCallback)(e=>{U(e),z(!1),Z(null),Q(null)},[]),ed=(0,n.useCallback)(async e=>{K(e);try{if(!(await fetch("/api/stripe/payment-methods",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({paymentMethodId:e})})).ok)throw Error("Failed");o.toast.success("Card removed"),D===e&&U(null),await ei()}catch{o.toast.error("Failed to remove card")}finally{K(null)}},[D,ei]),ep=(0,n.useCallback)(async e=>{J(e);try{if(!(await fetch("/api/stripe/payment-methods",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({paymentMethodId:e})})).ok)throw Error("Failed");G(e),o.toast.success("Default card updated")}catch{o.toast.error("Failed to set default")}finally{J(null)}},[]),em=(0,n.useCallback)(async()=>{et(!0);try{let e=await fetch("/api/stripe/setup-intent",{method:"POST"});if(!e.ok)throw Error("Failed");let t=await e.json();Z(t.clientSecret),Q("setup"),z(!0),U(null),ec()}catch{o.toast.error("Failed to start card setup")}finally{et(!1)}},[]),ef=(0,n.useCallback)(()=>{z(!1),Z(null),Q(null),o.toast.success("Card saved"),ei()},[ei]),eh=(0,n.useCallback)(()=>{(0,u.trackCheckoutStarted)({package_id:C,amount_gbp:er?.priceGbp??0,auto_replenish_enabled:E}),E&&k({enabled:!0,packageId:C})},[C,er,E,k]),ex=(0,n.useCallback)(()=>{er&&D&&x(async()=>{eh(),_(null);try{let e=await fetch("/api/stripe/payment-intent",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({packId:C,paymentMethodId:D})}),t=await e.json();if(!e.ok)return void _(t.error??"Payment failed");if("succeeded"===t.status){let e=er.tokens+er.bonusTokens;L(e),S(e),F(!0);return}Z(t.clientSecret),Q("payment"),z(!0),U(null),ec()}catch{_("Network error. Please try again.")}})},[er,C,D,eh,S]),eb=(0,n.useCallback)(()=>{er&&x(async()=>{eh(),_(null);try{let e=await fetch("/api/stripe/payment-intent",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({packId:C})}),t=await e.json();if(!e.ok)return void _(t.error??"Failed to start payment");Z(t.clientSecret),Q("payment"),z(!0),ec()}catch{_("Network error. Please try again.")}})},[er,C,eh]),ey=(0,n.useCallback)(e=>{L(e),S(e),F(!0)},[S]),eg=(0,n.useCallback)((e,t)=>{_(t),o.toast.error(t)},[]);return A?(0,t.jsx)(N.PurchaseSuccess,{tokensAdded:I,newBalance:(ea??0)+I,packageId:C,amountPaid:er?.priceGbp??0}):(0,t.jsxs)("div",{className:"mx-auto max-w-2xl px-4 py-8",children:[(0,t.jsxs)("div",{className:"mb-8 text-center",children:[(0,t.jsx)("h1",{className:"text-2xl font-bold text-stone-900",children:"Get Tokens"}),(0,t.jsx)("p",{className:"mt-2 text-stone-500",children:"Use tokens to chat with your favorite creators via voice or text"})]}),e?(0,t.jsxs)("div",{className:"mb-8 rounded-xl bg-stone-50 p-6 text-center",children:[(0,t.jsx)("p",{className:"text-sm text-stone-500",children:"Current Balance"}),v&&void 0===f?(0,t.jsx)("div",{className:"mx-auto mt-2 h-8 w-24 animate-pulse rounded bg-stone-200"}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:"flex items-center justify-center gap-2 text-3xl font-bold text-stone-900",children:[(0,t.jsx)(r.Coins,{className:"h-7 w-7 text-amber-500"}
2),(ea??0).toLocaleString()]}),es>0?(0,t.jsxs)("p",{className:"mt-1 text-sm text-stone-500",children:["(~",es," min voice)"]}):null]})]}):null,(0,t.jsxs)("div",{className:"mb-8",children:[(0,t.jsx)("h2",{className:"mb-4 font-semibold text-stone-900",children:"Choose a package"}),(0,t.jsx)("div",{className:"space-y-3",children:i.TOKEN_PACKAGES.map(e=>(0,t.jsx)(d.PackageCard,{pack:e,isSelected:C===e.id,onSelect:()=>P(e.id)},e.id))})]}),(0,t.jsxs)("div",{className:"mb-8",ref:en,children:[(0,t.jsx)("h2",{className:"mb-4 font-semibold text-stone-900",children:"Payment method"}),q?(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-6 text-sm text-stone-400",children:[(0,t.jsx)(a.Loader2,{className:"h-4 w-4 animate-spin"}),"Loading..."]}):eo?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(w,{cards:R,defaultCardId:B,selectedCardId:D,showNewCardForm:$,deletingCardId:W,settingDefaultId:Y,isCreatingIntent:ee,onSelectCard:eu,onDeleteCard:ed,onSetDefault:ep,onAddNewCard:em}),$&&H?(0,t.jsx)("div",{className:"border-coral-200 mt-3 rounded-xl border-2 bg-white p-4",children:(0,t.jsx)(m.StripeElementsProvider,{clientSecret:H,children:"setup"===X?(0,t.jsx)(y,{onSaved:ef}):er?(0,t.jsx)(b,{pack:er,onSuccess:ey,onError:eg}):null})}):null]}):H&&er?(0,t.jsx)(m.StripeElementsProvider,{clientSecret:H,children:(0,t.jsx)(b,{pack:er,onSuccess:ey,onError:eg})}):null]}),er?(0,t.jsx)("div",{className:"mb-8",children:(0,t.jsx)(p.AutoReplenishToggle,{enabled:E,onChange:T,selectedPackage:er})}):null,O?(0,t.jsx)("div",{className:"mb-4 rounded-lg bg-red-50 p-3 text-sm text-red-700",children:O}):null,!$&&eo?(0,t.jsxs)("div",{className:"space-y-4",children:[D&&eo?(0,t.jsx)(l.Button,{onClick:ex,disabled:h||!er,className:"bg-coral-500 hover:bg-coral-600 w-full py-6 text-lg font-semibold",children:h?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.Loader2,{className:"mr-2 h-5 w-5 animate-spin"}),"Processing..."]}):(0,t.jsxs)(t.Fragment,{children:["Pay £",er?.priceGbp??0," with ••••"," ",R.find(e=>e.id===D)?.last4]})}):(0,t.jsx)(l.Button,{onClick:eb,disabled:h||!er,className:"bg-coral-500 hover:bg-coral-600 w-full py-6 text-lg font-semibold",children:h?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.Loader2,{className:"mr-2 h-5 w-5 animate-spin"}),"Processing..."]}):(0,t.jsxs)(t.Fragment,{children:["Pay £",er?.priceGbp??0]})}),(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 text-xs text-stone-400",children:[(0,t.jsx)(s.Lock,{className:"h-3 w-3"}),(0,t.jsx)("span",{children:"Secured by Stripe · Card saved for future purchases"})]}),(0,t.jsxs)("div",{className:"text-center text-sm text-stone-500",children:[(0,t.jsx)("p",{children:"All prices include VAT. Tokens never expire."}),(0,t.jsx)("p",{className:"mt-1",children:"Voice calls use ~40 tokens/minute. Text messages use 1-3 tokens each."})]})]}):null]})}e.s(["TokenPurchasePage",()=>C],239153)}]);
3
4//# debugId=250f1275-61d3-0789-c6d8-47ca11c19f84
5//# sourceMappingURL=79a90372f05d2fdb.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.