@shopgate/pwa-common-commerce 7.30.0-alpha.7 → 7.30.0-alpha.8
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/cart/action-creators/addCouponsToCart.js +9 -2
- package/cart/action-creators/addProductsToCart.js +9 -2
- package/cart/action-creators/deleteCouponsFromCart.js +9 -2
- package/cart/action-creators/deleteProductsFromCart.js +9 -2
- package/cart/action-creators/errorAddCouponsToCart.js +10 -2
- package/cart/action-creators/errorAddProductsToCart.js +10 -2
- package/cart/action-creators/errorCart.js +8 -2
- package/cart/action-creators/errorDeleteCouponsFromCart.js +10 -2
- package/cart/action-creators/errorDeleteProductsFromCart.js +10 -2
- package/cart/action-creators/errorUpdateProductsInCart.js +10 -2
- package/cart/action-creators/receiveCart.js +9 -2
- package/cart/action-creators/requestCart.js +8 -2
- package/cart/action-creators/setCartProductPendingCount.js +9 -2
- package/cart/action-creators/setCouponFieldError.js +9 -2
- package/cart/action-creators/setCouponFieldValue.js +9 -2
- package/cart/action-creators/setFulfillmentSlot.js +9 -2
- package/cart/action-creators/successAddCouponsToCart.js +10 -2
- package/cart/action-creators/successAddProductsToCart.js +8 -2
- package/cart/action-creators/successDeleteCouponsFromCart.js +8 -2
- package/cart/action-creators/successDeleteProductsFromCart.js +8 -2
- package/cart/action-creators/successUpdateProductsInCart.js +8 -2
- package/cart/action-creators/updateProductsInCart.js +9 -2
- package/cart/actions/addCouponsToCart.js +52 -8
- package/cart/actions/addProductsToCart.js +80 -11
- package/cart/actions/deleteCouponsFromCart.js +39 -6
- package/cart/actions/deleteProductsFromCart.js +38 -6
- package/cart/actions/fetchCart.js +52 -8
- package/cart/actions/updateProductsInCart.js +44 -6
- package/cart/constants/PipelineErrors.js +6 -1
- package/cart/constants/Pipelines.js +6 -1
- package/cart/constants/Portals.js +85 -1
- package/cart/constants/index.js +39 -2
- package/cart/helpers/config.js +47 -2
- package/cart/helpers/createPipelineErrorList.js +30 -4
- package/cart/helpers/fulfillmentSlots.js +37 -4
- package/cart/helpers/index.js +14 -3
- package/cart/helpers/quantity.js +23 -4
- package/cart/helpers/shipping.js +57 -2
- package/cart/helpers/tax.js +26 -2
- package/cart/index.js +25 -5
- package/cart/mock.js +130 -1
- package/cart/reducers/couponField.js +30 -2
- package/cart/reducers/data.js +98 -6
- package/cart/reducers/index.js +7 -1
- package/cart/selectors/index.js +181 -31
- package/cart/selectors/spec.js +189 -2
- package/cart/streams/index.js +176 -29
- package/cart/subscriptions/index.js +307 -30
- package/category/action-creators/errorCategory.js +10 -2
- package/category/action-creators/errorCategoryChildren.js +9 -2
- package/category/action-creators/errorRootCategories.js +8 -2
- package/category/action-creators/receiveCategory.js +12 -2
- package/category/action-creators/receiveCategoryChildren.js +10 -2
- package/category/action-creators/receiveRootCategories.js +9 -2
- package/category/action-creators/requestCategory.js +9 -2
- package/category/action-creators/requestCategoryChildren.js +9 -2
- package/category/action-creators/requestRootCategories.js +8 -2
- package/category/actions/fetchCategory.js +47 -5
- package/category/actions/fetchCategoryChildren.js +30 -2
- package/category/actions/fetchCategoryOrRootCategories.js +16 -2
- package/category/actions/fetchCategoryProducts.js +36 -2
- package/category/actions/fetchRootCategories.js +31 -2
- package/category/actions/getCategory.js +10 -2
- package/category/constants/Pipelines.js +3 -1
- package/category/constants/Portals.js +56 -3
- package/category/constants/index.js +17 -2
- package/category/helpers/index.js +27 -3
- package/category/index.js +19 -5
- package/category/mock.js +176 -1
- package/category/reducers/categoriesById.js +65 -3
- package/category/reducers/childrenByCategoryId.js +55 -4
- package/category/reducers/helpers/handleCategoryCollection.js +24 -3
- package/category/reducers/helpers/handleReceivedCategories.js +3 -1
- package/category/reducers/index.js +12 -2
- package/category/reducers/rootCategories.js +31 -2
- package/category/selectors/index.js +115 -16
- package/category/streams/index.js +82 -4
- package/category/subscriptions/index.js +96 -3
- package/checkout/action-creators/successCheckout.js +9 -2
- package/checkout/actions/fetchCheckoutUrl.js +28 -3
- package/checkout/constants/Pipelines.js +1 -1
- package/checkout/constants/index.js +3 -2
- package/checkout/index.js +11 -4
- package/checkout/selectors/index.js +7 -2
- package/checkout/streams/index.js +8 -2
- package/checkout/subscriptions/index.js +35 -6
- package/favorites/action-creators/index.js +206 -24
- package/favorites/actions/addFavorites.js +41 -3
- package/favorites/actions/addFavoritesList.js +27 -2
- package/favorites/actions/fetchFavoriteIds.js +49 -5
- package/favorites/actions/fetchFavorites.js +60 -5
- package/favorites/actions/fetchFavoritesList.js +47 -3
- package/favorites/actions/fetchFavoritesListsWithItems.js +32 -3
- package/favorites/actions/getFavorites.js +6 -2
- package/favorites/actions/removeFavorites.js +32 -3
- package/favorites/actions/removeFavoritesList.js +24 -2
- package/favorites/actions/toggleFavorites.js +68 -10
- package/favorites/actions/updateFavorites.js +39 -3
- package/favorites/actions/updateFavoritesList.js +26 -2
- package/favorites/constants/Pipelines.js +9 -1
- package/favorites/constants/Portals.js +32 -4
- package/favorites/constants/index.js +37 -5
- package/favorites/index.js +14 -4
- package/favorites/mock.js +89 -4
- package/favorites/reducers/index.js +7 -1
- package/favorites/reducers/lists.js +74 -2
- package/favorites/reducers/products.js +231 -24
- package/favorites/selectors/index.js +188 -24
- package/favorites/streams/index.js +135 -23
- package/favorites/streams/spec.js +517 -8
- package/favorites/subscriptions/index.js +260 -25
- package/favorites/subscriptions/spec.js +701 -28
- package/filter/action-creators/errorFilters.js +9 -2
- package/filter/action-creators/index.js +4 -1
- package/filter/action-creators/receiveFilters.js +10 -2
- package/filter/action-creators/requestFilters.js +9 -2
- package/filter/action-creators/updateFilters.js +8 -2
- package/filter/actions/fetchFilters.js +46 -3
- package/filter/actions/getFilters.js +6 -2
- package/filter/actions/helpers/buildFilterParams.js +34 -2
- package/filter/actions/helpers/buildRequestFilters.js +35 -2
- package/filter/actions/helpers/processFilters.js +10 -2
- package/filter/actions/helpers/processParams.js +26 -2
- package/filter/constants/Pipelines.js +1 -1
- package/filter/constants/Portals.js +39 -3
- package/filter/constants/index.js +8 -1
- package/filter/index.js +12 -4
- package/filter/reducers/helpers/enrichFilters.js +11 -3
- package/filter/reducers/index.js +5 -1
- package/filter/reducers/resultsByHash.js +43 -3
- package/filter/selectors/index.js +47 -6
- package/filter/streams/index.js +30 -1
- package/filter/subscriptions/index.js +34 -2
- package/market/constants/Portals.js +22 -4
- package/market/constants/index.js +2 -1
- package/market/helpers/showReturnPolicy.js +3 -1
- package/market/helpers/showTaxDisclaimer.js +3 -1
- package/market/index.js +6 -2
- package/orders/constants.js +2 -1
- package/package.json +3 -3
- package/product/action-creators/deleteProductsByIds.js +10 -2
- package/product/action-creators/errorProduct.js +10 -2
- package/product/action-creators/errorProductDescription.js +10 -2
- package/product/action-creators/errorProductImages.js +10 -2
- package/product/action-creators/errorProductMedia.js +10 -2
- package/product/action-creators/errorProductOptions.js +10 -2
- package/product/action-creators/errorProductProperties.js +10 -2
- package/product/action-creators/errorProductRelations.js +9 -2
- package/product/action-creators/errorProductShipping.js +10 -2
- package/product/action-creators/errorProductVariants.js +10 -2
- package/product/action-creators/errorProducts.js +9 -2
- package/product/action-creators/expireProductById.js +10 -2
- package/product/action-creators/expireProductData.js +11 -2
- package/product/action-creators/expireProductsByHash.js +9 -2
- package/product/action-creators/productNotAvailable.js +10 -2
- package/product/action-creators/provideProduct.js +9 -2
- package/product/action-creators/receiveProduct.js +10 -2
- package/product/action-creators/receiveProductCached.js +9 -2
- package/product/action-creators/receiveProductDescription.js +10 -2
- package/product/action-creators/receiveProductImages.js +10 -2
- package/product/action-creators/receiveProductMedia.js +10 -2
- package/product/action-creators/receiveProductOptions.js +10 -2
- package/product/action-creators/receiveProductProperties.js +10 -2
- package/product/action-creators/receiveProductRelations.js +12 -2
- package/product/action-creators/receiveProductShipping.js +10 -2
- package/product/action-creators/receiveProductVariants.js +10 -2
- package/product/action-creators/receiveProducts.js +16 -2
- package/product/action-creators/receiveProductsCached.js +9 -2
- package/product/action-creators/refreshExpiredPDPData.js +8 -2
- package/product/action-creators/requestProduct.js +10 -2
- package/product/action-creators/requestProductDescription.js +9 -2
- package/product/action-creators/requestProductImages.js +9 -2
- package/product/action-creators/requestProductMedia.js +9 -2
- package/product/action-creators/requestProductOptions.js +9 -2
- package/product/action-creators/requestProductProperties.js +9 -2
- package/product/action-creators/requestProductRelations.js +10 -2
- package/product/action-creators/requestProductShipping.js +9 -2
- package/product/action-creators/requestProductVariants.js +9 -2
- package/product/action-creators/requestProducts.js +9 -2
- package/product/action-creators/setProductId.js +9 -2
- package/product/action-creators/setProductQuantity.js +9 -2
- package/product/action-creators/setProductVariantId.js +9 -2
- package/product/actions/changeSortOrder.js +21 -2
- package/product/actions/fetchHighlightProducts.js +18 -2
- package/product/actions/fetchLiveshoppingProducts.js +14 -2
- package/product/actions/fetchProduct.js +52 -3
- package/product/actions/fetchProductDescription.js +30 -2
- package/product/actions/fetchProductImages.js +31 -2
- package/product/actions/fetchProductMedia.js +35 -2
- package/product/actions/fetchProductOptions.js +31 -2
- package/product/actions/fetchProductProperties.js +30 -2
- package/product/actions/fetchProductRelations.js +63 -2
- package/product/actions/fetchProductShipping.js +31 -2
- package/product/actions/fetchProductVariants.js +31 -2
- package/product/actions/fetchProducts.js +189 -17
- package/product/actions/fetchProductsById.js +68 -8
- package/product/actions/fetchProductsByQuery.js +102 -18
- package/product/actions/getHighlightProducts.js +6 -2
- package/product/actions/getLiveshoppingProducts.js +6 -2
- package/product/actions/getProduct.js +6 -2
- package/product/actions/getProductDescription.js +6 -2
- package/product/actions/getProductImages.js +6 -2
- package/product/actions/getProductOptions.js +6 -2
- package/product/actions/getProductProperties.js +6 -2
- package/product/actions/getProductRelations.js +6 -2
- package/product/actions/getProductShipping.js +6 -2
- package/product/actions/getProductVariants.js +6 -2
- package/product/actions/getProducts.js +6 -2
- package/product/actions/getProductsById.js +6 -2
- package/product/actions/getProductsByQuery.js +6 -2
- package/product/actions/processProductFlags.js +35 -3
- package/product/actions/updateMetadata.js +17 -2
- package/product/collections/ProductImageFormats.js +48 -8
- package/product/collections/index.js +1 -1
- package/product/constants/Pipelines.js +12 -1
- package/product/constants/Portals.js +200 -33
- package/product/constants/index.js +90 -18
- package/product/helpers/index.js +61 -8
- package/product/index.js +36 -6
- package/product/mock.js +1002 -2
- package/product/reducers/descriptionsByProductId.js +54 -5
- package/product/reducers/helpers/formatOptions.js +17 -2
- package/product/reducers/helpers/handleProductCollection.js +19 -2
- package/product/reducers/imagesByProductId.js +51 -4
- package/product/reducers/index.js +23 -1
- package/product/reducers/mediaByProductId.js +55 -3
- package/product/reducers/optionsByProductId.js +41 -2
- package/product/reducers/productRelationsByHash.js +43 -2
- package/product/reducers/productsById.js +122 -7
- package/product/reducers/propertiesByProductId.js +48 -2
- package/product/reducers/resultsByHash.js +125 -9
- package/product/reducers/shippingByProductId.js +37 -2
- package/product/reducers/variantsByProductId.js +56 -2
- package/product/selectors/options.js +90 -13
- package/product/selectors/page.js +62 -13
- package/product/selectors/price.js +81 -18
- package/product/selectors/product.js +549 -59
- package/product/selectors/product.mock.js +327 -12
- package/product/selectors/relations.js +35 -5
- package/product/selectors/variants.js +91 -15
- package/product/streams/index.js +167 -13
- package/product/subscriptions/index.js +210 -4
- package/reviews/action-creators/errorProductReviews.js +9 -2
- package/reviews/action-creators/errorReviews.js +9 -2
- package/reviews/action-creators/errorSubmitReview.js +9 -2
- package/reviews/action-creators/errorUserReview.js +9 -2
- package/reviews/action-creators/flushUserReview.js +8 -2
- package/reviews/action-creators/receiveProductReviews.js +11 -2
- package/reviews/action-creators/receiveReviews.js +12 -2
- package/reviews/action-creators/receiveSubmitReview.js +9 -2
- package/reviews/action-creators/receiveUserReview.js +10 -2
- package/reviews/action-creators/requestProductReviews.js +10 -2
- package/reviews/action-creators/requestReviews.js +9 -2
- package/reviews/action-creators/requestSubmitReview.js +9 -2
- package/reviews/action-creators/requestUserReview.js +9 -2
- package/reviews/action-creators/resetSubmittedReview.js +9 -2
- package/reviews/action-creators/spec.js +40 -1
- package/reviews/actions/fetchProductReviews.js +37 -2
- package/reviews/actions/fetchReviews.js +38 -2
- package/reviews/actions/fetchUserReview.js +31 -2
- package/reviews/actions/flushUserReview.js +5 -1
- package/reviews/actions/getProductReviews.js +6 -2
- package/reviews/actions/getUserReview.js +6 -2
- package/reviews/actions/spec.js +241 -4
- package/reviews/actions/submitReview.js +63 -3
- package/reviews/constants/Pipelines.js +4 -1
- package/reviews/constants/Portals.js +4 -1
- package/reviews/constants/index.js +26 -7
- package/reviews/index.js +15 -4
- package/reviews/mock.js +172 -11
- package/reviews/reducers/index.js +11 -1
- package/reviews/reducers/mock.js +14 -2
- package/reviews/reducers/reviewsByHash.js +52 -6
- package/reviews/reducers/reviewsById.js +27 -2
- package/reviews/reducers/reviewsByProductId.js +47 -2
- package/reviews/reducers/spec.js +211 -2
- package/reviews/reducers/userReviewsByProductId.js +68 -2
- package/reviews/selectors/index.js +123 -19
- package/reviews/selectors/mock.js +100 -1
- package/reviews/selectors/spec.js +100 -1
- package/reviews/streams/index.js +37 -5
- package/reviews/streams/spec.js +25 -1
- package/reviews/subscriptions/index.js +27 -2
- package/scanner/action-creators/errorHandleScanner.js +11 -2
- package/scanner/action-creators/scannerFinished.js +11 -2
- package/scanner/action-creators/startScanner.js +8 -2
- package/scanner/action-creators/successHandleScanner.js +11 -2
- package/scanner/actions/handleBarCode.js +22 -2
- package/scanner/actions/handleNoResults.js +23 -2
- package/scanner/actions/handleQrCode.js +116 -6
- package/scanner/actions/handleSearch.js +33 -2
- package/scanner/constants/Portals.js +22 -1
- package/scanner/constants/index.js +17 -1
- package/scanner/helpers/index.js +115 -5
- package/scanner/index.js +19 -5
- package/scanner/streams/index.js +36 -1
- package/scanner/subscriptions/index.js +78 -8
- package/search/action-creators/errorSearchResults.js +10 -2
- package/search/action-creators/receiveSearchResults.js +11 -2
- package/search/action-creators/receiveSearchSuggestions.js +10 -2
- package/search/action-creators/requestSearchResults.js +10 -2
- package/search/action-creators/requestSearchSuggestions.js +9 -2
- package/search/actions/fetchSearchResults.js +66 -8
- package/search/actions/fetchSearchSuggestions.js +36 -2
- package/search/constants/Pipelines.js +1 -1
- package/search/constants/Portals.js +9 -2
- package/search/constants/index.js +10 -2
- package/search/helpers/index.js +5 -2
- package/search/helpers/removeHighlightingPlaceholders.js +4 -1
- package/search/helpers/spec.js +19 -1
- package/search/index.js +17 -5
- package/search/reducers/index.js +38 -2
- package/search/selectors/index.js +23 -4
- package/search/streams/index.js +51 -3
- package/search/subscriptions/index.js +132 -5
|
@@ -1,9 +1,58 @@
|
|
|
1
|
-
|
|
1
|
+
import "core-js/modules/es.array.reduce.js";
|
|
2
|
+
import { PRODUCT_LIFETIME, REQUEST_PRODUCT_DESCRIPTION, RECEIVE_PRODUCT_DESCRIPTION, ERROR_PRODUCT_DESCRIPTION, EXPIRE_PRODUCT_DATA } from "../constants";
|
|
3
|
+
|
|
4
|
+
/**
|
|
2
5
|
* Stores product descriptions by their product ID.
|
|
3
6
|
* @param {Object} [state={}] The current state.
|
|
4
7
|
* @param {Object} action The action object.
|
|
5
8
|
* @return {Object} The new state.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
*/
|
|
10
|
+
export default function descriptionsByProductId(state = {}, action) {
|
|
11
|
+
switch (action.type) {
|
|
12
|
+
case REQUEST_PRODUCT_DESCRIPTION:
|
|
13
|
+
return {
|
|
14
|
+
...state,
|
|
15
|
+
[action.productId]: {
|
|
16
|
+
...state[action.productId],
|
|
17
|
+
isFetching: true,
|
|
18
|
+
expires: 0
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
case RECEIVE_PRODUCT_DESCRIPTION:
|
|
22
|
+
return {
|
|
23
|
+
...state,
|
|
24
|
+
[action.productId]: {
|
|
25
|
+
...state[action.productId],
|
|
26
|
+
description: action.description,
|
|
27
|
+
isFetching: false,
|
|
28
|
+
expires: Date.now() + PRODUCT_LIFETIME
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
case ERROR_PRODUCT_DESCRIPTION:
|
|
32
|
+
return {
|
|
33
|
+
...state,
|
|
34
|
+
[action.productId]: {
|
|
35
|
+
...state[action.productId],
|
|
36
|
+
isFetching: false
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
// Mark all product descriptions as expired when action is dispatched with
|
|
40
|
+
// the "description" scope
|
|
41
|
+
case EXPIRE_PRODUCT_DATA:
|
|
42
|
+
{
|
|
43
|
+
if (Array.isArray(action.scopes) && action.scopes.includes('description')) {
|
|
44
|
+
// Expire all descriptions
|
|
45
|
+
return Object.keys(state).reduce((acc, productId) => {
|
|
46
|
+
acc[productId] = {
|
|
47
|
+
...state[productId],
|
|
48
|
+
expires: 0
|
|
49
|
+
};
|
|
50
|
+
return acc;
|
|
51
|
+
}, {});
|
|
52
|
+
}
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
return state;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
import { OPTION_TYPE_TEXT } from "../../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Formats the options from the API to a format our frontend needs.
|
|
3
5
|
* @param {Object} options Product options
|
|
4
6
|
* @return {Array} The formatted options
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const formatOptions = options => options.map(option => ({
|
|
9
|
+
...option,
|
|
10
|
+
...(option.values && {
|
|
11
|
+
values: option.values.map(value => ({
|
|
12
|
+
...value,
|
|
13
|
+
unitPriceModifier: value.unitPriceModifier || 0
|
|
14
|
+
}))
|
|
15
|
+
}),
|
|
16
|
+
...(option.type === OPTION_TYPE_TEXT && {
|
|
17
|
+
unitPriceModifier: option.unitPriceModifier || 0
|
|
18
|
+
})
|
|
19
|
+
}));
|
|
20
|
+
export default formatOptions;
|
|
@@ -1,5 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
import "core-js/modules/es.array.reduce.js";
|
|
2
|
+
import { PRODUCT_LIFETIME } from "../../constants";
|
|
3
|
+
|
|
4
|
+
/**
|
|
2
5
|
* Builds state entries from a collection of products (Array).
|
|
3
6
|
* @param {Array} products A products collection.
|
|
4
7
|
* @return {Object} The product entries for the state.
|
|
5
|
-
*/
|
|
8
|
+
*/
|
|
9
|
+
const handleProductCollection = products => {
|
|
10
|
+
if (!Array.isArray(products)) {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
return products.reduce((currentProducts, productData) => ({
|
|
14
|
+
...currentProducts,
|
|
15
|
+
[productData.id]: {
|
|
16
|
+
productData,
|
|
17
|
+
isFetching: false,
|
|
18
|
+
expires: Date.now() + PRODUCT_LIFETIME
|
|
19
|
+
}
|
|
20
|
+
}), {});
|
|
21
|
+
};
|
|
22
|
+
export default handleProductCollection;
|
|
@@ -1,8 +1,55 @@
|
|
|
1
|
-
|
|
1
|
+
import "core-js/modules/es.array.reduce.js";
|
|
2
|
+
import { PRODUCT_LIFETIME, REQUEST_PRODUCT_IMAGES, RECEIVE_PRODUCT_IMAGES, ERROR_PRODUCT_IMAGES, EXPIRE_PRODUCT_DATA } from "../constants";
|
|
3
|
+
|
|
4
|
+
/**
|
|
2
5
|
* Stores product images by product id
|
|
3
6
|
* @param {Object} state Current state.
|
|
4
7
|
* @param {Object} action The action object.
|
|
5
8
|
* @returns {Object}
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
*/
|
|
10
|
+
export default function imagesByProductId(state = {}, action) {
|
|
11
|
+
switch (action.type) {
|
|
12
|
+
case REQUEST_PRODUCT_IMAGES:
|
|
13
|
+
return {
|
|
14
|
+
...state,
|
|
15
|
+
[action.productId]: {
|
|
16
|
+
...state[action.productId],
|
|
17
|
+
isFetching: true,
|
|
18
|
+
expires: 0
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
case RECEIVE_PRODUCT_IMAGES:
|
|
22
|
+
return {
|
|
23
|
+
...state,
|
|
24
|
+
[action.productId]: {
|
|
25
|
+
isFetching: false,
|
|
26
|
+
expires: Date.now() + PRODUCT_LIFETIME,
|
|
27
|
+
images: action.productImages
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
case ERROR_PRODUCT_IMAGES:
|
|
31
|
+
return {
|
|
32
|
+
...state,
|
|
33
|
+
[action.productId]: {
|
|
34
|
+
isFetching: false
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
// Mark all product images as expired when action is dispatched with the "media" scope
|
|
38
|
+
case EXPIRE_PRODUCT_DATA:
|
|
39
|
+
{
|
|
40
|
+
if (Array.isArray(action.scopes) && action.scopes.includes('media')) {
|
|
41
|
+
// Expire all descriptions
|
|
42
|
+
return Object.keys(state).reduce((acc, productId) => {
|
|
43
|
+
acc[productId] = {
|
|
44
|
+
...state[productId],
|
|
45
|
+
expires: 0
|
|
46
|
+
};
|
|
47
|
+
return acc;
|
|
48
|
+
}, {});
|
|
49
|
+
}
|
|
50
|
+
return state;
|
|
51
|
+
}
|
|
52
|
+
default:
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -1 +1,23 @@
|
|
|
1
|
-
import{combineReducers}from'redux';
|
|
1
|
+
import { combineReducers } from 'redux';
|
|
2
|
+
import productsById from "./productsById";
|
|
3
|
+
import imagesByProductId from "./imagesByProductId";
|
|
4
|
+
import descriptionsByProductId from "./descriptionsByProductId";
|
|
5
|
+
import propertiesByProductId from "./propertiesByProductId";
|
|
6
|
+
import shippingByProductId from "./shippingByProductId";
|
|
7
|
+
import variantsByProductId from "./variantsByProductId";
|
|
8
|
+
import optionsByProductId from "./optionsByProductId";
|
|
9
|
+
import resultsByHash from "./resultsByHash";
|
|
10
|
+
import productRelationsByHash from "./productRelationsByHash";
|
|
11
|
+
import mediaByProductId from "./mediaByProductId";
|
|
12
|
+
export default combineReducers({
|
|
13
|
+
descriptionsByProductId,
|
|
14
|
+
imagesByProductId,
|
|
15
|
+
optionsByProductId,
|
|
16
|
+
productRelationsByHash,
|
|
17
|
+
productsById,
|
|
18
|
+
propertiesByProductId,
|
|
19
|
+
resultsByHash,
|
|
20
|
+
shippingByProductId,
|
|
21
|
+
variantsByProductId,
|
|
22
|
+
mediaByProductId
|
|
23
|
+
});
|
|
@@ -1,7 +1,59 @@
|
|
|
1
|
-
|
|
1
|
+
import "core-js/modules/es.array.reduce.js";
|
|
2
|
+
import { PRODUCT_LIFETIME, REQUEST_PRODUCT_MEDIA, RECEIVE_PRODUCT_MEDIA, ERROR_PRODUCT_MEDIA, EXPIRE_PRODUCT_DATA } from "../constants";
|
|
3
|
+
|
|
4
|
+
/**
|
|
2
5
|
* Stores product media by the ID of the related parent product.
|
|
3
6
|
* @param {Object} [state={}] The current state.
|
|
4
7
|
* @param {Object} action The action object.
|
|
5
8
|
* @return {Object} The new state.
|
|
6
|
-
*/
|
|
7
|
-
|
|
9
|
+
*/
|
|
10
|
+
export default function mediaByProductId(state = {}, action) {
|
|
11
|
+
switch (action.type) {
|
|
12
|
+
case REQUEST_PRODUCT_MEDIA:
|
|
13
|
+
return {
|
|
14
|
+
...state,
|
|
15
|
+
[action.productId]: {
|
|
16
|
+
...state[action.productId],
|
|
17
|
+
isFetching: true,
|
|
18
|
+
expires: 0
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
case RECEIVE_PRODUCT_MEDIA:
|
|
22
|
+
{
|
|
23
|
+
return {
|
|
24
|
+
...state,
|
|
25
|
+
[action.productId]: {
|
|
26
|
+
...state[action.productId],
|
|
27
|
+
media: action.media,
|
|
28
|
+
isFetching: false,
|
|
29
|
+
expires: Date.now() + PRODUCT_LIFETIME
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
case ERROR_PRODUCT_MEDIA:
|
|
34
|
+
return {
|
|
35
|
+
...state,
|
|
36
|
+
[action.productId]: {
|
|
37
|
+
...state[action.productId],
|
|
38
|
+
isFetching: false
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Mark all product media as expired when action is dispatched with the "media" scope
|
|
43
|
+
case EXPIRE_PRODUCT_DATA:
|
|
44
|
+
{
|
|
45
|
+
if (Array.isArray(action.scopes) && action.scopes.includes('media')) {
|
|
46
|
+
return Object.keys(state).reduce((acc, productId) => {
|
|
47
|
+
acc[productId] = {
|
|
48
|
+
...state[productId],
|
|
49
|
+
expires: 0
|
|
50
|
+
};
|
|
51
|
+
return acc;
|
|
52
|
+
}, {});
|
|
53
|
+
}
|
|
54
|
+
return state;
|
|
55
|
+
}
|
|
56
|
+
default:
|
|
57
|
+
return state;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -1,6 +1,45 @@
|
|
|
1
|
-
|
|
1
|
+
import { PRODUCT_LIFETIME, REQUEST_PRODUCT_OPTIONS, RECEIVE_PRODUCT_OPTIONS, ERROR_PRODUCT_OPTIONS } from "../constants";
|
|
2
|
+
import formatOptions from "./helpers/formatOptions";
|
|
3
|
+
|
|
4
|
+
/**
|
|
2
5
|
* Stores product options by the ID of the related parent product.
|
|
3
6
|
* @param {Object} [state={}] The current state.
|
|
4
7
|
* @param {Object} action The action object.
|
|
5
8
|
* @return {Object} The new state.
|
|
6
|
-
*/
|
|
9
|
+
*/
|
|
10
|
+
export default function optionsByProductId(state = {}, action) {
|
|
11
|
+
switch (action.type) {
|
|
12
|
+
case REQUEST_PRODUCT_OPTIONS:
|
|
13
|
+
return {
|
|
14
|
+
...state,
|
|
15
|
+
[action.productId]: {
|
|
16
|
+
...state[action.productId],
|
|
17
|
+
isFetching: true,
|
|
18
|
+
expires: 0
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
case RECEIVE_PRODUCT_OPTIONS:
|
|
22
|
+
{
|
|
23
|
+
const options = formatOptions(action.options);
|
|
24
|
+
return {
|
|
25
|
+
...state,
|
|
26
|
+
[action.productId]: {
|
|
27
|
+
...state[action.productId],
|
|
28
|
+
options,
|
|
29
|
+
isFetching: false,
|
|
30
|
+
expires: Date.now() + PRODUCT_LIFETIME
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
case ERROR_PRODUCT_OPTIONS:
|
|
35
|
+
return {
|
|
36
|
+
...state,
|
|
37
|
+
[action.productId]: {
|
|
38
|
+
...state[action.productId],
|
|
39
|
+
isFetching: false
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
default:
|
|
43
|
+
return state;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -1,6 +1,47 @@
|
|
|
1
|
-
|
|
1
|
+
import { REQUEST_PRODUCT_RELATIONS, RECEIVE_PRODUCT_RELATIONS, ERROR_PRODUCT_RELATIONS, PRODUCT_LIFETIME } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Product relations reducer.
|
|
3
5
|
* @param {Object} state State.
|
|
4
6
|
* @param {Object} action Action.
|
|
5
7
|
* @returns {Object}
|
|
6
|
-
*/
|
|
8
|
+
*/
|
|
9
|
+
const productRelationsByHash = (state = {}, action) => {
|
|
10
|
+
switch (action.type) {
|
|
11
|
+
case REQUEST_PRODUCT_RELATIONS:
|
|
12
|
+
return {
|
|
13
|
+
...state,
|
|
14
|
+
[action.hash]: {
|
|
15
|
+
...state[action.hash],
|
|
16
|
+
isFetching: true,
|
|
17
|
+
expires: 0
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
case RECEIVE_PRODUCT_RELATIONS:
|
|
21
|
+
return {
|
|
22
|
+
...state,
|
|
23
|
+
[action.hash]: {
|
|
24
|
+
productIds: action.payload.relations.map(product => {
|
|
25
|
+
if (product.productId) {
|
|
26
|
+
return product.productId;
|
|
27
|
+
}
|
|
28
|
+
return product.id;
|
|
29
|
+
}),
|
|
30
|
+
isFetching: false,
|
|
31
|
+
expires: Date.now() + PRODUCT_LIFETIME
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
case ERROR_PRODUCT_RELATIONS:
|
|
35
|
+
return {
|
|
36
|
+
...state,
|
|
37
|
+
[action.hash]: {
|
|
38
|
+
...state[action.hash],
|
|
39
|
+
isFetching: false,
|
|
40
|
+
expires: 0
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
default:
|
|
44
|
+
return state;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export default productRelationsByHash;
|
|
@@ -1,11 +1,126 @@
|
|
|
1
|
-
|
|
1
|
+
import "core-js/modules/es.array.reduce.js";
|
|
2
|
+
import { ENOTFOUND } from '@shopgate/pwa-core/constants/Pipeline';
|
|
3
|
+
import { PRODUCT_LIFETIME, REQUEST_PRODUCT, RECEIVE_PRODUCT, RECEIVE_PRODUCTS, ERROR_PRODUCT, UPDATE_METADATA, EXPIRE_PRODUCT_BY_ID, DELETE_PRODUCTS_BY_IDS, RECEIVE_PRODUCT_RELATIONS, EXPIRE_PRODUCT_DATA } from "../constants";
|
|
4
|
+
import handleProductCollection from "./helpers/handleProductCollection";
|
|
5
|
+
|
|
6
|
+
/**
|
|
2
7
|
* Stores products by their ID.
|
|
3
8
|
* @param {Object} [state={}] The current state.
|
|
4
9
|
* @param {Object} action The action object.
|
|
5
10
|
* @return {Object} The new state.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return
|
|
11
|
-
|
|
11
|
+
*/
|
|
12
|
+
export default function productsById(state = {}, action) {
|
|
13
|
+
switch (action.type) {
|
|
14
|
+
case RECEIVE_PRODUCTS:
|
|
15
|
+
return {
|
|
16
|
+
...state,
|
|
17
|
+
...handleProductCollection(action.products)
|
|
18
|
+
};
|
|
19
|
+
case RECEIVE_PRODUCT_RELATIONS:
|
|
20
|
+
return {
|
|
21
|
+
...state,
|
|
22
|
+
...handleProductCollection(action.payload.relations)
|
|
23
|
+
};
|
|
24
|
+
case REQUEST_PRODUCT:
|
|
25
|
+
return {
|
|
26
|
+
...state,
|
|
27
|
+
[action.productId]: {
|
|
28
|
+
...state[action.productId],
|
|
29
|
+
isFetching: true,
|
|
30
|
+
expires: 0
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
case RECEIVE_PRODUCT:
|
|
34
|
+
return {
|
|
35
|
+
...state,
|
|
36
|
+
[action.productId]: {
|
|
37
|
+
...state[action.productId],
|
|
38
|
+
productData: action.productData,
|
|
39
|
+
isFetching: false,
|
|
40
|
+
expires: Date.now() + PRODUCT_LIFETIME
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
case ERROR_PRODUCT:
|
|
44
|
+
if (action.errorCode === ENOTFOUND) {
|
|
45
|
+
// Remove the entry from the state when noting was found for the productId.
|
|
46
|
+
const {
|
|
47
|
+
[action.productId]: ignore,
|
|
48
|
+
...rest
|
|
49
|
+
} = state;
|
|
50
|
+
return rest;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
...state,
|
|
54
|
+
[action.productId]: {
|
|
55
|
+
...state[action.productId],
|
|
56
|
+
isFetching: false
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
case UPDATE_METADATA:
|
|
60
|
+
{
|
|
61
|
+
const {
|
|
62
|
+
productData = {}
|
|
63
|
+
} = state[action.productId];
|
|
64
|
+
|
|
65
|
+
// Merge the given metadata with the existing metadata.
|
|
66
|
+
const metadata = {
|
|
67
|
+
...productData.metadata,
|
|
68
|
+
...action.metadata
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// Put the metadata back into the productData.
|
|
72
|
+
const updatedProductData = {
|
|
73
|
+
...productData,
|
|
74
|
+
metadata
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Put the updated product back into the state.
|
|
78
|
+
return {
|
|
79
|
+
...state,
|
|
80
|
+
[action.productId]: {
|
|
81
|
+
...state[action.productId],
|
|
82
|
+
productData: updatedProductData
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
case EXPIRE_PRODUCT_BY_ID:
|
|
87
|
+
return {
|
|
88
|
+
...state,
|
|
89
|
+
[action.productId]: {
|
|
90
|
+
...state[action.productId],
|
|
91
|
+
expires: 0
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Mark all product data as expired
|
|
96
|
+
case EXPIRE_PRODUCT_DATA:
|
|
97
|
+
{
|
|
98
|
+
if (Array.isArray(action.scopes) && action.scopes.includes('price')) {
|
|
99
|
+
return Object.keys(state).reduce((accumulator, productId) => {
|
|
100
|
+
accumulator[productId] = {
|
|
101
|
+
...accumulator[productId],
|
|
102
|
+
expires: 0
|
|
103
|
+
};
|
|
104
|
+
return accumulator;
|
|
105
|
+
}, {
|
|
106
|
+
...state
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return state;
|
|
110
|
+
}
|
|
111
|
+
case DELETE_PRODUCTS_BY_IDS:
|
|
112
|
+
{
|
|
113
|
+
const nextState = {
|
|
114
|
+
...state
|
|
115
|
+
};
|
|
116
|
+
if (Array.isArray(action?.productIds)) {
|
|
117
|
+
action.productIds.forEach(productId => {
|
|
118
|
+
delete nextState[productId];
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return nextState;
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
return state;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -1,6 +1,52 @@
|
|
|
1
|
-
|
|
1
|
+
import "core-js/modules/es.array.reduce.js";
|
|
2
|
+
import { PRODUCT_LIFETIME, REQUEST_PRODUCT_PROPERTIES, RECEIVE_PRODUCT_PROPERTIES, ERROR_PRODUCT_PROPERTIES, EXPIRE_PRODUCT_DATA } from "../constants";
|
|
3
|
+
|
|
4
|
+
/**
|
|
2
5
|
* Stores product properties by their product ID.
|
|
3
6
|
* @param {Object} [state={}] The current state.
|
|
4
7
|
* @param {Object} action The action object.
|
|
5
8
|
* @return {Object} The new state.
|
|
6
|
-
*/
|
|
9
|
+
*/
|
|
10
|
+
export default function propertiesByProductId(state = {}, action) {
|
|
11
|
+
switch (action.type) {
|
|
12
|
+
case REQUEST_PRODUCT_PROPERTIES:
|
|
13
|
+
return {
|
|
14
|
+
...state,
|
|
15
|
+
[action.productId]: {
|
|
16
|
+
...state[action.productId],
|
|
17
|
+
isFetching: true,
|
|
18
|
+
expires: 0
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
case RECEIVE_PRODUCT_PROPERTIES:
|
|
22
|
+
return {
|
|
23
|
+
...state,
|
|
24
|
+
[action.productId]: {
|
|
25
|
+
...state[action.productId],
|
|
26
|
+
properties: action.properties,
|
|
27
|
+
isFetching: false,
|
|
28
|
+
expires: Date.now() + PRODUCT_LIFETIME
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
case ERROR_PRODUCT_PROPERTIES:
|
|
32
|
+
return {
|
|
33
|
+
...state,
|
|
34
|
+
[action.productId]: {
|
|
35
|
+
...state[action.productId],
|
|
36
|
+
isFetching: false
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
case EXPIRE_PRODUCT_DATA:
|
|
40
|
+
{
|
|
41
|
+
return Object.keys(state).reduce((acc, productId) => {
|
|
42
|
+
acc[productId] = {
|
|
43
|
+
...state[productId],
|
|
44
|
+
expires: 0
|
|
45
|
+
};
|
|
46
|
+
return acc;
|
|
47
|
+
}, {});
|
|
48
|
+
}
|
|
49
|
+
default:
|
|
50
|
+
return state;
|
|
51
|
+
}
|
|
52
|
+
}
|