@jetshop/core 5.10.0 → 5.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. package/ChannelHandler/ChannelHandler.d.ts +9 -13
  2. package/ChannelHandler/ChannelHandler.js +16 -63
  3. package/ChannelHandler/ChannelHandler.js.map +1 -1
  4. package/ChannelHandler/channelUtils.d.ts +13 -0
  5. package/ChannelHandler/channelUtils.js +26 -15
  6. package/ChannelHandler/channelUtils.js.map +1 -1
  7. package/ChannelHandler/redirectUtils.d.ts +3 -0
  8. package/ChannelHandler/redirectUtils.js +48 -0
  9. package/ChannelHandler/redirectUtils.js.map +1 -0
  10. package/ChannelHandler/redirectUtils.test.js +8 -0
  11. package/analytics/AnalyticsProvider.d.ts +4 -0
  12. package/analytics/AnalyticsProvider.js +18 -2
  13. package/analytics/AnalyticsProvider.js.map +1 -1
  14. package/analytics/integrations/ga4.js +1 -1
  15. package/analytics/integrations/ga4.js.map +1 -1
  16. package/analytics/integrations/gtag/gtag.d.ts +0 -1
  17. package/analytics/integrations/gtag/gtag.js +39 -28
  18. package/analytics/integrations/gtag/gtag.js.map +1 -1
  19. package/analytics/integrations/gtm/index.d.ts +0 -1
  20. package/analytics/integrations/gtm/index.js +37 -24
  21. package/analytics/integrations/gtm/index.js.map +1 -1
  22. package/analytics/integrations/releware/index.js +1 -1
  23. package/analytics/integrations/releware/index.js.map +1 -1
  24. package/analytics/integrations/unslugify.d.ts +1 -0
  25. package/analytics/integrations/unslugify.js +18 -0
  26. package/analytics/integrations/unslugify.js.map +1 -0
  27. package/analytics/trackerRegistry.d.ts +8 -3
  28. package/analytics/trackerRegistry.js +31 -14
  29. package/analytics/trackerRegistry.js.map +1 -1
  30. package/analytics/utils/breadcrumbsWithoutProduct.d.ts +1 -0
  31. package/analytics/utils/breadcrumbsWithoutProduct.js +9 -0
  32. package/analytics/utils/breadcrumbsWithoutProduct.js.map +1 -0
  33. package/boot/PreviewHandler.js.map +1 -1
  34. package/boot/SharedTree.js +1 -1
  35. package/boot/SharedTree.js.map +1 -1
  36. package/boot/apollo.d.ts +5 -3
  37. package/boot/apollo.js +9 -13
  38. package/boot/apollo.js.map +1 -1
  39. package/boot/client/startClient.js +5 -10
  40. package/boot/client/startClient.js.map +1 -1
  41. package/boot/server/createRenderer.js +8 -7
  42. package/boot/server/createRenderer.js.map +1 -1
  43. package/boot/server/index.js +2 -2
  44. package/boot/server/index.js.map +1 -1
  45. package/boot/server/persistedQueries/__tests__/getPersistedQueriesForRequest.test.js +53 -39
  46. package/boot/server/persistedQueries/getPersistedQueriesForRequest.js +2 -2
  47. package/boot/server/persistedQueries/getPersistedQueriesForRequest.js.map +1 -1
  48. package/cart/AddToCartFormik.d.ts +2 -2
  49. package/cart/AddToCartFormik.js +11 -11
  50. package/cart/AddToCartFormik.js.map +1 -1
  51. package/components/Auth/CustomerUpdateForm.js +7 -7
  52. package/components/Auth/CustomerUpdateForm.js.map +1 -1
  53. package/components/ChannelContext/ChannelContext.d.ts +2 -0
  54. package/components/ChannelContext/ChannelContext.js.map +1 -1
  55. package/components/ChannelContext/ChannelProvider.d.ts +1 -3
  56. package/components/ChannelContext/ChannelProvider.js +16 -6
  57. package/components/ChannelContext/ChannelProvider.js.map +1 -1
  58. package/components/ChannelContext/ChannelProvider.test.js +112 -0
  59. package/components/ConfigProvider.d.ts +2 -0
  60. package/components/ConfigProvider.js.map +1 -1
  61. package/components/DynamicRoute/CategoryRoute.js +9 -2
  62. package/components/DynamicRoute/CategoryRoute.js.map +1 -1
  63. package/components/DynamicRoute/ContentRoute.js +9 -1
  64. package/components/DynamicRoute/ContentRoute.js.map +1 -1
  65. package/components/DynamicRoute/PreviewRoute.js +12 -2
  66. package/components/DynamicRoute/PreviewRoute.js.map +1 -1
  67. package/components/DynamicRoute/ProductRoute.js +12 -4
  68. package/components/DynamicRoute/ProductRoute.js.map +1 -1
  69. package/components/Head.js +4 -4
  70. package/components/Head.js.map +1 -1
  71. package/components/Mutation/AddToCart/addToCartUtils.d.ts +1 -1
  72. package/components/Mutation/AddToCart/addToCartUtils.js +7 -1
  73. package/components/Mutation/AddToCart/addToCartUtils.js.map +1 -1
  74. package/components/Mutation/RemoveFromCart.js +10 -1
  75. package/components/Mutation/RemoveFromCart.js.map +1 -1
  76. package/components/Mutation/cartMutationUtils.js +7 -6
  77. package/components/Mutation/cartMutationUtils.js.map +1 -1
  78. package/components/Mutation/useDecrementQuantity.js +8 -3
  79. package/components/Mutation/useDecrementQuantity.js.map +1 -1
  80. package/components/Mutation/useIncrementQuantity.js +8 -3
  81. package/components/Mutation/useIncrementQuantity.js.map +1 -1
  82. package/components/Mutation/useRemoveFromCart.js +10 -1
  83. package/components/Mutation/useRemoveFromCart.js.map +1 -1
  84. package/components/PreviewContext.js +3 -1
  85. package/components/PreviewContext.js.map +1 -1
  86. package/components/Query/CartProvider.js +31 -21
  87. package/components/Query/CartProvider.js.map +1 -1
  88. package/components/StructuredData/StructuredBreadcrumbData.d.ts +8 -3
  89. package/components/StructuredData/StructuredBreadcrumbData.js +42 -23
  90. package/components/StructuredData/StructuredBreadcrumbData.js.map +1 -1
  91. package/components/StructuredData/StructuredCategoryData.d.ts +16 -0
  92. package/components/StructuredData/StructuredCategoryData.js +18 -0
  93. package/components/StructuredData/StructuredCategoryData.js.map +1 -0
  94. package/components/StructuredData/StructuredPageData.d.ts +16 -0
  95. package/components/StructuredData/StructuredPageData.js +17 -0
  96. package/components/StructuredData/StructuredPageData.js.map +1 -0
  97. package/components/StructuredData/StructuredProductData.js +2 -2
  98. package/components/StructuredData/StructuredProductData.js.map +1 -1
  99. package/components/StructuredData/index.d.ts +2 -0
  100. package/components/StructuredData/index.js +2 -0
  101. package/components/StructuredData/index.js.map +1 -1
  102. package/data/fragments/ChannelsFragment.gql +4 -0
  103. package/data/fragments/ProductListsFragments.gql +94 -0
  104. package/data/fragments/RouteMetaFragment.gql +18 -0
  105. package/data/mutations/productListMutations.gql +18 -0
  106. package/data/queries/ProductLists.gql +8 -0
  107. package/dependencies.d.ts +10 -1
  108. package/helpers/isRelativeUrl.d.ts +1 -0
  109. package/helpers/isRelativeUrl.js +4 -0
  110. package/helpers/isRelativeUrl.js.map +1 -0
  111. package/hooks/PackageProducts/usePackageProductItem.d.ts +3 -4
  112. package/hooks/ProductList/ProductListContext.js +49 -14
  113. package/hooks/ProductList/ProductListContext.js.map +1 -1
  114. package/hooks/ProductList/ProductLists.gql +0 -0
  115. package/hooks/ProductList/action-creators.d.ts +20 -7
  116. package/hooks/ProductList/action-creators.js +125 -31
  117. package/hooks/ProductList/action-creators.js.map +1 -1
  118. package/hooks/ProductList/index.d.ts +34 -8
  119. package/hooks/ProductList/index.js +19 -0
  120. package/hooks/ProductList/index.js.map +1 -1
  121. package/hooks/ProductList/list-transforms.d.ts +2 -2
  122. package/hooks/ProductList/list-transforms.js +22 -22
  123. package/hooks/ProductList/list-transforms.js.map +1 -1
  124. package/hooks/ProductList/list-transforms.test.js +103 -100
  125. package/hooks/ProductList/product-list-reducer.d.ts +37 -14
  126. package/hooks/ProductList/product-list-reducer.js +106 -43
  127. package/hooks/ProductList/product-list-reducer.js.map +1 -1
  128. package/hooks/ProductList/product-list-reducer.test.js +144 -82
  129. package/hooks/ProductList/useProductList.d.ts +2 -2
  130. package/hooks/ProductList/useProductList.js +12 -5
  131. package/hooks/ProductList/useProductList.js.map +1 -1
  132. package/hooks/ProductList/useProductListItems.d.ts +1 -1
  133. package/hooks/ProductList/useProductListItems.js +8 -6
  134. package/hooks/ProductList/useProductListItems.js.map +1 -1
  135. package/hooks/useAddMultipleToCart.js +11 -5
  136. package/hooks/useAddMultipleToCart.js.map +1 -1
  137. package/hooks/useProductVariants/useProductVariants.d.ts +1 -2
  138. package/hooks/useProductVariants/useProductVariants.js +1 -1
  139. package/hooks/useProductVariants/useProductVariants.js.map +1 -1
  140. package/package.json +1 -1
  141. package/resolvers/index.d.ts +3 -0
  142. package/resolvers/index.js +3 -0
  143. package/resolvers/index.js.map +1 -1
  144. package/sentry/client.js +1 -1
  145. package/sentry/client.js.map +1 -1
  146. package/server/tracking/facebook.d.ts +1 -1
  147. package/server/tracking/facebook.js +4 -2
  148. package/server/tracking/facebook.js.map +1 -1
  149. package/server/tracking/types.d.ts +3 -1
  150. package/time.d.ts +1 -0
  151. package/time.js +6 -0
  152. package/time.js.map +1 -0
  153. package/types.d.ts +5 -2
@@ -1,12 +1,16 @@
1
1
  import { act, renderHook } from '@testing-library/react-hooks';
2
2
  import { useReducer } from 'react';
3
3
  import { reducer, init } from './product-list-reducer';
4
+ import {
5
+ productListMapToArray,
6
+ PRODUCT_LISTS_KEY
7
+ } from '@jetshop/core/hooks/ProductList';
4
8
  import { LocalStorageMock } from '@react-mock/localstorage';
5
9
  import { render } from '@testing-library/react';
6
10
  import React from 'react';
7
11
 
8
- const MOCK_LIST = {
9
- '6952315': {
12
+ const MOCK_LIST_ITEMS = {
13
+ 6952315: {
10
14
  options: { quantity: 1 },
11
15
  variants: {
12
16
  '6952315-170-white': {
@@ -17,7 +21,7 @@ const MOCK_LIST = {
17
21
  }
18
22
  }
19
23
  },
20
- '502935480': {
24
+ 502935480: {
21
25
  variants: null,
22
26
  options: {
23
27
  quantity: 1
@@ -47,22 +51,25 @@ describe('reducer init method', () => {
47
51
  const obj = {
48
52
  key: 'value'
49
53
  };
54
+ const listId = 'test';
50
55
 
51
56
  function Parent({ children }) {
52
- const mockList = JSON.stringify(obj);
57
+ const mockList = new Map([[listId, obj]]);
58
+ const localStorage = {};
59
+ localStorage[PRODUCT_LISTS_KEY] = JSON.stringify(
60
+ productListMapToArray(mockList)
61
+ );
53
62
  return (
54
- <LocalStorageMock items={{ productList: mockList }}>
55
- {children}
56
- </LocalStorageMock>
63
+ <LocalStorageMock items={localStorage}>{children}</LocalStorageMock>
57
64
  );
58
65
  }
59
66
  function Child() {
60
- const initialState = { loggedIn: false, list: {} };
67
+ const initialState = { loggedIn: false, lists: new Map() };
61
68
  const state = init(initialState);
62
69
 
63
70
  return (
64
71
  <div>
65
- <span>{state.list.key}</span>
72
+ <span>{state.lists.get(listId).key}</span>
66
73
  <span>{state.loggedIn ? 'logged in' : 'not logged in'}</span>
67
74
  </div>
68
75
  );
@@ -80,21 +87,45 @@ describe('reducer init method', () => {
80
87
  });
81
88
 
82
89
  describe('reducer', () => {
90
+ const initialState = {
91
+ loggedIn: false,
92
+ lists: new Map([[null, { name: null, items: MOCK_LIST_ITEMS }]])
93
+ };
94
+
83
95
  it('sets logged in and payload when LOGIN is called', () => {
84
96
  const { result, dispatch } = setup();
85
- const payload = { test: 'one' };
97
+
98
+ // We should only test listId null, logged out users shouldn't have lists with IDs.
99
+ // We could remove the listId from the payload to make null implicit
100
+ const payload = {
101
+ listId: null,
102
+ list: {
103
+ name: null,
104
+ items: {
105
+ test: 'one'
106
+ }
107
+ }
108
+ };
86
109
 
87
110
  act(() => dispatch({ type: 'LOGIN', payload }));
88
111
 
89
112
  const [state] = result.current;
90
113
 
91
114
  expect(state.loggedIn).toBe(true);
92
- expect(state.list).toBe(payload);
115
+ expect(state.lists.get(null).items).toMatchObject(payload.list.items);
93
116
  });
94
117
  it('sets loggedIn and resets list on LOGOUT', () => {
95
118
  const initialState = {
96
119
  loggedIn: true,
97
- list: { '234523423': { options: { quantity: 1, description: '' } } }
120
+ lists: new Map([
121
+ [
122
+ null,
123
+ {
124
+ name: null,
125
+ items: { 234523423: { options: { quantity: 1, description: '' } } }
126
+ }
127
+ ]
128
+ ])
98
129
  };
99
130
 
100
131
  const { result, dispatch } = setup(initialState);
@@ -109,21 +140,19 @@ describe('reducer', () => {
109
140
  const [state] = result.current;
110
141
 
111
142
  expect(state.loggedIn).toBe(false);
112
- expect(state.list).toMatchObject({});
143
+ expect(state.lists).toMatchObject(
144
+ new Map([[null, { name: null, items: {} }]])
145
+ );
113
146
  });
114
147
  describe('UPDATE action', () => {
115
148
  it('can replace a base product with one of its variants', () => {
116
- const initialState = {
117
- loggedIn: false,
118
- list: MOCK_LIST
119
- };
120
-
121
149
  const { result, dispatch } = setup(initialState);
122
150
 
123
151
  act(() =>
124
152
  dispatch({
125
153
  type: 'UPDATE',
126
154
  payload: {
155
+ listId: null,
127
156
  articleNumber: '502935480',
128
157
  variantArticleNumber: '502935480-sparkles',
129
158
  options: {
@@ -135,7 +164,7 @@ describe('reducer', () => {
135
164
 
136
165
  const [state] = result.current;
137
166
 
138
- const baseProduct = state.list['502935480'];
167
+ const baseProduct = state.lists.get(null).items['502935480'];
139
168
 
140
169
  expect(baseProduct.variants['502935480-sparkles'].options.quantity).toBe(
141
170
  1
@@ -144,17 +173,13 @@ describe('reducer', () => {
144
173
  expect(baseProduct.options).toBe(null);
145
174
  });
146
175
  it('can replace a variant with another variant', () => {
147
- const initialState = {
148
- loggedIn: false,
149
- list: MOCK_LIST
150
- };
151
-
152
176
  const { result, dispatch } = setup(initialState);
153
177
 
154
178
  act(() =>
155
179
  dispatch({
156
180
  type: 'UPDATE',
157
181
  payload: {
182
+ listId: null,
158
183
  articleNumber: '6952315',
159
184
  variantArticleNumber: '6952315-170-pink',
160
185
  options: {
@@ -166,28 +191,25 @@ describe('reducer', () => {
166
191
  );
167
192
 
168
193
  const [state] = result.current;
194
+ const list = state.lists.get(null);
169
195
 
170
196
  expect(
171
- state.list['6952315'].variants['6952315-170-pink'].options.quantity
197
+ list.items['6952315'].variants['6952315-170-pink'].options.quantity
172
198
  ).toBe(1);
173
199
  expect(
174
- state.list['6952315'].variants['6952315-170-white']
200
+ list.items['6952315'].variants['6952315-170-white']
175
201
  ).not.toBeDefined();
176
202
  });
177
203
  });
178
204
  describe('ADD action', () => {
179
205
  it('can add a base product to the list', () => {
180
- const initialState = {
181
- loggedIn: false,
182
- list: MOCK_LIST
183
- };
184
-
185
206
  const { result, dispatch } = setup(initialState);
186
207
 
187
208
  act(() =>
188
209
  dispatch({
189
210
  type: 'ADD',
190
211
  payload: {
212
+ listId: null,
191
213
  articleNumber: 'boogie',
192
214
  options: {
193
215
  quantity: 1
@@ -198,20 +220,16 @@ describe('reducer', () => {
198
220
 
199
221
  const [state] = result.current;
200
222
 
201
- expect(state.list['boogie'].options.quantity).toBe(1);
223
+ expect(state.lists.get(null).items['boogie'].options.quantity).toBe(1);
202
224
  });
203
225
  it('can add a variant to the list when there is no existing base product', () => {
204
- const initialState = {
205
- loggedIn: false,
206
- list: MOCK_LIST
207
- };
208
-
209
226
  const { result, dispatch } = setup(initialState);
210
227
 
211
228
  act(() =>
212
229
  dispatch({
213
230
  type: 'ADD',
214
231
  payload: {
232
+ listId: null,
215
233
  articleNumber: 'boogie',
216
234
  variantArticleNumber: 'boogie-woogie',
217
235
  options: {
@@ -222,24 +240,21 @@ describe('reducer', () => {
222
240
  );
223
241
 
224
242
  const [state] = result.current;
243
+ const list = state.lists.get(null);
225
244
 
226
- expect(state.list['boogie'].options).toBe(null);
245
+ expect(list.items['boogie'].options).toBe(null);
227
246
  expect(
228
- state.list['boogie'].variants['boogie-woogie'].options.quantity
247
+ list.items['boogie'].variants['boogie-woogie'].options.quantity
229
248
  ).toBe(1);
230
249
  });
231
250
  it('can add a variant to the list when there is an existing base product', () => {
232
- const initialState = {
233
- loggedIn: false,
234
- list: MOCK_LIST
235
- };
236
-
237
251
  const { result, dispatch } = setup(initialState);
238
252
 
239
253
  act(() =>
240
254
  dispatch({
241
255
  type: 'ADD',
242
256
  payload: {
257
+ listId: null,
243
258
  articleNumber: '502935480',
244
259
  variantArticleNumber: 'boogie-woogie',
245
260
  options: {
@@ -250,24 +265,21 @@ describe('reducer', () => {
250
265
  );
251
266
 
252
267
  const [state] = result.current;
268
+ const list = state.lists.get(null);
253
269
 
254
- expect(state.list['502935480'].options).not.toBe(null);
270
+ expect(list.items['502935480'].options).not.toBe(null);
255
271
  expect(
256
- state.list['502935480'].variants['boogie-woogie'].options.quantity
272
+ list.items['502935480'].variants['boogie-woogie'].options.quantity
257
273
  ).toBe(1);
258
274
  });
259
275
  it('can add a variant to the list when there is a base product with variants', () => {
260
- const initialState = {
261
- loggedIn: false,
262
- list: MOCK_LIST
263
- };
264
-
265
276
  const { result, dispatch } = setup(initialState);
266
277
 
267
278
  act(() =>
268
279
  dispatch({
269
280
  type: 'ADD',
270
281
  payload: {
282
+ listId: null,
271
283
  articleNumber: '6952315',
272
284
  variantArticleNumber: 'boogie-woogie',
273
285
  options: {
@@ -278,50 +290,44 @@ describe('reducer', () => {
278
290
  );
279
291
 
280
292
  const [state] = result.current;
293
+ const list = state.lists.get(null);
281
294
 
282
- expect(state.list['6952315'].options).not.toBe(null);
295
+ expect(list.items['6952315'].options).not.toBe(null);
283
296
  expect(
284
- state.list['6952315'].variants['boogie-woogie'].options.quantity
297
+ list.items['6952315'].variants['boogie-woogie'].options.quantity
285
298
  ).toBe(1);
286
- expect(state.list['6952315'].variants['6952315-170-white']).toMatchObject(
287
- MOCK_LIST['6952315'].variants['6952315-170-white']
299
+ expect(list.items['6952315'].variants['6952315-170-white']).toMatchObject(
300
+ MOCK_LIST_ITEMS['6952315'].variants['6952315-170-white']
288
301
  );
289
302
  });
290
303
  });
291
304
  describe('REMOVE action', () => {
292
305
  it('will entirely remove a base product with no variants', () => {
293
- const initialState = {
294
- loggedIn: false,
295
- list: MOCK_LIST
296
- };
297
-
298
306
  const { result, dispatch } = setup(initialState);
299
307
 
300
308
  act(() =>
301
309
  dispatch({
302
310
  type: 'REMOVE',
303
311
  payload: {
312
+ listId: null,
304
313
  articleNumber: '502935480'
305
314
  }
306
315
  })
307
316
  );
308
317
 
309
318
  const [state] = result.current;
319
+ const list = state.lists.get(null);
310
320
 
311
- expect(state.list['502935480']).not.toBeDefined();
321
+ expect(list.items['502935480']).not.toBeDefined();
312
322
  });
313
323
  it('will entirely remove an item if the variant is removed and there is no base product', () => {
314
- const initialState = {
315
- loggedIn: false,
316
- list: MOCK_LIST
317
- };
318
-
319
324
  const { result, dispatch } = setup(initialState);
320
325
 
321
326
  act(() =>
322
327
  dispatch({
323
328
  type: 'REMOVE',
324
329
  payload: {
330
+ listId: null,
325
331
  articleNumber: 'without-base',
326
332
  variantArticleNumber: 'with-variant'
327
333
  }
@@ -329,15 +335,11 @@ describe('reducer', () => {
329
335
  );
330
336
 
331
337
  const [state] = result.current;
338
+ const list = state.lists.get(null);
332
339
 
333
- expect(state.list['without-base']).not.toBeDefined();
340
+ expect(list['without-base']).not.toBeDefined();
334
341
  });
335
342
  it('will keep the variant if one exists', () => {
336
- const initialState = {
337
- loggedIn: false,
338
- list: MOCK_LIST
339
- };
340
-
341
343
  const { result, dispatch } = setup(initialState);
342
344
  const articleToRemove = '6952315';
343
345
 
@@ -345,22 +347,19 @@ describe('reducer', () => {
345
347
  dispatch({
346
348
  type: 'REMOVE',
347
349
  payload: {
350
+ listId: null,
348
351
  articleNumber: articleToRemove
349
352
  }
350
353
  })
351
354
  );
352
355
 
353
356
  const [state] = result.current;
357
+ const list = state.lists.get(null);
354
358
 
355
- expect(state.list[articleToRemove].options).toBe(null);
356
- expect(state.list[articleToRemove].variants).toBeDefined();
359
+ expect(list.items[articleToRemove].options).toBe(null);
360
+ expect(list.items[articleToRemove].variants).toBeDefined();
357
361
  });
358
362
  it('will remove the variant but keep the base product', () => {
359
- const initialState = {
360
- loggedIn: false,
361
- list: MOCK_LIST
362
- };
363
-
364
363
  const { result, dispatch } = setup(initialState);
365
364
 
366
365
  const parent = '6952315';
@@ -370,6 +369,7 @@ describe('reducer', () => {
370
369
  dispatch({
371
370
  type: 'REMOVE',
372
371
  payload: {
372
+ listId: null,
373
373
  articleNumber: parent,
374
374
  variantArticleNumber: articleToRemove
375
375
  }
@@ -377,9 +377,71 @@ describe('reducer', () => {
377
377
  );
378
378
 
379
379
  const [state] = result.current;
380
+ const list = state.lists.get(null);
381
+
382
+ expect(list.items[parent].variants[articleToRemove]).not.toBeDefined();
383
+ expect(list.items[parent].options).toBeDefined();
384
+ });
385
+ });
386
+
387
+ describe('DELETE_LIST action', () => {
388
+ it('can delete a product list', () => {
389
+ const listId = '12345';
390
+ const initialState = {
391
+ loggedIn: false,
392
+ lists: new Map([[listId, MOCK_LIST_ITEMS]])
393
+ };
394
+
395
+ const { result, dispatch } = setup(initialState);
396
+ const [state] = result.current;
397
+
398
+ expect(state.lists.get(listId)).toBeDefined;
399
+
400
+ act(() =>
401
+ dispatch({
402
+ type: 'DELETE_LIST',
403
+ payload: { listId }
404
+ })
405
+ );
406
+
407
+ expect(state.lists.get(listId)).toBeUndefined;
408
+ });
409
+ });
410
+
411
+ describe('CREATE_LIST action', () => {
412
+ it('can create a new product list', () => {
413
+ const listId = '12345';
414
+ const { result, dispatch } = setup();
415
+ const name = 'My Stuff';
416
+
417
+ act(() =>
418
+ dispatch({
419
+ type: 'CREATE_LIST',
420
+ payload: { listId, list: { name } }
421
+ })
422
+ );
423
+
424
+ const [state] = result.current;
425
+ expect(state.lists.has(listId)).toBe(true);
426
+ expect(state.lists.get(listId).name).toBe(name);
427
+ });
428
+ });
429
+
430
+ describe('CLEAR_ITEMS action', () => {
431
+ it('can clear items on a product list', () => {
432
+ const { result, dispatch } = setup(initialState);
433
+ const listId = null;
434
+
435
+ act(() =>
436
+ dispatch({
437
+ type: 'CLEAR_ITEMS',
438
+ payload: { listId }
439
+ })
440
+ );
380
441
 
381
- expect(state.list[parent].variants[articleToRemove]).not.toBeDefined();
382
- expect(state.list[parent].options).toBeDefined();
442
+ const [state] = result.current;
443
+ const list = state.lists.get(listId);
444
+ expect(list.items).toMatchObject({});
383
445
  });
384
446
  });
385
447
  });
@@ -395,7 +457,7 @@ function setup(initialState) {
395
457
  function useProductListReducer({ initialState }) {
396
458
  const [state, dispatch] = useReducer(
397
459
  reducer,
398
- initialState || { loggedIn: false, list: {} }
460
+ initialState || { loggedIn: false, lists: new Map() }
399
461
  );
400
462
 
401
463
  return [state, dispatch];
@@ -1,5 +1,5 @@
1
- import { UpdateListInput } from '.';
2
- export declare function useProductList(): {
1
+ import { ProductListId, UpdateListInput } from '.';
2
+ export declare function useProductList(listId?: ProductListId): {
3
3
  toggle: (articleNumber: string, { variantArticleNumber, quantity, description, productName }: UpdateListInput) => void;
4
4
  add: (articleNumber: string, { variantArticleNumber, quantity, description, productName }: UpdateListInput) => void;
5
5
  remove: (articleNumber: string, { variantArticleNumber }: UpdateListInput) => void;
@@ -5,8 +5,12 @@ import { flattenList } from './list-transforms';
5
5
  import { ProductListContext } from './ProductListContext';
6
6
  import { trackAddToWishListEvent } from '../../analytics/tracking';
7
7
  import { useTracker } from '../../analytics/Analytics';
8
- export function useProductList() {
9
- const { state: { list = {} }, dispatch, queries, usingLocalList } = React.useContext(ProductListContext);
8
+ export function useProductList(listId = null) {
9
+ const {
10
+ // XXX
11
+ //state: { list = {} },
12
+ state, dispatch, queries, usingLocalList } = React.useContext(ProductListContext);
13
+ const list = state.lists.get(listId);
10
14
  const [hydrated, setHydrated] = useState(!usingLocalList);
11
15
  const updateAPI = !usingLocalList;
12
16
  const removeMutation = useMutation(queries.remove);
@@ -27,6 +31,7 @@ export function useProductList() {
27
31
  }
28
32
  function remove(articleNumber, { variantArticleNumber }) {
29
33
  dispatch(removeAction({
34
+ listId,
30
35
  articleNumber,
31
36
  variantArticleNumber,
32
37
  removeMutation,
@@ -39,6 +44,7 @@ export function useProductList() {
39
44
  productName
40
45
  }));
41
46
  dispatch(addAction({
47
+ listId,
42
48
  updateAPI,
43
49
  articleNumber,
44
50
  variantArticleNumber,
@@ -48,6 +54,7 @@ export function useProductList() {
48
54
  }
49
55
  function update(articleNumber, { variantArticleNumber, quantity, description, variantToReplace }) {
50
56
  dispatch(updateAction({
57
+ listId,
51
58
  updateAPI,
52
59
  articleNumber,
53
60
  variantArticleNumber,
@@ -58,16 +65,16 @@ export function useProductList() {
58
65
  }));
59
66
  }
60
67
  function clear() {
61
- dispatch(clearAction({ removeMutation, updateAPI }));
68
+ dispatch(clearAction({ listId, removeMutation, updateAPI }));
62
69
  }
63
70
  function inList(articleNumber, { variantArticleNumber }) {
64
71
  var _a;
65
72
  if (!hydrated)
66
73
  return false;
67
- if (list && articleNumber in list) {
74
+ if (list && articleNumber in list.items) {
68
75
  if (!variantArticleNumber)
69
76
  return true;
70
- const variantInList = !!((_a = list[articleNumber].variants) === null || _a === void 0 ? void 0 : _a[variantArticleNumber]);
77
+ const variantInList = !!((_a = list.items[articleNumber].variants) === null || _a === void 0 ? void 0 : _a[variantArticleNumber]);
71
78
  return variantInList;
72
79
  }
73
80
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"useProductList.js","sourceRoot":"","sources":["useProductList.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useProductList.js","sourceRoot":"","sources":["useProductList.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { ProductListDetail } from '.';
4
4
  */
5
5
  export declare function useProductListItems(
6
6
  /** Passing null for id will retrieve the default product list */
7
- id?: string | null, options?: {
7
+ listId?: string | null, options?: {
8
8
  /** Limit how many items are returned */
9
9
  limit?: number;
10
10
  }): ProductListDetail;
@@ -8,10 +8,9 @@ import getErrorDetail from '../../helpers/getErrorDetail';
8
8
  */
9
9
  export function useProductListItems(
10
10
  /** Passing null for id will retrieve the default product list */
11
- id = null, options = {}) {
12
- if (id && typeof id !== 'string')
13
- throw new Error('Product list id must be a string or null');
14
- const { state: { list }, queries, dispatch, usingLocalList } = useContext(ProductListContext);
11
+ listId = null, options = {}) {
12
+ const { state: { lists }, queries, dispatch, usingLocalList } = useContext(ProductListContext);
13
+ const list = lists.get(listId);
15
14
  const [hydrated, setHydrated] = useState(!usingLocalList);
16
15
  const flattenedList = useMemo(() => flattenList(list), [list]);
17
16
  // Make a `products` query containing every item in the list
@@ -20,7 +19,7 @@ id = null, options = {}) {
20
19
  errorPolicy: 'all',
21
20
  variables: {
22
21
  articleNumbers: flattenedList
23
- .map(listItem => listItem.articleNumber)
22
+ .map((listItem) => listItem.articleNumber)
24
23
  .slice(0, options.limit)
25
24
  }
26
25
  });
@@ -29,7 +28,10 @@ id = null, options = {}) {
29
28
  const { codes, data } = getErrorDetail(productQueryResult.error);
30
29
  if (codes.includes('ProductNotFound')) {
31
30
  for (const item of data) {
32
- dispatch({ type: 'REMOVE', payload: { articleNumber: item.argument } });
31
+ dispatch({
32
+ type: 'REMOVE',
33
+ payload: { listId, articleNumber: item.argument }
34
+ });
33
35
  }
34
36
  }
35
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useProductListItems.js","sourceRoot":"","sources":["useProductListItems.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EACL,WAAW,EACX,uCAAuC,EACxC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,mBAAmB;AACjC,iEAAiE;AACjE,KAAoB,IAAI,EACxB,UAGI,EAAE;IAEN,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;QAC9B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAE9D,MAAM,EACJ,KAAK,EAAE,EAAE,IAAI,EAAE,EACf,OAAO,EACP,QAAQ,EACR,cAAc,EACf,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAEnC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;IAE1D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/D,4DAA4D;IAC5D,MAAM,kBAAkB,GAAkB,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE;QACxE,IAAI,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC;QAChC,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE;YACT,cAAc,EAAE,aAAa;iBAC1B,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;iBACvC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;SAC3B;KACF,CAAC,CAAC;IAEH,qEAAqE;IACrE,IAAI,kBAAkB,CAAC,KAAK,EAAE;QAC5B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAEjE,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;YACrC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;gBACvB,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;aACzE;SACF;KACF;IAED,0EAA0E;IAC1E,4EAA4E;IAC5E,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE,uCAAuC,CAC/C,aAAa,EACb,kBAAkB,CACnB;QACD,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;KACtD,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"useProductListItems.js","sourceRoot":"","sources":["useProductListItems.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EACL,WAAW,EACX,uCAAuC,EACxC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,mBAAmB;AACjC,iEAAiE;AACjE,SAAwB,IAAI,EAC5B,UAGI,EAAE;IAEN,MAAM,EACJ,KAAK,EAAE,EAAE,KAAK,EAAE,EAChB,OAAO,EACP,QAAQ,EACR,cAAc,EACf,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;IAE1D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/D,4DAA4D;IAC5D,MAAM,kBAAkB,GAAkB,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE;QACxE,IAAI,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC;QAChC,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE;YACT,cAAc,EAAE,aAAa;iBAC1B,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;iBACzC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;SAC3B;KACF,CAAC,CAAC;IAEH,qEAAqE;IACrE,IAAI,kBAAkB,CAAC,KAAK,EAAE;QAC5B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAEjE,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;YACrC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;gBACvB,QAAQ,CAAC;oBACP,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE;iBAClD,CAAC,CAAC;aACJ;SACF;KACF;IAED,0EAA0E;IAC1E,4EAA4E;IAC5E,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE,uCAAuC,CAC/C,aAAa,EACb,kBAAkB,CACnB;QACD,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;KACtD,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -4,6 +4,8 @@ import { useContext, useState } from 'react';
4
4
  import throwErrorInDev from '../helpers/throwErrorInDev';
5
5
  import { useTracker } from '../analytics/Analytics';
6
6
  import { trackProductEvent } from '../analytics/tracking';
7
+ import { unSlugify } from '../analytics/integrations/unslugify';
8
+ import { breadcrumbsWithoutProduct } from '../analytics/utils/breadcrumbsWithoutProduct';
7
9
  export function useAddMultipleToCart(items, hookQueries, hookCallbacks) {
8
10
  const track = useTracker();
9
11
  const client = useApolloClient();
@@ -30,11 +32,15 @@ export function useAddMultipleToCart(items, hookQueries, hookCallbacks) {
30
32
  if (!queries || !queries.addMultipleToCartMutation || !queries.cartQuery) {
31
33
  return Promise.reject(`You must pass cartQuery and addMultipleToCartMutation to useAddMultipletoCart or to the addMultiple fn`);
32
34
  }
33
- items.forEach(item => {
35
+ items.forEach((item) => {
36
+ var _a, _b, _c;
34
37
  track(trackProductEvent({
35
38
  action: 'add',
36
39
  product: item,
37
- quantity: item.quantity
40
+ quantity: item.quantity,
41
+ category: breadcrumbsWithoutProduct((_a = item.primaryRoute) === null || _a === void 0 ? void 0 : _a.breadcrumbs) ||
42
+ unSlugify((_c = (_b = item.canonicalCategory) === null || _b === void 0 ? void 0 : _b.primaryRoute) === null || _c === void 0 ? void 0 : _c.path) ||
43
+ ''
38
44
  }));
39
45
  });
40
46
  setStatus('loading');
@@ -52,13 +58,13 @@ export function useAddMultipleToCart(items, hookQueries, hookCallbacks) {
52
58
  preOrderDate
53
59
  }))
54
60
  },
55
- refetchQueries: resp => {
61
+ refetchQueries: (resp) => {
56
62
  // When errors are present, the cart does not get automatically
57
63
  // updated. We have to use refetchQueries in that case.
58
64
  return (resp.errors && [{ query: queries.cartQuery, variables: { cartId } }]);
59
65
  }
60
66
  })
61
- .then(resp => {
67
+ .then((resp) => {
62
68
  setData(resp);
63
69
  (callbacks === null || callbacks === void 0 ? void 0 : callbacks.onCompleted) && callbacks.onCompleted(resp);
64
70
  // Update the cart context
@@ -72,7 +78,7 @@ export function useAddMultipleToCart(items, hookQueries, hookCallbacks) {
72
78
  }
73
79
  return resp;
74
80
  })
75
- .catch(err => {
81
+ .catch((err) => {
76
82
  console.log('error!', err);
77
83
  setStatus('error');
78
84
  (callbacks === null || callbacks === void 0 ? void 0 : callbacks.onError) && callbacks.onError(err);
@@ -1 +1 @@
1
- {"version":3,"file":"useAddMultipleToCart.js","sourceRoot":"","sources":["useAddMultipleToCart.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAddMultipleToCart.js","sourceRoot":"","sources":["useAddMultipleToCart.ts"],"names":[],"mappings":"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"}