Big News: Socket Selected for OpenAI's Cybersecurity Grant Program.Details
Socket
Book a DemoSign in
Socket

@shopkit/cart

Package Overview
Dependencies
Maintainers
1
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@shopkit/cart - npm Package Compare versions

Comparing version
0.1.2
to
0.1.3
+20
-0
CHANGELOG.md
# Changelog
## 0.1.3
### Patch Changes
- feat(cart): add `product_type` field to CartItem type
- `CartItem` now includes optional `product_type?: string` field
- Enables `content_category` in `@shopkit/events` AddToCart analytics events
- API already returns this field — type declaration was the only missing piece
- feat(cart): add `sku` field to CartItem type and `mapProductToCartItem`
- `CartItem` now includes optional `sku?: string` field
- `mapProductToCartItem` extracts `sku` from `selectedVariant.sku || product.sku`
- Enables `productIdentifier: "sku"` in `@shopkit/events` for analytics content_ids
- fix(cart): preserve existing currencyCode in price objects
- `mapProductToCartItem` no longer overwrites `currencyCode` from API responses with the default
- Only uses `defaultCurrencyCode` as fallback when the price object has no `currencyCode`
- chore(cart): change default currency from USD to INR in `mapProductToCartItem`
## 0.1.2

@@ -4,0 +24,0 @@

+4
-0

@@ -34,2 +34,4 @@ import * as zustand from 'zustand';

variantId?: string;
/** SKU identifier */
sku?: string;
/** Product identifier (snake_case - from API response) */

@@ -57,2 +59,4 @@ product_id?: string;

vendor?: string;
/** Product type/category (e.g., "Shampoo", "Hair Color") — used for content_category in analytics */
product_type?: string;
}

@@ -59,0 +63,0 @@ /**

@@ -34,2 +34,4 @@ import * as zustand from 'zustand';

variantId?: string;
/** SKU identifier */
sku?: string;
/** Product identifier (snake_case - from API response) */

@@ -57,2 +59,4 @@ product_id?: string;

vendor?: string;
/** Product type/category (e.g., "Shampoo", "Hair Color") — used for content_category in analytics */
product_type?: string;
}

@@ -59,0 +63,0 @@ /**

+1
-1
"use client";
'use strict';var zustand=require('zustand'),react=require('react');var h=null;function _(r){h=r;}function y(){if(!h)throw new Error("Cart not configured. Call configureCart() first.");return h}function E(){return h!==null}var p=zustand.create((r,e)=>({items:[],isOpen:false,isLoading:false,loadingItems:{},error:null,cartToken:null,totalAmount:void 0,isInitialized:false,initializeCart:async t=>{let{isInitialized:a}=e();if(a)return;let i=y(),{cartService:o,cartStorage:s}=i,u=t??i.merchantName;try{let d=s.getCartToken();if(d)try{let n=await o.getCart(d);r({items:n.items||[],cartToken:d,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:d});}catch{s.removeCartToken();let n=await o.createCart(u),c=n.token||n.id;s.setCartToken(c),r({items:n.items||[],cartToken:c,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:c});}else {let n=await o.createCart(u),c=n.token||n.id;s.setCartToken(c),r({items:n.items||[],cartToken:c,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:c});}}catch{r({error:"Failed to initialize cart",isInitialized:true}),i.onCartEvent?.({type:"CART_ERROR",action:"initializeCart",error:"Failed to initialize cart"});}},addItem:async t=>{let{cartToken:a,loadingItems:i}=e();if(!a)return;let o=t.variantId||t.id,{cartService:s,onCartEvent:u}=y();try{r({loadingItems:{...i,[o]:!0},isLoading:!0,error:null});let d=[{productId:t.productId||t.id,variantId:t.variantId||t.id,quantity:t.quantity}];await s.addToCart(a,d);let n=await s.getCart(a),{loadingItems:c}=e(),{[o]:m,...C}=c;r({items:n.items||[],checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,loadingItems:C,isLoading:Object.keys(C).length>0}),u?.({type:"ADD_TO_CART",item:t});}catch{let{loadingItems:d}=e(),{[o]:n,...c}=d;r({error:"Failed to add item",loadingItems:c,isLoading:Object.keys(c).length>0}),u?.({type:"CART_ERROR",action:"addItem",error:"Failed to add item"});}},addItems:async t=>{let{cartToken:a,loadingItems:i}=e();if(!a)return;let o=t.map(n=>n.variantId),s=o.reduce((n,c)=>({...n,[c]:true}),i),{cartService:u,onCartEvent:d}=y();try{r({loadingItems:s,isLoading:!0,error:null}),await u.addToCart(a,t);let n=await u.getCart(a),{loadingItems:c}=e(),m=Object.fromEntries(Object.entries(c).filter(([C])=>!o.includes(C)));r({items:n.items||[],checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,loadingItems:m,isLoading:Object.keys(m).length>0});}catch{let{loadingItems:n}=e(),c=Object.fromEntries(Object.entries(n).filter(([m])=>!o.includes(m)));r({error:"Failed to add items",loadingItems:c,isLoading:Object.keys(c).length>0}),d?.({type:"CART_ERROR",action:"addItems",error:"Failed to add items"});}},removeItem:async(t,a)=>{let{cartToken:i,items:o,loadingItems:s}=e();if(!i)return;let{cartService:u,onCartEvent:d}=y(),n=o.find(m=>{let C=m.variant_id||m.variantId,l=m.product_id||m.productId;return a?m.id===t||l===t&&C===a:m.id===t});if(!n)return;let c=n.variant_id||n.variantId||t;try{r({loadingItems:{...s,[c]:!0},isLoading:!0,error:null});let m=n.variant_id||n.variantId||n.id;await u.removeFromCart(i,[m]);let C=await u.getCart(i),{loadingItems:l}=e(),{[c]:f,...g}=l;r({items:C.items||[],checkoutUrl:C.checkoutUrl,totalAmount:C.totalAmount,loadingItems:g,isLoading:Object.keys(g).length>0}),d?.({type:"REMOVE_FROM_CART",item:n});}catch{let{loadingItems:m}=e(),{[c]:C,...l}=m;r({error:"Failed to remove item",loadingItems:l,isLoading:Object.keys(l).length>0}),d?.({type:"CART_ERROR",action:"removeItem",error:"Failed to remove item"});}},updateItemQuantity:async(t,a,i)=>{let{cartToken:o,items:s,loadingItems:u}=e();if(!o)return;if(a<=0)return e().removeItem(t,i);let{cartService:d,onCartEvent:n}=y(),c=s.find(l=>{let f=l.variant_id||l.variantId,g=l.product_id||l.productId;return i?l.id===t||g===t&&f===i:l.id===t});if(!c)return;let m=c.variant_id||c.variantId||t,C=c.quantity;try{r({loadingItems:{...u,[m]:!0},isLoading:!0,error:null});let l=s.map(I=>({productId:I.product_id||I.productId,variantId:I.variant_id||I.variantId||I.id,quantity:I.id===c.id?a:I.quantity}));await d.updateCart(o,l);let f=await d.getCart(o),{loadingItems:g}=e(),{[m]:V,...k}=g;r({items:f.items||[],checkoutUrl:f.checkoutUrl,totalAmount:f.totalAmount,loadingItems:k,isLoading:Object.keys(k).length>0}),n?.({type:"UPDATE_QUANTITY",item:{...c,quantity:a},previousQuantity:C});}catch{let{loadingItems:l}=e(),{[m]:f,...g}=l;r({error:"Failed to update quantity",loadingItems:g,isLoading:Object.keys(g).length>0}),n?.({type:"CART_ERROR",action:"updateItemQuantity",error:"Failed to update quantity"});}},incrementItem:async(t,a)=>{let{items:i}=e(),o=i.find(s=>{let u=s.variant_id||s.variantId,d=s.product_id||s.productId;return a?s.id===t||d===t&&u===a:s.id===t});o&&await e().updateItemQuantity(t,o.quantity+1,a);},decrementItem:async(t,a)=>{let{items:i}=e(),o=i.find(s=>{let u=s.variant_id||s.variantId,d=s.product_id||s.productId;return a?s.id===t||d===t&&u===a:s.id===t});o&&(o.quantity<=1?await e().removeItem(t,a):await e().updateItemQuantity(t,o.quantity-1,a));},setItemQuantity:async(t,a,i)=>{await e().updateItemQuantity(t,a,i);},clearCart:async()=>{let{cartToken:t,items:a}=e();if(!t)return;let{cartService:i,onCartEvent:o}=y();try{r({isLoading:!0,loadingItems:{},error:null}),await i.updateCart(t,[]);let s=a.length;r({items:[],isLoading:!1,loadingItems:{}}),o?.({type:"CLEAR_CART",itemCount:s});}catch{r({error:"Failed to clear cart",isLoading:false,loadingItems:{}}),o?.({type:"CART_ERROR",action:"clearCart",error:"Failed to clear cart"});}},openCart:async()=>{let{cartToken:t}=e(),{cartService:a,onCartEvent:i}=y();if(t)try{let o=await a.getCart(t);r({items:o.items||[],checkoutUrl:o.checkoutUrl,totalAmount:o.totalAmount,isOpen:!0});}catch{r({isOpen:true});}else r({isOpen:true});i?.({type:"CART_OPENED"});},closeCart:()=>{r({isOpen:false}),y().onCartEvent?.({type:"CART_CLOSED"});},toggleCart:async()=>{let{isOpen:t}=e();t?e().closeCart():await e().openCart();}}));var q=()=>p(r=>r.isInitialized?r.items.length:0),D=()=>p(r=>r.isInitialized?r.items.reduce((e,t)=>e+t.quantity,0):0),U=()=>p(r=>r.items),F=()=>p(r=>r.toggleCart),z=()=>p(r=>({isOpen:r.isOpen,isLoading:r.isLoading,error:r.error,cartToken:r.cartToken,isInitialized:r.isInitialized})),N=()=>p(r=>r.items.reduce((e,t)=>e+t.price.amount*t.quantity,0)),j=()=>p(r=>r.totalAmount),$=(r,e)=>p(t=>t.items.some(a=>e?a.productId===r&&a.variantId===e:a.productId===r)),Q=(r,e)=>p(t=>t.items.find(a=>e?a.productId===r&&a.variantId===e:a.productId===r)),K=()=>p(r=>r.checkoutUrl);var v=class{constructor(e="/api/v1/cart"){this.baseUrl=e;}async makeRequest(e,t){return fetch(e,{headers:{"Content-Type":"application/json",...t.headers},...t})}async handleResponse(e,t){if(!e.ok){let a=await e.text();throw new Error(`${t}: ${e.status} ${a}`)}return e.json()}async createCart(e){let t=await this.makeRequest(this.baseUrl,{method:"POST",body:JSON.stringify({merchantName:e})});return this.handleResponse(t,"Failed to create cart")}async getCart(e){let t=await this.makeRequest(`${this.baseUrl}/get`,{method:"POST",body:JSON.stringify({cartId:e})});return this.handleResponse(t,"Failed to get cart")}async addToCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/add`,{method:"POST",body:JSON.stringify({cartId:e,items:t})});await this.handleResponse(a,"Failed to add item to cart");}async removeFromCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/remove`,{method:"POST",body:JSON.stringify({cartId:e,itemIds:t})});await this.handleResponse(a,"Failed to remove item from cart");}async updateCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/update`,{method:"POST",body:JSON.stringify({cartId:e,items:t})});await this.handleResponse(a,"Failed to update cart");}};var T=class{constructor(e="default"){this.merchantName=e;}getStorageKey(e){return `${this.merchantName?`merchant_${this.merchantName}`:"default"}_${e}`}get(e){if(typeof window>"u")return null;try{return localStorage.getItem(this.getStorageKey(e))}catch{return null}}set(e,t){if(!(typeof window>"u"))try{localStorage.setItem(this.getStorageKey(e),t);}catch{}}remove(e){if(!(typeof window>"u"))try{localStorage.removeItem(this.getStorageKey(e));}catch{}}getCartToken(){return this.get("cartToken")}setCartToken(e){this.set("cartToken",e);}removeCartToken(){this.remove("cartToken");}clear(){if(!(typeof window>"u"))try{let e=Object.keys(localStorage),t=this.getStorageKey("");e.forEach(a=>{a.startsWith(t)&&localStorage.removeItem(a);});}catch{}}};var R=class{constructor(e){this.client=e;}unwrapResponse(e){if(!e.success)throw new Error(e.message||"Cart operation failed");if(e.data===null)throw new Error("Cart data is null");return e.data}async createCart(e){let t=await this.client.createCart({merchantName:e});return this.unwrapResponse(t)}async getCart(e){let t=await this.client.getCart({id:e});return this.unwrapResponse(t)}async addToCart(e,t){let a=await this.client.addToCart({id:e,items:t});this.unwrapResponse(a);}async removeFromCart(e,t){let a=await this.client.removeFromCart({id:e,itemIds:t});this.unwrapResponse(a);}async updateCart(e,t){let a=await this.client.updateCart({id:e,items:t});this.unwrapResponse(a);}};function A(r){return r&&typeof r.getCart=="function"&&typeof r.createCart=="function"&&typeof r.addToCart=="function"}function L(r,e,t,a="USD"){let i=e?r.variants?.find(n=>n.id===e)||r.variants?.[0]:r.variants?.find(n=>n.available)||r.variants?.[0],o=i?.price||r.price||r.priceRange?.minVariantPrice,s=typeof o=="number"?{amount:o,currencyCode:a}:o?{...o,currencyCode:a}:{amount:0,currencyCode:a},u=i?.compareAtPrice||r.compareAtPrice,d=u?typeof u=="number"?{amount:u,currencyCode:a}:{...u,currencyCode:a}:void 0;return {id:`${r.id}-${e||i?.id||"default"}`,productId:r.id,variantId:e||i?.id,title:r.title,price:s,compareAtPrice:d,quantity:t||r.quantity||1,image:r.images?.[0]?.url||r.image,vendor:r.vendor}}function w(r,e="USD",t){try{return new Intl.NumberFormat(t,{style:"currency",currency:e}).format(r)}catch{return `${e} ${r.toFixed(2)}`}}function S(r){return r.reduce((e,t)=>{let a=typeof t.price=="number"?t.price:t.price.amount;return e+a*t.quantity},0)}function b(r){return r.reduce((e,t)=>{if(!t.compareAtPrice)return e;let a=typeof t.price=="number"?t.price:t.price.amount,o=(typeof t.compareAtPrice=="number"?t.compareAtPrice:t.compareAtPrice.amount)-a;return e+Math.max(0,o)*t.quantity},0)}function x({merchantName:r}){let e=p(a=>a.initializeCart),t=p(a=>a.isOpen);return react.useEffect(()=>{e(r);},[r,e]),react.useEffect(()=>(document.body.style.overflow=t?"hidden":"",()=>{document.body.style.overflow="";}),[t]),null}exports.CartInitializer=x;exports.DataLayerCartService=R;exports.DefaultCartService=v;exports.DefaultCartStorage=T;exports.calculateCartTotal=S;exports.calculateSavings=b;exports.configureCart=_;exports.formatPrice=w;exports.getCartConfig=y;exports.isCartConfigured=E;exports.isDataLayerClient=A;exports.mapProductToCartItem=L;exports.useCartCount=q;exports.useCartItem=Q;exports.useCartItems=U;exports.useCartStatus=z;exports.useCartStore=p;exports.useCartToggle=F;exports.useCartTotal=N;exports.useCartTotalAmount=j;exports.useCartTotalQuantity=D;exports.useCheckoutUrl=K;exports.useIsInCart=$;
'use strict';var zustand=require('zustand'),react=require('react');var h=null;function _(r){h=r;}function g(){if(!h)throw new Error("Cart not configured. Call configureCart() first.");return h}function E(){return h!==null}var p=zustand.create((r,e)=>({items:[],isOpen:false,isLoading:false,loadingItems:{},error:null,cartToken:null,totalAmount:void 0,isInitialized:false,initializeCart:async t=>{let{isInitialized:a}=e();if(a)return;let i=g(),{cartService:o,cartStorage:s}=i,u=t??i.merchantName;try{let d=s.getCartToken();if(d)try{let n=await o.getCart(d);r({items:n.items||[],cartToken:d,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:d});}catch{s.removeCartToken();let n=await o.createCart(u),c=n.token||n.id;s.setCartToken(c),r({items:n.items||[],cartToken:c,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:c});}else {let n=await o.createCart(u),c=n.token||n.id;s.setCartToken(c),r({items:n.items||[],cartToken:c,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:c});}}catch{r({error:"Failed to initialize cart",isInitialized:true}),i.onCartEvent?.({type:"CART_ERROR",action:"initializeCart",error:"Failed to initialize cart"});}},addItem:async t=>{let{cartToken:a,loadingItems:i}=e();if(!a)return;let o=t.variantId||t.id,{cartService:s,onCartEvent:u}=g();try{r({loadingItems:{...i,[o]:!0},isLoading:!0,error:null});let d=[{productId:t.productId||t.id,variantId:t.variantId||t.id,quantity:t.quantity}];await s.addToCart(a,d);let n=await s.getCart(a),{loadingItems:c}=e(),{[o]:m,...C}=c;r({items:n.items||[],checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,loadingItems:C,isLoading:Object.keys(C).length>0}),u?.({type:"ADD_TO_CART",item:t});}catch{let{loadingItems:d}=e(),{[o]:n,...c}=d;r({error:"Failed to add item",loadingItems:c,isLoading:Object.keys(c).length>0}),u?.({type:"CART_ERROR",action:"addItem",error:"Failed to add item"});}},addItems:async t=>{let{cartToken:a,loadingItems:i}=e();if(!a)return;let o=t.map(n=>n.variantId),s=o.reduce((n,c)=>({...n,[c]:true}),i),{cartService:u,onCartEvent:d}=g();try{r({loadingItems:s,isLoading:!0,error:null}),await u.addToCart(a,t);let n=await u.getCart(a),{loadingItems:c}=e(),m=Object.fromEntries(Object.entries(c).filter(([C])=>!o.includes(C)));r({items:n.items||[],checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,loadingItems:m,isLoading:Object.keys(m).length>0});}catch{let{loadingItems:n}=e(),c=Object.fromEntries(Object.entries(n).filter(([m])=>!o.includes(m)));r({error:"Failed to add items",loadingItems:c,isLoading:Object.keys(c).length>0}),d?.({type:"CART_ERROR",action:"addItems",error:"Failed to add items"});}},removeItem:async(t,a)=>{let{cartToken:i,items:o,loadingItems:s}=e();if(!i)return;let{cartService:u,onCartEvent:d}=g(),n=o.find(m=>{let C=m.variant_id||m.variantId,l=m.product_id||m.productId;return a?m.id===t||l===t&&C===a:m.id===t});if(!n)return;let c=n.variant_id||n.variantId||t;try{r({loadingItems:{...s,[c]:!0},isLoading:!0,error:null});let m=n.variant_id||n.variantId||n.id;await u.removeFromCart(i,[m]);let C=await u.getCart(i),{loadingItems:l}=e(),{[c]:f,...y}=l;r({items:C.items||[],checkoutUrl:C.checkoutUrl,totalAmount:C.totalAmount,loadingItems:y,isLoading:Object.keys(y).length>0}),d?.({type:"REMOVE_FROM_CART",item:n});}catch{let{loadingItems:m}=e(),{[c]:C,...l}=m;r({error:"Failed to remove item",loadingItems:l,isLoading:Object.keys(l).length>0}),d?.({type:"CART_ERROR",action:"removeItem",error:"Failed to remove item"});}},updateItemQuantity:async(t,a,i)=>{let{cartToken:o,items:s,loadingItems:u}=e();if(!o)return;if(a<=0)return e().removeItem(t,i);let{cartService:d,onCartEvent:n}=g(),c=s.find(l=>{let f=l.variant_id||l.variantId,y=l.product_id||l.productId;return i?l.id===t||y===t&&f===i:l.id===t});if(!c)return;let m=c.variant_id||c.variantId||t,C=c.quantity;try{r({loadingItems:{...u,[m]:!0},isLoading:!0,error:null});let l=s.map(I=>({productId:I.product_id||I.productId,variantId:I.variant_id||I.variantId||I.id,quantity:I.id===c.id?a:I.quantity}));await d.updateCart(o,l);let f=await d.getCart(o),{loadingItems:y}=e(),{[m]:V,...k}=y;r({items:f.items||[],checkoutUrl:f.checkoutUrl,totalAmount:f.totalAmount,loadingItems:k,isLoading:Object.keys(k).length>0}),n?.({type:"UPDATE_QUANTITY",item:{...c,quantity:a},previousQuantity:C});}catch{let{loadingItems:l}=e(),{[m]:f,...y}=l;r({error:"Failed to update quantity",loadingItems:y,isLoading:Object.keys(y).length>0}),n?.({type:"CART_ERROR",action:"updateItemQuantity",error:"Failed to update quantity"});}},incrementItem:async(t,a)=>{let{items:i}=e(),o=i.find(s=>{let u=s.variant_id||s.variantId,d=s.product_id||s.productId;return a?s.id===t||d===t&&u===a:s.id===t});o&&await e().updateItemQuantity(t,o.quantity+1,a);},decrementItem:async(t,a)=>{let{items:i}=e(),o=i.find(s=>{let u=s.variant_id||s.variantId,d=s.product_id||s.productId;return a?s.id===t||d===t&&u===a:s.id===t});o&&(o.quantity<=1?await e().removeItem(t,a):await e().updateItemQuantity(t,o.quantity-1,a));},setItemQuantity:async(t,a,i)=>{await e().updateItemQuantity(t,a,i);},clearCart:async()=>{let{cartToken:t,items:a}=e();if(!t)return;let{cartService:i,onCartEvent:o}=g();try{r({isLoading:!0,loadingItems:{},error:null}),await i.updateCart(t,[]);let s=a.length;r({items:[],isLoading:!1,loadingItems:{}}),o?.({type:"CLEAR_CART",itemCount:s});}catch{r({error:"Failed to clear cart",isLoading:false,loadingItems:{}}),o?.({type:"CART_ERROR",action:"clearCart",error:"Failed to clear cart"});}},openCart:async()=>{let{cartToken:t}=e(),{cartService:a,onCartEvent:i}=g();if(t)try{let o=await a.getCart(t);r({items:o.items||[],checkoutUrl:o.checkoutUrl,totalAmount:o.totalAmount,isOpen:!0});}catch{r({isOpen:true});}else r({isOpen:true});i?.({type:"CART_OPENED"});},closeCart:()=>{r({isOpen:false}),g().onCartEvent?.({type:"CART_CLOSED"});},toggleCart:async()=>{let{isOpen:t}=e();t?e().closeCart():await e().openCart();}}));var q=()=>p(r=>r.isInitialized?r.items.length:0),D=()=>p(r=>r.isInitialized?r.items.reduce((e,t)=>e+t.quantity,0):0),U=()=>p(r=>r.items),F=()=>p(r=>r.toggleCart),z=()=>p(r=>({isOpen:r.isOpen,isLoading:r.isLoading,error:r.error,cartToken:r.cartToken,isInitialized:r.isInitialized})),N=()=>p(r=>r.items.reduce((e,t)=>e+t.price.amount*t.quantity,0)),j=()=>p(r=>r.totalAmount),$=(r,e)=>p(t=>t.items.some(a=>e?a.productId===r&&a.variantId===e:a.productId===r)),Q=(r,e)=>p(t=>t.items.find(a=>e?a.productId===r&&a.variantId===e:a.productId===r)),K=()=>p(r=>r.checkoutUrl);var v=class{constructor(e="/api/v1/cart"){this.baseUrl=e;}async makeRequest(e,t){return fetch(e,{headers:{"Content-Type":"application/json",...t.headers},...t})}async handleResponse(e,t){if(!e.ok){let a=await e.text();throw new Error(`${t}: ${e.status} ${a}`)}return e.json()}async createCart(e){let t=await this.makeRequest(this.baseUrl,{method:"POST",body:JSON.stringify({merchantName:e})});return this.handleResponse(t,"Failed to create cart")}async getCart(e){let t=await this.makeRequest(`${this.baseUrl}/get`,{method:"POST",body:JSON.stringify({cartId:e})});return this.handleResponse(t,"Failed to get cart")}async addToCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/add`,{method:"POST",body:JSON.stringify({cartId:e,items:t})});await this.handleResponse(a,"Failed to add item to cart");}async removeFromCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/remove`,{method:"POST",body:JSON.stringify({cartId:e,itemIds:t})});await this.handleResponse(a,"Failed to remove item from cart");}async updateCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/update`,{method:"POST",body:JSON.stringify({cartId:e,items:t})});await this.handleResponse(a,"Failed to update cart");}};var T=class{constructor(e="default"){this.merchantName=e;}getStorageKey(e){return `${this.merchantName?`merchant_${this.merchantName}`:"default"}_${e}`}get(e){if(typeof window>"u")return null;try{return localStorage.getItem(this.getStorageKey(e))}catch{return null}}set(e,t){if(!(typeof window>"u"))try{localStorage.setItem(this.getStorageKey(e),t);}catch{}}remove(e){if(!(typeof window>"u"))try{localStorage.removeItem(this.getStorageKey(e));}catch{}}getCartToken(){return this.get("cartToken")}setCartToken(e){this.set("cartToken",e);}removeCartToken(){this.remove("cartToken");}clear(){if(!(typeof window>"u"))try{let e=Object.keys(localStorage),t=this.getStorageKey("");e.forEach(a=>{a.startsWith(t)&&localStorage.removeItem(a);});}catch{}}};var R=class{constructor(e){this.client=e;}unwrapResponse(e){if(!e.success)throw new Error(e.message||"Cart operation failed");if(e.data===null)throw new Error("Cart data is null");return e.data}async createCart(e){let t=await this.client.createCart({merchantName:e});return this.unwrapResponse(t)}async getCart(e){let t=await this.client.getCart({id:e});return this.unwrapResponse(t)}async addToCart(e,t){let a=await this.client.addToCart({id:e,items:t});this.unwrapResponse(a);}async removeFromCart(e,t){let a=await this.client.removeFromCart({id:e,itemIds:t});this.unwrapResponse(a);}async updateCart(e,t){let a=await this.client.updateCart({id:e,items:t});this.unwrapResponse(a);}};function A(r){return r&&typeof r.getCart=="function"&&typeof r.createCart=="function"&&typeof r.addToCart=="function"}function L(r,e,t,a="INR"){let i=e?r.variants?.find(n=>n.id===e)||r.variants?.[0]:r.variants?.find(n=>n.available)||r.variants?.[0],o=i?.price||r.price||r.priceRange?.minVariantPrice,s=typeof o=="number"?{amount:o,currencyCode:a}:o?{...o,currencyCode:o.currencyCode||a}:{amount:0,currencyCode:a},u=i?.compareAtPrice||r.compareAtPrice,d=u?typeof u=="number"?{amount:u,currencyCode:a}:{...u,currencyCode:u.currencyCode||a}:void 0;return {id:`${r.id}-${e||i?.id||"default"}`,productId:r.id,variantId:e||i?.id,sku:i?.sku||r.sku,title:r.title,price:s,compareAtPrice:d,quantity:t||r.quantity||1,image:r.images?.[0]?.url||r.image,vendor:r.vendor,product_type:r.product_type||r.productType}}function w(r,e="USD",t){try{return new Intl.NumberFormat(t,{style:"currency",currency:e}).format(r)}catch{return `${e} ${r.toFixed(2)}`}}function S(r){return r.reduce((e,t)=>{let a=typeof t.price=="number"?t.price:t.price.amount;return e+a*t.quantity},0)}function b(r){return r.reduce((e,t)=>{if(!t.compareAtPrice)return e;let a=typeof t.price=="number"?t.price:t.price.amount,o=(typeof t.compareAtPrice=="number"?t.compareAtPrice:t.compareAtPrice.amount)-a;return e+Math.max(0,o)*t.quantity},0)}function x({merchantName:r}){let e=p(a=>a.initializeCart),t=p(a=>a.isOpen);return react.useEffect(()=>{e(r);},[r,e]),react.useEffect(()=>(document.body.style.overflow=t?"hidden":"",()=>{document.body.style.overflow="";}),[t]),null}exports.CartInitializer=x;exports.DataLayerCartService=R;exports.DefaultCartService=v;exports.DefaultCartStorage=T;exports.calculateCartTotal=S;exports.calculateSavings=b;exports.configureCart=_;exports.formatPrice=w;exports.getCartConfig=g;exports.isCartConfigured=E;exports.isDataLayerClient=A;exports.mapProductToCartItem=L;exports.useCartCount=q;exports.useCartItem=Q;exports.useCartItems=U;exports.useCartStatus=z;exports.useCartStore=p;exports.useCartToggle=F;exports.useCartTotal=N;exports.useCartTotalAmount=j;exports.useCartTotalQuantity=D;exports.useCheckoutUrl=K;exports.useIsInCart=$;
"use client";
import {create}from'zustand';import {useEffect}from'react';var h=null;function _(r){h=r;}function y(){if(!h)throw new Error("Cart not configured. Call configureCart() first.");return h}function E(){return h!==null}var p=create((r,e)=>({items:[],isOpen:false,isLoading:false,loadingItems:{},error:null,cartToken:null,totalAmount:void 0,isInitialized:false,initializeCart:async t=>{let{isInitialized:a}=e();if(a)return;let i=y(),{cartService:o,cartStorage:s}=i,u=t??i.merchantName;try{let d=s.getCartToken();if(d)try{let n=await o.getCart(d);r({items:n.items||[],cartToken:d,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:d});}catch{s.removeCartToken();let n=await o.createCart(u),c=n.token||n.id;s.setCartToken(c),r({items:n.items||[],cartToken:c,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:c});}else {let n=await o.createCart(u),c=n.token||n.id;s.setCartToken(c),r({items:n.items||[],cartToken:c,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:c});}}catch{r({error:"Failed to initialize cart",isInitialized:true}),i.onCartEvent?.({type:"CART_ERROR",action:"initializeCart",error:"Failed to initialize cart"});}},addItem:async t=>{let{cartToken:a,loadingItems:i}=e();if(!a)return;let o=t.variantId||t.id,{cartService:s,onCartEvent:u}=y();try{r({loadingItems:{...i,[o]:!0},isLoading:!0,error:null});let d=[{productId:t.productId||t.id,variantId:t.variantId||t.id,quantity:t.quantity}];await s.addToCart(a,d);let n=await s.getCart(a),{loadingItems:c}=e(),{[o]:m,...C}=c;r({items:n.items||[],checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,loadingItems:C,isLoading:Object.keys(C).length>0}),u?.({type:"ADD_TO_CART",item:t});}catch{let{loadingItems:d}=e(),{[o]:n,...c}=d;r({error:"Failed to add item",loadingItems:c,isLoading:Object.keys(c).length>0}),u?.({type:"CART_ERROR",action:"addItem",error:"Failed to add item"});}},addItems:async t=>{let{cartToken:a,loadingItems:i}=e();if(!a)return;let o=t.map(n=>n.variantId),s=o.reduce((n,c)=>({...n,[c]:true}),i),{cartService:u,onCartEvent:d}=y();try{r({loadingItems:s,isLoading:!0,error:null}),await u.addToCart(a,t);let n=await u.getCart(a),{loadingItems:c}=e(),m=Object.fromEntries(Object.entries(c).filter(([C])=>!o.includes(C)));r({items:n.items||[],checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,loadingItems:m,isLoading:Object.keys(m).length>0});}catch{let{loadingItems:n}=e(),c=Object.fromEntries(Object.entries(n).filter(([m])=>!o.includes(m)));r({error:"Failed to add items",loadingItems:c,isLoading:Object.keys(c).length>0}),d?.({type:"CART_ERROR",action:"addItems",error:"Failed to add items"});}},removeItem:async(t,a)=>{let{cartToken:i,items:o,loadingItems:s}=e();if(!i)return;let{cartService:u,onCartEvent:d}=y(),n=o.find(m=>{let C=m.variant_id||m.variantId,l=m.product_id||m.productId;return a?m.id===t||l===t&&C===a:m.id===t});if(!n)return;let c=n.variant_id||n.variantId||t;try{r({loadingItems:{...s,[c]:!0},isLoading:!0,error:null});let m=n.variant_id||n.variantId||n.id;await u.removeFromCart(i,[m]);let C=await u.getCart(i),{loadingItems:l}=e(),{[c]:f,...g}=l;r({items:C.items||[],checkoutUrl:C.checkoutUrl,totalAmount:C.totalAmount,loadingItems:g,isLoading:Object.keys(g).length>0}),d?.({type:"REMOVE_FROM_CART",item:n});}catch{let{loadingItems:m}=e(),{[c]:C,...l}=m;r({error:"Failed to remove item",loadingItems:l,isLoading:Object.keys(l).length>0}),d?.({type:"CART_ERROR",action:"removeItem",error:"Failed to remove item"});}},updateItemQuantity:async(t,a,i)=>{let{cartToken:o,items:s,loadingItems:u}=e();if(!o)return;if(a<=0)return e().removeItem(t,i);let{cartService:d,onCartEvent:n}=y(),c=s.find(l=>{let f=l.variant_id||l.variantId,g=l.product_id||l.productId;return i?l.id===t||g===t&&f===i:l.id===t});if(!c)return;let m=c.variant_id||c.variantId||t,C=c.quantity;try{r({loadingItems:{...u,[m]:!0},isLoading:!0,error:null});let l=s.map(I=>({productId:I.product_id||I.productId,variantId:I.variant_id||I.variantId||I.id,quantity:I.id===c.id?a:I.quantity}));await d.updateCart(o,l);let f=await d.getCart(o),{loadingItems:g}=e(),{[m]:V,...k}=g;r({items:f.items||[],checkoutUrl:f.checkoutUrl,totalAmount:f.totalAmount,loadingItems:k,isLoading:Object.keys(k).length>0}),n?.({type:"UPDATE_QUANTITY",item:{...c,quantity:a},previousQuantity:C});}catch{let{loadingItems:l}=e(),{[m]:f,...g}=l;r({error:"Failed to update quantity",loadingItems:g,isLoading:Object.keys(g).length>0}),n?.({type:"CART_ERROR",action:"updateItemQuantity",error:"Failed to update quantity"});}},incrementItem:async(t,a)=>{let{items:i}=e(),o=i.find(s=>{let u=s.variant_id||s.variantId,d=s.product_id||s.productId;return a?s.id===t||d===t&&u===a:s.id===t});o&&await e().updateItemQuantity(t,o.quantity+1,a);},decrementItem:async(t,a)=>{let{items:i}=e(),o=i.find(s=>{let u=s.variant_id||s.variantId,d=s.product_id||s.productId;return a?s.id===t||d===t&&u===a:s.id===t});o&&(o.quantity<=1?await e().removeItem(t,a):await e().updateItemQuantity(t,o.quantity-1,a));},setItemQuantity:async(t,a,i)=>{await e().updateItemQuantity(t,a,i);},clearCart:async()=>{let{cartToken:t,items:a}=e();if(!t)return;let{cartService:i,onCartEvent:o}=y();try{r({isLoading:!0,loadingItems:{},error:null}),await i.updateCart(t,[]);let s=a.length;r({items:[],isLoading:!1,loadingItems:{}}),o?.({type:"CLEAR_CART",itemCount:s});}catch{r({error:"Failed to clear cart",isLoading:false,loadingItems:{}}),o?.({type:"CART_ERROR",action:"clearCart",error:"Failed to clear cart"});}},openCart:async()=>{let{cartToken:t}=e(),{cartService:a,onCartEvent:i}=y();if(t)try{let o=await a.getCart(t);r({items:o.items||[],checkoutUrl:o.checkoutUrl,totalAmount:o.totalAmount,isOpen:!0});}catch{r({isOpen:true});}else r({isOpen:true});i?.({type:"CART_OPENED"});},closeCart:()=>{r({isOpen:false}),y().onCartEvent?.({type:"CART_CLOSED"});},toggleCart:async()=>{let{isOpen:t}=e();t?e().closeCart():await e().openCart();}}));var q=()=>p(r=>r.isInitialized?r.items.length:0),D=()=>p(r=>r.isInitialized?r.items.reduce((e,t)=>e+t.quantity,0):0),U=()=>p(r=>r.items),F=()=>p(r=>r.toggleCart),z=()=>p(r=>({isOpen:r.isOpen,isLoading:r.isLoading,error:r.error,cartToken:r.cartToken,isInitialized:r.isInitialized})),N=()=>p(r=>r.items.reduce((e,t)=>e+t.price.amount*t.quantity,0)),j=()=>p(r=>r.totalAmount),$=(r,e)=>p(t=>t.items.some(a=>e?a.productId===r&&a.variantId===e:a.productId===r)),Q=(r,e)=>p(t=>t.items.find(a=>e?a.productId===r&&a.variantId===e:a.productId===r)),K=()=>p(r=>r.checkoutUrl);var v=class{constructor(e="/api/v1/cart"){this.baseUrl=e;}async makeRequest(e,t){return fetch(e,{headers:{"Content-Type":"application/json",...t.headers},...t})}async handleResponse(e,t){if(!e.ok){let a=await e.text();throw new Error(`${t}: ${e.status} ${a}`)}return e.json()}async createCart(e){let t=await this.makeRequest(this.baseUrl,{method:"POST",body:JSON.stringify({merchantName:e})});return this.handleResponse(t,"Failed to create cart")}async getCart(e){let t=await this.makeRequest(`${this.baseUrl}/get`,{method:"POST",body:JSON.stringify({cartId:e})});return this.handleResponse(t,"Failed to get cart")}async addToCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/add`,{method:"POST",body:JSON.stringify({cartId:e,items:t})});await this.handleResponse(a,"Failed to add item to cart");}async removeFromCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/remove`,{method:"POST",body:JSON.stringify({cartId:e,itemIds:t})});await this.handleResponse(a,"Failed to remove item from cart");}async updateCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/update`,{method:"POST",body:JSON.stringify({cartId:e,items:t})});await this.handleResponse(a,"Failed to update cart");}};var T=class{constructor(e="default"){this.merchantName=e;}getStorageKey(e){return `${this.merchantName?`merchant_${this.merchantName}`:"default"}_${e}`}get(e){if(typeof window>"u")return null;try{return localStorage.getItem(this.getStorageKey(e))}catch{return null}}set(e,t){if(!(typeof window>"u"))try{localStorage.setItem(this.getStorageKey(e),t);}catch{}}remove(e){if(!(typeof window>"u"))try{localStorage.removeItem(this.getStorageKey(e));}catch{}}getCartToken(){return this.get("cartToken")}setCartToken(e){this.set("cartToken",e);}removeCartToken(){this.remove("cartToken");}clear(){if(!(typeof window>"u"))try{let e=Object.keys(localStorage),t=this.getStorageKey("");e.forEach(a=>{a.startsWith(t)&&localStorage.removeItem(a);});}catch{}}};var R=class{constructor(e){this.client=e;}unwrapResponse(e){if(!e.success)throw new Error(e.message||"Cart operation failed");if(e.data===null)throw new Error("Cart data is null");return e.data}async createCart(e){let t=await this.client.createCart({merchantName:e});return this.unwrapResponse(t)}async getCart(e){let t=await this.client.getCart({id:e});return this.unwrapResponse(t)}async addToCart(e,t){let a=await this.client.addToCart({id:e,items:t});this.unwrapResponse(a);}async removeFromCart(e,t){let a=await this.client.removeFromCart({id:e,itemIds:t});this.unwrapResponse(a);}async updateCart(e,t){let a=await this.client.updateCart({id:e,items:t});this.unwrapResponse(a);}};function A(r){return r&&typeof r.getCart=="function"&&typeof r.createCart=="function"&&typeof r.addToCart=="function"}function L(r,e,t,a="USD"){let i=e?r.variants?.find(n=>n.id===e)||r.variants?.[0]:r.variants?.find(n=>n.available)||r.variants?.[0],o=i?.price||r.price||r.priceRange?.minVariantPrice,s=typeof o=="number"?{amount:o,currencyCode:a}:o?{...o,currencyCode:a}:{amount:0,currencyCode:a},u=i?.compareAtPrice||r.compareAtPrice,d=u?typeof u=="number"?{amount:u,currencyCode:a}:{...u,currencyCode:a}:void 0;return {id:`${r.id}-${e||i?.id||"default"}`,productId:r.id,variantId:e||i?.id,title:r.title,price:s,compareAtPrice:d,quantity:t||r.quantity||1,image:r.images?.[0]?.url||r.image,vendor:r.vendor}}function w(r,e="USD",t){try{return new Intl.NumberFormat(t,{style:"currency",currency:e}).format(r)}catch{return `${e} ${r.toFixed(2)}`}}function S(r){return r.reduce((e,t)=>{let a=typeof t.price=="number"?t.price:t.price.amount;return e+a*t.quantity},0)}function b(r){return r.reduce((e,t)=>{if(!t.compareAtPrice)return e;let a=typeof t.price=="number"?t.price:t.price.amount,o=(typeof t.compareAtPrice=="number"?t.compareAtPrice:t.compareAtPrice.amount)-a;return e+Math.max(0,o)*t.quantity},0)}function x({merchantName:r}){let e=p(a=>a.initializeCart),t=p(a=>a.isOpen);return useEffect(()=>{e(r);},[r,e]),useEffect(()=>(document.body.style.overflow=t?"hidden":"",()=>{document.body.style.overflow="";}),[t]),null}export{x as CartInitializer,R as DataLayerCartService,v as DefaultCartService,T as DefaultCartStorage,S as calculateCartTotal,b as calculateSavings,_ as configureCart,w as formatPrice,y as getCartConfig,E as isCartConfigured,A as isDataLayerClient,L as mapProductToCartItem,q as useCartCount,Q as useCartItem,U as useCartItems,z as useCartStatus,p as useCartStore,F as useCartToggle,N as useCartTotal,j as useCartTotalAmount,D as useCartTotalQuantity,K as useCheckoutUrl,$ as useIsInCart};
import {create}from'zustand';import {useEffect}from'react';var h=null;function _(r){h=r;}function g(){if(!h)throw new Error("Cart not configured. Call configureCart() first.");return h}function E(){return h!==null}var p=create((r,e)=>({items:[],isOpen:false,isLoading:false,loadingItems:{},error:null,cartToken:null,totalAmount:void 0,isInitialized:false,initializeCart:async t=>{let{isInitialized:a}=e();if(a)return;let i=g(),{cartService:o,cartStorage:s}=i,u=t??i.merchantName;try{let d=s.getCartToken();if(d)try{let n=await o.getCart(d);r({items:n.items||[],cartToken:d,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:d});}catch{s.removeCartToken();let n=await o.createCart(u),c=n.token||n.id;s.setCartToken(c),r({items:n.items||[],cartToken:c,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:c});}else {let n=await o.createCart(u),c=n.token||n.id;s.setCartToken(c),r({items:n.items||[],cartToken:c,checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,isInitialized:!0}),i.onCartEvent?.({type:"CART_INITIALIZED",cartToken:c});}}catch{r({error:"Failed to initialize cart",isInitialized:true}),i.onCartEvent?.({type:"CART_ERROR",action:"initializeCart",error:"Failed to initialize cart"});}},addItem:async t=>{let{cartToken:a,loadingItems:i}=e();if(!a)return;let o=t.variantId||t.id,{cartService:s,onCartEvent:u}=g();try{r({loadingItems:{...i,[o]:!0},isLoading:!0,error:null});let d=[{productId:t.productId||t.id,variantId:t.variantId||t.id,quantity:t.quantity}];await s.addToCart(a,d);let n=await s.getCart(a),{loadingItems:c}=e(),{[o]:m,...C}=c;r({items:n.items||[],checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,loadingItems:C,isLoading:Object.keys(C).length>0}),u?.({type:"ADD_TO_CART",item:t});}catch{let{loadingItems:d}=e(),{[o]:n,...c}=d;r({error:"Failed to add item",loadingItems:c,isLoading:Object.keys(c).length>0}),u?.({type:"CART_ERROR",action:"addItem",error:"Failed to add item"});}},addItems:async t=>{let{cartToken:a,loadingItems:i}=e();if(!a)return;let o=t.map(n=>n.variantId),s=o.reduce((n,c)=>({...n,[c]:true}),i),{cartService:u,onCartEvent:d}=g();try{r({loadingItems:s,isLoading:!0,error:null}),await u.addToCart(a,t);let n=await u.getCart(a),{loadingItems:c}=e(),m=Object.fromEntries(Object.entries(c).filter(([C])=>!o.includes(C)));r({items:n.items||[],checkoutUrl:n.checkoutUrl,totalAmount:n.totalAmount,loadingItems:m,isLoading:Object.keys(m).length>0});}catch{let{loadingItems:n}=e(),c=Object.fromEntries(Object.entries(n).filter(([m])=>!o.includes(m)));r({error:"Failed to add items",loadingItems:c,isLoading:Object.keys(c).length>0}),d?.({type:"CART_ERROR",action:"addItems",error:"Failed to add items"});}},removeItem:async(t,a)=>{let{cartToken:i,items:o,loadingItems:s}=e();if(!i)return;let{cartService:u,onCartEvent:d}=g(),n=o.find(m=>{let C=m.variant_id||m.variantId,l=m.product_id||m.productId;return a?m.id===t||l===t&&C===a:m.id===t});if(!n)return;let c=n.variant_id||n.variantId||t;try{r({loadingItems:{...s,[c]:!0},isLoading:!0,error:null});let m=n.variant_id||n.variantId||n.id;await u.removeFromCart(i,[m]);let C=await u.getCart(i),{loadingItems:l}=e(),{[c]:f,...y}=l;r({items:C.items||[],checkoutUrl:C.checkoutUrl,totalAmount:C.totalAmount,loadingItems:y,isLoading:Object.keys(y).length>0}),d?.({type:"REMOVE_FROM_CART",item:n});}catch{let{loadingItems:m}=e(),{[c]:C,...l}=m;r({error:"Failed to remove item",loadingItems:l,isLoading:Object.keys(l).length>0}),d?.({type:"CART_ERROR",action:"removeItem",error:"Failed to remove item"});}},updateItemQuantity:async(t,a,i)=>{let{cartToken:o,items:s,loadingItems:u}=e();if(!o)return;if(a<=0)return e().removeItem(t,i);let{cartService:d,onCartEvent:n}=g(),c=s.find(l=>{let f=l.variant_id||l.variantId,y=l.product_id||l.productId;return i?l.id===t||y===t&&f===i:l.id===t});if(!c)return;let m=c.variant_id||c.variantId||t,C=c.quantity;try{r({loadingItems:{...u,[m]:!0},isLoading:!0,error:null});let l=s.map(I=>({productId:I.product_id||I.productId,variantId:I.variant_id||I.variantId||I.id,quantity:I.id===c.id?a:I.quantity}));await d.updateCart(o,l);let f=await d.getCart(o),{loadingItems:y}=e(),{[m]:V,...k}=y;r({items:f.items||[],checkoutUrl:f.checkoutUrl,totalAmount:f.totalAmount,loadingItems:k,isLoading:Object.keys(k).length>0}),n?.({type:"UPDATE_QUANTITY",item:{...c,quantity:a},previousQuantity:C});}catch{let{loadingItems:l}=e(),{[m]:f,...y}=l;r({error:"Failed to update quantity",loadingItems:y,isLoading:Object.keys(y).length>0}),n?.({type:"CART_ERROR",action:"updateItemQuantity",error:"Failed to update quantity"});}},incrementItem:async(t,a)=>{let{items:i}=e(),o=i.find(s=>{let u=s.variant_id||s.variantId,d=s.product_id||s.productId;return a?s.id===t||d===t&&u===a:s.id===t});o&&await e().updateItemQuantity(t,o.quantity+1,a);},decrementItem:async(t,a)=>{let{items:i}=e(),o=i.find(s=>{let u=s.variant_id||s.variantId,d=s.product_id||s.productId;return a?s.id===t||d===t&&u===a:s.id===t});o&&(o.quantity<=1?await e().removeItem(t,a):await e().updateItemQuantity(t,o.quantity-1,a));},setItemQuantity:async(t,a,i)=>{await e().updateItemQuantity(t,a,i);},clearCart:async()=>{let{cartToken:t,items:a}=e();if(!t)return;let{cartService:i,onCartEvent:o}=g();try{r({isLoading:!0,loadingItems:{},error:null}),await i.updateCart(t,[]);let s=a.length;r({items:[],isLoading:!1,loadingItems:{}}),o?.({type:"CLEAR_CART",itemCount:s});}catch{r({error:"Failed to clear cart",isLoading:false,loadingItems:{}}),o?.({type:"CART_ERROR",action:"clearCart",error:"Failed to clear cart"});}},openCart:async()=>{let{cartToken:t}=e(),{cartService:a,onCartEvent:i}=g();if(t)try{let o=await a.getCart(t);r({items:o.items||[],checkoutUrl:o.checkoutUrl,totalAmount:o.totalAmount,isOpen:!0});}catch{r({isOpen:true});}else r({isOpen:true});i?.({type:"CART_OPENED"});},closeCart:()=>{r({isOpen:false}),g().onCartEvent?.({type:"CART_CLOSED"});},toggleCart:async()=>{let{isOpen:t}=e();t?e().closeCart():await e().openCart();}}));var q=()=>p(r=>r.isInitialized?r.items.length:0),D=()=>p(r=>r.isInitialized?r.items.reduce((e,t)=>e+t.quantity,0):0),U=()=>p(r=>r.items),F=()=>p(r=>r.toggleCart),z=()=>p(r=>({isOpen:r.isOpen,isLoading:r.isLoading,error:r.error,cartToken:r.cartToken,isInitialized:r.isInitialized})),N=()=>p(r=>r.items.reduce((e,t)=>e+t.price.amount*t.quantity,0)),j=()=>p(r=>r.totalAmount),$=(r,e)=>p(t=>t.items.some(a=>e?a.productId===r&&a.variantId===e:a.productId===r)),Q=(r,e)=>p(t=>t.items.find(a=>e?a.productId===r&&a.variantId===e:a.productId===r)),K=()=>p(r=>r.checkoutUrl);var v=class{constructor(e="/api/v1/cart"){this.baseUrl=e;}async makeRequest(e,t){return fetch(e,{headers:{"Content-Type":"application/json",...t.headers},...t})}async handleResponse(e,t){if(!e.ok){let a=await e.text();throw new Error(`${t}: ${e.status} ${a}`)}return e.json()}async createCart(e){let t=await this.makeRequest(this.baseUrl,{method:"POST",body:JSON.stringify({merchantName:e})});return this.handleResponse(t,"Failed to create cart")}async getCart(e){let t=await this.makeRequest(`${this.baseUrl}/get`,{method:"POST",body:JSON.stringify({cartId:e})});return this.handleResponse(t,"Failed to get cart")}async addToCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/add`,{method:"POST",body:JSON.stringify({cartId:e,items:t})});await this.handleResponse(a,"Failed to add item to cart");}async removeFromCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/remove`,{method:"POST",body:JSON.stringify({cartId:e,itemIds:t})});await this.handleResponse(a,"Failed to remove item from cart");}async updateCart(e,t){let a=await this.makeRequest(`${this.baseUrl}/update`,{method:"POST",body:JSON.stringify({cartId:e,items:t})});await this.handleResponse(a,"Failed to update cart");}};var T=class{constructor(e="default"){this.merchantName=e;}getStorageKey(e){return `${this.merchantName?`merchant_${this.merchantName}`:"default"}_${e}`}get(e){if(typeof window>"u")return null;try{return localStorage.getItem(this.getStorageKey(e))}catch{return null}}set(e,t){if(!(typeof window>"u"))try{localStorage.setItem(this.getStorageKey(e),t);}catch{}}remove(e){if(!(typeof window>"u"))try{localStorage.removeItem(this.getStorageKey(e));}catch{}}getCartToken(){return this.get("cartToken")}setCartToken(e){this.set("cartToken",e);}removeCartToken(){this.remove("cartToken");}clear(){if(!(typeof window>"u"))try{let e=Object.keys(localStorage),t=this.getStorageKey("");e.forEach(a=>{a.startsWith(t)&&localStorage.removeItem(a);});}catch{}}};var R=class{constructor(e){this.client=e;}unwrapResponse(e){if(!e.success)throw new Error(e.message||"Cart operation failed");if(e.data===null)throw new Error("Cart data is null");return e.data}async createCart(e){let t=await this.client.createCart({merchantName:e});return this.unwrapResponse(t)}async getCart(e){let t=await this.client.getCart({id:e});return this.unwrapResponse(t)}async addToCart(e,t){let a=await this.client.addToCart({id:e,items:t});this.unwrapResponse(a);}async removeFromCart(e,t){let a=await this.client.removeFromCart({id:e,itemIds:t});this.unwrapResponse(a);}async updateCart(e,t){let a=await this.client.updateCart({id:e,items:t});this.unwrapResponse(a);}};function A(r){return r&&typeof r.getCart=="function"&&typeof r.createCart=="function"&&typeof r.addToCart=="function"}function L(r,e,t,a="INR"){let i=e?r.variants?.find(n=>n.id===e)||r.variants?.[0]:r.variants?.find(n=>n.available)||r.variants?.[0],o=i?.price||r.price||r.priceRange?.minVariantPrice,s=typeof o=="number"?{amount:o,currencyCode:a}:o?{...o,currencyCode:o.currencyCode||a}:{amount:0,currencyCode:a},u=i?.compareAtPrice||r.compareAtPrice,d=u?typeof u=="number"?{amount:u,currencyCode:a}:{...u,currencyCode:u.currencyCode||a}:void 0;return {id:`${r.id}-${e||i?.id||"default"}`,productId:r.id,variantId:e||i?.id,sku:i?.sku||r.sku,title:r.title,price:s,compareAtPrice:d,quantity:t||r.quantity||1,image:r.images?.[0]?.url||r.image,vendor:r.vendor,product_type:r.product_type||r.productType}}function w(r,e="USD",t){try{return new Intl.NumberFormat(t,{style:"currency",currency:e}).format(r)}catch{return `${e} ${r.toFixed(2)}`}}function S(r){return r.reduce((e,t)=>{let a=typeof t.price=="number"?t.price:t.price.amount;return e+a*t.quantity},0)}function b(r){return r.reduce((e,t)=>{if(!t.compareAtPrice)return e;let a=typeof t.price=="number"?t.price:t.price.amount,o=(typeof t.compareAtPrice=="number"?t.compareAtPrice:t.compareAtPrice.amount)-a;return e+Math.max(0,o)*t.quantity},0)}function x({merchantName:r}){let e=p(a=>a.initializeCart),t=p(a=>a.isOpen);return useEffect(()=>{e(r);},[r,e]),useEffect(()=>(document.body.style.overflow=t?"hidden":"",()=>{document.body.style.overflow="";}),[t]),null}export{x as CartInitializer,R as DataLayerCartService,v as DefaultCartService,T as DefaultCartStorage,S as calculateCartTotal,b as calculateSavings,_ as configureCart,w as formatPrice,g as getCartConfig,E as isCartConfigured,A as isDataLayerClient,L as mapProductToCartItem,q as useCartCount,Q as useCartItem,U as useCartItems,z as useCartStatus,p as useCartStore,F as useCartToggle,N as useCartTotal,j as useCartTotalAmount,D as useCartTotalQuantity,K as useCheckoutUrl,$ as useIsInCart};
{
"name": "@shopkit/cart",
"version": "0.1.2",
"version": "0.1.3",
"description": "Cart state management, hooks, and services for e-commerce storefronts",

@@ -5,0 +5,0 @@ "main": "./dist/index.js",