1 | import produce from 'immer';
|
2 | export 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 | }
|
51 | export 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 | }
|
63 | export function addVariantToList(state, articleNumber, { variantArticleNumber, options }) {
|
64 |
|
65 |
|
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 | }
|
79 | export 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 | }
|
88 | export 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 | }
|
109 | export function replaceItemInList(state, articleNumber, { variantToReplace, variantArticleNumber, options }) {
|
110 | if (variantToReplace) {
|
111 | return produce(state, draft => {
|
112 |
|
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 |
|
\ | No newline at end of file |