@neosianexus/super-tebex 3.4.3 → 3.4.4
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.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/stores/basketStore.d.ts +2 -6
- package/dist/stores/basketStore.d.ts.map +1 -1
- package/dist/stores/userStore.d.ts +2 -6
- package/dist/stores/userStore.d.ts.map +1 -1
- package/dist/testing/index.cjs +2 -2
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.js +2 -2
- package/dist/testing/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import {QueryClient,QueryClientProvider,useQueryClient,useQuery,useMutation}from'@tanstack/react-query';import {createContext,useContext,useMemo,useState,useCallback,useEffect,useRef}from'react';import {TebexHeadless}from'tebex_headless';import {create}from'zustand';import {subscribeWithSelector,persist}from'zustand/middleware';import {jsx}from'react/jsx-runtime';var h=(b=>(b.PROVIDER_NOT_FOUND="PROVIDER_NOT_FOUND",b.INVALID_CONFIG="INVALID_CONFIG",b.NOT_AUTHENTICATED="NOT_AUTHENTICATED",b.INVALID_USERNAME="INVALID_USERNAME",b.BASKET_NOT_FOUND="BASKET_NOT_FOUND",b.BASKET_CREATION_FAILED="BASKET_CREATION_FAILED",b.BASKET_EXPIRED="BASKET_EXPIRED",b.BASKET_EMPTY="BASKET_EMPTY",b.PACKAGE_NOT_FOUND="PACKAGE_NOT_FOUND",b.PACKAGE_OUT_OF_STOCK="PACKAGE_OUT_OF_STOCK",b.PACKAGE_ALREADY_OWNED="PACKAGE_ALREADY_OWNED",b.INVALID_QUANTITY="INVALID_QUANTITY",b.CATEGORY_NOT_FOUND="CATEGORY_NOT_FOUND",b.COUPON_INVALID="COUPON_INVALID",b.COUPON_EXPIRED="COUPON_EXPIRED",b.COUPON_ALREADY_USED="COUPON_ALREADY_USED",b.GIFTCARD_INVALID="GIFTCARD_INVALID",b.GIFTCARD_INSUFFICIENT_BALANCE="GIFTCARD_INSUFFICIENT_BALANCE",b.CREATOR_CODE_INVALID="CREATOR_CODE_INVALID",b.CHECKOUT_FAILED="CHECKOUT_FAILED",b.CHECKOUT_CANCELLED="CHECKOUT_CANCELLED",b.TEBEX_JS_NOT_LOADED="TEBEX_JS_NOT_LOADED",b.NETWORK_ERROR="NETWORK_ERROR",b.TIMEOUT="TIMEOUT",b.RATE_LIMITED="RATE_LIMITED",b.SERVER_ERROR="SERVER_ERROR",b.FORBIDDEN="FORBIDDEN",b.VALIDATION_ERROR="VALIDATION_ERROR",b.NOT_FOUND="NOT_FOUND",b.BASKET_LOCKED="BASKET_LOCKED",b.PACKAGE_DISABLED="PACKAGE_DISABLED",b.UNKNOWN="UNKNOWN",b))(h||{});var c=class e extends Error{code;cause;constructor(t,n,r){super(n??t),Object.setPrototypeOf(this,e.prototype),this.name="TebexError",this.code=t,this.cause=r,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,e);}static extractStatusCode(t){if(typeof t=="object"&&t!==null){if("response"in t){let n=t.response;if(n&&typeof n.status=="number")return n.status}if("status"in t&&typeof t.status=="number")return t.status}return null}static fromUnknown(t){if(t instanceof e)return t;let n=t instanceof Error?t.message:String(t),r=e.extractStatusCode(t);if(r!==null)switch(r){case 400:return new e("VALIDATION_ERROR",n,t);case 401:case 403:return new e("FORBIDDEN",n,t);case 404:{let i=n.toLowerCase();return i.includes("basket")?new e("BASKET_NOT_FOUND",n,t):i.includes("package")?new e("PACKAGE_NOT_FOUND",n,t):i.includes("category")?new e("CATEGORY_NOT_FOUND",n,t):new e("NOT_FOUND",n,t)}case 408:return new e("TIMEOUT",n,t);case 409:return new e("BASKET_LOCKED",n,t);case 410:return new e("BASKET_EXPIRED",n,t);case 422:{let i=n.toLowerCase();return i.includes("coupon")&&i.includes("already")?new e("COUPON_ALREADY_USED",n,t):i.includes("coupon")&&i.includes("invalid")?new e("COUPON_INVALID",n,t):i.includes("coupon")&&i.includes("expired")?new e("COUPON_EXPIRED",n,t):i.includes("gift")&&i.includes("invalid")?new e("GIFTCARD_INVALID",n,t):i.includes("gift")&&i.includes("balance")?new e("GIFTCARD_INSUFFICIENT_BALANCE",n,t):i.includes("creator")&&i.includes("invalid")?new e("CREATOR_CODE_INVALID",n,t):i.includes("locked")||i.includes("lock")?new e("BASKET_LOCKED",n,t):i.includes("disabled")?new e("PACKAGE_DISABLED",n,t):i.includes("out of stock")||i.includes("stock")?new e("PACKAGE_OUT_OF_STOCK",n,t):i.includes("already own")?new e("PACKAGE_ALREADY_OWNED",n,t):new e("VALIDATION_ERROR",n,t)}case 423:return new e("BASKET_LOCKED",n,t);case 429:return new e("RATE_LIMITED",n,t);case 500:case 502:case 503:return new e("SERVER_ERROR",n,t);case 504:return new e("TIMEOUT",n,t)}if(t instanceof Error){if(t.name==="AbortError")return new e("TIMEOUT",n,t);if("code"in t){let m=t.code;if(typeof m=="string"){if(m==="ERR_NETWORK"||m==="ERR_FR_TOO_MANY_REDIRECTS")return new e("NETWORK_ERROR",n,t);if(m==="ECONNABORTED"||m==="ERR_CANCELED")return new e("TIMEOUT",n,t)}}let i=n.toLowerCase();return i.includes("network")||i.includes("fetch")||i.includes("load failed")||i.includes("enotfound")||i.includes("econnreset")||i.includes("econnrefused")||i.includes("econnaborted")||i.includes("err_network")?new e("NETWORK_ERROR",n,t):i.includes("timeout")||i.includes("etimedout")?new e("TIMEOUT",n,t):i.includes("rate limit")||i.includes("429")?new e("RATE_LIMITED",n,t):i.includes("basket")&&i.includes("not found")?new e("BASKET_NOT_FOUND",n,t):i.includes("package")&&i.includes("not found")?new e("PACKAGE_NOT_FOUND",n,t):i.includes("coupon")&&i.includes("invalid")?new e("COUPON_INVALID",n,t):i.includes("coupon")&&i.includes("expired")?new e("COUPON_EXPIRED",n,t):i.includes("gift")&&i.includes("invalid")?new e("GIFTCARD_INVALID",n,t):new e("UNKNOWN",n,t)}return new e("UNKNOWN",n)}static fromJSON(t){let r=Object.values(h).includes(t.code)?t.code:"UNKNOWN";return new e(r,t.message??t.code)}toJSON(){return {name:this.name,code:this.code,message:this.message,...this.cause instanceof Error?{cause:this.cause.message}:{}}}};var M=null;function H(e){let t=e.trim();if(t.length===0)throw new c("INVALID_CONFIG","publicKey must be a non-empty string");M=new TebexHeadless(t);}function T(){if(M===null)throw new c("PROVIDER_NOT_FOUND","Tebex client not initialized. Ensure TebexProvider wraps your component tree.");return M}function $(){return M!==null}var U=create()(subscribeWithSelector(persist(e=>({basketIdent:null,setBasketIdent:t=>{e({basketIdent:t});},clearBasketIdent:()=>{e({basketIdent:null});}}),{name:"tebex-basket-store",skipHydration:true,version:1,partialize:e=>({basketIdent:e.basketIdent}),migrate:e=>{if(typeof e=="object"&&e!==null&&"basketIdent"in e){let t=e;return {basketIdent:typeof t.basketIdent=="string"?t.basketIdent:null}}return {basketIdent:null}},onRehydrateStorage:()=>(e,t)=>{t!==void 0&&console.warn("[tebex] Failed to rehydrate basket store:",t);}})));var O=create()(subscribeWithSelector(persist(e=>({username:null,setUsername:t=>{e({username:t});},clearUsername:()=>{e({username:null}),U.getState().clearBasketIdent();}}),{name:"tebex-user-store",skipHydration:true,version:1,partialize:e=>({username:e.username}),migrate:e=>{if(typeof e=="object"&&e!==null&&"username"in e){let t=e;return {username:typeof t.username=="string"?t.username:null}}return {username:null}},onRehydrateStorage:()=>(e,t)=>{t!==void 0&&console.warn("[tebex] Failed to rehydrate user store:",t);}})));var Y=createContext(null);function F(){let e=useContext(Y);if(e===null)throw new c("PROVIDER_NOT_FOUND","useTebexContext must be used within TebexProvider or TebexMockProvider");return e}function I(){let{config:e}=F();return e}function X(){let{isHydrated:e}=F();return e}var qe={defaultOptions:{queries:{staleTime:60*1e3,gcTime:300*1e3,retry:3,retryDelay:e=>Math.min(1e3*2**e,3e4),refetchOnWindowFocus:false,refetchOnReconnect:true},mutations:{retry:false}}};function Ge(e){if(typeof e.publicKey!="string"||e.publicKey.trim().length===0)throw new c("INVALID_CONFIG","publicKey must be a non-empty string");if(typeof e.baseUrl!="string"||e.baseUrl.trim().length===0)throw new c("INVALID_CONFIG","baseUrl must be a non-empty string");let t=e.baseUrl.replace(/\/$/,""),n=e.urls?.complete??"/shop/complete",r=e.urls?.cancel??"/shop/cancel";return {publicKey:e.publicKey,baseUrl:t,completeUrl:`${t}${n}`,cancelUrl:`${t}${r}`,onError:e.onError}}function ne({children:e,config:t,queryClient:n}){let r=useMemo(()=>Ge(t),[t]),[i]=useState(()=>n??new QueryClient(qe));useState(()=>{H(r.publicKey);});let[m,p]=useState(()=>U.persist.hasHydrated()&&O.persist.hasHydrated()),x=useCallback(()=>{U.persist.hasHydrated()&&O.persist.hasHydrated()&&p(true);},[]);useEffect(()=>{if(m)return;let f=U.persist.onFinishHydration(x),g=O.persist.onFinishHydration(x);return U.persist.rehydrate(),O.persist.rehydrate(),x(),()=>{f(),g();}},[m,x]),useEffect(()=>{let f=g=>{(g.key==="tebex-basket-store"||g.key==="tebex-user-store")&&(U.persist.rehydrate(),O.persist.rehydrate());};return window.addEventListener("storage",f),()=>{window.removeEventListener("storage",f);}},[]);let y=useMemo(()=>({config:r,queryClient:i,isHydrated:m}),[r,i,m]);return jsx(Y.Provider,{value:y,children:jsx(QueryClientProvider,{client:i,children:e})})}var u={all:["tebex"],categories:()=>[...u.all,"categories"],categoriesList:e=>[...u.categories(),"list",{includePackages:e}],category:e=>[...u.categories(),"detail",e],packages:()=>[...u.all,"packages"],packagesList:e=>[...u.packages(),"list",{categoryId:e}],package:e=>[...u.packages(),"detail",e],baskets:()=>[...u.all,"baskets"],basket:e=>[...u.baskets(),e],webstore:()=>[...u.all,"webstore"]};function re(e){if(e instanceof c)return true;if(typeof e=="object"&&e!==null&&"name"in e&&"code"in e&&e.name==="TebexError"){let t=e.code;return typeof t=="string"&&Object.values(h).includes(t)}return false}function se(e){return e.success}function oe(e){return !e.success}function ae(e){return e!=null}function B(e){return typeof e=="string"&&e.length>0}function ie(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function D(e){return typeof e=="number"&&Number.isInteger(e)&&e>0}function S(e){return typeof e!="string"?false:/^[a-zA-Z0-9_]{3,16}$/.test(e)}var Q=null;function _(){let e=I(),t=useQueryClient(),n=U(l=>l.basketIdent),r=U(l=>l.setBasketIdent),i=U(l=>l.clearBasketIdent),m=useRef(n);m.current=n;let p=useQuery({queryKey:u.basket(n),queryFn:async()=>n===null?null:T().getBasket(n),enabled:n!==null,retry:(l,k)=>{let d=c.fromUnknown(k);return d.code==="BASKET_NOT_FOUND"||d.code==="BASKET_EXPIRED"?false:l<3}});useEffect(()=>{if(p.error!==null){let l=c.fromUnknown(p.error);(l.code==="BASKET_NOT_FOUND"||l.code==="BASKET_EXPIRED")&&(i(),t.removeQueries({queryKey:u.baskets()}));}},[p.error,i,t]);let x=useCallback(async()=>{let l=U.getState().basketIdent;return l!==null?l:(Q!==null||(Q=(async()=>{let d=O.getState().username;if(d===null||d.length===0)throw new c("NOT_AUTHENTICATED","Username is required to create a basket");let w=await T().createMinecraftBasket(d,e.completeUrl,e.cancelUrl);return r(w.ident),w.ident})().finally(()=>{Q=null;})),Q)},[e.completeUrl,e.cancelUrl,r]),y=useMutation({scope:{id:"basket-mutations"},mutationFn:async l=>{let k=l.quantity??1;if(!D(k))throw new c("INVALID_QUANTITY","Quantity must be a positive integer");let d=async w=>{let A=T();return await A.addPackageToBasket(w,l.packageId,k,l.type,l.variableData),A.getBasket(w)},C=await x();try{return await d(C)}catch(w){let A=c.fromUnknown(w);if(A.code==="BASKET_NOT_FOUND"||A.code==="BASKET_EXPIRED"){i();let P=await x();return d(P)}throw w}},onMutate:async l=>{let k=m.current;if(k===null)return {previousBasket:void 0,ident:k};await t.cancelQueries({queryKey:u.basket(k)});let d=t.getQueryData(u.basket(k));if(d!=null){let C={id:l.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:l.quantity??1,price:0,gift_username_id:null,gift_username:null}},w=d.packages.findIndex(P=>P.id===l.packageId),A=w>=0?d.packages.map((P,Re)=>Re===w?{...P,in_basket:{...P.in_basket,quantity:P.in_basket.quantity+(l.quantity??1)}}:P):[...d.packages,C];t.setQueryData(u.basket(k),{...d,packages:A});}return {previousBasket:d,ident:k}},onError:(l,k,d)=>{d?.previousBasket!==void 0&&d.ident!==null&&t.setQueryData(u.basket(d.ident),d.previousBasket),e.onError?.(c.fromUnknown(l));},onSuccess:(l,k,d)=>{let C=d.ident??m.current;C!==null&&t.setQueryData(u.basket(C),l);}}),f=useMutation({scope:{id:"basket-mutations"},mutationFn:async l=>{let k=U.getState().basketIdent;if(k===null)throw new c("BASKET_NOT_FOUND");let d=T();return await d.removePackage(k,l),d.getBasket(k)},onMutate:async l=>{let k=m.current;if(k===null)return {previousBasket:void 0,ident:k};await t.cancelQueries({queryKey:u.basket(k)});let d=t.getQueryData(u.basket(k));return d!=null&&t.setQueryData(u.basket(k),{...d,packages:d.packages.filter(C=>C.id!==l)}),{previousBasket:d,ident:k}},onError:(l,k,d)=>{d?.previousBasket!==void 0&&d.ident!==null&&t.setQueryData(u.basket(d.ident),d.previousBasket),e.onError?.(c.fromUnknown(l));},onSuccess:(l,k,d)=>{let C=d.ident??m.current;C!==null&&t.setQueryData(u.basket(C),l);}}),g=useMutation({scope:{id:"basket-mutations"},mutationFn:async l=>{if(!D(l.quantity))throw new c("INVALID_QUANTITY","Quantity must be a positive integer");let k=U.getState().basketIdent;if(k===null)throw new c("BASKET_NOT_FOUND");let d=T();return await d.updateQuantity(k,l.packageId,l.quantity),d.getBasket(k)},onMutate:async l=>{let k=m.current;if(k===null)return {previousBasket:void 0,ident:k};await t.cancelQueries({queryKey:u.basket(k)});let d=t.getQueryData(u.basket(k));return d!=null&&t.setQueryData(u.basket(k),{...d,packages:d.packages.map(C=>C.id===l.packageId?{...C,in_basket:{...C.in_basket,quantity:l.quantity}}:C)}),{previousBasket:d,ident:k}},onError:(l,k,d)=>{d?.previousBasket!==void 0&&d.ident!==null&&t.setQueryData(u.basket(d.ident),d.previousBasket),e.onError?.(c.fromUnknown(l));},onSuccess:(l,k,d)=>{let C=d.ident??m.current;C!==null&&t.setQueryData(u.basket(C),l);}}),s=useCallback(()=>{i(),t.removeQueries({queryKey:u.baskets()});},[i,t]),a=p.data??null,o=useMemo(()=>a?.packages??[],[a?.packages]),E=useMemo(()=>o.reduce((l,k)=>l+k.in_basket.quantity,0),[o]),V=useMemo(()=>a?.total_price??0,[a?.total_price]),v=p.error??y.error??f.error??g.error,K=useMemo(()=>v!==null?c.fromUnknown(v):null,[v]),N=useCallback(async l=>{await y.mutateAsync(l);},[y]),R=useCallback(async l=>{await f.mutateAsync(l);},[f]),W=useCallback(async l=>{await g.mutateAsync(l);},[g]);return {basket:a,data:a,basketIdent:n,packages:o,isLoading:p.isLoading,isFetching:p.isFetching,isAddingPackage:y.isPending,isRemovingPackage:f.isPending,isUpdatingQuantity:g.isPending,error:K,errorCode:K?.code??null,addPackage:N,removePackage:R,updateQuantity:W,clearBasket:s,refetch:p.refetch,itemCount:E,total:V,isEmpty:o.length===0}}function ue(e={}){let{includePackages:t=true,enabled:n=true}=e,r=useQuery({queryKey:u.categoriesList(t),queryFn:async()=>T().getCategories(t),enabled:n,staleTime:300*1e3}),i=useMemo(()=>r.error!==null?c.fromUnknown(r.error):null,[r.error]),m=useRef(r.data);m.current=r.data;let p=useCallback(f=>m.current?.find(g=>g.name.toLowerCase()===f.toLowerCase()),[]),x=useCallback(f=>m.current?.find(g=>g.id===f),[]),y=useCallback(f=>m.current?.find(g=>g.slug===f),[]);return {categories:r.data??null,data:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:i,errorCode:i?.code??null,refetch:r.refetch,getByName:p,getById:x,getBySlug:y}}function ce(e){let{id:t,enabled:n=true}=e,r=useQuery({queryKey:u.category(t),queryFn:async()=>T().getCategory(t),enabled:n&&t>0&&Number.isInteger(t),staleTime:300*1e3}),i=useMemo(()=>r.error!==null?c.fromUnknown(r.error):null,[r.error]);return {category:r.data??null,data:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:i,errorCode:i?.code??null,refetch:r.refetch}}var nt=1800*1e3,G=0;function le(e={}){let{basket:t,basketIdent:n,clearBasket:r,isEmpty:i}=_(),m=I(),p=useMutation({scope:{id:"basket-mutations"},retry:false,mutationFn:async()=>{if(n===null||t===null)throw new c("BASKET_NOT_FOUND");if(i)throw new c("BASKET_EMPTY","Basket is empty");if(typeof window>"u")throw new c("TEBEX_JS_NOT_LOADED","Cannot checkout on server side.");let f=window.Tebex;if(f===void 0)throw new c("TEBEX_JS_NOT_LOADED",'Tebex.js not loaded. Add <script src="https://js.tebex.io/v/1.9.0.js"></script> to your page.');return new Promise((g,s)=>{let a=f.checkout,o=false,E=++G,V=()=>{E!==G||o||(o=true,l(),r(),e.onSuccess?.(),g());},v=C=>{if(E!==G||o)return;o=true,l();let w=new c("CHECKOUT_FAILED",String(C));e.onError?.(w),m.onError?.(w),s(w);},K=()=>{E!==G||o||(o=true,l(),e.onClose?.(),g());},N=null,R=null,W=setTimeout(()=>{if(!o){o=true,l();let C=new c("TIMEOUT","Checkout session timed out");e.onError?.(C),m.onError?.(C),s(C);}},nt),l=()=>{clearTimeout(W),N!==null&&(N.disconnect(),N=null),R!==null&&(clearTimeout(R),R=null);},k=()=>document.querySelector('iframe[src*="tebex"]')??document.querySelector('[class*="tebex-js"]')??document.querySelector("tebex-checkout[open]"),d=()=>{let C=false,w=()=>{if(o)return;k()!==null?C=true:C&&K();};N=new MutationObserver(()=>{o||(R!==null&&clearTimeout(R),R=setTimeout(w,50));}),N.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["open","style","class"]}),k()!==null&&(C=true);};a.init({ident:n}),a.on("payment:complete",V),a.on("payment:error",v),a.on("close",K),a.launch(),d();})}}),x=useCallback(async()=>{await p.mutateAsync();},[p]),y=useMemo(()=>p.error!==null?c.fromUnknown(p.error):null,[p.error]);return {launch:x,isLaunching:p.isPending,error:y,errorCode:y?.code??null,canCheckout:t!==null&&!i&&!p.isPending,checkoutUrl:t?.links.checkout??null}}function fe(){let{basket:e}=_(),t=U(s=>s.basketIdent),n=useRef(t);n.current=t;let r=useQueryClient(),i=I(),m=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("COUPON_INVALID","Coupon code must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.apply(a,"coupons",{coupon_code:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,coupons:[...o.coupons,{code:s}]}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),p=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("COUPON_INVALID","Coupon code must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.remove(a,"coupons",{coupon_code:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,coupons:o.coupons.filter(E=>E.code!==s)}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),x=useCallback(async s=>{await m.mutateAsync(s);},[m]),y=useCallback(async s=>{await p.mutateAsync(s);},[p]),f=m.error??p.error,g=useMemo(()=>f!==null?c.fromUnknown(f):null,[f]);return {coupons:e?.coupons??[],apply:x,remove:y,isApplying:m.isPending,isRemoving:p.isPending,error:g,errorCode:g?.code??null}}function ye(){let{basket:e}=_(),t=U(s=>s.basketIdent),n=useRef(t);n.current=t;let r=useQueryClient(),i=I(),m=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("CREATOR_CODE_INVALID","Creator code must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.apply(a,"creator-codes",{creator_code:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,creator_code:s}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),p=useMutation({scope:{id:"basket-mutations"},mutationFn:async()=>{let s=n.current;if(s===null)throw new c("BASKET_NOT_FOUND");let a=T();return await a.remove(s,"creator-codes",{creator_code:""}),a.getBasket(s)},onMutate:async()=>{let s=n.current;if(s===null)return;await r.cancelQueries({queryKey:u.basket(s)});let a=r.getQueryData(u.basket(s));return a!==void 0&&r.setQueryData(u.basket(s),{...a,creator_code:""}),{previousBasket:a,ident:s}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),x=useCallback(async s=>{await m.mutateAsync(s);},[m]),y=useCallback(async()=>{await p.mutateAsync();},[p]),f=m.error??p.error,g=useMemo(()=>f!==null?c.fromUnknown(f):null,[f]);return {creatorCode:e?.creator_code??null,apply:x,remove:y,isApplying:m.isPending,isRemoving:p.isPending,error:g,errorCode:g?.code??null}}function Ce(){let{basket:e}=_(),t=U(s=>s.basketIdent),n=useRef(t);n.current=t;let r=useQueryClient(),i=I(),m=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("GIFTCARD_INVALID","Gift card number must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.apply(a,"giftcards",{card_number:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,giftcards:[...o.giftcards,{card_number:s}]}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),p=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("GIFTCARD_INVALID","Gift card number must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.remove(a,"giftcards",{card_number:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,giftcards:o.giftcards.filter(E=>E.card_number!==s)}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),x=useCallback(async s=>{await m.mutateAsync(s);},[m]),y=useCallback(async s=>{await p.mutateAsync(s);},[p]),f=m.error??p.error,g=useMemo(()=>f!==null?c.fromUnknown(f):null,[f]);return {giftCards:e?.giftcards??[],apply:x,remove:y,isApplying:m.isPending,isRemoving:p.isPending,error:g,errorCode:g?.code??null}}function Te(){let e=U(y=>y.basketIdent),t=useRef(e);t.current=e;let n=U(y=>y.setBasketIdent),r=useQueryClient(),i=I(),m=useMutation({scope:{id:"basket-mutations"},mutationFn:async y=>{let f=O.getState().username;if(f===null||f.length===0)throw new c("NOT_AUTHENTICATED","Username is required to gift a package");if(!S(y.targetUsername))throw new c("INVALID_USERNAME","Target username must be 3-16 alphanumeric characters");let g=y.quantity??1;if(!D(g))throw new c("INVALID_QUANTITY","Quantity must be a positive integer");if(!D(y.packageId))throw new c("PACKAGE_NOT_FOUND","Package ID must be a positive integer");let s=T(),a=U.getState().basketIdent;return a===null&&(a=(await s.createMinecraftBasket(f,i.completeUrl,i.cancelUrl)).ident,n(a)),await s.addPackageToBasket(a,y.packageId,g,"single",{gift_username:y.targetUsername}),s.getBasket(a)},onMutate:async y=>{let f=t.current;if(f===null)return;await r.cancelQueries({queryKey:u.basket(f)});let g=r.getQueryData(u.basket(f));if(g!==void 0){let s={id:y.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:y.quantity??1,price:0,gift_username_id:null,gift_username:y.targetUsername}};r.setQueryData(u.basket(f),{...g,packages:[...g.packages,s]});}return {previousBasket:g,ident:f}},onError:(y,f,g)=>{g?.previousBasket!==void 0&&r.setQueryData(u.basket(g.ident),g.previousBasket),i.onError?.(c.fromUnknown(y));},onSuccess:(y,f,g)=>{let s=g?.ident??t.current;s!==null&&r.setQueryData(u.basket(s),y);}}),p=useCallback(async y=>{await m.mutateAsync(y);},[m]),x=useMemo(()=>m.error!==null?c.fromUnknown(m.error):null,[m.error]);return {gift:p,isGifting:m.isPending,error:x,errorCode:x?.code??null}}function Ee(e){let{id:t,enabled:n=true}=e,r=useQuery({queryKey:u.package(t),queryFn:async()=>T().getPackage(t),enabled:n&&t>0&&Number.isInteger(t),staleTime:300*1e3}),i=useMemo(()=>r.error!==null?c.fromUnknown(r.error):null,[r.error]);return {package:r.data??null,data:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:i,errorCode:i?.code??null,refetch:r.refetch}}function xe(e={}){let{categoryId:t,enabled:n=true}=e,r=useQuery({queryKey:u.packagesList(t),queryFn:async()=>{let y=T();if(t!==void 0)return (await y.getCategory(t)).packages;let f=await y.getCategories(true),g=[];for(let s of f)g.push(...s.packages);return g},enabled:n,staleTime:300*1e3}),i=useMemo(()=>r.error!==null?c.fromUnknown(r.error):null,[r.error]),m=useRef(r.data);m.current=r.data;let p=useCallback(y=>m.current?.find(f=>f.id===y),[]),x=useCallback(y=>m.current?.find(f=>f.name.toLowerCase()===y.toLowerCase()),[]);return {packages:r.data??null,data:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:i,errorCode:i?.code??null,refetch:r.refetch,getById:p,getByName:x}}function Oe(){let e=O(p=>p.username),t=O(p=>p.setUsername),n=O(p=>p.clearUsername),r=useCallback(p=>{let x=p.trim();return S(x)?(t(x),true):false},[t]),i=useCallback(()=>{n();},[n]),m=e!==null&&e.length>0;return {username:e,setUsername:r,clearUsername:i,isAuthenticated:m}}function wt(e){return typeof e=="object"&&e!==null&&"iso_4217"in e&&typeof e.iso_4217=="string"}function Ot(e){let t=e.currency,n;return wt(t)?n=t.iso_4217:typeof t=="string"?n=t:n="USD",{id:e.id,name:e.name,description:e.description,currency:n,domain:e.webstore_url,logo:typeof e.logo=="string"&&e.logo.length>0?e.logo:null}}function Ie(){let e=useQuery({queryKey:u.webstore(),queryFn:async()=>{let r=await T().getWebstore();return Ot(r)},staleTime:3e5}),t=useMemo(()=>e.error!==null?c.fromUnknown(e.error):null,[e.error]);return {webstore:e.data??null,data:e.data??null,name:e.data?.name??null,currency:e.data?.currency??null,domain:e.data?.domain??null,isLoading:e.isLoading,isFetching:e.isFetching,error:t,errorCode:t?.code??null,refetch:e.refetch}}function Be(e){return {success:true,data:e}}function _e(e){return {success:false,error:e}}
|
|
3
|
-
export{c as TebexError,
|
|
2
|
+
import {QueryClient,QueryClientProvider,useQueryClient,useQuery,useMutation}from'@tanstack/react-query';import {createContext,useContext,useMemo,useState,useCallback,useEffect,useRef}from'react';import {TebexHeadless}from'tebex_headless';import {create}from'zustand';import {subscribeWithSelector,persist,createJSONStorage}from'zustand/middleware';import {jsx}from'react/jsx-runtime';var S=(b=>(b.PROVIDER_NOT_FOUND="PROVIDER_NOT_FOUND",b.INVALID_CONFIG="INVALID_CONFIG",b.NOT_AUTHENTICATED="NOT_AUTHENTICATED",b.INVALID_USERNAME="INVALID_USERNAME",b.BASKET_NOT_FOUND="BASKET_NOT_FOUND",b.BASKET_CREATION_FAILED="BASKET_CREATION_FAILED",b.BASKET_EXPIRED="BASKET_EXPIRED",b.BASKET_EMPTY="BASKET_EMPTY",b.PACKAGE_NOT_FOUND="PACKAGE_NOT_FOUND",b.PACKAGE_OUT_OF_STOCK="PACKAGE_OUT_OF_STOCK",b.PACKAGE_ALREADY_OWNED="PACKAGE_ALREADY_OWNED",b.INVALID_QUANTITY="INVALID_QUANTITY",b.CATEGORY_NOT_FOUND="CATEGORY_NOT_FOUND",b.COUPON_INVALID="COUPON_INVALID",b.COUPON_EXPIRED="COUPON_EXPIRED",b.COUPON_ALREADY_USED="COUPON_ALREADY_USED",b.GIFTCARD_INVALID="GIFTCARD_INVALID",b.GIFTCARD_INSUFFICIENT_BALANCE="GIFTCARD_INSUFFICIENT_BALANCE",b.CREATOR_CODE_INVALID="CREATOR_CODE_INVALID",b.CHECKOUT_FAILED="CHECKOUT_FAILED",b.CHECKOUT_CANCELLED="CHECKOUT_CANCELLED",b.TEBEX_JS_NOT_LOADED="TEBEX_JS_NOT_LOADED",b.NETWORK_ERROR="NETWORK_ERROR",b.TIMEOUT="TIMEOUT",b.RATE_LIMITED="RATE_LIMITED",b.SERVER_ERROR="SERVER_ERROR",b.FORBIDDEN="FORBIDDEN",b.VALIDATION_ERROR="VALIDATION_ERROR",b.NOT_FOUND="NOT_FOUND",b.BASKET_LOCKED="BASKET_LOCKED",b.PACKAGE_DISABLED="PACKAGE_DISABLED",b.UNKNOWN="UNKNOWN",b))(S||{});var c=class e extends Error{code;cause;constructor(t,n,r){super(n??t),Object.setPrototypeOf(this,e.prototype),this.name="TebexError",this.code=t,this.cause=r,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,e);}static extractStatusCode(t){if(typeof t=="object"&&t!==null){if("response"in t){let n=t.response;if(n&&typeof n.status=="number")return n.status}if("status"in t&&typeof t.status=="number")return t.status}return null}static fromUnknown(t){if(t instanceof e)return t;let n=t instanceof Error?t.message:String(t),r=e.extractStatusCode(t);if(r!==null)switch(r){case 400:return new e("VALIDATION_ERROR",n,t);case 401:case 403:return new e("FORBIDDEN",n,t);case 404:{let i=n.toLowerCase();return i.includes("basket")?new e("BASKET_NOT_FOUND",n,t):i.includes("package")?new e("PACKAGE_NOT_FOUND",n,t):i.includes("category")?new e("CATEGORY_NOT_FOUND",n,t):new e("NOT_FOUND",n,t)}case 408:return new e("TIMEOUT",n,t);case 409:return new e("BASKET_LOCKED",n,t);case 410:return new e("BASKET_EXPIRED",n,t);case 422:{let i=n.toLowerCase();return i.includes("coupon")&&i.includes("already")?new e("COUPON_ALREADY_USED",n,t):i.includes("coupon")&&i.includes("invalid")?new e("COUPON_INVALID",n,t):i.includes("coupon")&&i.includes("expired")?new e("COUPON_EXPIRED",n,t):i.includes("gift")&&i.includes("invalid")?new e("GIFTCARD_INVALID",n,t):i.includes("gift")&&i.includes("balance")?new e("GIFTCARD_INSUFFICIENT_BALANCE",n,t):i.includes("creator")&&i.includes("invalid")?new e("CREATOR_CODE_INVALID",n,t):i.includes("locked")||i.includes("lock")?new e("BASKET_LOCKED",n,t):i.includes("disabled")?new e("PACKAGE_DISABLED",n,t):i.includes("out of stock")||i.includes("stock")?new e("PACKAGE_OUT_OF_STOCK",n,t):i.includes("already own")?new e("PACKAGE_ALREADY_OWNED",n,t):new e("VALIDATION_ERROR",n,t)}case 423:return new e("BASKET_LOCKED",n,t);case 429:return new e("RATE_LIMITED",n,t);case 500:case 502:case 503:return new e("SERVER_ERROR",n,t);case 504:return new e("TIMEOUT",n,t)}if(t instanceof Error){if(t.name==="AbortError")return new e("TIMEOUT",n,t);if("code"in t){let m=t.code;if(typeof m=="string"){if(m==="ERR_NETWORK"||m==="ERR_FR_TOO_MANY_REDIRECTS")return new e("NETWORK_ERROR",n,t);if(m==="ECONNABORTED"||m==="ERR_CANCELED")return new e("TIMEOUT",n,t)}}let i=n.toLowerCase();return i.includes("network")||i.includes("fetch")||i.includes("load failed")||i.includes("enotfound")||i.includes("econnreset")||i.includes("econnrefused")||i.includes("econnaborted")||i.includes("err_network")?new e("NETWORK_ERROR",n,t):i.includes("timeout")||i.includes("etimedout")?new e("TIMEOUT",n,t):i.includes("rate limit")||i.includes("429")?new e("RATE_LIMITED",n,t):i.includes("basket")&&i.includes("not found")?new e("BASKET_NOT_FOUND",n,t):i.includes("package")&&i.includes("not found")?new e("PACKAGE_NOT_FOUND",n,t):i.includes("coupon")&&i.includes("invalid")?new e("COUPON_INVALID",n,t):i.includes("coupon")&&i.includes("expired")?new e("COUPON_EXPIRED",n,t):i.includes("gift")&&i.includes("invalid")?new e("GIFTCARD_INVALID",n,t):new e("UNKNOWN",n,t)}return new e("UNKNOWN",n)}static fromJSON(t){let r=Object.values(S).includes(t.code)?t.code:"UNKNOWN";return new e(r,t.message??t.code)}toJSON(){return {name:this.name,code:this.code,message:this.message,...this.cause instanceof Error?{cause:this.cause.message}:{}}}};var M=null;function H(e){let t=e.trim();if(t.length===0)throw new c("INVALID_CONFIG","publicKey must be a non-empty string");M=new TebexHeadless(t);}function T(){if(M===null)throw new c("PROVIDER_NOT_FOUND","Tebex client not initialized. Ensure TebexProvider wraps your component tree.");return M}function $(){return M!==null}var U=create()(subscribeWithSelector(persist(e=>({basketIdent:null,setBasketIdent:t=>{e({basketIdent:t});},clearBasketIdent:()=>{e({basketIdent:null});}}),{name:"tebex-basket-store",storage:createJSONStorage(()=>typeof window<"u"?window.localStorage:{getItem:()=>null,setItem:()=>{},removeItem:()=>{}}),skipHydration:true,version:1,partialize:e=>({basketIdent:e.basketIdent}),migrate:e=>{if(typeof e=="object"&&e!==null&&"basketIdent"in e){let t=e;return {basketIdent:typeof t.basketIdent=="string"?t.basketIdent:null}}return {basketIdent:null}},onRehydrateStorage:()=>(e,t)=>{t!==void 0&&console.warn("[tebex] Failed to rehydrate basket store:",t);}})));var O=create()(subscribeWithSelector(persist(e=>({username:null,setUsername:t=>{e({username:t});},clearUsername:()=>{e({username:null}),U.getState().clearBasketIdent();}}),{name:"tebex-user-store",storage:createJSONStorage(()=>typeof window<"u"?window.localStorage:{getItem:()=>null,setItem:()=>{},removeItem:()=>{}}),skipHydration:true,version:1,partialize:e=>({username:e.username}),migrate:e=>{if(typeof e=="object"&&e!==null&&"username"in e){let t=e;return {username:typeof t.username=="string"?t.username:null}}return {username:null}},onRehydrateStorage:()=>(e,t)=>{t!==void 0&&console.warn("[tebex] Failed to rehydrate user store:",t);}})));var Y=createContext(null);function F(){let e=useContext(Y);if(e===null)throw new c("PROVIDER_NOT_FOUND","useTebexContext must be used within TebexProvider or TebexMockProvider");return e}function I(){let{config:e}=F();return e}function X(){let{isHydrated:e}=F();return e}var Ve={defaultOptions:{queries:{staleTime:60*1e3,gcTime:300*1e3,retry:3,retryDelay:e=>Math.min(1e3*2**e,3e4),refetchOnWindowFocus:false,refetchOnReconnect:true},mutations:{retry:false}}};function We(e){if(typeof e.publicKey!="string"||e.publicKey.trim().length===0)throw new c("INVALID_CONFIG","publicKey must be a non-empty string");if(typeof e.baseUrl!="string"||e.baseUrl.trim().length===0)throw new c("INVALID_CONFIG","baseUrl must be a non-empty string");let t=e.baseUrl.replace(/\/$/,""),n=e.urls?.complete??"/shop/complete",r=e.urls?.cancel??"/shop/cancel";return {publicKey:e.publicKey,baseUrl:t,completeUrl:`${t}${n}`,cancelUrl:`${t}${r}`,onError:e.onError}}function ne({children:e,config:t,queryClient:n}){let r=useMemo(()=>We(t),[t]),[i]=useState(()=>n??new QueryClient(Ve));useState(()=>{H(r.publicKey);});let[m,p]=useState(()=>U.persist.hasHydrated()&&O.persist.hasHydrated()),x=useCallback(()=>{U.persist.hasHydrated()&&O.persist.hasHydrated()&&p(true);},[]);useEffect(()=>{if(m)return;let f=U.persist.onFinishHydration(x),g=O.persist.onFinishHydration(x);return U.persist.rehydrate(),O.persist.rehydrate(),x(),()=>{f(),g();}},[m,x]),useEffect(()=>{let f=g=>{(g.key==="tebex-basket-store"||g.key==="tebex-user-store")&&(U.persist.rehydrate(),O.persist.rehydrate());};return window.addEventListener("storage",f),()=>{window.removeEventListener("storage",f);}},[]);let y=useMemo(()=>({config:r,queryClient:i,isHydrated:m}),[r,i,m]);return jsx(Y.Provider,{value:y,children:jsx(QueryClientProvider,{client:i,children:e})})}var u={all:["tebex"],categories:()=>[...u.all,"categories"],categoriesList:e=>[...u.categories(),"list",{includePackages:e}],category:e=>[...u.categories(),"detail",e],packages:()=>[...u.all,"packages"],packagesList:e=>[...u.packages(),"list",{categoryId:e}],package:e=>[...u.packages(),"detail",e],baskets:()=>[...u.all,"baskets"],basket:e=>[...u.baskets(),e],webstore:()=>[...u.all,"webstore"]};function re(e){if(e instanceof c)return true;if(typeof e=="object"&&e!==null&&"name"in e&&"code"in e&&e.name==="TebexError"){let t=e.code;return typeof t=="string"&&Object.values(S).includes(t)}return false}function se(e){return e.success}function oe(e){return !e.success}function ae(e){return e!=null}function B(e){return typeof e=="string"&&e.length>0}function ie(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function N(e){return typeof e=="number"&&Number.isInteger(e)&&e>0}function h(e){return typeof e!="string"?false:/^[a-zA-Z0-9_]{3,16}$/.test(e)}var Q=null;function _(){let e=I(),t=useQueryClient(),n=U(l=>l.basketIdent),r=U(l=>l.setBasketIdent),i=U(l=>l.clearBasketIdent),m=useRef(n);m.current=n;let p=useQuery({queryKey:u.basket(n),queryFn:async()=>n===null?null:T().getBasket(n),enabled:n!==null,retry:(l,k)=>{let d=c.fromUnknown(k);return d.code==="BASKET_NOT_FOUND"||d.code==="BASKET_EXPIRED"?false:l<3}});useEffect(()=>{if(p.error!==null){let l=c.fromUnknown(p.error);(l.code==="BASKET_NOT_FOUND"||l.code==="BASKET_EXPIRED")&&(i(),t.removeQueries({queryKey:u.baskets()}));}},[p.error,i,t]);let x=useCallback(async()=>{let l=U.getState().basketIdent;return l!==null?l:(Q!==null||(Q=(async()=>{let d=O.getState().username;if(d===null||d.length===0)throw new c("NOT_AUTHENTICATED","Username is required to create a basket");let w=await T().createMinecraftBasket(d,e.completeUrl,e.cancelUrl);return r(w.ident),w.ident})().finally(()=>{Q=null;})),Q)},[e.completeUrl,e.cancelUrl,r]),y=useMutation({scope:{id:"basket-mutations"},mutationFn:async l=>{let k=l.quantity??1;if(!N(k))throw new c("INVALID_QUANTITY","Quantity must be a positive integer");let d=async w=>{let A=T();return await A.addPackageToBasket(w,l.packageId,k,l.type,l.variableData),A.getBasket(w)},C=await x();try{return await d(C)}catch(w){let A=c.fromUnknown(w);if(A.code==="BASKET_NOT_FOUND"||A.code==="BASKET_EXPIRED"){i();let P=await x();return d(P)}throw w}},onMutate:async l=>{let k=m.current;if(k===null)return {previousBasket:void 0,ident:k};await t.cancelQueries({queryKey:u.basket(k)});let d=t.getQueryData(u.basket(k));if(d!=null){let C={id:l.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:l.quantity??1,price:0,gift_username_id:null,gift_username:null}},w=d.packages.findIndex(P=>P.id===l.packageId),A=w>=0?d.packages.map((P,Re)=>Re===w?{...P,in_basket:{...P.in_basket,quantity:P.in_basket.quantity+(l.quantity??1)}}:P):[...d.packages,C];t.setQueryData(u.basket(k),{...d,packages:A});}return {previousBasket:d,ident:k}},onError:(l,k,d)=>{d?.previousBasket!==void 0&&d.ident!==null&&t.setQueryData(u.basket(d.ident),d.previousBasket),e.onError?.(c.fromUnknown(l));},onSuccess:(l,k,d)=>{let C=d.ident??m.current;C!==null&&t.setQueryData(u.basket(C),l);}}),f=useMutation({scope:{id:"basket-mutations"},mutationFn:async l=>{let k=U.getState().basketIdent;if(k===null)throw new c("BASKET_NOT_FOUND");let d=T();return await d.removePackage(k,l),d.getBasket(k)},onMutate:async l=>{let k=m.current;if(k===null)return {previousBasket:void 0,ident:k};await t.cancelQueries({queryKey:u.basket(k)});let d=t.getQueryData(u.basket(k));return d!=null&&t.setQueryData(u.basket(k),{...d,packages:d.packages.filter(C=>C.id!==l)}),{previousBasket:d,ident:k}},onError:(l,k,d)=>{d?.previousBasket!==void 0&&d.ident!==null&&t.setQueryData(u.basket(d.ident),d.previousBasket),e.onError?.(c.fromUnknown(l));},onSuccess:(l,k,d)=>{let C=d.ident??m.current;C!==null&&t.setQueryData(u.basket(C),l);}}),g=useMutation({scope:{id:"basket-mutations"},mutationFn:async l=>{if(!N(l.quantity))throw new c("INVALID_QUANTITY","Quantity must be a positive integer");let k=U.getState().basketIdent;if(k===null)throw new c("BASKET_NOT_FOUND");let d=T();return await d.updateQuantity(k,l.packageId,l.quantity),d.getBasket(k)},onMutate:async l=>{let k=m.current;if(k===null)return {previousBasket:void 0,ident:k};await t.cancelQueries({queryKey:u.basket(k)});let d=t.getQueryData(u.basket(k));return d!=null&&t.setQueryData(u.basket(k),{...d,packages:d.packages.map(C=>C.id===l.packageId?{...C,in_basket:{...C.in_basket,quantity:l.quantity}}:C)}),{previousBasket:d,ident:k}},onError:(l,k,d)=>{d?.previousBasket!==void 0&&d.ident!==null&&t.setQueryData(u.basket(d.ident),d.previousBasket),e.onError?.(c.fromUnknown(l));},onSuccess:(l,k,d)=>{let C=d.ident??m.current;C!==null&&t.setQueryData(u.basket(C),l);}}),s=useCallback(()=>{i(),t.removeQueries({queryKey:u.baskets()});},[i,t]),a=p.data??null,o=useMemo(()=>a?.packages??[],[a?.packages]),E=useMemo(()=>o.reduce((l,k)=>l+k.in_basket.quantity,0),[o]),V=useMemo(()=>a?.total_price??0,[a?.total_price]),v=p.error??y.error??f.error??g.error,K=useMemo(()=>v!==null?c.fromUnknown(v):null,[v]),D=useCallback(async l=>{await y.mutateAsync(l);},[y]),R=useCallback(async l=>{await f.mutateAsync(l);},[f]),W=useCallback(async l=>{await g.mutateAsync(l);},[g]);return {basket:a,data:a,basketIdent:n,packages:o,isLoading:p.isLoading,isFetching:p.isFetching,isAddingPackage:y.isPending,isRemovingPackage:f.isPending,isUpdatingQuantity:g.isPending,error:K,errorCode:K?.code??null,addPackage:D,removePackage:R,updateQuantity:W,clearBasket:s,refetch:p.refetch,itemCount:E,total:V,isEmpty:o.length===0}}function ue(e={}){let{includePackages:t=true,enabled:n=true}=e,r=useQuery({queryKey:u.categoriesList(t),queryFn:async()=>T().getCategories(t),enabled:n,staleTime:300*1e3}),i=useMemo(()=>r.error!==null?c.fromUnknown(r.error):null,[r.error]),m=useRef(r.data);m.current=r.data;let p=useCallback(f=>m.current?.find(g=>g.name.toLowerCase()===f.toLowerCase()),[]),x=useCallback(f=>m.current?.find(g=>g.id===f),[]),y=useCallback(f=>m.current?.find(g=>g.slug===f),[]);return {categories:r.data??null,data:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:i,errorCode:i?.code??null,refetch:r.refetch,getByName:p,getById:x,getBySlug:y}}function ce(e){let{id:t,enabled:n=true}=e,r=useQuery({queryKey:u.category(t),queryFn:async()=>T().getCategory(t),enabled:n&&t>0&&Number.isInteger(t),staleTime:300*1e3}),i=useMemo(()=>r.error!==null?c.fromUnknown(r.error):null,[r.error]);return {category:r.data??null,data:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:i,errorCode:i?.code??null,refetch:r.refetch}}var st=1800*1e3,G=0;function le(e={}){let{basket:t,basketIdent:n,clearBasket:r,isEmpty:i}=_(),m=I(),p=useMutation({scope:{id:"basket-mutations"},retry:false,mutationFn:async()=>{if(n===null||t===null)throw new c("BASKET_NOT_FOUND");if(i)throw new c("BASKET_EMPTY","Basket is empty");if(typeof window>"u")throw new c("TEBEX_JS_NOT_LOADED","Cannot checkout on server side.");let f=window.Tebex;if(f===void 0)throw new c("TEBEX_JS_NOT_LOADED",'Tebex.js not loaded. Add <script src="https://js.tebex.io/v/1.9.0.js"></script> to your page.');return new Promise((g,s)=>{let a=f.checkout,o=false,E=++G,V=()=>{E!==G||o||(o=true,l(),r(),e.onSuccess?.(),g());},v=C=>{if(E!==G||o)return;o=true,l();let w=new c("CHECKOUT_FAILED",String(C));e.onError?.(w),m.onError?.(w),s(w);},K=()=>{E!==G||o||(o=true,l(),e.onClose?.(),g());},D=null,R=null,W=setTimeout(()=>{if(!o){o=true,l();let C=new c("TIMEOUT","Checkout session timed out");e.onError?.(C),m.onError?.(C),s(C);}},st),l=()=>{clearTimeout(W),D!==null&&(D.disconnect(),D=null),R!==null&&(clearTimeout(R),R=null);},k=()=>document.querySelector('iframe[src*="tebex"]')??document.querySelector('[class*="tebex-js"]')??document.querySelector("tebex-checkout[open]"),d=()=>{let C=false,w=()=>{if(o)return;k()!==null?C=true:C&&K();};D=new MutationObserver(()=>{o||(R!==null&&clearTimeout(R),R=setTimeout(w,50));}),D.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:["open","style","class"]}),k()!==null&&(C=true);};a.init({ident:n}),a.on("payment:complete",V),a.on("payment:error",v),a.on("close",K),a.launch(),d();})}}),x=useCallback(async()=>{await p.mutateAsync();},[p]),y=useMemo(()=>p.error!==null?c.fromUnknown(p.error):null,[p.error]);return {launch:x,isLaunching:p.isPending,error:y,errorCode:y?.code??null,canCheckout:t!==null&&!i&&!p.isPending,checkoutUrl:t?.links.checkout??null}}function fe(){let{basket:e}=_(),t=U(s=>s.basketIdent),n=useRef(t);n.current=t;let r=useQueryClient(),i=I(),m=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("COUPON_INVALID","Coupon code must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.apply(a,"coupons",{coupon_code:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,coupons:[...o.coupons,{code:s}]}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),p=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("COUPON_INVALID","Coupon code must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.remove(a,"coupons",{coupon_code:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,coupons:o.coupons.filter(E=>E.code!==s)}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),x=useCallback(async s=>{await m.mutateAsync(s);},[m]),y=useCallback(async s=>{await p.mutateAsync(s);},[p]),f=m.error??p.error,g=useMemo(()=>f!==null?c.fromUnknown(f):null,[f]);return {coupons:e?.coupons??[],apply:x,remove:y,isApplying:m.isPending,isRemoving:p.isPending,error:g,errorCode:g?.code??null}}function ye(){let{basket:e}=_(),t=U(s=>s.basketIdent),n=useRef(t);n.current=t;let r=useQueryClient(),i=I(),m=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("CREATOR_CODE_INVALID","Creator code must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.apply(a,"creator-codes",{creator_code:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,creator_code:s}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),p=useMutation({scope:{id:"basket-mutations"},mutationFn:async()=>{let s=n.current;if(s===null)throw new c("BASKET_NOT_FOUND");let a=T();return await a.remove(s,"creator-codes",{creator_code:""}),a.getBasket(s)},onMutate:async()=>{let s=n.current;if(s===null)return;await r.cancelQueries({queryKey:u.basket(s)});let a=r.getQueryData(u.basket(s));return a!==void 0&&r.setQueryData(u.basket(s),{...a,creator_code:""}),{previousBasket:a,ident:s}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),x=useCallback(async s=>{await m.mutateAsync(s);},[m]),y=useCallback(async()=>{await p.mutateAsync();},[p]),f=m.error??p.error,g=useMemo(()=>f!==null?c.fromUnknown(f):null,[f]);return {creatorCode:e?.creator_code??null,apply:x,remove:y,isApplying:m.isPending,isRemoving:p.isPending,error:g,errorCode:g?.code??null}}function Ce(){let{basket:e}=_(),t=U(s=>s.basketIdent),n=useRef(t);n.current=t;let r=useQueryClient(),i=I(),m=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("GIFTCARD_INVALID","Gift card number must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.apply(a,"giftcards",{card_number:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,giftcards:[...o.giftcards,{card_number:s}]}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),p=useMutation({scope:{id:"basket-mutations"},mutationFn:async s=>{if(!B(s.trim()))throw new c("GIFTCARD_INVALID","Gift card number must be a non-empty string");let a=n.current;if(a===null)throw new c("BASKET_NOT_FOUND");let o=T();return await o.remove(a,"giftcards",{card_number:s}),o.getBasket(a)},onMutate:async s=>{let a=n.current;if(a===null)return;await r.cancelQueries({queryKey:u.basket(a)});let o=r.getQueryData(u.basket(a));return o!==void 0&&r.setQueryData(u.basket(a),{...o,giftcards:o.giftcards.filter(E=>E.card_number!==s)}),{previousBasket:o,ident:a}},onError:(s,a,o)=>{o?.previousBasket!==void 0&&r.setQueryData(u.basket(o.ident),o.previousBasket),i.onError?.(c.fromUnknown(s));},onSuccess:(s,a,o)=>{let E=o?.ident??n.current;E!==null&&r.setQueryData(u.basket(E),s);}}),x=useCallback(async s=>{await m.mutateAsync(s);},[m]),y=useCallback(async s=>{await p.mutateAsync(s);},[p]),f=m.error??p.error,g=useMemo(()=>f!==null?c.fromUnknown(f):null,[f]);return {giftCards:e?.giftcards??[],apply:x,remove:y,isApplying:m.isPending,isRemoving:p.isPending,error:g,errorCode:g?.code??null}}function Te(){let e=U(y=>y.basketIdent),t=useRef(e);t.current=e;let n=U(y=>y.setBasketIdent),r=useQueryClient(),i=I(),m=useMutation({scope:{id:"basket-mutations"},mutationFn:async y=>{let f=O.getState().username;if(f===null||f.length===0)throw new c("NOT_AUTHENTICATED","Username is required to gift a package");if(!h(y.targetUsername))throw new c("INVALID_USERNAME","Target username must be 3-16 alphanumeric characters");let g=y.quantity??1;if(!N(g))throw new c("INVALID_QUANTITY","Quantity must be a positive integer");if(!N(y.packageId))throw new c("PACKAGE_NOT_FOUND","Package ID must be a positive integer");let s=T(),a=U.getState().basketIdent;return a===null&&(a=(await s.createMinecraftBasket(f,i.completeUrl,i.cancelUrl)).ident,n(a)),await s.addPackageToBasket(a,y.packageId,g,"single",{gift_username:y.targetUsername}),s.getBasket(a)},onMutate:async y=>{let f=t.current;if(f===null)return;await r.cancelQueries({queryKey:u.basket(f)});let g=r.getQueryData(u.basket(f));if(g!==void 0){let s={id:y.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:y.quantity??1,price:0,gift_username_id:null,gift_username:y.targetUsername}};r.setQueryData(u.basket(f),{...g,packages:[...g.packages,s]});}return {previousBasket:g,ident:f}},onError:(y,f,g)=>{g?.previousBasket!==void 0&&r.setQueryData(u.basket(g.ident),g.previousBasket),i.onError?.(c.fromUnknown(y));},onSuccess:(y,f,g)=>{let s=g?.ident??t.current;s!==null&&r.setQueryData(u.basket(s),y);}}),p=useCallback(async y=>{await m.mutateAsync(y);},[m]),x=useMemo(()=>m.error!==null?c.fromUnknown(m.error):null,[m.error]);return {gift:p,isGifting:m.isPending,error:x,errorCode:x?.code??null}}function Ee(e){let{id:t,enabled:n=true}=e,r=useQuery({queryKey:u.package(t),queryFn:async()=>T().getPackage(t),enabled:n&&t>0&&Number.isInteger(t),staleTime:300*1e3}),i=useMemo(()=>r.error!==null?c.fromUnknown(r.error):null,[r.error]);return {package:r.data??null,data:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:i,errorCode:i?.code??null,refetch:r.refetch}}function xe(e={}){let{categoryId:t,enabled:n=true}=e,r=useQuery({queryKey:u.packagesList(t),queryFn:async()=>{let y=T();if(t!==void 0)return (await y.getCategory(t)).packages;let f=await y.getCategories(true),g=[];for(let s of f)g.push(...s.packages);return g},enabled:n,staleTime:300*1e3}),i=useMemo(()=>r.error!==null?c.fromUnknown(r.error):null,[r.error]),m=useRef(r.data);m.current=r.data;let p=useCallback(y=>m.current?.find(f=>f.id===y),[]),x=useCallback(y=>m.current?.find(f=>f.name.toLowerCase()===y.toLowerCase()),[]);return {packages:r.data??null,data:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:i,errorCode:i?.code??null,refetch:r.refetch,getById:p,getByName:x}}function Oe(){let e=O(p=>p.username),t=O(p=>p.setUsername),n=O(p=>p.clearUsername),r=useCallback(p=>{let x=p.trim();return h(x)?(t(x),true):false},[t]),i=useCallback(()=>{n();},[n]),m=e!==null&&e.length>0;return {username:e,setUsername:r,clearUsername:i,isAuthenticated:m}}function It(e){return typeof e=="object"&&e!==null&&"iso_4217"in e&&typeof e.iso_4217=="string"}function Bt(e){let t=e.currency,n;return It(t)?n=t.iso_4217:typeof t=="string"?n=t:n="USD",{id:e.id,name:e.name,description:e.description,currency:n,domain:e.webstore_url,logo:typeof e.logo=="string"&&e.logo.length>0?e.logo:null}}function Ie(){let e=useQuery({queryKey:u.webstore(),queryFn:async()=>{let r=await T().getWebstore();return Bt(r)},staleTime:3e5}),t=useMemo(()=>e.error!==null?c.fromUnknown(e.error):null,[e.error]);return {webstore:e.data??null,data:e.data??null,name:e.data?.name??null,currency:e.data?.currency??null,domain:e.data?.domain??null,isLoading:e.isLoading,isFetching:e.isFetching,error:t,errorCode:t?.code??null,refetch:e.refetch}}function Be(e){return {success:true,data:e}}function _e(e){return {success:false,error:e}}
|
|
3
|
+
export{c as TebexError,S as TebexErrorCode,ne as TebexProvider,_e as err,T as getTebexClient,ae as isDefined,oe as isError,B as isNonEmptyString,N as isPositiveInteger,ie as isPositiveNumber,se as isSuccess,$ as isTebexClientInitialized,re as isTebexError,h as isValidMinecraftUsername,Be as ok,u as tebexKeys,_ as useBasket,U as useBasketStore,ue as useCategories,ce as useCategory,le as useCheckout,fe as useCoupons,ye as useCreatorCodes,Ce as useGiftCards,Te as useGiftPackage,Ee as usePackage,xe as usePackages,I as useTebexConfig,F as useTebexContext,X as useTebexHydrated,Oe as useUser,O as useUserStore,Ie as useWebstore};//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|