UNPKG

react-use-watchlist

Version:

React hook library for managing watchlist state.

3 lines (2 loc) 3.79 kB
"use strict";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 n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t}).apply(this,arguments)}function n(e,n){var r=t.useState((function(){try{return"undefined"!=typeof window&&window.localStorage.getItem(e)||n}catch(t){return n}})),a=r[0],i=r[1];return[a,function(t){try{var n=t instanceof Function?t(a):t;i(n),window.localStorage.setItem(e,n)}catch(t){console.log(t)}}]}var r={items:[],isEmpty:!0,totalItems:0,totalUniqueItems:0,metadata:{}},a=t.createContext(r),i=function(t){return void 0===t&&(t=12),[].concat(Array(t)).map((function(){return(~~(36*Math.random())).toString(36)})).join("")};function o(t,n){switch(n.type){case"SET_ITEMS":return u(t,n.payload);case"ADD_ITEM":var a=[].concat(t.items,[n.payload]);return u(t,a);case"UPDATE_ITEM":var i=t.items.map((function(t){return t.id!==n.id?t:e({},t,n.payload)}));return u(t,i);case"REMOVE_ITEM":var o=t.items.filter((function(t){return t.id!==n.id}));return u(t,o);case"EMPTY_WATCHLIST":return r;case"CLEAR_WATCHLIST_META":return e({},t,{metadata:{}});case"SET_WATCHLIST_META":return e({},t,{metadata:e({},n.payload)});case"UPDATE_WATCHLIST_META":return e({},t,{metadata:e({},t.metadata,n.payload)});default:throw new Error("No action specified")}}var u=function(t,n){void 0===t&&(t=r);var a=s(n),i=0===a;return e({},r,t,{items:c(n),totalItems:d(n),totalUniqueItems:a,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}),0)},s=function(t){return t.length};exports.WatchlistProvider=function(u){var c=u.children,d=u.id,s=u.defaultItems,f=void 0===s?[]:s,p=u.onSetItems,m=u.onItemAdd,l=u.onItemUpdate,y=u.onItemRemove,E=u.storage,T=void 0===E?n:E,I=u.metadata,v=d||i(),M=T(d?"react-use-watchlist-"+v:"react-use-watchlist",JSON.stringify(e({id:v},r,{items:f,metadata:I}))),_=M[1],A=t.useReducer(o,JSON.parse(M[0])),h=A[0],S=A[1];return t.useEffect((function(){_(JSON.stringify(h))}),[h,_]),t.createElement(a.Provider,{value:e({},h,{getItem:function(t){return h.items.find((function(e){return e.id===t}))},inWatchlist:function(t){return h.items.some((function(e){return e.id===t}))},setItems:function(t){S({type:"SET_ITEMS",payload:t.map((function(t){return e({},t,{quantity:t.quantity||1})}))}),p&&p(t)},addItem:function(t,n){if(void 0===n&&(n=1),!t.id)throw new Error("You must provide an `id` for items");var r=h.items.find((function(e){return e.id===t.id}));if(!r){var a=e({},t,{quantity:n});return S({type:"ADD_ITEM",payload:a}),void(m&&m(a))}var i=e({},t,{quantity:r.quantity+n});S({type:"UPDATE_ITEM",id:t.id,payload:i}),l&&l(i)},updateItem:function(t,e){t&&e&&(S({type:"UPDATE_ITEM",id:t,payload:e}),l&&l(e))},updateItemQuantity:function(t,n){if(n<=0)return y&&y(t),void S({type:"REMOVE_ITEM",id:t});var r=h.items.find((function(e){return e.id===t}));if(!r)throw new Error("No such item to update");var a=e({},r,{quantity:n});S({type:"UPDATE_ITEM",id:t,payload:a}),l&&l(a)},removeItem:function(t){t&&(S({type:"REMOVE_ITEM",id:t}),y&&y(t))},emptyWatchlist:function(){return S({type:"EMPTY_WATCHLIST"})},clearWatchlistMetadata:function(){S({type:"CLEAR_WATCHLIST_META"})},setWatchlistMetadata:function(t){t&&S({type:"SET_WATCHLIST_META",payload:t})},updateWatchlistMetadata:function(t){t&&S({type:"UPDATE_WATCHLIST_META",payload:t})}})},c)},exports.createWatchlistIdentifier=i,exports.initialState=r,exports.useWatchlist=function(){var e=t.useContext(a);if(!e)throw new Error("Expected to be wrapped in a WatchlistProvider");return e}; //# sourceMappingURL=react-use-watchlist.cjs.production.min.js.map