react-use-cart
Version:
React hook library for managing cart state.
3 lines (2 loc) • 3.91 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});var t=require("react");function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t}).apply(this,arguments)}function r(e,r){var n=t.useState((function(){try{return"undefined"!=typeof window&&window.localStorage.getItem(e)||r}catch(t){return r}})),a=n[0],i=n[1];return[a,function(t){try{var r=t instanceof Function?t(a):t;i(r),window.localStorage.setItem(e,r)}catch(t){console.log(t)}}]}var n={items:[],isEmpty:!0,totalItems:0,totalUniqueItems:0,cartTotal:0,metadata:{}},a=t.createContext(n),i=function(t){return void 0===t&&(t=12),[].concat(Array(t)).map((function(){return(~~(36*Math.random())).toString(36)})).join("")};function o(t,r){switch(r.type){case"SET_ITEMS":return u(t,r.payload);case"ADD_ITEM":var a=[].concat(t.items,[r.payload]);return u(t,a);case"UPDATE_ITEM":var i=t.items.map((function(t){return t.id!==r.id?t:e({},t,r.payload)}));return u(t,i);case"REMOVE_ITEM":var o=t.items.filter((function(t){return t.id!==r.id}));return u(t,o);case"EMPTY_CART":return n;case"CLEAR_CART_META":return e({},t,{metadata:{}});case"SET_CART_META":return e({},t,{metadata:e({},r.payload)});case"UPDATE_CART_META":return e({},t,{metadata:e({},t.metadata,r.payload)});default:throw new Error("No action specified")}}var u=function(t,r){void 0===t&&(t=n);var a=f(r),i=0===a;return e({},n,t,{items:c(r),totalItems:s(r),totalUniqueItems:a,cartTotal:d(r),isEmpty:i})},c=function(t){return t.map((function(t){return e({},t,{itemTotal:t.price*t.quantity})}))},d=function(t){return t.reduce((function(t,e){return t+e.quantity*e.price}),0)},s=function(t){return t.reduce((function(t,e){return t+e.quantity}),0)},f=function(t){return t.length};exports.CartProvider=function(u){var c=u.children,d=u.id,s=u.defaultItems,f=void 0===s?[]:s,p=u.onSetItems,m=u.onItemAdd,y=u.onItemUpdate,E=u.onItemRemove,l=u.onEmptyCart,T=u.storage,v=void 0===T?r:T,I=u.metadata,M=d||i(),_=v(d?"react-use-cart-"+M:"react-use-cart",JSON.stringify(e({id:M},n,{items:f,metadata:I}))),A=_[1],C=t.useReducer(o,JSON.parse(_[0])),w=C[0],h=C[1];return t.useEffect((function(){A(JSON.stringify(w))}),[w,A]),t.createElement(a.Provider,{value:e({},w,{getItem:function(t){return w.items.find((function(e){return e.id===t}))},inCart:function(t){return w.items.some((function(e){return e.id===t}))},setItems:function(t){h({type:"SET_ITEMS",payload:t.map((function(t){return e({},t,{quantity:t.quantity||1})}))}),p&&p(t)},addItem:function(t,r){if(void 0===r&&(r=1),!t.id)throw new Error("You must provide an `id` for items");if(!(r<=0)){var n=w.items.find((function(e){return e.id===t.id}));if(!n&&!t.hasOwnProperty("price"))throw new Error("You must pass a `price` for new items");if(!n){var a=e({},t,{quantity:r});return h({type:"ADD_ITEM",payload:a}),void(m&&m(a))}var i=e({},t,{quantity:n.quantity+r});h({type:"UPDATE_ITEM",id:t.id,payload:i}),y&&y(i)}},updateItem:function(t,e){t&&e&&(h({type:"UPDATE_ITEM",id:t,payload:e}),y&&y(e))},updateItemQuantity:function(t,r){if(r<=0)return E&&E(t),void h({type:"REMOVE_ITEM",id:t});var n=w.items.find((function(e){return e.id===t}));if(!n)throw new Error("No such item to update");var a=e({},n,{quantity:r});h({type:"UPDATE_ITEM",id:t,payload:a}),y&&y(a)},removeItem:function(t){t&&(h({type:"REMOVE_ITEM",id:t}),E&&E(t))},emptyCart:function(){h({type:"EMPTY_CART"}),l&&l()},clearCartMetadata:function(){h({type:"CLEAR_CART_META"})},setCartMetadata:function(t){t&&h({type:"SET_CART_META",payload:t})},updateCartMetadata:function(t){t&&h({type:"UPDATE_CART_META",payload:t})}})},c)},exports.createCartIdentifier=i,exports.initialState=n,exports.useCart=function(){var e=t.useContext(a);if(!e)throw new Error("Expected to be wrapped in a CartProvider");return e};
//# sourceMappingURL=react-use-cart.cjs.production.min.js.map