UNPKG

3.29 kBJavaScriptView Raw
1import React, { useEffect, useMemo, useState } from 'react';
2import { useMutation } from 'react-apollo';
3import { addAction, clearAction, removeAction, updateAction } from './action-creators';
4import { flattenList } from './list-transforms';
5import { ProductListContext } from './ProductListContext';
6import { trackAddToWishListEvent } from '../../analytics/tracking';
7import { useTracker } from '../../analytics/Analytics';
8export function useProductList() {
9 const { state: { list }, dispatch, queries, usingLocalList } = React.useContext(ProductListContext);
10 const [hydrated, setHydrated] = useState(!usingLocalList);
11 const updateAPI = !usingLocalList;
12 const removeMutation = useMutation(queries.remove);
13 const addMutation = useMutation(queries.add);
14 const track = useTracker();
15 function toggle(articleNumber, { variantArticleNumber, quantity, description, productName }) {
16 if (inList(articleNumber, { variantArticleNumber })) {
17 remove(articleNumber, { variantArticleNumber });
18 }
19 else {
20 add(articleNumber, {
21 variantArticleNumber,
22 quantity,
23 description,
24 productName
25 });
26 }
27 }
28 function remove(articleNumber, { variantArticleNumber }) {
29 dispatch(removeAction({
30 articleNumber,
31 variantArticleNumber,
32 removeMutation,
33 updateAPI
34 }));
35 }
36 function add(articleNumber, { variantArticleNumber, quantity = 1, description, productName }) {
37 track(trackAddToWishListEvent({
38 articleNumber: variantArticleNumber || articleNumber,
39 productName
40 }));
41 dispatch(addAction({
42 updateAPI,
43 articleNumber,
44 variantArticleNumber,
45 options: { quantity, description },
46 addMutation
47 }));
48 }
49 function update(articleNumber, { variantArticleNumber, quantity, description, variantToReplace }) {
50 dispatch(updateAction({
51 updateAPI,
52 articleNumber,
53 variantArticleNumber,
54 variantToReplace,
55 options: { quantity, description },
56 removeMutation,
57 addMutation
58 }));
59 }
60 function clear() {
61 dispatch(clearAction({ removeMutation, updateAPI }));
62 }
63 function inList(articleNumber, { variantArticleNumber }) {
64 var _a;
65 if (!hydrated)
66 return false;
67 if (articleNumber in list) {
68 if (!variantArticleNumber)
69 return true;
70 const variantInList = !!((_a = list[articleNumber].variants) === null || _a === void 0 ? void 0 : _a[variantArticleNumber]);
71 return variantInList;
72 }
73 else {
74 return false;
75 }
76 }
77 // When using localStorage, we only want to display the list values after
78 // hydration, to avoid the initial server and client render being different
79 useEffect(() => {
80 setHydrated(true);
81 }, []);
82 const count = useMemo(() => {
83 return hydrated ? flattenList(list).length : 0;
84 }, [hydrated, list]);
85 return { toggle, add, remove, update, clear, inList, list, count };
86}
87//# sourceMappingURL=useProductList.js.map
\No newline at end of file