@neosianexus/super-tebex 3.4.0 → 3.4.1

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.
@@ -9,7 +9,6 @@ interface TebexCheckout {
9
9
  }) => void;
10
10
  launch: () => void;
11
11
  on: (event: string, callback: (data?: unknown) => void) => void;
12
- off: (event: string, callback: (data?: unknown) => void) => void;
13
12
  close: () => void;
14
13
  }
15
14
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"useCheckout.d.ts","sourceRoot":"","sources":["../../src/hooks/useCheckout.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG5E;;;GAGG;AACH,UAAU,aAAa;IACrB,IAAI,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3C,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IAChE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IACjE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,KAAK,CAAC,EAAE;YACN,QAAQ,EAAE,aAAa,CAAC;SACzB,CAAC;KACH;CACF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CA8F/E"}
1
+ {"version":3,"file":"useCheckout.d.ts","sourceRoot":"","sources":["../../src/hooks/useCheckout.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG5E;;;GAGG;AACH,UAAU,aAAa;IACrB,IAAI,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3C,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IAChE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,KAAK,CAAC,EAAE;YACN,QAAQ,EAAE,aAAa,CAAC;SACzB,CAAC;KACH;CACF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAuJ/E"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
1
  'use client';
2
- var{defineProperty:_A,getOwnPropertyNames:yA,getOwnPropertyDescriptor:xA}=Object,cA=Object.prototype.hasOwnProperty;var IA=new WeakMap,dA=(A)=>{var O=IA.get(A),_;if(O)return O;if(O=_A({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function")yA(A).map((N)=>!cA.call(O,N)&&_A(O,N,{get:()=>A[N],enumerable:!(_=xA(A,N))||_.enumerable}));return IA.set(A,O),O};var bA=(A,O)=>{for(var _ in O)_A(A,_,{get:O[_],enumerable:!0,configurable:!0,set:(N)=>O[_]=()=>N})};var oA={};bA(oA,{useWebstore:()=>wA,useUserStore:()=>K,useUser:()=>QA,useTebexContext:()=>C,useTebexConfig:()=>S,usePackages:()=>jA,usePackage:()=>PA,useGiftPackage:()=>zA,useGiftCards:()=>WA,useCreatorCodes:()=>HA,useCoupons:()=>$A,useCheckout:()=>ZA,useCategory:()=>JA,useCategories:()=>XA,useBasketStore:()=>j,useBasket:()=>h,tebexKeys:()=>R,ok:()=>KA,isTebexError:()=>GA,isTebexClientInitialized:()=>NA,isSuccess:()=>UA,isError:()=>YA,isDefined:()=>VA,getTebexClient:()=>H,err:()=>hA,TebexProvider:()=>FA,TebexErrorCode:()=>u,TebexError:()=>L});module.exports=dA(oA);var o=require("@tanstack/react-query"),B=require("react");var fA=require("tebex_headless"),i=null;function DA(A){i=new fA.TebexHeadless(A)}function H(){if(i===null)throw Error("Tebex client not initialized. Make sure you are using TebexProvider.");return i}function NA(){return i!==null}var n=require("react");var u;((W)=>{W.PROVIDER_NOT_FOUND="PROVIDER_NOT_FOUND";W.INVALID_CONFIG="INVALID_CONFIG";W.NOT_AUTHENTICATED="NOT_AUTHENTICATED";W.INVALID_USERNAME="INVALID_USERNAME";W.BASKET_NOT_FOUND="BASKET_NOT_FOUND";W.BASKET_CREATION_FAILED="BASKET_CREATION_FAILED";W.BASKET_EXPIRED="BASKET_EXPIRED";W.BASKET_EMPTY="BASKET_EMPTY";W.PACKAGE_NOT_FOUND="PACKAGE_NOT_FOUND";W.PACKAGE_OUT_OF_STOCK="PACKAGE_OUT_OF_STOCK";W.PACKAGE_ALREADY_OWNED="PACKAGE_ALREADY_OWNED";W.INVALID_QUANTITY="INVALID_QUANTITY";W.CATEGORY_NOT_FOUND="CATEGORY_NOT_FOUND";W.COUPON_INVALID="COUPON_INVALID";W.COUPON_EXPIRED="COUPON_EXPIRED";W.COUPON_ALREADY_USED="COUPON_ALREADY_USED";W.GIFTCARD_INVALID="GIFTCARD_INVALID";W.GIFTCARD_INSUFFICIENT_BALANCE="GIFTCARD_INSUFFICIENT_BALANCE";W.CREATOR_CODE_INVALID="CREATOR_CODE_INVALID";W.CHECKOUT_FAILED="CHECKOUT_FAILED";W.CHECKOUT_CANCELLED="CHECKOUT_CANCELLED";W.TEBEX_JS_NOT_LOADED="TEBEX_JS_NOT_LOADED";W.NETWORK_ERROR="NETWORK_ERROR";W.TIMEOUT="TIMEOUT";W.RATE_LIMITED="RATE_LIMITED";W.UNKNOWN="UNKNOWN"})(u||={});class L extends Error{code;cause;constructor(A,O,_){super(O??A);if(this.name="TebexError",this.code=A,this.cause=_,typeof Error.captureStackTrace==="function")Error.captureStackTrace(this,L)}static fromUnknown(A){if(A instanceof L)return A;if(A instanceof Error){let O=A.message.toLowerCase();if(O.includes("network")||O.includes("fetch"))return new L("NETWORK_ERROR",A.message,A);if(O.includes("timeout"))return new L("TIMEOUT",A.message,A);if(O.includes("rate limit")||O.includes("429"))return new L("RATE_LIMITED",A.message,A);if(O.includes("basket")&&O.includes("not found"))return new L("BASKET_NOT_FOUND",A.message,A);if(O.includes("package")&&O.includes("not found"))return new L("PACKAGE_NOT_FOUND",A.message,A);if(O.includes("coupon")&&O.includes("invalid"))return new L("COUPON_INVALID",A.message,A);if(O.includes("coupon")&&O.includes("expired"))return new L("COUPON_EXPIRED",A.message,A);if(O.includes("gift")&&O.includes("invalid"))return new L("GIFTCARD_INVALID",A.message,A);return new L("UNKNOWN",A.message,A)}return new L("UNKNOWN",String(A))}toJSON(){return{name:this.name,code:this.code,message:this.message}}}var RA=n.createContext(null);function C(){let A=n.useContext(RA);if(A===null)throw new L("PROVIDER_NOT_FOUND","useTebexContext must be used within TebexProvider or TebexMockProvider");return A}function S(){let{config:A}=C();return A}var LA=require("react/jsx-runtime"),iA={defaultOptions:{queries:{staleTime:60000,gcTime:300000,retry:3,retryDelay:(A)=>Math.min(1000*2**A,30000),refetchOnWindowFocus:!1,refetchOnReconnect:!0},mutations:{retry:2,retryDelay:(A)=>Math.min(500*2**A,5000)}}};function uA(A){let O=A.baseUrl.replace(/\/$/,""),_=A.urls?.complete??"/shop/complete",N=A.urls?.cancel??"/shop/cancel";return{publicKey:A.publicKey,baseUrl:O,completeUrl:`${O}${_}`,cancelUrl:`${O}${N}`,onError:A.onError}}function FA({children:A,config:O,queryClient:_}){let N=B.useMemo(()=>uA(O),[O]),[Y]=B.useState(()=>_??new o.QueryClient(iA));B.useState(()=>{DA(N.publicKey)});let V=B.useMemo(()=>({config:N,queryClient:Y}),[N,Y]);return LA.jsx(RA.Provider,{value:V,children:LA.jsx(o.QueryClientProvider,{client:Y,children:A})})}var I=require("@tanstack/react-query"),Q=require("react");var R={all:["tebex"],categories:()=>[...R.all,"categories"],categoriesList:(A)=>[...R.categories(),"list",{includePackages:A}],category:(A)=>[...R.categories(),"detail",A],packages:()=>[...R.all,"packages"],packagesList:(A)=>[...R.packages(),"list",{categoryId:A}],package:(A)=>[...R.packages(),"detail",A],baskets:()=>[...R.all,"baskets"],basket:(A)=>[...R.baskets(),A],webstore:()=>[...R.all,"webstore"]};var BA=require("zustand"),s=require("zustand/middleware"),j=BA.create()(s.subscribeWithSelector(s.persist((A)=>({basketIdent:null,setBasketIdent:(O)=>{A({basketIdent:O})},clearBasketIdent:()=>{A({basketIdent:null})}}),{name:"tebex-basket-store",skipHydration:typeof window>"u"})));var MA=require("zustand"),a=require("zustand/middleware");var K=MA.create()(a.subscribeWithSelector(a.persist((A)=>({username:null,setUsername:(O)=>{A({username:O})},clearUsername:()=>{A({username:null}),j.getState().clearBasketIdent()}}),{name:"tebex-user-store",skipHydration:typeof window>"u"})));function GA(A){return A instanceof L}function UA(A){return A.success}function YA(A){return!A.success}function VA(A){return A!==null&&A!==void 0}function M(A){return typeof A==="number"&&Number.isInteger(A)&&A>0}function g(A){if(typeof A!=="string")return!1;return/^[a-zA-Z0-9_]{3,16}$/.test(A)}function h(){let A=S(),O=I.useQueryClient(),_=j((G)=>G.basketIdent),N=j((G)=>G.setBasketIdent),Y=j((G)=>G.clearBasketIdent),V=K((G)=>G.username),Z=I.useQuery({queryKey:R.basket(_),queryFn:async()=>{if(_===null)return null;return H().getBasket(_)},enabled:_!==null,retry:(G,J)=>{let P=L.fromUnknown(J);if(P.code==="BASKET_NOT_FOUND"||P.code==="BASKET_EXPIRED")return!1;return G<3}});Q.useEffect(()=>{if(Z.error!==null){let G=L.fromUnknown(Z.error);if(G.code==="BASKET_NOT_FOUND"||G.code==="BASKET_EXPIRED")Y()}},[Z.error,Y]);let z=Q.useCallback(async()=>{if(_!==null)return _;if(V===null||V.length===0)throw new L("NOT_AUTHENTICATED","Username is required to create a basket");let J=await H().createMinecraftBasket(V,A.completeUrl,A.cancelUrl);return N(J.ident),J.ident},[_,V,A.completeUrl,A.cancelUrl,N]),U=I.useMutation({mutationFn:async(G)=>{let J=G.quantity??1;if(!M(J))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");let P=await z(),v=H();return await v.addPackageToBasket(P,G.packageId,J,G.type,G.variableData),v.getBasket(P)},onMutate:async(G)=>{await O.cancelQueries({queryKey:R.basket(_)});let J=O.getQueryData(R.basket(_));if(J!==null&&J!==void 0){let P={id:G.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:G.quantity??1,price:0,gift_username_id:null,gift_username:null}},v=J.packages.findIndex((f)=>f.id===G.packageId),lA=v>=0?J.packages.map((f,W)=>W===v?{...f,in_basket:{...f.in_basket,quantity:f.in_basket.quantity+(G.quantity??1)}}:f):[...J.packages,P];O.setQueryData(R.basket(_),{...J,packages:lA})}return{previousBasket:J}},onError:(G,J,P)=>{if(P?.previousBasket!==void 0)O.setQueryData(R.basket(_),P.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(R.basket(_),G)}}),$=I.useMutation({mutationFn:async(G)=>{if(_===null)throw new L("BASKET_NOT_FOUND");let J=H();return await J.removePackage(_,G),J.getBasket(_)},onMutate:async(G)=>{await O.cancelQueries({queryKey:R.basket(_)});let J=O.getQueryData(R.basket(_));if(J!==null&&J!==void 0)O.setQueryData(R.basket(_),{...J,packages:J.packages.filter((P)=>P.id!==G)});return{previousBasket:J}},onError:(G,J,P)=>{if(P?.previousBasket!==void 0)O.setQueryData(R.basket(_),P.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(R.basket(_),G)}}),D=I.useMutation({mutationFn:async(G)=>{if(!M(G.quantity))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");if(_===null)throw new L("BASKET_NOT_FOUND");let J=H();return await J.updateQuantity(_,G.packageId,G.quantity),J.getBasket(_)},onMutate:async(G)=>{await O.cancelQueries({queryKey:R.basket(_)});let J=O.getQueryData(R.basket(_));if(J!==null&&J!==void 0)O.setQueryData(R.basket(_),{...J,packages:J.packages.map((P)=>P.id===G.packageId?{...P,in_basket:{...P.in_basket,quantity:G.quantity}}:P)});return{previousBasket:J}},onError:(G,J,P)=>{if(P?.previousBasket!==void 0)O.setQueryData(R.basket(_),P.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(R.basket(_),G)}}),F=Q.useCallback(()=>{Y(),O.removeQueries({queryKey:R.baskets()})},[Y,O]),X=Z.data??null,w=Q.useMemo(()=>X?.packages??[],[X?.packages]),d=Q.useMemo(()=>w.reduce((G,J)=>G+J.in_basket.quantity,0),[w]),b=Q.useMemo(()=>X?.total_price??0,[X]),E=Q.useMemo(()=>Z.error!==null?L.fromUnknown(Z.error):null,[Z.error]),T=Q.useCallback(async(G)=>{await U.mutateAsync(G)},[U]),OA=Q.useCallback(async(G)=>{await $.mutateAsync(G)},[$]),q=Q.useCallback(async(G)=>{await D.mutateAsync(G)},[D]);return{basket:X,data:X,basketIdent:_,packages:w,isLoading:Z.isLoading,isFetching:Z.isFetching,isAddingPackage:U.isPending,isRemovingPackage:$.isPending,isUpdatingQuantity:D.isPending,error:E,errorCode:E?.code??null,addPackage:T,removePackage:OA,updateQuantity:q,clearBasket:F,refetch:Z.refetch,itemCount:d,total:b,isEmpty:w.length===0}}var EA=require("@tanstack/react-query"),m=require("react");function XA(A={}){let{includePackages:O=!0,enabled:_=!0}=A,N=EA.useQuery({queryKey:R.categoriesList(O),queryFn:async()=>{return H().getCategories(O)},enabled:_}),Y=m.useMemo(()=>N.error!==null?L.fromUnknown(N.error):null,[N.error]),V=m.useMemo(()=>(U)=>N.data?.find(($)=>$.name.toLowerCase()===U.toLowerCase()),[N.data]),Z=m.useMemo(()=>(U)=>N.data?.find(($)=>$.id===U),[N.data]),z=m.useMemo(()=>(U)=>N.data?.find(($)=>$.slug===U),[N.data]);return{categories:N.data??null,data:N.data??null,isLoading:N.isLoading,isFetching:N.isFetching,error:Y,errorCode:Y?.code??null,refetch:N.refetch,getByName:V,getById:Z,getBySlug:z}}var TA=require("@tanstack/react-query"),qA=require("react");function JA(A){let{id:O,enabled:_=!0}=A,N=TA.useQuery({queryKey:R.category(O),queryFn:async()=>{return H().getCategory(O)},enabled:_}),Y=qA.useMemo(()=>N.error!==null?L.fromUnknown(N.error):null,[N.error]);return{category:N.data??null,data:N.data??null,isLoading:N.isLoading,isFetching:N.isFetching,error:Y,errorCode:Y?.code??null,refetch:N.refetch}}var vA=require("@tanstack/react-query"),t=require("react");function ZA(A={}){let{basket:O,basketIdent:_,clearBasket:N,isEmpty:Y}=h(),V=S(),Z=vA.useMutation({mutationFn:async()=>{if(_===null||O===null)throw new L("BASKET_NOT_FOUND");if(Y)throw new L("BASKET_EMPTY","Basket is empty");if(typeof window>"u")throw new L("TEBEX_JS_NOT_LOADED","Cannot checkout on server side.");let $=window.Tebex;if($===void 0)throw new L("TEBEX_JS_NOT_LOADED",'Tebex.js not loaded. Add <script src="https://js.tebex.io/v/1.js"></script> to your page.');return new Promise((D,F)=>{let X=$.checkout,w=!1,d=()=>{if(w)return;w=!0,T(),N(),A.onSuccess?.(),D()},b=(OA)=>{if(w)return;w=!0,T();let q=new L("CHECKOUT_FAILED",String(OA));A.onError?.(q),V.onError?.(q),F(q)},E=()=>{if(w)return;w=!0,T(),A.onClose?.(),D()},T=()=>{X.off("payment:complete",d),X.off("payment:error",b),X.off("close",E)};X.init({ident:_}),X.on("payment:complete",d),X.on("payment:error",b),X.on("close",E),X.launch()})}}),z=t.useCallback(async()=>{await Z.mutateAsync()},[Z]),U=t.useMemo(()=>Z.error!==null?L.fromUnknown(Z.error):null,[Z.error]);return{launch:z,isLaunching:Z.isPending,error:U,errorCode:U?.code??null,canCheckout:O!==null&&!Y,checkoutUrl:O?.links.checkout??null}}var p=require("@tanstack/react-query"),k=require("react");function $A(){let{basket:A}=h(),O=j((D)=>D.basketIdent),_=p.useQueryClient(),N=S(),Y=p.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"coupons",{coupon_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,coupons:[...F.coupons,{code:D}]});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(R.basket(O),X.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),V=p.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.remove(O,"coupons",{coupon_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,coupons:F.coupons.filter((X)=>X.code!==D)});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(R.basket(O),X.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),Z=k.useCallback(async(D)=>{await Y.mutateAsync(D)},[Y]),z=k.useCallback(async(D)=>{await V.mutateAsync(D)},[V]),U=Y.error??V.error,$=k.useMemo(()=>U!==null?L.fromUnknown(U):null,[U]);return{coupons:A?.coupons??[],apply:Z,remove:z,isApplying:Y.isPending,isRemoving:V.isPending,error:$,errorCode:$?.code??null}}var l=require("@tanstack/react-query"),y=require("react");function HA(){let{basket:A}=h(),O=j((D)=>D.basketIdent),_=l.useQueryClient(),N=S(),Y=l.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"creator-codes",{creator_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,creator_code:D});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(R.basket(O),X.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),V=l.useMutation({mutationFn:async()=>{if(O===null)throw new L("BASKET_NOT_FOUND");let D=H();return await D.remove(O,"creator-codes",{creator_code:""}),D.getBasket(O)},onMutate:async()=>{await _.cancelQueries({queryKey:R.basket(O)});let D=_.getQueryData(R.basket(O));if(D!==null&&D!==void 0)_.setQueryData(R.basket(O),{...D,creator_code:""});return{previousBasket:D}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(R.basket(O),X.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),Z=y.useCallback(async(D)=>{await Y.mutateAsync(D)},[Y]),z=y.useCallback(async()=>{await V.mutateAsync()},[V]),U=Y.error??V.error,$=y.useMemo(()=>U!==null?L.fromUnknown(U):null,[U]);return{creatorCode:A?.creator_code??null,apply:Z,remove:z,isApplying:Y.isPending,isRemoving:V.isPending,error:$,errorCode:$?.code??null}}var x=require("@tanstack/react-query"),c=require("react");function WA(){let{basket:A}=h(),O=j((D)=>D.basketIdent),_=x.useQueryClient(),N=S(),Y=x.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"giftcards",{card_number:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,giftcards:[...F.giftcards,{card_number:D}]});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(R.basket(O),X.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),V=x.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.remove(O,"giftcards",{card_number:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,giftcards:F.giftcards.filter((X)=>X.card_number!==D)});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(R.basket(O),X.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),Z=c.useCallback(async(D)=>{await Y.mutateAsync(D)},[Y]),z=c.useCallback(async(D)=>{await V.mutateAsync(D)},[V]),U=Y.error??V.error,$=c.useMemo(()=>U!==null?L.fromUnknown(U):null,[U]);return{giftCards:A?.giftcards??[],apply:Z,remove:z,isApplying:Y.isPending,isRemoving:V.isPending,error:$,errorCode:$?.code??null}}var r=require("@tanstack/react-query"),e=require("react");function zA(){let A=j((U)=>U.basketIdent),O=j((U)=>U.setBasketIdent),_=K((U)=>U.username),N=r.useQueryClient(),Y=S(),V=r.useMutation({mutationFn:async(U)=>{if(_===null||_.length===0)throw new L("NOT_AUTHENTICATED","Username is required to gift a package");if(!g(U.targetUsername))throw new L("INVALID_USERNAME","Target username must be 3-16 alphanumeric characters");let $=U.quantity??1;if(!M($))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");let D=H(),F=A;if(F===null)F=(await D.createMinecraftBasket(_,Y.completeUrl,Y.cancelUrl)).ident,O(F);return await D.addPackageToBasket(F,U.packageId,$,"single",{gift_username:U.targetUsername}),D.getBasket(F)},onMutate:async(U)=>{await N.cancelQueries({queryKey:R.basket(A)});let $=N.getQueryData(R.basket(A));if($!==null&&$!==void 0){let D={id:U.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:U.quantity??1,price:0,gift_username_id:null,gift_username:U.targetUsername}};N.setQueryData(R.basket(A),{...$,packages:[...$.packages,D]})}return{previousBasket:$}},onError:(U,$,D)=>{if(D?.previousBasket!==void 0)N.setQueryData(R.basket(A),D.previousBasket);Y.onError?.(L.fromUnknown(U))},onSuccess:(U)=>{N.setQueryData(R.basket(A),U)}}),Z=e.useCallback(async(U)=>{await V.mutateAsync(U)},[V]),z=e.useMemo(()=>V.error!==null?L.fromUnknown(V.error):null,[V.error]);return{gift:Z,isGifting:V.isPending,error:z,errorCode:z?.code??null}}var CA=require("@tanstack/react-query"),gA=require("react");function PA(A){let{id:O,enabled:_=!0}=A,N=CA.useQuery({queryKey:R.package(O),queryFn:async()=>{return H().getPackage(O)},enabled:_}),Y=gA.useMemo(()=>N.error!==null?L.fromUnknown(N.error):null,[N.error]);return{package:N.data??null,data:N.data??null,isLoading:N.isLoading,isFetching:N.isFetching,error:Y,errorCode:Y?.code??null,refetch:N.refetch}}var mA=require("@tanstack/react-query"),AA=require("react");function jA(A={}){let{categoryId:O,enabled:_=!0}=A,N=mA.useQuery({queryKey:R.packagesList(O),queryFn:async()=>{let z=H();if(O!==void 0)return(await z.getCategory(O)).packages;let U=await z.getCategories(!0),$=[];for(let D of U)$.push(...D.packages);return $},enabled:_}),Y=AA.useMemo(()=>N.error!==null?L.fromUnknown(N.error):null,[N.error]),V=AA.useMemo(()=>(z)=>N.data?.find((U)=>U.id===z),[N.data]),Z=AA.useMemo(()=>(z)=>N.data?.find((U)=>U.name.toLowerCase()===z.toLowerCase()),[N.data]);return{packages:N.data??null,data:N.data??null,isLoading:N.isLoading,isFetching:N.isFetching,error:Y,errorCode:Y?.code??null,refetch:N.refetch,getById:V,getByName:Z}}var SA=require("react");function QA(){let A=K((Z)=>Z.username),O=K((Z)=>Z.setUsername),_=K((Z)=>Z.clearUsername),N=SA.useCallback((Z)=>{let z=Z.trim();if(g(z))return O(z),!0;return!1},[O]),Y=SA.useCallback(()=>{_()},[_]),V=A!==null&&A.length>0;return{username:A,setUsername:N,clearUsername:Y,isAuthenticated:V}}var pA=require("@tanstack/react-query"),kA=require("react");function nA(A){let O=A.currency;return{id:A.id,name:A.name,description:A.description,currency:O.iso_4217,domain:A.webstore_url,logo:A.logo.length>0?A.logo:null}}function wA(){let A=pA.useQuery({queryKey:R.webstore(),queryFn:async()=>{let N=await H().getWebstore();return nA(N)},staleTime:300000}),O=kA.useMemo(()=>A.error!==null?L.fromUnknown(A.error):null,[A.error]);return{webstore:A.data??null,data:A.data??null,name:A.data?.name??null,currency:A.data?.currency??null,domain:A.data?.domain??null,isLoading:A.isLoading,isFetching:A.isFetching,error:O,errorCode:O?.code??null,refetch:A.refetch}}function KA(A){return{success:!0,data:A}}function hA(A){return{success:!1,error:A}}
2
+ var{defineProperty:_A,getOwnPropertyNames:yA,getOwnPropertyDescriptor:xA}=Object,cA=Object.prototype.hasOwnProperty;var BA=new WeakMap,dA=(A)=>{var O=BA.get(A),_;if(O)return O;if(O=_A({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function")yA(A).map((N)=>!cA.call(O,N)&&_A(O,N,{get:()=>A[N],enumerable:!(_=xA(A,N))||_.enumerable}));return BA.set(A,O),O};var bA=(A,O)=>{for(var _ in O)_A(A,_,{get:O[_],enumerable:!0,configurable:!0,set:(N)=>O[_]=()=>N})};var oA={};bA(oA,{useWebstore:()=>wA,useUserStore:()=>h,useUser:()=>QA,useTebexContext:()=>g,useTebexConfig:()=>S,usePackages:()=>jA,usePackage:()=>WA,useGiftPackage:()=>PA,useGiftCards:()=>zA,useCreatorCodes:()=>HA,useCoupons:()=>$A,useCheckout:()=>ZA,useCategory:()=>JA,useCategories:()=>XA,useBasketStore:()=>j,useBasket:()=>I,tebexKeys:()=>R,ok:()=>KA,isTebexError:()=>GA,isTebexClientInitialized:()=>NA,isSuccess:()=>UA,isError:()=>YA,isDefined:()=>VA,getTebexClient:()=>H,err:()=>hA,TebexProvider:()=>FA,TebexErrorCode:()=>i,TebexError:()=>L});module.exports=dA(oA);var n=require("@tanstack/react-query"),T=require("react");var fA=require("tebex_headless"),b=null;function DA(A){b=new fA.TebexHeadless(A)}function H(){if(b===null)throw Error("Tebex client not initialized. Make sure you are using TebexProvider.");return b}function NA(){return b!==null}var u=require("react");var i;((P)=>{P.PROVIDER_NOT_FOUND="PROVIDER_NOT_FOUND";P.INVALID_CONFIG="INVALID_CONFIG";P.NOT_AUTHENTICATED="NOT_AUTHENTICATED";P.INVALID_USERNAME="INVALID_USERNAME";P.BASKET_NOT_FOUND="BASKET_NOT_FOUND";P.BASKET_CREATION_FAILED="BASKET_CREATION_FAILED";P.BASKET_EXPIRED="BASKET_EXPIRED";P.BASKET_EMPTY="BASKET_EMPTY";P.PACKAGE_NOT_FOUND="PACKAGE_NOT_FOUND";P.PACKAGE_OUT_OF_STOCK="PACKAGE_OUT_OF_STOCK";P.PACKAGE_ALREADY_OWNED="PACKAGE_ALREADY_OWNED";P.INVALID_QUANTITY="INVALID_QUANTITY";P.CATEGORY_NOT_FOUND="CATEGORY_NOT_FOUND";P.COUPON_INVALID="COUPON_INVALID";P.COUPON_EXPIRED="COUPON_EXPIRED";P.COUPON_ALREADY_USED="COUPON_ALREADY_USED";P.GIFTCARD_INVALID="GIFTCARD_INVALID";P.GIFTCARD_INSUFFICIENT_BALANCE="GIFTCARD_INSUFFICIENT_BALANCE";P.CREATOR_CODE_INVALID="CREATOR_CODE_INVALID";P.CHECKOUT_FAILED="CHECKOUT_FAILED";P.CHECKOUT_CANCELLED="CHECKOUT_CANCELLED";P.TEBEX_JS_NOT_LOADED="TEBEX_JS_NOT_LOADED";P.NETWORK_ERROR="NETWORK_ERROR";P.TIMEOUT="TIMEOUT";P.RATE_LIMITED="RATE_LIMITED";P.UNKNOWN="UNKNOWN"})(i||={});class L extends Error{code;cause;constructor(A,O,_){super(O??A);if(this.name="TebexError",this.code=A,this.cause=_,typeof Error.captureStackTrace==="function")Error.captureStackTrace(this,L)}static fromUnknown(A){if(A instanceof L)return A;if(A instanceof Error){let O=A.message.toLowerCase();if(O.includes("network")||O.includes("fetch"))return new L("NETWORK_ERROR",A.message,A);if(O.includes("timeout"))return new L("TIMEOUT",A.message,A);if(O.includes("rate limit")||O.includes("429"))return new L("RATE_LIMITED",A.message,A);if(O.includes("basket")&&O.includes("not found"))return new L("BASKET_NOT_FOUND",A.message,A);if(O.includes("package")&&O.includes("not found"))return new L("PACKAGE_NOT_FOUND",A.message,A);if(O.includes("coupon")&&O.includes("invalid"))return new L("COUPON_INVALID",A.message,A);if(O.includes("coupon")&&O.includes("expired"))return new L("COUPON_EXPIRED",A.message,A);if(O.includes("gift")&&O.includes("invalid"))return new L("GIFTCARD_INVALID",A.message,A);return new L("UNKNOWN",A.message,A)}return new L("UNKNOWN",String(A))}toJSON(){return{name:this.name,code:this.code,message:this.message}}}var RA=u.createContext(null);function g(){let A=u.useContext(RA);if(A===null)throw new L("PROVIDER_NOT_FOUND","useTebexContext must be used within TebexProvider or TebexMockProvider");return A}function S(){let{config:A}=g();return A}var LA=require("react/jsx-runtime"),iA={defaultOptions:{queries:{staleTime:60000,gcTime:300000,retry:3,retryDelay:(A)=>Math.min(1000*2**A,30000),refetchOnWindowFocus:!1,refetchOnReconnect:!0},mutations:{retry:2,retryDelay:(A)=>Math.min(500*2**A,5000)}}};function uA(A){let O=A.baseUrl.replace(/\/$/,""),_=A.urls?.complete??"/shop/complete",N=A.urls?.cancel??"/shop/cancel";return{publicKey:A.publicKey,baseUrl:O,completeUrl:`${O}${_}`,cancelUrl:`${O}${N}`,onError:A.onError}}function FA({children:A,config:O,queryClient:_}){let N=T.useMemo(()=>uA(O),[O]),[Y]=T.useState(()=>_??new n.QueryClient(iA));T.useState(()=>{DA(N.publicKey)});let X=T.useMemo(()=>({config:N,queryClient:Y}),[N,Y]);return LA.jsx(RA.Provider,{value:X,children:LA.jsx(n.QueryClientProvider,{client:Y,children:A})})}var f=require("@tanstack/react-query"),w=require("react");var R={all:["tebex"],categories:()=>[...R.all,"categories"],categoriesList:(A)=>[...R.categories(),"list",{includePackages:A}],category:(A)=>[...R.categories(),"detail",A],packages:()=>[...R.all,"packages"],packagesList:(A)=>[...R.packages(),"list",{categoryId:A}],package:(A)=>[...R.packages(),"detail",A],baskets:()=>[...R.all,"baskets"],basket:(A)=>[...R.baskets(),A],webstore:()=>[...R.all,"webstore"]};var EA=require("zustand"),o=require("zustand/middleware"),j=EA.create()(o.subscribeWithSelector(o.persist((A)=>({basketIdent:null,setBasketIdent:(O)=>{A({basketIdent:O})},clearBasketIdent:()=>{A({basketIdent:null})}}),{name:"tebex-basket-store",skipHydration:typeof window>"u"})));var MA=require("zustand"),s=require("zustand/middleware");var h=MA.create()(s.subscribeWithSelector(s.persist((A)=>({username:null,setUsername:(O)=>{A({username:O})},clearUsername:()=>{A({username:null}),j.getState().clearBasketIdent()}}),{name:"tebex-user-store",skipHydration:typeof window>"u"})));function GA(A){return A instanceof L}function UA(A){return A.success}function YA(A){return!A.success}function VA(A){return A!==null&&A!==void 0}function q(A){return typeof A==="number"&&Number.isInteger(A)&&A>0}function m(A){if(typeof A!=="string")return!1;return/^[a-zA-Z0-9_]{3,16}$/.test(A)}function I(){let A=S(),O=f.useQueryClient(),_=j((G)=>G.basketIdent),N=j((G)=>G.setBasketIdent),Y=j((G)=>G.clearBasketIdent),X=h((G)=>G.username),J=f.useQuery({queryKey:R.basket(_),queryFn:async()=>{if(_===null)return null;return H().getBasket(_)},enabled:_!==null,retry:(G,V)=>{let z=L.fromUnknown(V);if(z.code==="BASKET_NOT_FOUND"||z.code==="BASKET_EXPIRED")return!1;return G<3}});w.useEffect(()=>{if(J.error!==null){let G=L.fromUnknown(J.error);if(G.code==="BASKET_NOT_FOUND"||G.code==="BASKET_EXPIRED")Y()}},[J.error,Y]);let W=w.useCallback(async()=>{if(_!==null)return _;if(X===null||X.length===0)throw new L("NOT_AUTHENTICATED","Username is required to create a basket");let V=await H().createMinecraftBasket(X,A.completeUrl,A.cancelUrl);return N(V.ident),V.ident},[_,X,A.completeUrl,A.cancelUrl,N]),U=f.useMutation({mutationFn:async(G)=>{let V=G.quantity??1;if(!q(V))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");let z=await W(),K=H();return await K.addPackageToBasket(z,G.packageId,V,G.type,G.variableData),K.getBasket(z)},onMutate:async(G)=>{await O.cancelQueries({queryKey:R.basket(_)});let V=O.getQueryData(R.basket(_));if(V!==null&&V!==void 0){let z={id:G.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:G.quantity??1,price:0,gift_username_id:null,gift_username:null}},K=V.packages.findIndex((M)=>M.id===G.packageId),IA=K>=0?V.packages.map((M,P)=>P===K?{...M,in_basket:{...M.in_basket,quantity:M.in_basket.quantity+(G.quantity??1)}}:M):[...V.packages,z];O.setQueryData(R.basket(_),{...V,packages:IA})}return{previousBasket:V}},onError:(G,V,z)=>{if(z?.previousBasket!==void 0)O.setQueryData(R.basket(_),z.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(R.basket(_),G)}}),$=f.useMutation({mutationFn:async(G)=>{if(_===null)throw new L("BASKET_NOT_FOUND");let V=H();return await V.removePackage(_,G),V.getBasket(_)},onMutate:async(G)=>{await O.cancelQueries({queryKey:R.basket(_)});let V=O.getQueryData(R.basket(_));if(V!==null&&V!==void 0)O.setQueryData(R.basket(_),{...V,packages:V.packages.filter((z)=>z.id!==G)});return{previousBasket:V}},onError:(G,V,z)=>{if(z?.previousBasket!==void 0)O.setQueryData(R.basket(_),z.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(R.basket(_),G)}}),D=f.useMutation({mutationFn:async(G)=>{if(!q(G.quantity))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");if(_===null)throw new L("BASKET_NOT_FOUND");let V=H();return await V.updateQuantity(_,G.packageId,G.quantity),V.getBasket(_)},onMutate:async(G)=>{await O.cancelQueries({queryKey:R.basket(_)});let V=O.getQueryData(R.basket(_));if(V!==null&&V!==void 0)O.setQueryData(R.basket(_),{...V,packages:V.packages.map((z)=>z.id===G.packageId?{...z,in_basket:{...z.in_basket,quantity:G.quantity}}:z)});return{previousBasket:V}},onError:(G,V,z)=>{if(z?.previousBasket!==void 0)O.setQueryData(R.basket(_),z.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(R.basket(_),G)}}),F=w.useCallback(()=>{Y(),O.removeQueries({queryKey:R.baskets()})},[Y,O]),Z=J.data??null,Q=w.useMemo(()=>Z?.packages??[],[Z?.packages]),AA=w.useMemo(()=>Q.reduce((G,V)=>G+V.in_basket.quantity,0),[Q]),OA=w.useMemo(()=>Z?.total_price??0,[Z]),v=w.useMemo(()=>J.error!==null?L.fromUnknown(J.error):null,[J.error]),E=w.useCallback(async(G)=>{await U.mutateAsync(G)},[U]),B=w.useCallback(async(G)=>{await $.mutateAsync(G)},[$]),C=w.useCallback(async(G)=>{await D.mutateAsync(G)},[D]);return{basket:Z,data:Z,basketIdent:_,packages:Q,isLoading:J.isLoading,isFetching:J.isFetching,isAddingPackage:U.isPending,isRemovingPackage:$.isPending,isUpdatingQuantity:D.isPending,error:v,errorCode:v?.code??null,addPackage:E,removePackage:B,updateQuantity:C,clearBasket:F,refetch:J.refetch,itemCount:AA,total:OA,isEmpty:Q.length===0}}var TA=require("@tanstack/react-query"),p=require("react");function XA(A={}){let{includePackages:O=!0,enabled:_=!0}=A,N=TA.useQuery({queryKey:R.categoriesList(O),queryFn:async()=>{return H().getCategories(O)},enabled:_}),Y=p.useMemo(()=>N.error!==null?L.fromUnknown(N.error):null,[N.error]),X=p.useMemo(()=>(U)=>N.data?.find(($)=>$.name.toLowerCase()===U.toLowerCase()),[N.data]),J=p.useMemo(()=>(U)=>N.data?.find(($)=>$.id===U),[N.data]),W=p.useMemo(()=>(U)=>N.data?.find(($)=>$.slug===U),[N.data]);return{categories:N.data??null,data:N.data??null,isLoading:N.isLoading,isFetching:N.isFetching,error:Y,errorCode:Y?.code??null,refetch:N.refetch,getByName:X,getById:J,getBySlug:W}}var qA=require("@tanstack/react-query"),vA=require("react");function JA(A){let{id:O,enabled:_=!0}=A,N=qA.useQuery({queryKey:R.category(O),queryFn:async()=>{return H().getCategory(O)},enabled:_}),Y=vA.useMemo(()=>N.error!==null?L.fromUnknown(N.error):null,[N.error]);return{category:N.data??null,data:N.data??null,isLoading:N.isLoading,isFetching:N.isFetching,error:Y,errorCode:Y?.code??null,refetch:N.refetch}}var CA=require("@tanstack/react-query"),a=require("react");function ZA(A={}){let{basket:O,basketIdent:_,clearBasket:N,isEmpty:Y}=I(),X=S(),J=CA.useMutation({mutationFn:async()=>{if(_===null||O===null)throw new L("BASKET_NOT_FOUND");if(Y)throw new L("BASKET_EMPTY","Basket is empty");if(typeof window>"u")throw new L("TEBEX_JS_NOT_LOADED","Cannot checkout on server side.");let $=window.Tebex;if($===void 0)throw new L("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((D,F)=>{let Z=$.checkout,Q=!1,AA=()=>{if(Q)return;Q=!0,C(),N(),A.onSuccess?.(),D()},OA=(z)=>{if(Q)return;Q=!0,C();let K=new L("CHECKOUT_FAILED",String(z));A.onError?.(K),X.onError?.(K),F(K)},v=()=>{if(Q)return;Q=!0,C(),A.onClose?.(),D()},E=null,B=null,C=()=>{if(E!==null)E.disconnect(),E=null;if(B!==null)clearTimeout(B),B=null},G=()=>document.querySelector('iframe[src*="tebex"]')??document.querySelector('[class*="tebex-js"]')??document.querySelector("tebex-checkout[open]"),V=()=>{let z=!1,K=()=>{if(Q)return;if(G()!==null)z=!0;else if(z)v()};if(E=new MutationObserver(()=>{if(Q)return;if(B!==null)clearTimeout(B);B=setTimeout(K,50)}),E.observe(document.body,{childList:!0,subtree:!0}),G()!==null)z=!0};Z.init({ident:_}),Z.on("payment:complete",AA),Z.on("payment:error",OA),Z.on("close",v),Z.launch(),V()})}}),W=a.useCallback(async()=>{await J.mutateAsync()},[J]),U=a.useMemo(()=>J.error!==null?L.fromUnknown(J.error):null,[J.error]);return{launch:W,isLaunching:J.isPending,error:U,errorCode:U?.code??null,canCheckout:O!==null&&!Y,checkoutUrl:O?.links.checkout??null}}var k=require("@tanstack/react-query"),l=require("react");function $A(){let{basket:A}=I(),O=j((D)=>D.basketIdent),_=k.useQueryClient(),N=S(),Y=k.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"coupons",{coupon_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,coupons:[...F.coupons,{code:D}]});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(R.basket(O),Z.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),X=k.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.remove(O,"coupons",{coupon_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,coupons:F.coupons.filter((Z)=>Z.code!==D)});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(R.basket(O),Z.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),J=l.useCallback(async(D)=>{await Y.mutateAsync(D)},[Y]),W=l.useCallback(async(D)=>{await X.mutateAsync(D)},[X]),U=Y.error??X.error,$=l.useMemo(()=>U!==null?L.fromUnknown(U):null,[U]);return{coupons:A?.coupons??[],apply:J,remove:W,isApplying:Y.isPending,isRemoving:X.isPending,error:$,errorCode:$?.code??null}}var y=require("@tanstack/react-query"),x=require("react");function HA(){let{basket:A}=I(),O=j((D)=>D.basketIdent),_=y.useQueryClient(),N=S(),Y=y.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"creator-codes",{creator_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,creator_code:D});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(R.basket(O),Z.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),X=y.useMutation({mutationFn:async()=>{if(O===null)throw new L("BASKET_NOT_FOUND");let D=H();return await D.remove(O,"creator-codes",{creator_code:""}),D.getBasket(O)},onMutate:async()=>{await _.cancelQueries({queryKey:R.basket(O)});let D=_.getQueryData(R.basket(O));if(D!==null&&D!==void 0)_.setQueryData(R.basket(O),{...D,creator_code:""});return{previousBasket:D}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(R.basket(O),Z.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),J=x.useCallback(async(D)=>{await Y.mutateAsync(D)},[Y]),W=x.useCallback(async()=>{await X.mutateAsync()},[X]),U=Y.error??X.error,$=x.useMemo(()=>U!==null?L.fromUnknown(U):null,[U]);return{creatorCode:A?.creator_code??null,apply:J,remove:W,isApplying:Y.isPending,isRemoving:X.isPending,error:$,errorCode:$?.code??null}}var c=require("@tanstack/react-query"),d=require("react");function zA(){let{basket:A}=I(),O=j((D)=>D.basketIdent),_=c.useQueryClient(),N=S(),Y=c.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"giftcards",{card_number:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,giftcards:[...F.giftcards,{card_number:D}]});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(R.basket(O),Z.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),X=c.useMutation({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.remove(O,"giftcards",{card_number:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:R.basket(O)});let F=_.getQueryData(R.basket(O));if(F!==null&&F!==void 0)_.setQueryData(R.basket(O),{...F,giftcards:F.giftcards.filter((Z)=>Z.card_number!==D)});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(R.basket(O),Z.previousBasket);N.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(R.basket(O),D)}}),J=d.useCallback(async(D)=>{await Y.mutateAsync(D)},[Y]),W=d.useCallback(async(D)=>{await X.mutateAsync(D)},[X]),U=Y.error??X.error,$=d.useMemo(()=>U!==null?L.fromUnknown(U):null,[U]);return{giftCards:A?.giftcards??[],apply:J,remove:W,isApplying:Y.isPending,isRemoving:X.isPending,error:$,errorCode:$?.code??null}}var t=require("@tanstack/react-query"),r=require("react");function PA(){let A=j((U)=>U.basketIdent),O=j((U)=>U.setBasketIdent),_=h((U)=>U.username),N=t.useQueryClient(),Y=S(),X=t.useMutation({mutationFn:async(U)=>{if(_===null||_.length===0)throw new L("NOT_AUTHENTICATED","Username is required to gift a package");if(!m(U.targetUsername))throw new L("INVALID_USERNAME","Target username must be 3-16 alphanumeric characters");let $=U.quantity??1;if(!q($))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");let D=H(),F=A;if(F===null)F=(await D.createMinecraftBasket(_,Y.completeUrl,Y.cancelUrl)).ident,O(F);return await D.addPackageToBasket(F,U.packageId,$,"single",{gift_username:U.targetUsername}),D.getBasket(F)},onMutate:async(U)=>{await N.cancelQueries({queryKey:R.basket(A)});let $=N.getQueryData(R.basket(A));if($!==null&&$!==void 0){let D={id:U.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:U.quantity??1,price:0,gift_username_id:null,gift_username:U.targetUsername}};N.setQueryData(R.basket(A),{...$,packages:[...$.packages,D]})}return{previousBasket:$}},onError:(U,$,D)=>{if(D?.previousBasket!==void 0)N.setQueryData(R.basket(A),D.previousBasket);Y.onError?.(L.fromUnknown(U))},onSuccess:(U)=>{N.setQueryData(R.basket(A),U)}}),J=r.useCallback(async(U)=>{await X.mutateAsync(U)},[X]),W=r.useMemo(()=>X.error!==null?L.fromUnknown(X.error):null,[X.error]);return{gift:J,isGifting:X.isPending,error:W,errorCode:W?.code??null}}var gA=require("@tanstack/react-query"),mA=require("react");function WA(A){let{id:O,enabled:_=!0}=A,N=gA.useQuery({queryKey:R.package(O),queryFn:async()=>{return H().getPackage(O)},enabled:_}),Y=mA.useMemo(()=>N.error!==null?L.fromUnknown(N.error):null,[N.error]);return{package:N.data??null,data:N.data??null,isLoading:N.isLoading,isFetching:N.isFetching,error:Y,errorCode:Y?.code??null,refetch:N.refetch}}var pA=require("@tanstack/react-query"),e=require("react");function jA(A={}){let{categoryId:O,enabled:_=!0}=A,N=pA.useQuery({queryKey:R.packagesList(O),queryFn:async()=>{let W=H();if(O!==void 0)return(await W.getCategory(O)).packages;let U=await W.getCategories(!0),$=[];for(let D of U)$.push(...D.packages);return $},enabled:_}),Y=e.useMemo(()=>N.error!==null?L.fromUnknown(N.error):null,[N.error]),X=e.useMemo(()=>(W)=>N.data?.find((U)=>U.id===W),[N.data]),J=e.useMemo(()=>(W)=>N.data?.find((U)=>U.name.toLowerCase()===W.toLowerCase()),[N.data]);return{packages:N.data??null,data:N.data??null,isLoading:N.isLoading,isFetching:N.isFetching,error:Y,errorCode:Y?.code??null,refetch:N.refetch,getById:X,getByName:J}}var SA=require("react");function QA(){let A=h((J)=>J.username),O=h((J)=>J.setUsername),_=h((J)=>J.clearUsername),N=SA.useCallback((J)=>{let W=J.trim();if(m(W))return O(W),!0;return!1},[O]),Y=SA.useCallback(()=>{_()},[_]),X=A!==null&&A.length>0;return{username:A,setUsername:N,clearUsername:Y,isAuthenticated:X}}var kA=require("@tanstack/react-query"),lA=require("react");function nA(A){let O=A.currency;return{id:A.id,name:A.name,description:A.description,currency:O.iso_4217,domain:A.webstore_url,logo:A.logo.length>0?A.logo:null}}function wA(){let A=kA.useQuery({queryKey:R.webstore(),queryFn:async()=>{let N=await H().getWebstore();return nA(N)},staleTime:300000}),O=lA.useMemo(()=>A.error!==null?L.fromUnknown(A.error):null,[A.error]);return{webstore:A.data??null,data:A.data??null,name:A.data?.name??null,currency:A.data?.currency??null,domain:A.data?.domain??null,isLoading:A.isLoading,isFetching:A.isFetching,error:O,errorCode:O?.code??null,refetch:A.refetch}}function KA(A){return{success:!0,data:A}}function hA(A){return{success:!1,error:A}}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  'use client';
2
- import{QueryClient as KA,QueryClientProvider as hA}from"@tanstack/react-query";import{useMemo as u,useState as n}from"react";import{TebexHeadless as SA}from"tebex_headless";var g=null;function y(A){g=new SA(A)}function H(){if(g===null)throw Error("Tebex client not initialized. Make sure you are using TebexProvider.");return g}function i(){return g!==null}import{createContext as QA,useContext as wA}from"react";var x;((W)=>{W.PROVIDER_NOT_FOUND="PROVIDER_NOT_FOUND";W.INVALID_CONFIG="INVALID_CONFIG";W.NOT_AUTHENTICATED="NOT_AUTHENTICATED";W.INVALID_USERNAME="INVALID_USERNAME";W.BASKET_NOT_FOUND="BASKET_NOT_FOUND";W.BASKET_CREATION_FAILED="BASKET_CREATION_FAILED";W.BASKET_EXPIRED="BASKET_EXPIRED";W.BASKET_EMPTY="BASKET_EMPTY";W.PACKAGE_NOT_FOUND="PACKAGE_NOT_FOUND";W.PACKAGE_OUT_OF_STOCK="PACKAGE_OUT_OF_STOCK";W.PACKAGE_ALREADY_OWNED="PACKAGE_ALREADY_OWNED";W.INVALID_QUANTITY="INVALID_QUANTITY";W.CATEGORY_NOT_FOUND="CATEGORY_NOT_FOUND";W.COUPON_INVALID="COUPON_INVALID";W.COUPON_EXPIRED="COUPON_EXPIRED";W.COUPON_ALREADY_USED="COUPON_ALREADY_USED";W.GIFTCARD_INVALID="GIFTCARD_INVALID";W.GIFTCARD_INSUFFICIENT_BALANCE="GIFTCARD_INSUFFICIENT_BALANCE";W.CREATOR_CODE_INVALID="CREATOR_CODE_INVALID";W.CHECKOUT_FAILED="CHECKOUT_FAILED";W.CHECKOUT_CANCELLED="CHECKOUT_CANCELLED";W.TEBEX_JS_NOT_LOADED="TEBEX_JS_NOT_LOADED";W.NETWORK_ERROR="NETWORK_ERROR";W.TIMEOUT="TIMEOUT";W.RATE_LIMITED="RATE_LIMITED";W.UNKNOWN="UNKNOWN"})(x||={});class L extends Error{code;cause;constructor(A,O,_){super(O??A);if(this.name="TebexError",this.code=A,this.cause=_,typeof Error.captureStackTrace==="function")Error.captureStackTrace(this,L)}static fromUnknown(A){if(A instanceof L)return A;if(A instanceof Error){let O=A.message.toLowerCase();if(O.includes("network")||O.includes("fetch"))return new L("NETWORK_ERROR",A.message,A);if(O.includes("timeout"))return new L("TIMEOUT",A.message,A);if(O.includes("rate limit")||O.includes("429"))return new L("RATE_LIMITED",A.message,A);if(O.includes("basket")&&O.includes("not found"))return new L("BASKET_NOT_FOUND",A.message,A);if(O.includes("package")&&O.includes("not found"))return new L("PACKAGE_NOT_FOUND",A.message,A);if(O.includes("coupon")&&O.includes("invalid"))return new L("COUPON_INVALID",A.message,A);if(O.includes("coupon")&&O.includes("expired"))return new L("COUPON_EXPIRED",A.message,A);if(O.includes("gift")&&O.includes("invalid"))return new L("GIFTCARD_INVALID",A.message,A);return new L("UNKNOWN",A.message,A)}return new L("UNKNOWN",String(A))}toJSON(){return{name:this.name,code:this.code,message:this.message}}}var c=QA(null);function m(){let A=wA(c);if(A===null)throw new L("PROVIDER_NOT_FOUND","useTebexContext must be used within TebexProvider or TebexMockProvider");return A}function S(){let{config:A}=m();return A}import{jsx as o}from"react/jsx-runtime";var IA={defaultOptions:{queries:{staleTime:60000,gcTime:300000,retry:3,retryDelay:(A)=>Math.min(1000*2**A,30000),refetchOnWindowFocus:!1,refetchOnReconnect:!0},mutations:{retry:2,retryDelay:(A)=>Math.min(500*2**A,5000)}}};function fA(A){let O=A.baseUrl.replace(/\/$/,""),_=A.urls?.complete??"/shop/complete",R=A.urls?.cancel??"/shop/cancel";return{publicKey:A.publicKey,baseUrl:O,completeUrl:`${O}${_}`,cancelUrl:`${O}${R}`,onError:A.onError}}function s({children:A,config:O,queryClient:_}){let R=u(()=>fA(O),[O]),[Y]=n(()=>_??new KA(IA));n(()=>{y(R.publicKey)});let V=u(()=>({config:R,queryClient:Y}),[R,Y]);return o(c.Provider,{value:V,children:o(hA,{client:Y,children:A})})}import{useMutation as d,useQuery as CA,useQueryClient as gA}from"@tanstack/react-query";import{useCallback as q,useEffect as mA,useMemo as p}from"react";var N={all:["tebex"],categories:()=>[...N.all,"categories"],categoriesList:(A)=>[...N.categories(),"list",{includePackages:A}],category:(A)=>[...N.categories(),"detail",A],packages:()=>[...N.all,"packages"],packagesList:(A)=>[...N.packages(),"list",{categoryId:A}],package:(A)=>[...N.packages(),"detail",A],baskets:()=>[...N.all,"baskets"],basket:(A)=>[...N.baskets(),A],webstore:()=>[...N.all,"webstore"]};import{create as BA}from"zustand";import{persist as MA,subscribeWithSelector as EA}from"zustand/middleware";var j=BA()(EA(MA((A)=>({basketIdent:null,setBasketIdent:(O)=>{A({basketIdent:O})},clearBasketIdent:()=>{A({basketIdent:null})}}),{name:"tebex-basket-store",skipHydration:typeof window>"u"})));import{create as TA}from"zustand";import{persist as qA,subscribeWithSelector as vA}from"zustand/middleware";var w=TA()(vA(qA((A)=>({username:null,setUsername:(O)=>{A({username:O})},clearUsername:()=>{A({username:null}),j.getState().clearBasketIdent()}}),{name:"tebex-user-store",skipHydration:typeof window>"u"})));function a(A){return A instanceof L}function t(A){return A.success}function r(A){return!A.success}function e(A){return A!==null&&A!==void 0}function I(A){return typeof A==="number"&&Number.isInteger(A)&&A>0}function T(A){if(typeof A!=="string")return!1;return/^[a-zA-Z0-9_]{3,16}$/.test(A)}function K(){let A=S(),O=gA(),_=j((G)=>G.basketIdent),R=j((G)=>G.setBasketIdent),Y=j((G)=>G.clearBasketIdent),V=w((G)=>G.username),Z=CA({queryKey:N.basket(_),queryFn:async()=>{if(_===null)return null;return H().getBasket(_)},enabled:_!==null,retry:(G,J)=>{let P=L.fromUnknown(J);if(P.code==="BASKET_NOT_FOUND"||P.code==="BASKET_EXPIRED")return!1;return G<3}});mA(()=>{if(Z.error!==null){let G=L.fromUnknown(Z.error);if(G.code==="BASKET_NOT_FOUND"||G.code==="BASKET_EXPIRED")Y()}},[Z.error,Y]);let z=q(async()=>{if(_!==null)return _;if(V===null||V.length===0)throw new L("NOT_AUTHENTICATED","Username is required to create a basket");let J=await H().createMinecraftBasket(V,A.completeUrl,A.cancelUrl);return R(J.ident),J.ident},[_,V,A.completeUrl,A.cancelUrl,R]),U=d({mutationFn:async(G)=>{let J=G.quantity??1;if(!I(J))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");let P=await z(),E=H();return await E.addPackageToBasket(P,G.packageId,J,G.type,G.variableData),E.getBasket(P)},onMutate:async(G)=>{await O.cancelQueries({queryKey:N.basket(_)});let J=O.getQueryData(N.basket(_));if(J!==null&&J!==void 0){let P={id:G.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:G.quantity??1,price:0,gift_username_id:null,gift_username:null}},E=J.packages.findIndex((h)=>h.id===G.packageId),jA=E>=0?J.packages.map((h,W)=>W===E?{...h,in_basket:{...h.in_basket,quantity:h.in_basket.quantity+(G.quantity??1)}}:h):[...J.packages,P];O.setQueryData(N.basket(_),{...J,packages:jA})}return{previousBasket:J}},onError:(G,J,P)=>{if(P?.previousBasket!==void 0)O.setQueryData(N.basket(_),P.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(N.basket(_),G)}}),$=d({mutationFn:async(G)=>{if(_===null)throw new L("BASKET_NOT_FOUND");let J=H();return await J.removePackage(_,G),J.getBasket(_)},onMutate:async(G)=>{await O.cancelQueries({queryKey:N.basket(_)});let J=O.getQueryData(N.basket(_));if(J!==null&&J!==void 0)O.setQueryData(N.basket(_),{...J,packages:J.packages.filter((P)=>P.id!==G)});return{previousBasket:J}},onError:(G,J,P)=>{if(P?.previousBasket!==void 0)O.setQueryData(N.basket(_),P.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(N.basket(_),G)}}),D=d({mutationFn:async(G)=>{if(!I(G.quantity))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");if(_===null)throw new L("BASKET_NOT_FOUND");let J=H();return await J.updateQuantity(_,G.packageId,G.quantity),J.getBasket(_)},onMutate:async(G)=>{await O.cancelQueries({queryKey:N.basket(_)});let J=O.getQueryData(N.basket(_));if(J!==null&&J!==void 0)O.setQueryData(N.basket(_),{...J,packages:J.packages.map((P)=>P.id===G.packageId?{...P,in_basket:{...P.in_basket,quantity:G.quantity}}:P)});return{previousBasket:J}},onError:(G,J,P)=>{if(P?.previousBasket!==void 0)O.setQueryData(N.basket(_),P.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(N.basket(_),G)}}),F=q(()=>{Y(),O.removeQueries({queryKey:N.baskets()})},[Y,O]),X=Z.data??null,Q=p(()=>X?.packages??[],[X?.packages]),v=p(()=>Q.reduce((G,J)=>G+J.in_basket.quantity,0),[Q]),C=p(()=>X?.total_price??0,[X]),f=p(()=>Z.error!==null?L.fromUnknown(Z.error):null,[Z.error]),B=q(async(G)=>{await U.mutateAsync(G)},[U]),l=q(async(G)=>{await $.mutateAsync(G)},[$]),M=q(async(G)=>{await D.mutateAsync(G)},[D]);return{basket:X,data:X,basketIdent:_,packages:Q,isLoading:Z.isLoading,isFetching:Z.isFetching,isAddingPackage:U.isPending,isRemovingPackage:$.isPending,isUpdatingQuantity:D.isPending,error:f,errorCode:f?.code??null,addPackage:B,removePackage:l,updateQuantity:M,clearBasket:F,refetch:Z.refetch,itemCount:v,total:C,isEmpty:Q.length===0}}import{useQuery as pA}from"@tanstack/react-query";import{useMemo as k}from"react";function AA(A={}){let{includePackages:O=!0,enabled:_=!0}=A,R=pA({queryKey:N.categoriesList(O),queryFn:async()=>{return H().getCategories(O)},enabled:_}),Y=k(()=>R.error!==null?L.fromUnknown(R.error):null,[R.error]),V=k(()=>(U)=>R.data?.find(($)=>$.name.toLowerCase()===U.toLowerCase()),[R.data]),Z=k(()=>(U)=>R.data?.find(($)=>$.id===U),[R.data]),z=k(()=>(U)=>R.data?.find(($)=>$.slug===U),[R.data]);return{categories:R.data??null,data:R.data??null,isLoading:R.isLoading,isFetching:R.isFetching,error:Y,errorCode:Y?.code??null,refetch:R.refetch,getByName:V,getById:Z,getBySlug:z}}import{useQuery as kA}from"@tanstack/react-query";import{useMemo as lA}from"react";function OA(A){let{id:O,enabled:_=!0}=A,R=kA({queryKey:N.category(O),queryFn:async()=>{return H().getCategory(O)},enabled:_}),Y=lA(()=>R.error!==null?L.fromUnknown(R.error):null,[R.error]);return{category:R.data??null,data:R.data??null,isLoading:R.isLoading,isFetching:R.isFetching,error:Y,errorCode:Y?.code??null,refetch:R.refetch}}import{useMutation as yA}from"@tanstack/react-query";import{useCallback as xA,useMemo as cA}from"react";function _A(A={}){let{basket:O,basketIdent:_,clearBasket:R,isEmpty:Y}=K(),V=S(),Z=yA({mutationFn:async()=>{if(_===null||O===null)throw new L("BASKET_NOT_FOUND");if(Y)throw new L("BASKET_EMPTY","Basket is empty");if(typeof window>"u")throw new L("TEBEX_JS_NOT_LOADED","Cannot checkout on server side.");let $=window.Tebex;if($===void 0)throw new L("TEBEX_JS_NOT_LOADED",'Tebex.js not loaded. Add <script src="https://js.tebex.io/v/1.js"></script> to your page.');return new Promise((D,F)=>{let X=$.checkout,Q=!1,v=()=>{if(Q)return;Q=!0,B(),R(),A.onSuccess?.(),D()},C=(l)=>{if(Q)return;Q=!0,B();let M=new L("CHECKOUT_FAILED",String(l));A.onError?.(M),V.onError?.(M),F(M)},f=()=>{if(Q)return;Q=!0,B(),A.onClose?.(),D()},B=()=>{X.off("payment:complete",v),X.off("payment:error",C),X.off("close",f)};X.init({ident:_}),X.on("payment:complete",v),X.on("payment:error",C),X.on("close",f),X.launch()})}}),z=xA(async()=>{await Z.mutateAsync()},[Z]),U=cA(()=>Z.error!==null?L.fromUnknown(Z.error):null,[Z.error]);return{launch:z,isLaunching:Z.isPending,error:U,errorCode:U?.code??null,canCheckout:O!==null&&!Y,checkoutUrl:O?.links.checkout??null}}import{useMutation as DA,useQueryClient as dA}from"@tanstack/react-query";import{useCallback as NA,useMemo as bA}from"react";function RA(){let{basket:A}=K(),O=j((D)=>D.basketIdent),_=dA(),R=S(),Y=DA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"coupons",{coupon_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,coupons:[...F.coupons,{code:D}]});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(N.basket(O),X.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),V=DA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.remove(O,"coupons",{coupon_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,coupons:F.coupons.filter((X)=>X.code!==D)});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(N.basket(O),X.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),Z=NA(async(D)=>{await Y.mutateAsync(D)},[Y]),z=NA(async(D)=>{await V.mutateAsync(D)},[V]),U=Y.error??V.error,$=bA(()=>U!==null?L.fromUnknown(U):null,[U]);return{coupons:A?.coupons??[],apply:Z,remove:z,isApplying:Y.isPending,isRemoving:V.isPending,error:$,errorCode:$?.code??null}}import{useMutation as LA,useQueryClient as iA}from"@tanstack/react-query";import{useCallback as FA,useMemo as uA}from"react";function GA(){let{basket:A}=K(),O=j((D)=>D.basketIdent),_=iA(),R=S(),Y=LA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"creator-codes",{creator_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,creator_code:D});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(N.basket(O),X.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),V=LA({mutationFn:async()=>{if(O===null)throw new L("BASKET_NOT_FOUND");let D=H();return await D.remove(O,"creator-codes",{creator_code:""}),D.getBasket(O)},onMutate:async()=>{await _.cancelQueries({queryKey:N.basket(O)});let D=_.getQueryData(N.basket(O));if(D!==null&&D!==void 0)_.setQueryData(N.basket(O),{...D,creator_code:""});return{previousBasket:D}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(N.basket(O),X.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),Z=FA(async(D)=>{await Y.mutateAsync(D)},[Y]),z=FA(async()=>{await V.mutateAsync()},[V]),U=Y.error??V.error,$=uA(()=>U!==null?L.fromUnknown(U):null,[U]);return{creatorCode:A?.creator_code??null,apply:Z,remove:z,isApplying:Y.isPending,isRemoving:V.isPending,error:$,errorCode:$?.code??null}}import{useMutation as UA,useQueryClient as nA}from"@tanstack/react-query";import{useCallback as YA,useMemo as oA}from"react";function VA(){let{basket:A}=K(),O=j((D)=>D.basketIdent),_=nA(),R=S(),Y=UA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.apply(O,"giftcards",{card_number:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,giftcards:[...F.giftcards,{card_number:D}]});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(N.basket(O),X.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),V=UA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=H();return await F.remove(O,"giftcards",{card_number:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,giftcards:F.giftcards.filter((X)=>X.card_number!==D)});return{previousBasket:F}},onError:(D,F,X)=>{if(X?.previousBasket!==void 0)_.setQueryData(N.basket(O),X.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),Z=YA(async(D)=>{await Y.mutateAsync(D)},[Y]),z=YA(async(D)=>{await V.mutateAsync(D)},[V]),U=Y.error??V.error,$=oA(()=>U!==null?L.fromUnknown(U):null,[U]);return{giftCards:A?.giftcards??[],apply:Z,remove:z,isApplying:Y.isPending,isRemoving:V.isPending,error:$,errorCode:$?.code??null}}import{useMutation as sA,useQueryClient as aA}from"@tanstack/react-query";import{useCallback as tA,useMemo as rA}from"react";function XA(){let A=j((U)=>U.basketIdent),O=j((U)=>U.setBasketIdent),_=w((U)=>U.username),R=aA(),Y=S(),V=sA({mutationFn:async(U)=>{if(_===null||_.length===0)throw new L("NOT_AUTHENTICATED","Username is required to gift a package");if(!T(U.targetUsername))throw new L("INVALID_USERNAME","Target username must be 3-16 alphanumeric characters");let $=U.quantity??1;if(!I($))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");let D=H(),F=A;if(F===null)F=(await D.createMinecraftBasket(_,Y.completeUrl,Y.cancelUrl)).ident,O(F);return await D.addPackageToBasket(F,U.packageId,$,"single",{gift_username:U.targetUsername}),D.getBasket(F)},onMutate:async(U)=>{await R.cancelQueries({queryKey:N.basket(A)});let $=R.getQueryData(N.basket(A));if($!==null&&$!==void 0){let D={id:U.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:U.quantity??1,price:0,gift_username_id:null,gift_username:U.targetUsername}};R.setQueryData(N.basket(A),{...$,packages:[...$.packages,D]})}return{previousBasket:$}},onError:(U,$,D)=>{if(D?.previousBasket!==void 0)R.setQueryData(N.basket(A),D.previousBasket);Y.onError?.(L.fromUnknown(U))},onSuccess:(U)=>{R.setQueryData(N.basket(A),U)}}),Z=tA(async(U)=>{await V.mutateAsync(U)},[V]),z=rA(()=>V.error!==null?L.fromUnknown(V.error):null,[V.error]);return{gift:Z,isGifting:V.isPending,error:z,errorCode:z?.code??null}}import{useQuery as eA}from"@tanstack/react-query";import{useMemo as AO}from"react";function JA(A){let{id:O,enabled:_=!0}=A,R=eA({queryKey:N.package(O),queryFn:async()=>{return H().getPackage(O)},enabled:_}),Y=AO(()=>R.error!==null?L.fromUnknown(R.error):null,[R.error]);return{package:R.data??null,data:R.data??null,isLoading:R.isLoading,isFetching:R.isFetching,error:Y,errorCode:Y?.code??null,refetch:R.refetch}}import{useQuery as OO}from"@tanstack/react-query";import{useMemo as b}from"react";function ZA(A={}){let{categoryId:O,enabled:_=!0}=A,R=OO({queryKey:N.packagesList(O),queryFn:async()=>{let z=H();if(O!==void 0)return(await z.getCategory(O)).packages;let U=await z.getCategories(!0),$=[];for(let D of U)$.push(...D.packages);return $},enabled:_}),Y=b(()=>R.error!==null?L.fromUnknown(R.error):null,[R.error]),V=b(()=>(z)=>R.data?.find((U)=>U.id===z),[R.data]),Z=b(()=>(z)=>R.data?.find((U)=>U.name.toLowerCase()===z.toLowerCase()),[R.data]);return{packages:R.data??null,data:R.data??null,isLoading:R.isLoading,isFetching:R.isFetching,error:Y,errorCode:Y?.code??null,refetch:R.refetch,getById:V,getByName:Z}}import{useCallback as $A}from"react";function HA(){let A=w((Z)=>Z.username),O=w((Z)=>Z.setUsername),_=w((Z)=>Z.clearUsername),R=$A((Z)=>{let z=Z.trim();if(T(z))return O(z),!0;return!1},[O]),Y=$A(()=>{_()},[_]),V=A!==null&&A.length>0;return{username:A,setUsername:R,clearUsername:Y,isAuthenticated:V}}import{useQuery as _O}from"@tanstack/react-query";import{useMemo as DO}from"react";function NO(A){let O=A.currency;return{id:A.id,name:A.name,description:A.description,currency:O.iso_4217,domain:A.webstore_url,logo:A.logo.length>0?A.logo:null}}function WA(){let A=_O({queryKey:N.webstore(),queryFn:async()=>{let R=await H().getWebstore();return NO(R)},staleTime:300000}),O=DO(()=>A.error!==null?L.fromUnknown(A.error):null,[A.error]);return{webstore:A.data??null,data:A.data??null,name:A.data?.name??null,currency:A.data?.currency??null,domain:A.data?.domain??null,isLoading:A.isLoading,isFetching:A.isFetching,error:O,errorCode:O?.code??null,refetch:A.refetch}}function zA(A){return{success:!0,data:A}}function PA(A){return{success:!1,error:A}}export{WA as useWebstore,w as useUserStore,HA as useUser,m as useTebexContext,S as useTebexConfig,ZA as usePackages,JA as usePackage,XA as useGiftPackage,VA as useGiftCards,GA as useCreatorCodes,RA as useCoupons,_A as useCheckout,OA as useCategory,AA as useCategories,j as useBasketStore,K as useBasket,N as tebexKeys,zA as ok,a as isTebexError,i as isTebexClientInitialized,t as isSuccess,r as isError,e as isDefined,H as getTebexClient,PA as err,s as TebexProvider,x as TebexErrorCode,L as TebexError};
2
+ import{QueryClient as KA,QueryClientProvider as hA}from"@tanstack/react-query";import{useMemo as n,useState as o}from"react";import{TebexHeadless as SA}from"tebex_headless";var C=null;function y(A){C=new SA(A)}function z(){if(C===null)throw Error("Tebex client not initialized. Make sure you are using TebexProvider.");return C}function u(){return C!==null}import{createContext as QA,useContext as wA}from"react";var x;((P)=>{P.PROVIDER_NOT_FOUND="PROVIDER_NOT_FOUND";P.INVALID_CONFIG="INVALID_CONFIG";P.NOT_AUTHENTICATED="NOT_AUTHENTICATED";P.INVALID_USERNAME="INVALID_USERNAME";P.BASKET_NOT_FOUND="BASKET_NOT_FOUND";P.BASKET_CREATION_FAILED="BASKET_CREATION_FAILED";P.BASKET_EXPIRED="BASKET_EXPIRED";P.BASKET_EMPTY="BASKET_EMPTY";P.PACKAGE_NOT_FOUND="PACKAGE_NOT_FOUND";P.PACKAGE_OUT_OF_STOCK="PACKAGE_OUT_OF_STOCK";P.PACKAGE_ALREADY_OWNED="PACKAGE_ALREADY_OWNED";P.INVALID_QUANTITY="INVALID_QUANTITY";P.CATEGORY_NOT_FOUND="CATEGORY_NOT_FOUND";P.COUPON_INVALID="COUPON_INVALID";P.COUPON_EXPIRED="COUPON_EXPIRED";P.COUPON_ALREADY_USED="COUPON_ALREADY_USED";P.GIFTCARD_INVALID="GIFTCARD_INVALID";P.GIFTCARD_INSUFFICIENT_BALANCE="GIFTCARD_INSUFFICIENT_BALANCE";P.CREATOR_CODE_INVALID="CREATOR_CODE_INVALID";P.CHECKOUT_FAILED="CHECKOUT_FAILED";P.CHECKOUT_CANCELLED="CHECKOUT_CANCELLED";P.TEBEX_JS_NOT_LOADED="TEBEX_JS_NOT_LOADED";P.NETWORK_ERROR="NETWORK_ERROR";P.TIMEOUT="TIMEOUT";P.RATE_LIMITED="RATE_LIMITED";P.UNKNOWN="UNKNOWN"})(x||={});class L extends Error{code;cause;constructor(A,O,_){super(O??A);if(this.name="TebexError",this.code=A,this.cause=_,typeof Error.captureStackTrace==="function")Error.captureStackTrace(this,L)}static fromUnknown(A){if(A instanceof L)return A;if(A instanceof Error){let O=A.message.toLowerCase();if(O.includes("network")||O.includes("fetch"))return new L("NETWORK_ERROR",A.message,A);if(O.includes("timeout"))return new L("TIMEOUT",A.message,A);if(O.includes("rate limit")||O.includes("429"))return new L("RATE_LIMITED",A.message,A);if(O.includes("basket")&&O.includes("not found"))return new L("BASKET_NOT_FOUND",A.message,A);if(O.includes("package")&&O.includes("not found"))return new L("PACKAGE_NOT_FOUND",A.message,A);if(O.includes("coupon")&&O.includes("invalid"))return new L("COUPON_INVALID",A.message,A);if(O.includes("coupon")&&O.includes("expired"))return new L("COUPON_EXPIRED",A.message,A);if(O.includes("gift")&&O.includes("invalid"))return new L("GIFTCARD_INVALID",A.message,A);return new L("UNKNOWN",A.message,A)}return new L("UNKNOWN",String(A))}toJSON(){return{name:this.name,code:this.code,message:this.message}}}var c=QA(null);function g(){let A=wA(c);if(A===null)throw new L("PROVIDER_NOT_FOUND","useTebexContext must be used within TebexProvider or TebexMockProvider");return A}function S(){let{config:A}=g();return A}import{jsx as s}from"react/jsx-runtime";var IA={defaultOptions:{queries:{staleTime:60000,gcTime:300000,retry:3,retryDelay:(A)=>Math.min(1000*2**A,30000),refetchOnWindowFocus:!1,refetchOnReconnect:!0},mutations:{retry:2,retryDelay:(A)=>Math.min(500*2**A,5000)}}};function BA(A){let O=A.baseUrl.replace(/\/$/,""),_=A.urls?.complete??"/shop/complete",R=A.urls?.cancel??"/shop/cancel";return{publicKey:A.publicKey,baseUrl:O,completeUrl:`${O}${_}`,cancelUrl:`${O}${R}`,onError:A.onError}}function a({children:A,config:O,queryClient:_}){let R=n(()=>BA(O),[O]),[Y]=o(()=>_??new KA(IA));o(()=>{y(R.publicKey)});let X=n(()=>({config:R,queryClient:Y}),[R,Y]);return s(c.Provider,{value:X,children:s(hA,{client:Y,children:A})})}import{useMutation as d,useQuery as CA,useQueryClient as gA}from"@tanstack/react-query";import{useCallback as v,useEffect as mA,useMemo as m}from"react";var N={all:["tebex"],categories:()=>[...N.all,"categories"],categoriesList:(A)=>[...N.categories(),"list",{includePackages:A}],category:(A)=>[...N.categories(),"detail",A],packages:()=>[...N.all,"packages"],packagesList:(A)=>[...N.packages(),"list",{categoryId:A}],package:(A)=>[...N.packages(),"detail",A],baskets:()=>[...N.all,"baskets"],basket:(A)=>[...N.baskets(),A],webstore:()=>[...N.all,"webstore"]};import{create as fA}from"zustand";import{persist as EA,subscribeWithSelector as MA}from"zustand/middleware";var j=fA()(MA(EA((A)=>({basketIdent:null,setBasketIdent:(O)=>{A({basketIdent:O})},clearBasketIdent:()=>{A({basketIdent:null})}}),{name:"tebex-basket-store",skipHydration:typeof window>"u"})));import{create as TA}from"zustand";import{persist as qA,subscribeWithSelector as vA}from"zustand/middleware";var K=TA()(vA(qA((A)=>({username:null,setUsername:(O)=>{A({username:O})},clearUsername:()=>{A({username:null}),j.getState().clearBasketIdent()}}),{name:"tebex-user-store",skipHydration:typeof window>"u"})));function t(A){return A instanceof L}function r(A){return A.success}function e(A){return!A.success}function AA(A){return A!==null&&A!==void 0}function E(A){return typeof A==="number"&&Number.isInteger(A)&&A>0}function q(A){if(typeof A!=="string")return!1;return/^[a-zA-Z0-9_]{3,16}$/.test(A)}function h(){let A=S(),O=gA(),_=j((G)=>G.basketIdent),R=j((G)=>G.setBasketIdent),Y=j((G)=>G.clearBasketIdent),X=K((G)=>G.username),J=CA({queryKey:N.basket(_),queryFn:async()=>{if(_===null)return null;return z().getBasket(_)},enabled:_!==null,retry:(G,V)=>{let H=L.fromUnknown(V);if(H.code==="BASKET_NOT_FOUND"||H.code==="BASKET_EXPIRED")return!1;return G<3}});mA(()=>{if(J.error!==null){let G=L.fromUnknown(J.error);if(G.code==="BASKET_NOT_FOUND"||G.code==="BASKET_EXPIRED")Y()}},[J.error,Y]);let W=v(async()=>{if(_!==null)return _;if(X===null||X.length===0)throw new L("NOT_AUTHENTICATED","Username is required to create a basket");let V=await z().createMinecraftBasket(X,A.completeUrl,A.cancelUrl);return R(V.ident),V.ident},[_,X,A.completeUrl,A.cancelUrl,R]),U=d({mutationFn:async(G)=>{let V=G.quantity??1;if(!E(V))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");let H=await W(),w=z();return await w.addPackageToBasket(H,G.packageId,V,G.type,G.variableData),w.getBasket(H)},onMutate:async(G)=>{await O.cancelQueries({queryKey:N.basket(_)});let V=O.getQueryData(N.basket(_));if(V!==null&&V!==void 0){let H={id:G.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:G.quantity??1,price:0,gift_username_id:null,gift_username:null}},w=V.packages.findIndex((f)=>f.id===G.packageId),i=w>=0?V.packages.map((f,P)=>P===w?{...f,in_basket:{...f.in_basket,quantity:f.in_basket.quantity+(G.quantity??1)}}:f):[...V.packages,H];O.setQueryData(N.basket(_),{...V,packages:i})}return{previousBasket:V}},onError:(G,V,H)=>{if(H?.previousBasket!==void 0)O.setQueryData(N.basket(_),H.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(N.basket(_),G)}}),$=d({mutationFn:async(G)=>{if(_===null)throw new L("BASKET_NOT_FOUND");let V=z();return await V.removePackage(_,G),V.getBasket(_)},onMutate:async(G)=>{await O.cancelQueries({queryKey:N.basket(_)});let V=O.getQueryData(N.basket(_));if(V!==null&&V!==void 0)O.setQueryData(N.basket(_),{...V,packages:V.packages.filter((H)=>H.id!==G)});return{previousBasket:V}},onError:(G,V,H)=>{if(H?.previousBasket!==void 0)O.setQueryData(N.basket(_),H.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(N.basket(_),G)}}),D=d({mutationFn:async(G)=>{if(!E(G.quantity))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");if(_===null)throw new L("BASKET_NOT_FOUND");let V=z();return await V.updateQuantity(_,G.packageId,G.quantity),V.getBasket(_)},onMutate:async(G)=>{await O.cancelQueries({queryKey:N.basket(_)});let V=O.getQueryData(N.basket(_));if(V!==null&&V!==void 0)O.setQueryData(N.basket(_),{...V,packages:V.packages.map((H)=>H.id===G.packageId?{...H,in_basket:{...H.in_basket,quantity:G.quantity}}:H)});return{previousBasket:V}},onError:(G,V,H)=>{if(H?.previousBasket!==void 0)O.setQueryData(N.basket(_),H.previousBasket);A.onError?.(L.fromUnknown(G))},onSuccess:(G)=>{O.setQueryData(N.basket(_),G)}}),F=v(()=>{Y(),O.removeQueries({queryKey:N.baskets()})},[Y,O]),Z=J.data??null,Q=m(()=>Z?.packages??[],[Z?.packages]),k=m(()=>Q.reduce((G,V)=>G+V.in_basket.quantity,0),[Q]),l=m(()=>Z?.total_price??0,[Z]),M=m(()=>J.error!==null?L.fromUnknown(J.error):null,[J.error]),B=v(async(G)=>{await U.mutateAsync(G)},[U]),I=v(async(G)=>{await $.mutateAsync(G)},[$]),T=v(async(G)=>{await D.mutateAsync(G)},[D]);return{basket:Z,data:Z,basketIdent:_,packages:Q,isLoading:J.isLoading,isFetching:J.isFetching,isAddingPackage:U.isPending,isRemovingPackage:$.isPending,isUpdatingQuantity:D.isPending,error:M,errorCode:M?.code??null,addPackage:B,removePackage:I,updateQuantity:T,clearBasket:F,refetch:J.refetch,itemCount:k,total:l,isEmpty:Q.length===0}}import{useQuery as pA}from"@tanstack/react-query";import{useMemo as p}from"react";function OA(A={}){let{includePackages:O=!0,enabled:_=!0}=A,R=pA({queryKey:N.categoriesList(O),queryFn:async()=>{return z().getCategories(O)},enabled:_}),Y=p(()=>R.error!==null?L.fromUnknown(R.error):null,[R.error]),X=p(()=>(U)=>R.data?.find(($)=>$.name.toLowerCase()===U.toLowerCase()),[R.data]),J=p(()=>(U)=>R.data?.find(($)=>$.id===U),[R.data]),W=p(()=>(U)=>R.data?.find(($)=>$.slug===U),[R.data]);return{categories:R.data??null,data:R.data??null,isLoading:R.isLoading,isFetching:R.isFetching,error:Y,errorCode:Y?.code??null,refetch:R.refetch,getByName:X,getById:J,getBySlug:W}}import{useQuery as kA}from"@tanstack/react-query";import{useMemo as lA}from"react";function _A(A){let{id:O,enabled:_=!0}=A,R=kA({queryKey:N.category(O),queryFn:async()=>{return z().getCategory(O)},enabled:_}),Y=lA(()=>R.error!==null?L.fromUnknown(R.error):null,[R.error]);return{category:R.data??null,data:R.data??null,isLoading:R.isLoading,isFetching:R.isFetching,error:Y,errorCode:Y?.code??null,refetch:R.refetch}}import{useMutation as yA}from"@tanstack/react-query";import{useCallback as xA,useMemo as cA}from"react";function DA(A={}){let{basket:O,basketIdent:_,clearBasket:R,isEmpty:Y}=h(),X=S(),J=yA({mutationFn:async()=>{if(_===null||O===null)throw new L("BASKET_NOT_FOUND");if(Y)throw new L("BASKET_EMPTY","Basket is empty");if(typeof window>"u")throw new L("TEBEX_JS_NOT_LOADED","Cannot checkout on server side.");let $=window.Tebex;if($===void 0)throw new L("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((D,F)=>{let Z=$.checkout,Q=!1,k=()=>{if(Q)return;Q=!0,T(),R(),A.onSuccess?.(),D()},l=(H)=>{if(Q)return;Q=!0,T();let w=new L("CHECKOUT_FAILED",String(H));A.onError?.(w),X.onError?.(w),F(w)},M=()=>{if(Q)return;Q=!0,T(),A.onClose?.(),D()},B=null,I=null,T=()=>{if(B!==null)B.disconnect(),B=null;if(I!==null)clearTimeout(I),I=null},G=()=>document.querySelector('iframe[src*="tebex"]')??document.querySelector('[class*="tebex-js"]')??document.querySelector("tebex-checkout[open]"),V=()=>{let H=!1,w=()=>{if(Q)return;if(G()!==null)H=!0;else if(H)M()};if(B=new MutationObserver(()=>{if(Q)return;if(I!==null)clearTimeout(I);I=setTimeout(w,50)}),B.observe(document.body,{childList:!0,subtree:!0}),G()!==null)H=!0};Z.init({ident:_}),Z.on("payment:complete",k),Z.on("payment:error",l),Z.on("close",M),Z.launch(),V()})}}),W=xA(async()=>{await J.mutateAsync()},[J]),U=cA(()=>J.error!==null?L.fromUnknown(J.error):null,[J.error]);return{launch:W,isLaunching:J.isPending,error:U,errorCode:U?.code??null,canCheckout:O!==null&&!Y,checkoutUrl:O?.links.checkout??null}}import{useMutation as NA,useQueryClient as dA}from"@tanstack/react-query";import{useCallback as RA,useMemo as bA}from"react";function LA(){let{basket:A}=h(),O=j((D)=>D.basketIdent),_=dA(),R=S(),Y=NA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=z();return await F.apply(O,"coupons",{coupon_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,coupons:[...F.coupons,{code:D}]});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(N.basket(O),Z.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),X=NA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=z();return await F.remove(O,"coupons",{coupon_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,coupons:F.coupons.filter((Z)=>Z.code!==D)});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(N.basket(O),Z.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),J=RA(async(D)=>{await Y.mutateAsync(D)},[Y]),W=RA(async(D)=>{await X.mutateAsync(D)},[X]),U=Y.error??X.error,$=bA(()=>U!==null?L.fromUnknown(U):null,[U]);return{coupons:A?.coupons??[],apply:J,remove:W,isApplying:Y.isPending,isRemoving:X.isPending,error:$,errorCode:$?.code??null}}import{useMutation as FA,useQueryClient as iA}from"@tanstack/react-query";import{useCallback as GA,useMemo as uA}from"react";function UA(){let{basket:A}=h(),O=j((D)=>D.basketIdent),_=iA(),R=S(),Y=FA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=z();return await F.apply(O,"creator-codes",{creator_code:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,creator_code:D});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(N.basket(O),Z.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),X=FA({mutationFn:async()=>{if(O===null)throw new L("BASKET_NOT_FOUND");let D=z();return await D.remove(O,"creator-codes",{creator_code:""}),D.getBasket(O)},onMutate:async()=>{await _.cancelQueries({queryKey:N.basket(O)});let D=_.getQueryData(N.basket(O));if(D!==null&&D!==void 0)_.setQueryData(N.basket(O),{...D,creator_code:""});return{previousBasket:D}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(N.basket(O),Z.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),J=GA(async(D)=>{await Y.mutateAsync(D)},[Y]),W=GA(async()=>{await X.mutateAsync()},[X]),U=Y.error??X.error,$=uA(()=>U!==null?L.fromUnknown(U):null,[U]);return{creatorCode:A?.creator_code??null,apply:J,remove:W,isApplying:Y.isPending,isRemoving:X.isPending,error:$,errorCode:$?.code??null}}import{useMutation as YA,useQueryClient as nA}from"@tanstack/react-query";import{useCallback as VA,useMemo as oA}from"react";function XA(){let{basket:A}=h(),O=j((D)=>D.basketIdent),_=nA(),R=S(),Y=YA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=z();return await F.apply(O,"giftcards",{card_number:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,giftcards:[...F.giftcards,{card_number:D}]});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(N.basket(O),Z.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),X=YA({mutationFn:async(D)=>{if(O===null)throw new L("BASKET_NOT_FOUND");let F=z();return await F.remove(O,"giftcards",{card_number:D}),F.getBasket(O)},onMutate:async(D)=>{await _.cancelQueries({queryKey:N.basket(O)});let F=_.getQueryData(N.basket(O));if(F!==null&&F!==void 0)_.setQueryData(N.basket(O),{...F,giftcards:F.giftcards.filter((Z)=>Z.card_number!==D)});return{previousBasket:F}},onError:(D,F,Z)=>{if(Z?.previousBasket!==void 0)_.setQueryData(N.basket(O),Z.previousBasket);R.onError?.(L.fromUnknown(D))},onSuccess:(D)=>{_.setQueryData(N.basket(O),D)}}),J=VA(async(D)=>{await Y.mutateAsync(D)},[Y]),W=VA(async(D)=>{await X.mutateAsync(D)},[X]),U=Y.error??X.error,$=oA(()=>U!==null?L.fromUnknown(U):null,[U]);return{giftCards:A?.giftcards??[],apply:J,remove:W,isApplying:Y.isPending,isRemoving:X.isPending,error:$,errorCode:$?.code??null}}import{useMutation as sA,useQueryClient as aA}from"@tanstack/react-query";import{useCallback as tA,useMemo as rA}from"react";function JA(){let A=j((U)=>U.basketIdent),O=j((U)=>U.setBasketIdent),_=K((U)=>U.username),R=aA(),Y=S(),X=sA({mutationFn:async(U)=>{if(_===null||_.length===0)throw new L("NOT_AUTHENTICATED","Username is required to gift a package");if(!q(U.targetUsername))throw new L("INVALID_USERNAME","Target username must be 3-16 alphanumeric characters");let $=U.quantity??1;if(!E($))throw new L("INVALID_QUANTITY","Quantity must be a positive integer");let D=z(),F=A;if(F===null)F=(await D.createMinecraftBasket(_,Y.completeUrl,Y.cancelUrl)).ident,O(F);return await D.addPackageToBasket(F,U.packageId,$,"single",{gift_username:U.targetUsername}),D.getBasket(F)},onMutate:async(U)=>{await R.cancelQueries({queryKey:N.basket(A)});let $=R.getQueryData(N.basket(A));if($!==null&&$!==void 0){let D={id:U.packageId,name:"Loading...",description:"",image:null,in_basket:{quantity:U.quantity??1,price:0,gift_username_id:null,gift_username:U.targetUsername}};R.setQueryData(N.basket(A),{...$,packages:[...$.packages,D]})}return{previousBasket:$}},onError:(U,$,D)=>{if(D?.previousBasket!==void 0)R.setQueryData(N.basket(A),D.previousBasket);Y.onError?.(L.fromUnknown(U))},onSuccess:(U)=>{R.setQueryData(N.basket(A),U)}}),J=tA(async(U)=>{await X.mutateAsync(U)},[X]),W=rA(()=>X.error!==null?L.fromUnknown(X.error):null,[X.error]);return{gift:J,isGifting:X.isPending,error:W,errorCode:W?.code??null}}import{useQuery as eA}from"@tanstack/react-query";import{useMemo as AO}from"react";function ZA(A){let{id:O,enabled:_=!0}=A,R=eA({queryKey:N.package(O),queryFn:async()=>{return z().getPackage(O)},enabled:_}),Y=AO(()=>R.error!==null?L.fromUnknown(R.error):null,[R.error]);return{package:R.data??null,data:R.data??null,isLoading:R.isLoading,isFetching:R.isFetching,error:Y,errorCode:Y?.code??null,refetch:R.refetch}}import{useQuery as OO}from"@tanstack/react-query";import{useMemo as b}from"react";function $A(A={}){let{categoryId:O,enabled:_=!0}=A,R=OO({queryKey:N.packagesList(O),queryFn:async()=>{let W=z();if(O!==void 0)return(await W.getCategory(O)).packages;let U=await W.getCategories(!0),$=[];for(let D of U)$.push(...D.packages);return $},enabled:_}),Y=b(()=>R.error!==null?L.fromUnknown(R.error):null,[R.error]),X=b(()=>(W)=>R.data?.find((U)=>U.id===W),[R.data]),J=b(()=>(W)=>R.data?.find((U)=>U.name.toLowerCase()===W.toLowerCase()),[R.data]);return{packages:R.data??null,data:R.data??null,isLoading:R.isLoading,isFetching:R.isFetching,error:Y,errorCode:Y?.code??null,refetch:R.refetch,getById:X,getByName:J}}import{useCallback as HA}from"react";function zA(){let A=K((J)=>J.username),O=K((J)=>J.setUsername),_=K((J)=>J.clearUsername),R=HA((J)=>{let W=J.trim();if(q(W))return O(W),!0;return!1},[O]),Y=HA(()=>{_()},[_]),X=A!==null&&A.length>0;return{username:A,setUsername:R,clearUsername:Y,isAuthenticated:X}}import{useQuery as _O}from"@tanstack/react-query";import{useMemo as DO}from"react";function NO(A){let O=A.currency;return{id:A.id,name:A.name,description:A.description,currency:O.iso_4217,domain:A.webstore_url,logo:A.logo.length>0?A.logo:null}}function PA(){let A=_O({queryKey:N.webstore(),queryFn:async()=>{let R=await z().getWebstore();return NO(R)},staleTime:300000}),O=DO(()=>A.error!==null?L.fromUnknown(A.error):null,[A.error]);return{webstore:A.data??null,data:A.data??null,name:A.data?.name??null,currency:A.data?.currency??null,domain:A.data?.domain??null,isLoading:A.isLoading,isFetching:A.isFetching,error:O,errorCode:O?.code??null,refetch:A.refetch}}function WA(A){return{success:!0,data:A}}function jA(A){return{success:!1,error:A}}export{PA as useWebstore,K as useUserStore,zA as useUser,g as useTebexContext,S as useTebexConfig,$A as usePackages,ZA as usePackage,JA as useGiftPackage,XA as useGiftCards,UA as useCreatorCodes,LA as useCoupons,DA as useCheckout,_A as useCategory,OA as useCategories,j as useBasketStore,h as useBasket,N as tebexKeys,WA as ok,t as isTebexError,u as isTebexClientInitialized,r as isSuccess,e as isError,AA as isDefined,z as getTebexClient,jA as err,a as TebexProvider,x as TebexErrorCode,L as TebexError};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neosianexus/super-tebex",
3
- "version": "3.4.0",
3
+ "version": "3.4.1",
4
4
  "description": "Tebex Headless SDK optimized for Next.js App Router with TanStack Query",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",