@jetshop/core 5.8.3 → 5.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ChannelHandler/ChannelHandler.d.ts +9 -13
- package/ChannelHandler/ChannelHandler.js +24 -66
- package/ChannelHandler/ChannelHandler.js.map +1 -1
- package/ChannelHandler/channelUtils.d.ts +13 -0
- package/ChannelHandler/channelUtils.js +26 -15
- package/ChannelHandler/channelUtils.js.map +1 -1
- package/ChannelHandler/redirectUtils.d.ts +3 -0
- package/ChannelHandler/redirectUtils.js +48 -0
- package/ChannelHandler/redirectUtils.js.map +1 -0
- package/ChannelHandler/redirectUtils.test.js +8 -0
- package/analytics/AnalyticsProvider.js +9 -2
- package/analytics/AnalyticsProvider.js.map +1 -1
- package/analytics/integrations/ga4.d.ts +2 -1
- package/analytics/integrations/ga4.js +15 -6
- package/analytics/integrations/ga4.js.map +1 -1
- package/analytics/integrations/gtag/gtag.d.ts +2 -1
- package/analytics/integrations/gtag/gtag.js +20 -10
- package/analytics/integrations/gtag/gtag.js.map +1 -1
- package/analytics/integrations/gtm/index.d.ts +10 -1
- package/analytics/integrations/gtm/index.js +175 -2
- package/analytics/integrations/gtm/index.js.map +1 -1
- package/boot/SharedTree.js +1 -1
- package/boot/SharedTree.js.map +1 -1
- package/boot/apollo.d.ts +5 -4
- package/boot/apollo.js +18 -18
- package/boot/apollo.js.map +1 -1
- package/boot/client/startClient.js +7 -16
- package/boot/client/startClient.js.map +1 -1
- package/boot/server/createRenderer.js +10 -9
- package/boot/server/createRenderer.js.map +1 -1
- package/boot/server/index.js +2 -2
- package/boot/server/index.js.map +1 -1
- package/boot/server/persistedQueries/__tests__/getPersistedQueriesForRequest.test.js +53 -39
- package/boot/server/persistedQueries/getPersistedQueriesForRequest.js +2 -2
- package/boot/server/persistedQueries/getPersistedQueriesForRequest.js.map +1 -1
- package/cart/useAddToCart.d.ts +2 -2
- package/cart/useAddToCart.js +13 -12
- package/cart/useAddToCart.js.map +1 -1
- package/components/Auth/CustomerUpdateForm.js +7 -7
- package/components/Auth/CustomerUpdateForm.js.map +1 -1
- package/components/Cart/CartIdContext.js +18 -18
- package/components/Cart/CartIdContext.js.map +1 -1
- package/components/ChannelContext/ChannelProvider.d.ts +1 -3
- package/components/ChannelContext/ChannelProvider.js +6 -13
- package/components/ChannelContext/ChannelProvider.js.map +1 -1
- package/components/ChannelContext/ChannelProvider.test.js +110 -0
- package/components/ConfigProvider.d.ts +1 -0
- package/components/ConfigProvider.js.map +1 -1
- package/components/DynamicRoute/ContentRoute.d.ts +1 -1
- package/components/DynamicRoute/ProductRoute.d.ts +1 -0
- package/components/DynamicRoute/ProductRoute.js +4 -2
- package/components/DynamicRoute/ProductRoute.js.map +1 -1
- package/components/DynamicRoute/RouteResolver.js +4 -2
- package/components/DynamicRoute/RouteResolver.js.map +1 -1
- package/components/Mutation/AddToCart/addToCartUtils.js +3 -2
- package/components/Mutation/AddToCart/addToCartUtils.js.map +1 -1
- package/components/Mutation/RemoveFromCart.d.ts +1 -1
- package/components/Mutation/cartMutationUtils.js +7 -6
- package/components/Mutation/cartMutationUtils.js.map +1 -1
- package/components/OpenGraph/OpenGraph.test.js +32 -5
- package/components/OpenGraph/OpenGraphProductData.d.ts +6 -1
- package/components/OpenGraph/OpenGraphProductData.js +18 -12
- package/components/OpenGraph/OpenGraphProductData.js.map +1 -1
- package/components/Query/CartProvider.js +32 -22
- package/components/Query/CartProvider.js.map +1 -1
- package/components/StructuredData/StructuredBreadcrumbData.js +4 -3
- package/components/StructuredData/StructuredBreadcrumbData.js.map +1 -1
- package/hooks/PackageProducts/packagePriceQuery.gql +1 -1
- package/hooks/ProductList/ProductListContext.js +37 -14
- package/hooks/ProductList/ProductListContext.js.map +1 -1
- package/hooks/ProductList/action-creators.d.ts +20 -7
- package/hooks/ProductList/action-creators.js +138 -44
- package/hooks/ProductList/action-creators.js.map +1 -1
- package/hooks/ProductList/index.d.ts +34 -8
- package/hooks/ProductList/index.js +19 -0
- package/hooks/ProductList/index.js.map +1 -1
- package/hooks/ProductList/list-transforms.d.ts +3 -2
- package/hooks/ProductList/list-transforms.js +22 -22
- package/hooks/ProductList/list-transforms.js.map +1 -1
- package/hooks/ProductList/list-transforms.test.js +103 -100
- package/hooks/ProductList/product-list-reducer.d.ts +37 -14
- package/hooks/ProductList/product-list-reducer.js +106 -43
- package/hooks/ProductList/product-list-reducer.js.map +1 -1
- package/hooks/ProductList/product-list-reducer.test.js +144 -82
- package/hooks/ProductList/useProductList.d.ts +2 -2
- package/hooks/ProductList/useProductList.js +12 -5
- package/hooks/ProductList/useProductList.js.map +1 -1
- package/hooks/ProductList/useProductListItems.d.ts +1 -1
- package/hooks/ProductList/useProductListItems.js +8 -6
- package/hooks/ProductList/useProductListItems.js.map +1 -1
- package/hooks/useInfinitePagination.js +2 -2
- package/hooks/useInfinitePagination.js.map +1 -1
- package/hooks/useRoutePreload.js +2 -2
- package/hooks/useRoutePreload.js.map +1 -1
- package/package.json +5 -5
- package/resolvers/index.d.ts +3 -0
- package/resolvers/index.js +3 -0
- package/resolvers/index.js.map +1 -1
- package/sentry/client.js +9 -4
- package/sentry/client.js.map +1 -1
- package/sentry/common.d.ts +1 -0
- package/sentry/common.js +5 -0
- package/sentry/common.js.map +1 -0
- package/sentry/server.js +11 -2
- package/sentry/server.js.map +1 -1
- package/time.d.ts +1 -0
- package/time.js +6 -0
- package/time.js.map +1 -0
- package/types.d.ts +31 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { DocumentNode } from 'graphql';
|
|
3
3
|
import { MutationTuple, QueryResult } from 'react-apollo';
|
|
4
|
-
import { CustomerProductListResult, MutationAddToCustomerProductListArgs, MutationRemoveFromCustomerProductListArgs, MutationUpdateCustomerProductListItemArgs, Product, ProductVariant, QueryCustomerProductListArgs, QueryProductsArgs } from '../../types';
|
|
4
|
+
import { CustomerProductListResult, MutationCreateCustomerProductListArgs, MutationAddToCustomerProductListArgs, MutationRemoveFromCustomerProductListArgs, MutationUpdateCustomerProductListItemArgs, Product, ProductVariant, QueryCustomerProductListArgs, QueryProductsArgs } from '../../types';
|
|
5
5
|
import { ThunkAction } from '../useThunkReducer';
|
|
6
6
|
import { Action } from './product-list-reducer';
|
|
7
7
|
export { useProductList } from './useProductList';
|
|
@@ -17,16 +17,42 @@ export interface ProductListContextOptions {
|
|
|
17
17
|
usingLocalList: boolean;
|
|
18
18
|
queries: ProductListQueries;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* A Product list mapping is a mapping between an ID and a product list
|
|
22
|
+
*
|
|
23
|
+
* As a convenienve, an ID of null is used for the "default" product list.
|
|
24
|
+
*/
|
|
25
|
+
export declare type ProductListId = string | null;
|
|
26
|
+
export declare type ProductListMap = Map<ProductListId, NormalizedProductList>;
|
|
27
|
+
export interface NormalizedProductList {
|
|
28
|
+
name: string | null;
|
|
29
|
+
items: {
|
|
30
|
+
[articleNumber: string]: {
|
|
31
|
+
options: ProductListItemOptions;
|
|
32
|
+
variants: ProductListItemVariants | null;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export declare const PRODUCT_LISTS_KEY = "productLists";
|
|
37
|
+
export declare function emptyProductLists(): ProductListMap;
|
|
38
|
+
export declare function productListMapToArray(map: ProductListMap): [string, NormalizedProductList][];
|
|
39
|
+
export declare function productListArrayToMap(array: [ProductListId, NormalizedProductList][]): Map<string, NormalizedProductList>;
|
|
20
40
|
export interface ProductListState {
|
|
21
41
|
loggedIn: boolean;
|
|
22
|
-
|
|
42
|
+
lists: ProductListMap;
|
|
23
43
|
requestIdRef: React.MutableRefObject<string | null>;
|
|
24
44
|
}
|
|
25
45
|
export interface ProductListQueries {
|
|
26
46
|
/** Products query, used for retrieving products from localList */
|
|
27
47
|
productsQuery: DocumentNode;
|
|
48
|
+
/** The customerProductLists query */
|
|
49
|
+
all: DocumentNode;
|
|
28
50
|
/** The customerProductList query */
|
|
29
51
|
query: DocumentNode;
|
|
52
|
+
/** The createCustomerProductList mutation */
|
|
53
|
+
createList: DocumentNode;
|
|
54
|
+
/** The deleteCustomerProductList mutation */
|
|
55
|
+
deleteList: DocumentNode;
|
|
30
56
|
/** The addToCustomerProductList mutation */
|
|
31
57
|
add: DocumentNode;
|
|
32
58
|
/** An addToCustomerProductList mutation that returns the full list */
|
|
@@ -45,12 +71,6 @@ export interface ProductListDetail {
|
|
|
45
71
|
/** An array containing the product data */
|
|
46
72
|
products: ProductListProduct[];
|
|
47
73
|
}
|
|
48
|
-
export interface NormalizedProductList {
|
|
49
|
-
[articleNumber: string]: {
|
|
50
|
-
options: ProductListItemOptions;
|
|
51
|
-
variants: ProductListItemVariants | null;
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
74
|
export interface FlattenedProductListItem {
|
|
55
75
|
articleNumber: string;
|
|
56
76
|
parentArticleNumber?: string;
|
|
@@ -80,12 +100,18 @@ export declare type ProductListProductValidation = {
|
|
|
80
100
|
export declare type AddToListMutation = MutationTuple<{
|
|
81
101
|
addToCustomerProductList: CustomerProductListResult;
|
|
82
102
|
}, MutationAddToCustomerProductListArgs>;
|
|
103
|
+
export declare type CreateListMutation = MutationTuple<{
|
|
104
|
+
createCustomerProductList: CustomerProductListResult;
|
|
105
|
+
}, MutationCreateCustomerProductListArgs>;
|
|
83
106
|
export declare type RemoveFromListMutation = MutationTuple<{
|
|
84
107
|
removeFromCustomerProductList: CustomerProductListResult;
|
|
85
108
|
}, MutationRemoveFromCustomerProductListArgs>;
|
|
86
109
|
export declare type UpdateListItemMutation = MutationTuple<{
|
|
87
110
|
updateCustomerProductListItem: CustomerProductListResult;
|
|
88
111
|
}, MutationUpdateCustomerProductListItemArgs>;
|
|
112
|
+
export declare type ListsProductsQuery = QueryResult<{
|
|
113
|
+
customerProductLists: CustomerProductListResult[];
|
|
114
|
+
}>;
|
|
89
115
|
export declare type ListProductsQuery = QueryResult<CustomerProductListResult, QueryCustomerProductListArgs>;
|
|
90
116
|
export declare type ProductsQuery = QueryResult<{
|
|
91
117
|
products: Product[];
|
|
@@ -1,3 +1,22 @@
|
|
|
1
1
|
export { useProductList } from './useProductList';
|
|
2
2
|
export { useProductListItems } from './useProductListItems';
|
|
3
|
+
export const PRODUCT_LISTS_KEY = 'productLists';
|
|
4
|
+
export function emptyProductLists() {
|
|
5
|
+
return new Map([
|
|
6
|
+
[
|
|
7
|
+
null,
|
|
8
|
+
{
|
|
9
|
+
items: {},
|
|
10
|
+
name: null
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
export function productListMapToArray(map) {
|
|
16
|
+
const [...array] = map;
|
|
17
|
+
return array;
|
|
18
|
+
}
|
|
19
|
+
export function productListArrayToMap(array) {
|
|
20
|
+
return new Map(array);
|
|
21
|
+
}
|
|
3
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAgC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,GAAG,CAAC;QACb;YACE,IAAI;YACJ;gBACE,KAAK,EAAE,EAAE;gBACT,IAAI,EAAE,IAAI;aACX;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAmB;IACvD,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAA+C;IAE/C,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { FlattenedProductListItem, NormalizedProductList, ProductsQuery } from '.';
|
|
2
|
-
import {
|
|
2
|
+
import { CustomerProductList, Product } from '../../types';
|
|
3
3
|
/**
|
|
4
4
|
* Converts a product list returned from the API to our normalized structure
|
|
5
5
|
* When a base product is selected, it will have a value for `options`.
|
|
6
6
|
* When it has variants, it will have one or more keys for `variants`
|
|
7
7
|
* Either variants or options may be null, but not both.
|
|
8
8
|
*/
|
|
9
|
-
export declare function normalizeServerList(
|
|
9
|
+
export declare function normalizeServerList(productList: CustomerProductList): NormalizedProductList;
|
|
10
10
|
/**
|
|
11
11
|
* Takes a flattened product list and result of a products query and returns
|
|
12
12
|
* product details for each item in the flattened list. */
|
|
@@ -35,6 +35,7 @@ productQueryResult: ProductsQuery): {
|
|
|
35
35
|
categories?: import("../../types").Category[];
|
|
36
36
|
campaigns?: import("../../types").Category[];
|
|
37
37
|
hasVariants: boolean;
|
|
38
|
+
hasVariantsWithDifferingPrices: boolean;
|
|
38
39
|
variants?: import("../../types").ProductVariants;
|
|
39
40
|
images?: import("../../types").ProductImage[];
|
|
40
41
|
relatedProducts?: Product[];
|
|
@@ -6,39 +6,39 @@ import { validateProduct } from './validate-product';
|
|
|
6
6
|
* When it has variants, it will have one or more keys for `variants`
|
|
7
7
|
* Either variants or options may be null, but not both.
|
|
8
8
|
*/
|
|
9
|
-
export function normalizeServerList(
|
|
9
|
+
export function normalizeServerList(productList) {
|
|
10
10
|
var _a, _b, _c, _d, _e;
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
const items = productList.items;
|
|
12
|
+
const newList = {
|
|
13
|
+
name: productList.name,
|
|
14
|
+
items: {}
|
|
15
|
+
};
|
|
16
16
|
for (const item of items) {
|
|
17
17
|
// skip if product is hidden
|
|
18
18
|
if (!((_a = item === null || item === void 0 ? void 0 : item.product) === null || _a === void 0 ? void 0 : _a.articleNumber)) {
|
|
19
19
|
continue;
|
|
20
20
|
}
|
|
21
21
|
if (item.variant) {
|
|
22
|
-
newList[item.product.articleNumber] = {
|
|
23
|
-
options: ((_b = newList[item.product.articleNumber]) === null || _b === void 0 ? void 0 : _b.options) || null,
|
|
24
|
-
variants: produce(((_c = newList[item.product.articleNumber]) === null || _c === void 0 ? void 0 : _c.variants) || {}, (draft) => {
|
|
22
|
+
newList.items[item.product.articleNumber] = {
|
|
23
|
+
options: ((_b = newList.items[item.product.articleNumber]) === null || _b === void 0 ? void 0 : _b.options) || null,
|
|
24
|
+
variants: produce(((_c = newList.items[item.product.articleNumber]) === null || _c === void 0 ? void 0 : _c.variants) || {}, (draft) => {
|
|
25
25
|
draft[item.variant.articleNumber] = {
|
|
26
26
|
options: {
|
|
27
27
|
quantity: item.quantity || 1,
|
|
28
|
-
description: item.description
|
|
28
|
+
description: item.description
|
|
29
29
|
},
|
|
30
|
-
parentArticleNumber: item.product.articleNumber
|
|
30
|
+
parentArticleNumber: item.product.articleNumber
|
|
31
31
|
};
|
|
32
|
-
})
|
|
32
|
+
})
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
|
-
newList[item.product.articleNumber] = {
|
|
37
|
-
variants: ((_d = newList[item.product.articleNumber]) === null || _d === void 0 ? void 0 : _d.variants) || null,
|
|
36
|
+
newList.items[item.product.articleNumber] = {
|
|
37
|
+
variants: ((_d = newList.items[item.product.articleNumber]) === null || _d === void 0 ? void 0 : _d.variants) || null,
|
|
38
38
|
options: {
|
|
39
39
|
quantity: (_e = item.quantity) !== null && _e !== void 0 ? _e : 1,
|
|
40
|
-
description: item.description
|
|
41
|
-
}
|
|
40
|
+
description: item.description
|
|
41
|
+
}
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -76,29 +76,29 @@ export function getVariantFromProductDetails(variant, product) {
|
|
|
76
76
|
}
|
|
77
77
|
export function flattenList(list) {
|
|
78
78
|
const flattenedList = [];
|
|
79
|
-
const baseProducts = list ? Object.keys(list) : [];
|
|
79
|
+
const baseProducts = list ? Object.keys(list.items) : [];
|
|
80
80
|
for (const baseArticleNumber of baseProducts) {
|
|
81
|
-
const variants = list[baseArticleNumber].variants;
|
|
81
|
+
const variants = list.items[baseArticleNumber].variants;
|
|
82
82
|
if (variants) {
|
|
83
83
|
const variantArticleNumbers = Object.keys(variants);
|
|
84
84
|
for (const articleNumber of variantArticleNumbers) {
|
|
85
85
|
flattenedList.push({
|
|
86
86
|
articleNumber,
|
|
87
87
|
parentArticleNumber: baseArticleNumber,
|
|
88
|
-
options: variants[articleNumber].options
|
|
88
|
+
options: variants[articleNumber].options
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
|
-
if (list[baseArticleNumber].options) {
|
|
91
|
+
if (list.items[baseArticleNumber].options) {
|
|
92
92
|
flattenedList.push({
|
|
93
93
|
articleNumber: baseArticleNumber,
|
|
94
|
-
options: list[baseArticleNumber].options
|
|
94
|
+
options: list.items[baseArticleNumber].options
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
else {
|
|
99
99
|
flattenedList.push({
|
|
100
100
|
articleNumber: baseArticleNumber,
|
|
101
|
-
options: list[baseArticleNumber].options
|
|
101
|
+
options: list.items[baseArticleNumber].options
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-transforms.js","sourceRoot":"","sources":["list-transforms.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"list-transforms.js","sourceRoot":"","sources":["list-transforms.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
normalizeServerList
|
|
6
6
|
} from './list-transforms';
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
|
|
8
|
+
const MOCK_LIST_ITEMS = {
|
|
9
|
+
6952315: {
|
|
10
10
|
options: { quantity: 1 },
|
|
11
11
|
variants: {
|
|
12
12
|
'6952315-170-white': {
|
|
@@ -17,7 +17,7 @@ const MOCK_LIST = {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
|
-
|
|
20
|
+
502935480: {
|
|
21
21
|
variants: null,
|
|
22
22
|
options: {
|
|
23
23
|
quantity: 1
|
|
@@ -161,8 +161,7 @@ const MOCK_PRODUCT_QUERY_RESULT = {
|
|
|
161
161
|
{
|
|
162
162
|
alt: '441728',
|
|
163
163
|
title: 'Belt Light',
|
|
164
|
-
url:
|
|
165
|
-
'https://www.demostore.se/pub_images/original/VARIANTIMAGE.jpg',
|
|
164
|
+
url: 'https://www.demostore.se/pub_images/original/VARIANTIMAGE.jpg',
|
|
166
165
|
__typename: 'ProductImage'
|
|
167
166
|
}
|
|
168
167
|
],
|
|
@@ -181,8 +180,7 @@ const MOCK_PRODUCT_QUERY_RESULT = {
|
|
|
181
180
|
{
|
|
182
181
|
alt: 'Belt Light',
|
|
183
182
|
title: 'Belt Light',
|
|
184
|
-
url:
|
|
185
|
-
'https://www.demostore.se/pub_images/original/441728.jpg',
|
|
183
|
+
url: 'https://www.demostore.se/pub_images/original/441728.jpg',
|
|
186
184
|
__typename: 'ProductImage'
|
|
187
185
|
}
|
|
188
186
|
],
|
|
@@ -201,8 +199,7 @@ const MOCK_PRODUCT_QUERY_RESULT = {
|
|
|
201
199
|
{
|
|
202
200
|
alt: 'Belt Light',
|
|
203
201
|
title: 'Belt Light',
|
|
204
|
-
url:
|
|
205
|
-
'https://www.demostore.se/pub_images/original/441728.jpg',
|
|
202
|
+
url: 'https://www.demostore.se/pub_images/original/441728.jpg',
|
|
206
203
|
__typename: 'ProductImage'
|
|
207
204
|
}
|
|
208
205
|
],
|
|
@@ -245,8 +242,7 @@ const MOCK_PRODUCT_QUERY_RESULT = {
|
|
|
245
242
|
badges: [
|
|
246
243
|
{
|
|
247
244
|
name: 'SALE Top Left',
|
|
248
|
-
url:
|
|
249
|
-
'https://www.demostore.se/M1/production/images/overlay/overlay8_en-GB.png',
|
|
245
|
+
url: 'https://www.demostore.se/M1/production/images/overlay/overlay8_en-GB.png',
|
|
250
246
|
location: 'TOP_LEFT',
|
|
251
247
|
style: '',
|
|
252
248
|
text: '',
|
|
@@ -268,7 +264,10 @@ const MOCK_PRODUCT_QUERY_RESULT = {
|
|
|
268
264
|
|
|
269
265
|
describe('flattenList', () => {
|
|
270
266
|
it('takes a normalized list and returns an array of items', () => {
|
|
271
|
-
const flattened = flattenList(
|
|
267
|
+
const flattened = flattenList({
|
|
268
|
+
name: 'My list',
|
|
269
|
+
items: MOCK_LIST_ITEMS
|
|
270
|
+
});
|
|
272
271
|
|
|
273
272
|
expect(flattened).toMatchSnapshot();
|
|
274
273
|
});
|
|
@@ -277,16 +276,19 @@ describe('flattenList', () => {
|
|
|
277
276
|
const options = { quantity: 1 };
|
|
278
277
|
|
|
279
278
|
const list = {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
279
|
+
name: 'My list',
|
|
280
|
+
items: {
|
|
281
|
+
baseProduct: {
|
|
282
|
+
options: null,
|
|
283
|
+
variants: {
|
|
284
|
+
'variant-one': {
|
|
285
|
+
options,
|
|
286
|
+
parentArticleNumber: 'baseProduct'
|
|
287
|
+
},
|
|
288
|
+
'variant-two': {
|
|
289
|
+
options,
|
|
290
|
+
parentArticleNumber: 'baseProduct'
|
|
291
|
+
}
|
|
290
292
|
}
|
|
291
293
|
}
|
|
292
294
|
}
|
|
@@ -301,16 +303,19 @@ describe('flattenList', () => {
|
|
|
301
303
|
const options = { quantity: 1 };
|
|
302
304
|
|
|
303
305
|
const list = {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
306
|
+
name: 'My funky list',
|
|
307
|
+
items: {
|
|
308
|
+
baseProduct: {
|
|
309
|
+
options: options,
|
|
310
|
+
variants: {
|
|
311
|
+
'variant-one': {
|
|
312
|
+
options,
|
|
313
|
+
parentArticleNumber: 'baseProduct'
|
|
314
|
+
},
|
|
315
|
+
'variant-two': {
|
|
316
|
+
options,
|
|
317
|
+
parentArticleNumber: 'baseProduct'
|
|
318
|
+
}
|
|
314
319
|
}
|
|
315
320
|
}
|
|
316
321
|
}
|
|
@@ -341,7 +346,7 @@ describe('getVariantFromProductDetails', () => {
|
|
|
341
346
|
|
|
342
347
|
expect(result).toBe(
|
|
343
348
|
MOCK_PRODUCT_WITH_VARIANTS.variants.values.find(
|
|
344
|
-
variant => variant.articleNumber === '441728-37'
|
|
349
|
+
(variant) => variant.articleNumber === '441728-37'
|
|
345
350
|
)
|
|
346
351
|
);
|
|
347
352
|
});
|
|
@@ -396,91 +401,89 @@ describe('normalizeServerList', () => {
|
|
|
396
401
|
let serverList;
|
|
397
402
|
beforeEach(() => {
|
|
398
403
|
serverList = {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
articleNumber: 'without-variants'
|
|
406
|
-
},
|
|
407
|
-
variant: null
|
|
404
|
+
items: [
|
|
405
|
+
{
|
|
406
|
+
quantity: 1,
|
|
407
|
+
description: 'hello',
|
|
408
|
+
product: {
|
|
409
|
+
articleNumber: 'without-variants'
|
|
408
410
|
},
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
articleNumber: 'the-variant'
|
|
417
|
-
}
|
|
411
|
+
variant: null
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
quantity: 1,
|
|
415
|
+
description: 'hello',
|
|
416
|
+
product: {
|
|
417
|
+
articleNumber: 'with-variants'
|
|
418
418
|
},
|
|
419
|
-
{
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
419
|
+
variant: {
|
|
420
|
+
articleNumber: 'the-variant'
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
quantity: 1,
|
|
425
|
+
description: 'hello',
|
|
426
|
+
product: {
|
|
427
|
+
articleNumber: 'with-many-variants'
|
|
428
428
|
},
|
|
429
|
-
{
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
429
|
+
variant: {
|
|
430
|
+
articleNumber: 'variant-one'
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
quantity: 1,
|
|
435
|
+
description: 'hello',
|
|
436
|
+
product: {
|
|
437
|
+
articleNumber: 'with-many-variants'
|
|
438
438
|
},
|
|
439
|
-
{
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
439
|
+
variant: {
|
|
440
|
+
articleNumber: 'variant-two'
|
|
441
|
+
}
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
quantity: 1,
|
|
445
|
+
description: 'hello',
|
|
446
|
+
product: {
|
|
447
|
+
articleNumber: 'with-base-and-variants'
|
|
446
448
|
},
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
449
|
+
variant: null
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
quantity: 1,
|
|
453
|
+
description: 'hello',
|
|
454
|
+
product: {
|
|
455
|
+
articleNumber: 'with-base-and-variants'
|
|
456
|
+
},
|
|
457
|
+
variant: {
|
|
458
|
+
articleNumber: 'variant-one'
|
|
456
459
|
}
|
|
457
|
-
|
|
458
|
-
|
|
460
|
+
}
|
|
461
|
+
]
|
|
459
462
|
};
|
|
460
463
|
});
|
|
461
|
-
it('returns an empty object if an invalid list if passed in', () => {
|
|
462
|
-
const result = normalizeServerList({ not: 'a list' });
|
|
463
464
|
|
|
464
|
-
expect(result).toEqual({});
|
|
465
|
-
});
|
|
466
465
|
it('creates the expected shape', () => {
|
|
467
466
|
const result = normalizeServerList(serverList);
|
|
468
467
|
|
|
469
|
-
expect(result['without-variants'].variants).toBe(null);
|
|
470
|
-
expect(result['without-variants'].options.quantity).toBe(1);
|
|
468
|
+
expect(result.items['without-variants'].variants).toBe(null);
|
|
469
|
+
expect(result.items['without-variants'].options.quantity).toBe(1);
|
|
471
470
|
|
|
472
|
-
expect(result['with-variants'].options).toBe(null);
|
|
471
|
+
expect(result.items['with-variants'].options).toBe(null);
|
|
473
472
|
expect(
|
|
474
|
-
result['with-variants'].variants['the-variant'].options.quantity
|
|
473
|
+
result.items['with-variants'].variants['the-variant'].options.quantity
|
|
475
474
|
).toBe(1);
|
|
476
475
|
|
|
477
|
-
expect(result['with-many-variants'].options).toBe(null);
|
|
478
|
-
expect(
|
|
479
|
-
|
|
476
|
+
expect(result.items['with-many-variants'].options).toBe(null);
|
|
477
|
+
expect(
|
|
478
|
+
result.items['with-many-variants'].variants['variant-one']
|
|
479
|
+
).toBeDefined();
|
|
480
|
+
expect(
|
|
481
|
+
result.items['with-many-variants'].variants['variant-two']
|
|
482
|
+
).toBeDefined();
|
|
480
483
|
|
|
481
|
-
expect(result['with-base-and-variants'].options).toBeDefined();
|
|
484
|
+
expect(result.items['with-base-and-variants'].options).toBeDefined();
|
|
482
485
|
expect(
|
|
483
|
-
result['with-base-and-variants'].variants['variant-one']
|
|
486
|
+
result.items['with-base-and-variants'].variants['variant-one']
|
|
484
487
|
).toBeDefined();
|
|
485
488
|
});
|
|
486
489
|
});
|
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
import { ProductListState, ProductListItemOptions, UpdateListOptions, NormalizedProductList } from '.';
|
|
1
|
+
import { ProductListMap, ProductListState, ProductListItemOptions, ProductListId, UpdateListOptions, NormalizedProductList } from '.';
|
|
3
2
|
export declare function reducer(state: ProductListState, action: Action): ProductListState;
|
|
4
|
-
export declare function init(initialState: ProductListState): ProductListState
|
|
5
|
-
|
|
6
|
-
loggedIn: boolean;
|
|
7
|
-
requestIdRef: import("react").MutableRefObject<string>;
|
|
8
|
-
};
|
|
9
|
-
export declare function addVariantToList(state: ProductListState, articleNumber: string, { variantArticleNumber, options }: {
|
|
3
|
+
export declare function init(initialState: ProductListState): ProductListState;
|
|
4
|
+
export declare function addVariantToList(state: ProductListState, listId: ProductListId, articleNumber: string, { variantArticleNumber, options }: {
|
|
10
5
|
variantArticleNumber?: string;
|
|
11
6
|
options: ProductListItemOptions;
|
|
12
7
|
}): ProductListState;
|
|
13
|
-
export declare function addBaseProductToList(state: ProductListState, articleNumber: string, options: ProductListItemOptions): ProductListState;
|
|
14
|
-
export declare function removeFromList(state: ProductListState, articleNumber: string, { variantArticleNumber }: {
|
|
8
|
+
export declare function addBaseProductToList(state: ProductListState, listId: ProductListId, articleNumber: string, options: ProductListItemOptions): ProductListState;
|
|
9
|
+
export declare function removeFromList(state: ProductListState, listId: ProductListId, articleNumber: string, { variantArticleNumber }: {
|
|
15
10
|
variantArticleNumber?: string;
|
|
16
11
|
}): ProductListState;
|
|
17
|
-
export declare function replaceItemInList(state: ProductListState, articleNumber: string, { variantToReplace, variantArticleNumber, options }: {
|
|
12
|
+
export declare function replaceItemInList(state: ProductListState, listId: ProductListId, articleNumber: string, { variantToReplace, variantArticleNumber, options }: {
|
|
18
13
|
variantToReplace?: string;
|
|
19
14
|
variantArticleNumber: string;
|
|
20
15
|
options: ProductListItemOptions;
|
|
@@ -22,6 +17,7 @@ export declare function replaceItemInList(state: ProductListState, articleNumber
|
|
|
22
17
|
export declare type Action = {
|
|
23
18
|
type: 'UPDATE';
|
|
24
19
|
payload: {
|
|
20
|
+
listId: ProductListId;
|
|
25
21
|
articleNumber: string;
|
|
26
22
|
variantArticleNumber: string;
|
|
27
23
|
variantToReplace?: string;
|
|
@@ -30,6 +26,7 @@ export declare type Action = {
|
|
|
30
26
|
} | {
|
|
31
27
|
type: 'ADD';
|
|
32
28
|
payload: {
|
|
29
|
+
listId: ProductListId;
|
|
33
30
|
articleNumber: string;
|
|
34
31
|
variantArticleNumber?: string;
|
|
35
32
|
options: UpdateListOptions;
|
|
@@ -37,17 +34,43 @@ export declare type Action = {
|
|
|
37
34
|
} | {
|
|
38
35
|
type: 'REMOVE';
|
|
39
36
|
payload: {
|
|
37
|
+
listId: ProductListId;
|
|
40
38
|
articleNumber: string;
|
|
41
39
|
variantArticleNumber?: string;
|
|
42
40
|
};
|
|
43
41
|
} | {
|
|
44
|
-
type: '
|
|
42
|
+
type: 'CLEAR_ITEMS';
|
|
43
|
+
payload: {
|
|
44
|
+
listId: ProductListId;
|
|
45
|
+
};
|
|
45
46
|
} | {
|
|
46
47
|
type: 'LOGOUT';
|
|
47
48
|
} | {
|
|
48
49
|
type: 'LOGIN';
|
|
49
|
-
payload:
|
|
50
|
+
payload: {
|
|
51
|
+
listId: ProductListId;
|
|
52
|
+
list: NormalizedProductList;
|
|
53
|
+
};
|
|
50
54
|
} | {
|
|
51
55
|
type: 'REPLACE';
|
|
52
|
-
payload:
|
|
56
|
+
payload: {
|
|
57
|
+
listId: ProductListId;
|
|
58
|
+
list: NormalizedProductList;
|
|
59
|
+
};
|
|
60
|
+
} | {
|
|
61
|
+
type: 'CREATE_LIST';
|
|
62
|
+
payload: {
|
|
63
|
+
listId: ProductListId;
|
|
64
|
+
list: NormalizedProductList;
|
|
65
|
+
};
|
|
66
|
+
} | {
|
|
67
|
+
type: 'SET_LISTS';
|
|
68
|
+
payload: {
|
|
69
|
+
lists: ProductListMap;
|
|
70
|
+
};
|
|
71
|
+
} | {
|
|
72
|
+
type: 'DELETE_LIST';
|
|
73
|
+
payload: {
|
|
74
|
+
listId: ProductListId;
|
|
75
|
+
};
|
|
53
76
|
};
|