UNPKG

4.91 kBJavaScriptView Raw
1import produce from 'immer';
2export function reducer(state, action) {
3 switch (action.type) {
4 case 'LOGIN':
5 return produce(state, draft => {
6 draft.loggedIn = true;
7 draft.list = action.payload;
8 });
9 case 'LOGOUT': {
10 return produce(state, draft => {
11 draft.loggedIn = false;
12 draft.list = {};
13 });
14 }
15 case 'UPDATE': {
16 const { articleNumber, variantArticleNumber, options, variantToReplace } = action.payload;
17 return replaceItemInList(state, articleNumber, {
18 variantArticleNumber,
19 variantToReplace,
20 options
21 });
22 }
23 case 'ADD': {
24 const { variantArticleNumber, articleNumber, options } = action.payload;
25 if (variantArticleNumber) {
26 return addVariantToList(state, articleNumber, {
27 variantArticleNumber,
28 options
29 });
30 }
31 else {
32 return addBaseProductToList(state, articleNumber, options);
33 }
34 }
35 case 'REMOVE': {
36 const { variantArticleNumber, articleNumber } = action.payload;
37 const list = removeFromList(state, articleNumber, {
38 variantArticleNumber
39 });
40 return list;
41 }
42 case 'REPLACE': {
43 return produce(state, draft => {
44 draft.list = action.payload;
45 });
46 }
47 default:
48 throw new Error(`Unsupported action ${action} for product list reducer`);
49 }
50}
51export function init(initialState) {
52 if (typeof window === 'undefined')
53 return initialState;
54 const updatedState = {
55 list: JSON.parse(window.localStorage.getItem('productList')) ||
56 initialState.list ||
57 null,
58 loggedIn: initialState.loggedIn,
59 requestIdRef: initialState.requestIdRef
60 };
61 return updatedState;
62}
63export function addVariantToList(state, articleNumber, { variantArticleNumber, options }) {
64 // If the article number exists, update it
65 // Otherwise create a new entry
66 return produce(state, draft => {
67 var _a, _b;
68 draft.list[articleNumber] = {
69 options: ((_a = draft.list[articleNumber]) === null || _a === void 0 ? void 0 : _a.options) || null,
70 variants: produce(((_b = draft.list[articleNumber]) === null || _b === void 0 ? void 0 : _b.variants) || {}, draft => {
71 draft[variantArticleNumber] = {
72 options,
73 parentArticleNumber: articleNumber
74 };
75 })
76 };
77 });
78}
79export function addBaseProductToList(state, articleNumber, options) {
80 return produce(state, draft => {
81 var _a;
82 draft.list[articleNumber] = {
83 variants: ((_a = draft.list[articleNumber]) === null || _a === void 0 ? void 0 : _a.variants) || null,
84 options
85 };
86 });
87}
88export function removeFromList(state, articleNumber, { variantArticleNumber }) {
89 if (variantArticleNumber) {
90 return produce(state, draft => {
91 delete draft.list[articleNumber].variants[variantArticleNumber];
92 if (Object.keys(draft.list[articleNumber].variants).length === 0 &&
93 draft.list[articleNumber].options === null) {
94 delete draft.list[articleNumber];
95 }
96 });
97 }
98 else {
99 return produce(state, draft => {
100 if (draft.list[articleNumber].variants) {
101 draft.list[articleNumber].options = null;
102 }
103 else {
104 delete draft.list[articleNumber];
105 }
106 });
107 }
108}
109export function replaceItemInList(state, articleNumber, { variantToReplace, variantArticleNumber, options }) {
110 if (variantToReplace) {
111 return produce(state, draft => {
112 // Replacing is a delete + an add
113 const variants = draft.list[articleNumber].variants;
114 delete variants[variantToReplace];
115 draft.list[articleNumber].variants = Object.assign(Object.assign({}, variants), { [variantArticleNumber]: {
116 options,
117 parentArticleNumber: articleNumber
118 } });
119 });
120 }
121 else {
122 return produce(state, draft => {
123 var _a;
124 draft.list[articleNumber] = {
125 options: null,
126 variants: Object.assign(Object.assign({}, (_a = draft.list[articleNumber]) === null || _a === void 0 ? void 0 : _a.variants), { [variantArticleNumber]: {
127 options,
128 parentArticleNumber: articleNumber
129 } })
130 };
131 });
132 }
133}
134//# sourceMappingURL=product-list-reducer.js.map
\No newline at end of file