1 | import React, { useEffect, useMemo, useState } from 'react';
|
2 | import { useMutation } from 'react-apollo';
|
3 | import { addAction, clearAction, removeAction, updateAction } from './action-creators';
|
4 | import { flattenList } from './list-transforms';
|
5 | import { ProductListContext } from './ProductListContext';
|
6 | import { trackAddToWishListEvent } from '../../analytics/tracking';
|
7 | import { useTracker } from '../../analytics/Analytics';
|
8 | export 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 |
|
78 |
|
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 |
|
\ | No newline at end of file |