@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
package/product/streams/index.js
CHANGED
|
@@ -1,24 +1,178 @@
|
|
|
1
|
-
|
|
1
|
+
import 'rxjs/add/operator/switchMap';
|
|
2
|
+
import 'rxjs/add/observable/of';
|
|
3
|
+
import { Observable } from 'rxjs/Observable';
|
|
4
|
+
import { ENOTFOUND } from '@shopgate/pwa-core';
|
|
5
|
+
import { main$ } from '@shopgate/pwa-common/streams/main';
|
|
6
|
+
import { routeWillEnter$, routeWillLeave$, routeDidUpdate$ } from '@shopgate/pwa-common/streams/router';
|
|
7
|
+
import { pwaDidAppear$ } from '@shopgate/pwa-common/streams';
|
|
8
|
+
import { getCurrentRoute } from '@shopgate/pwa-common/selectors/router';
|
|
9
|
+
import { hex2bin } from '@shopgate/pwa-common/helpers/data';
|
|
10
|
+
import { getBaseProduct } from "../selectors/product";
|
|
11
|
+
import { ITEM_PATTERN, ITEM_GALLERY_PATTERN, RECEIVE_PRODUCT, RECEIVE_PRODUCT_CACHED, RECEIVE_PRODUCT_RELATIONS, ERROR_PRODUCT, ERROR_PRODUCT_DESCRIPTION, ERROR_PRODUCT_IMAGES, ERROR_PRODUCT_VARIANTS, ERROR_PRODUCT_PROPERTIES, ERROR_PRODUCT_OPTIONS, ERROR_PRODUCT_SHIPPING, PRODUCT_NOT_AVAILABLE, RECEIVE_PRODUCTS_CACHED, RECEIVE_PRODUCTS, PROVIDE_PRODUCT_BUFFER_TIME, PROVIDE_PRODUCT, EXPIRE_PRODUCT_DATA, REFRESH_EXPIRED_PDP_DATA } from "../constants";
|
|
12
|
+
|
|
13
|
+
/**
|
|
2
14
|
* Emits when the category route comes active again after a legacy page was active.
|
|
3
|
-
*/
|
|
15
|
+
*/
|
|
16
|
+
export const productRouteReappeared$ = pwaDidAppear$.filter(({
|
|
17
|
+
action
|
|
18
|
+
}) => action.route.pattern === ITEM_PATTERN);
|
|
19
|
+
export const productWillEnter$ = routeWillEnter$.merge(routeDidUpdate$).filter(({
|
|
20
|
+
action
|
|
21
|
+
}) => action.route.pattern === ITEM_PATTERN);
|
|
22
|
+
export const variantWillUpdate$ = routeDidUpdate$.filter(({
|
|
23
|
+
action
|
|
24
|
+
}) => action.route.pattern === ITEM_PATTERN);
|
|
25
|
+
export const galleryWillEnter$ = routeWillEnter$.filter(({
|
|
26
|
+
action
|
|
27
|
+
}) => action.route.pattern === ITEM_GALLERY_PATTERN);
|
|
28
|
+
export const galleryWillLeave$ = routeWillLeave$.filter(({
|
|
29
|
+
action
|
|
30
|
+
}) => action.route.pattern === ITEM_GALLERY_PATTERN);
|
|
31
|
+
export const productReceived$ = main$.filter(({
|
|
32
|
+
action
|
|
33
|
+
}) => action.type === RECEIVE_PRODUCT).distinctUntilChanged();
|
|
34
|
+
|
|
35
|
+
/** Dispatched when ERROR_PRODUCT received */
|
|
36
|
+
export const errorProduct$ = main$.filter(({
|
|
37
|
+
action
|
|
38
|
+
}) => action.type === ERROR_PRODUCT);
|
|
39
|
+
|
|
40
|
+
/** Dispatched when ERROR_PRODUCT_* (resources) is received */
|
|
41
|
+
export const errorProductResources$ = main$.filter(({
|
|
42
|
+
action
|
|
43
|
+
}) => [ERROR_PRODUCT_DESCRIPTION, ERROR_PRODUCT_IMAGES, ERROR_PRODUCT_VARIANTS, ERROR_PRODUCT_PROPERTIES, ERROR_PRODUCT_OPTIONS, ERROR_PRODUCT_SHIPPING].includes(action.type));
|
|
44
|
+
|
|
45
|
+
/** Dispatched when ERROR_PRODUCT ENOTFOUND received */
|
|
46
|
+
export const errorProductNotFound$ = errorProduct$.filter(({
|
|
47
|
+
action
|
|
48
|
+
}) => action.errorCode === ENOTFOUND);
|
|
49
|
+
|
|
50
|
+
/** Dispatched when ERROR_PRODUCT_* ENOTFOUND received */
|
|
51
|
+
export const errorProductResourcesNotFound$ = errorProductResources$.filter(({
|
|
52
|
+
action
|
|
53
|
+
}) => action.errorCode === ENOTFOUND);
|
|
54
|
+
export const cachedProductReceived$ = main$.filter(({
|
|
55
|
+
action
|
|
56
|
+
}) => action.type === RECEIVE_PRODUCT_CACHED).distinctUntilChanged();
|
|
57
|
+
export const receivedVisibleProduct$ = productReceived$.merge(cachedProductReceived$).filter(({
|
|
58
|
+
action,
|
|
59
|
+
getState
|
|
60
|
+
}) => {
|
|
61
|
+
const route = getCurrentRoute(getState());
|
|
62
|
+
if (typeof action.productData === 'undefined' || typeof action.productData.id === 'undefined') {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
if (!route.params.productId && !route.state.productId) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (route.state.productId) {
|
|
69
|
+
return action.productData.id === route.state.productId;
|
|
70
|
+
}
|
|
71
|
+
return action.productData.id === hex2bin(route.params.productId);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
/**
|
|
4
75
|
* Emits when a product page was initially opened and its data is present.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
76
|
+
*/
|
|
77
|
+
export const productIsReady$ = productWillEnter$
|
|
78
|
+
// Take care that the stream only emits when underlying streams emit within the correct order.
|
|
79
|
+
.switchMap(() => receivedVisibleProduct$.first()).merge(productRouteReappeared$);
|
|
80
|
+
|
|
81
|
+
/** Dispatched when ERROR_PRODUCT ENOTFOUND of visible product is received */
|
|
82
|
+
export const visibleProductNotFound$ = errorProductNotFound$.withLatestFrom(routeWillEnter$).filter(([errorAction, routeAction]) => routeAction.action.route.pattern === ITEM_PATTERN && errorAction.action.productId === hex2bin(routeAction.action.route.params.productId)).map(([errorAction]) => errorAction);
|
|
83
|
+
export const variantDidChange$ = variantWillUpdate$
|
|
84
|
+
// Take care that the stream only emits when underlying streams emit within the correct order.
|
|
85
|
+
.switchMap(() => receivedVisibleProduct$.first().switchMap(data => {
|
|
86
|
+
const {
|
|
87
|
+
id,
|
|
88
|
+
baseProductId
|
|
89
|
+
} = data.action.productData;
|
|
90
|
+
const variantId = baseProductId !== null ? id : null;
|
|
91
|
+
const baseProduct = getBaseProduct(data.getState(), {
|
|
92
|
+
variantId
|
|
93
|
+
});
|
|
94
|
+
if (baseProduct === null) {
|
|
95
|
+
/**
|
|
96
|
+
* A PDP with a variant product was opened, but the base product is not fetched yet.
|
|
97
|
+
* So emitting of the stream is postponed till the data is present.
|
|
98
|
+
*/
|
|
99
|
+
return productReceived$;
|
|
100
|
+
}
|
|
101
|
+
return Observable.of(data);
|
|
102
|
+
}));
|
|
103
|
+
export const productRelationsReceived$ = main$.filter(({
|
|
104
|
+
action
|
|
105
|
+
}) => action.type === RECEIVE_PRODUCT_RELATIONS);
|
|
106
|
+
export const productNotAvailable$ = main$.filter(({
|
|
107
|
+
action
|
|
108
|
+
}) => action.type === PRODUCT_NOT_AVAILABLE);
|
|
109
|
+
|
|
110
|
+
/**
|
|
11
111
|
* Emits when product results has been received.
|
|
12
|
-
*/
|
|
112
|
+
*/
|
|
113
|
+
export const productsReceived$ = main$.filter(({
|
|
114
|
+
action
|
|
115
|
+
}) => action.type === RECEIVE_PRODUCTS);
|
|
116
|
+
|
|
117
|
+
/**
|
|
13
118
|
* Emits when product results has been received from cache.
|
|
14
|
-
*/
|
|
119
|
+
*/
|
|
120
|
+
export const productsReceivedCached$ = main$.filter(({
|
|
121
|
+
action
|
|
122
|
+
}) => action.type === RECEIVE_PRODUCTS_CACHED);
|
|
123
|
+
|
|
124
|
+
/**
|
|
15
125
|
* Buffer PROVIDE_PRODUCT action and map to have array of requested products
|
|
16
126
|
* @type {Observable}
|
|
17
|
-
*/
|
|
127
|
+
*/
|
|
128
|
+
export const fetchProductsRequested$ = main$.filter(({
|
|
129
|
+
action
|
|
130
|
+
}) => action.type === PROVIDE_PRODUCT).bufferTime(PROVIDE_PRODUCT_BUFFER_TIME).filter(actions => actions.length > 0).map(actions => {
|
|
131
|
+
const productIds = actions.map(({
|
|
132
|
+
action: {
|
|
133
|
+
productId
|
|
134
|
+
}
|
|
135
|
+
}) => productId);
|
|
136
|
+
return {
|
|
137
|
+
...actions[0],
|
|
138
|
+
action: {
|
|
139
|
+
...actions[0].action,
|
|
140
|
+
productId: productIds
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
/**
|
|
18
146
|
* Emits when product data has been expired.
|
|
19
|
-
*/
|
|
147
|
+
*/
|
|
148
|
+
export const productDataExpired$ = main$.filter(({
|
|
149
|
+
action
|
|
150
|
+
}) => action.type === EXPIRE_PRODUCT_DATA);
|
|
151
|
+
|
|
152
|
+
/**
|
|
20
153
|
* Emits when the REFRESH_EXPIRED_PDP_DATA action is dispatched
|
|
21
154
|
* and the current route is a product detail page.
|
|
22
155
|
*
|
|
23
156
|
* Stream payload will contain a route object that reflects the current active product / variant.
|
|
24
|
-
*/
|
|
157
|
+
*/
|
|
158
|
+
export const pdpDataNeedsRefresh$ = main$.filter(({
|
|
159
|
+
action
|
|
160
|
+
}) => action.type === REFRESH_EXPIRED_PDP_DATA).filter(({
|
|
161
|
+
getState
|
|
162
|
+
}) => {
|
|
163
|
+
const {
|
|
164
|
+
pattern
|
|
165
|
+
} = getCurrentRoute(getState());
|
|
166
|
+
return pattern === ITEM_PATTERN;
|
|
167
|
+
}).switchMap(params => {
|
|
168
|
+
const {
|
|
169
|
+
getState
|
|
170
|
+
} = params;
|
|
171
|
+
const route = getCurrentRoute(getState());
|
|
172
|
+
return Observable.of({
|
|
173
|
+
...params,
|
|
174
|
+
action: {
|
|
175
|
+
route
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
@@ -1,9 +1,215 @@
|
|
|
1
|
-
|
|
1
|
+
import "core-js/modules/es.regexp.flags.js";
|
|
2
|
+
import { hex2bin } from '@shopgate/pwa-common/helpers/data';
|
|
3
|
+
import showModal from '@shopgate/pwa-common/actions/modal/showModal';
|
|
4
|
+
import { getThemeSettings, historyPop, historyPush, routeWillEnter$, routeWillLeave$ } from '@shopgate/engage/core';
|
|
5
|
+
import { ToastProvider } from '@shopgate/pwa-common/providers';
|
|
6
|
+
import { getSearchRoute } from '@shopgate/pwa-common-commerce/search';
|
|
7
|
+
import fetchProduct from "../actions/fetchProduct";
|
|
8
|
+
import fetchProductDescription from "../actions/fetchProductDescription";
|
|
9
|
+
import fetchProductProperties from "../actions/fetchProductProperties";
|
|
10
|
+
import fetchProductImages from "../actions/fetchProductImages";
|
|
11
|
+
import fetchProductShipping from "../actions/fetchProductShipping";
|
|
12
|
+
import fetchProductVariants from "../actions/fetchProductVariants";
|
|
13
|
+
import fetchProductOptions from "../actions/fetchProductOptions";
|
|
14
|
+
import fetchProductMedia from "../actions/fetchProductMedia";
|
|
15
|
+
import { productWillEnter$, galleryWillEnter$, productReceived$, cachedProductReceived$, productRelationsReceived$, receivedVisibleProduct$, errorProductResourcesNotFound$, visibleProductNotFound$, productNotAvailable$, fetchProductsRequested$, pdpDataNeedsRefresh$ } from "../streams";
|
|
16
|
+
import fetchProductsById from "../actions/fetchProductsById";
|
|
17
|
+
import { getProductRelationsByHash } from "../selectors/relations";
|
|
18
|
+
import { checkoutSucceeded$ } from "../../checkout/streams";
|
|
19
|
+
import expireProductById from "../action-creators/expireProductById";
|
|
20
|
+
import { ITEM_PATTERN, NOT_AVAILABLE_EFFECTIVITY_DATES } from "../constants";
|
|
21
|
+
import { getProductName } from "../selectors/product";
|
|
22
|
+
const fetchPDPData$ = productWillEnter$.merge(pdpDataNeedsRefresh$);
|
|
23
|
+
|
|
24
|
+
/**
|
|
2
25
|
* Product subscriptions.
|
|
3
26
|
* @param {Function} subscribe The subscribe function.
|
|
4
|
-
*/
|
|
27
|
+
*/
|
|
28
|
+
function product(subscribe) {
|
|
29
|
+
const processProduct$ = productReceived$.merge(cachedProductReceived$);
|
|
30
|
+
subscribe(fetchPDPData$, ({
|
|
31
|
+
action,
|
|
32
|
+
dispatch
|
|
33
|
+
}) => {
|
|
34
|
+
const {
|
|
35
|
+
productId
|
|
36
|
+
} = action.route.params;
|
|
37
|
+
const {
|
|
38
|
+
productId: variantId
|
|
39
|
+
} = action.route.state;
|
|
40
|
+
const id = variantId || hex2bin(productId);
|
|
41
|
+
dispatch(fetchProduct(id));
|
|
42
|
+
dispatch(fetchProductDescription(id));
|
|
43
|
+
dispatch(fetchProductProperties(id));
|
|
44
|
+
dispatch(fetchProductImages(id));
|
|
45
|
+
dispatch(fetchProductShipping(id));
|
|
46
|
+
/**
|
|
5
47
|
* This feature is currently in BETA testing.
|
|
6
48
|
* It should only be used for approved BETA Client Projects
|
|
7
|
-
*/
|
|
49
|
+
*/
|
|
50
|
+
dispatch(fetchProductMedia(id));
|
|
51
|
+
});
|
|
52
|
+
subscribe(galleryWillEnter$, ({
|
|
53
|
+
action,
|
|
54
|
+
dispatch
|
|
55
|
+
}) => {
|
|
56
|
+
const {
|
|
57
|
+
productId
|
|
58
|
+
} = action.route.params;
|
|
59
|
+
dispatch(fetchProductImages(hex2bin(productId)));
|
|
60
|
+
dispatch(fetchProductMedia(hex2bin(productId)));
|
|
61
|
+
});
|
|
62
|
+
subscribe(processProduct$, ({
|
|
63
|
+
action,
|
|
64
|
+
dispatch
|
|
65
|
+
}) => {
|
|
66
|
+
const {
|
|
67
|
+
id,
|
|
68
|
+
flags = {
|
|
69
|
+
hasVariants: false,
|
|
70
|
+
hasOptions: false
|
|
71
|
+
},
|
|
72
|
+
baseProductId,
|
|
73
|
+
active
|
|
74
|
+
} = action.productData;
|
|
75
|
+
if (baseProductId) {
|
|
76
|
+
dispatch(fetchProduct(baseProductId));
|
|
77
|
+
dispatch(fetchProductImages(baseProductId));
|
|
78
|
+
}
|
|
79
|
+
if (active && flags.hasVariants) {
|
|
80
|
+
dispatch(fetchProductVariants(id));
|
|
81
|
+
}
|
|
82
|
+
if (active && flags.hasOptions) {
|
|
83
|
+
dispatch(fetchProductOptions(id));
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const errorProductResourcesNotFoundFirst$ = receivedVisibleProduct$.filter(({
|
|
87
|
+
action
|
|
88
|
+
}) => {
|
|
89
|
+
const active = action?.productData?.active;
|
|
90
|
+
return !!active;
|
|
91
|
+
}).switchMap(() => errorProductResourcesNotFound$.first());
|
|
92
|
+
|
|
93
|
+
/** Refresh product data after some of resources has ENOTFOUND code */
|
|
94
|
+
subscribe(errorProductResourcesNotFoundFirst$, ({
|
|
95
|
+
action,
|
|
96
|
+
dispatch
|
|
97
|
+
}) => {
|
|
98
|
+
const {
|
|
99
|
+
productId
|
|
100
|
+
} = action;
|
|
101
|
+
dispatch(fetchProduct(productId, true));
|
|
102
|
+
});
|
|
103
|
+
const productNotFound$ = visibleProductNotFound$.withLatestFrom(receivedVisibleProduct$.startWith({
|
|
104
|
+
action: {
|
|
105
|
+
productData: {}
|
|
106
|
+
}
|
|
107
|
+
}));
|
|
108
|
+
/** Visible product is no more available */
|
|
109
|
+
subscribe(productNotFound$, ([{
|
|
110
|
+
action,
|
|
111
|
+
dispatch
|
|
112
|
+
}, {
|
|
113
|
+
action: {
|
|
114
|
+
productData
|
|
115
|
+
}
|
|
116
|
+
}]) => {
|
|
117
|
+
const {
|
|
118
|
+
productId
|
|
119
|
+
} = action;
|
|
120
|
+
const name = productData.id === productId ? productData.name : productId;
|
|
121
|
+
dispatch(showModal({
|
|
122
|
+
confirm: null,
|
|
123
|
+
dismiss: 'modal.ok',
|
|
124
|
+
title: 'modal.title_error',
|
|
125
|
+
message: 'product.no_more_found',
|
|
126
|
+
params: {
|
|
127
|
+
name
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
dispatch(historyPop());
|
|
131
|
+
dispatch(expireProductById(productId));
|
|
132
|
+
});
|
|
133
|
+
subscribe(productRelationsReceived$, ({
|
|
134
|
+
dispatch,
|
|
135
|
+
getState,
|
|
136
|
+
action
|
|
137
|
+
}) => {
|
|
138
|
+
const {
|
|
139
|
+
hash
|
|
140
|
+
} = action;
|
|
141
|
+
const productIds = getProductRelationsByHash(hash)(getState());
|
|
142
|
+
dispatch(fetchProductsById(productIds));
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
/**
|
|
8
146
|
* Expire products after checkout, fetch updated data
|
|
9
|
-
*/
|
|
147
|
+
*/
|
|
148
|
+
subscribe(checkoutSucceeded$, ({
|
|
149
|
+
dispatch,
|
|
150
|
+
action
|
|
151
|
+
}) => {
|
|
152
|
+
const {
|
|
153
|
+
products
|
|
154
|
+
} = action;
|
|
155
|
+
const productIds = products.map(p => p.product.id);
|
|
156
|
+
productIds.forEach(id => dispatch(expireProductById(id)));
|
|
157
|
+
dispatch(fetchProductsById(productIds));
|
|
158
|
+
});
|
|
159
|
+
const productNotAvailableEffDates$ = productNotAvailable$.filter(({
|
|
160
|
+
action
|
|
161
|
+
}) => action.reason === NOT_AVAILABLE_EFFECTIVITY_DATES);
|
|
162
|
+
|
|
163
|
+
/** PDP expired effectivity dates */
|
|
164
|
+
const productNotAvailableEffDatesPDP$ = productNotAvailableEffDates$.withLatestFrom(routeWillEnter$).filter(([notAvailable, willEnter]) => willEnter.action.route.pattern === ITEM_PATTERN && notAvailable.action.productId === willEnter.action.route.state.productId).map(([notAvailable]) => notAvailable);
|
|
165
|
+
subscribe(productNotAvailableEffDatesPDP$, ({
|
|
166
|
+
action,
|
|
167
|
+
getState,
|
|
168
|
+
dispatch,
|
|
169
|
+
events
|
|
170
|
+
}) => {
|
|
171
|
+
const {
|
|
172
|
+
effectivityDates: {
|
|
173
|
+
accessExpired
|
|
174
|
+
} = {}
|
|
175
|
+
} = getThemeSettings('product') || {};
|
|
176
|
+
if (accessExpired === false) {
|
|
177
|
+
const {
|
|
178
|
+
productId
|
|
179
|
+
} = action;
|
|
180
|
+
dispatch(historyPop());
|
|
181
|
+
const name = getProductName(getState(), {
|
|
182
|
+
productId
|
|
183
|
+
});
|
|
184
|
+
events.emit(ToastProvider.ADD, {
|
|
185
|
+
id: 'product.available.not_search_similar',
|
|
186
|
+
message: 'product.available.not_search_similar',
|
|
187
|
+
messageParams: {
|
|
188
|
+
name
|
|
189
|
+
},
|
|
190
|
+
action: () => dispatch(historyPush({
|
|
191
|
+
pathname: getSearchRoute(name)
|
|
192
|
+
}))
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
/** Expired effectivity dates products after PLP leave */
|
|
198
|
+
const productNotAvailableEffDatesPLP$ = productNotAvailableEffDates$.buffer(routeWillLeave$).filter(buffered => buffered.length);
|
|
199
|
+
subscribe(productNotAvailableEffDatesPLP$, buffered => {
|
|
200
|
+
const [{
|
|
201
|
+
dispatch
|
|
202
|
+
}] = buffered;
|
|
203
|
+
const productIds = buffered.map(params => params.action.productId);
|
|
204
|
+
dispatch(expireProductById(productIds, true));
|
|
205
|
+
});
|
|
206
|
+
subscribe(fetchProductsRequested$, ({
|
|
207
|
+
dispatch,
|
|
208
|
+
action: {
|
|
209
|
+
productId
|
|
210
|
+
}
|
|
211
|
+
}) => {
|
|
212
|
+
dispatch(fetchProductsById(Array.isArray(productId) ? productId : [productId]));
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
export default product;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import{ERROR_PRODUCT_REVIEWS}from"../constants"
|
|
1
|
+
import { ERROR_PRODUCT_REVIEWS } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the ERROR_PRODUCT_REVIEWS action.
|
|
3
5
|
* @param {string} productId The ID of the product
|
|
4
6
|
* @returns {Object} The ERROR_PRODUCT_REVIEWS action
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const errorProductReviews = productId => ({
|
|
9
|
+
type: ERROR_PRODUCT_REVIEWS,
|
|
10
|
+
productId
|
|
11
|
+
});
|
|
12
|
+
export default errorProductReviews;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import{ERROR_REVIEWS}from"../constants"
|
|
1
|
+
import { ERROR_REVIEWS } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the ERROR_REVIEWS action.
|
|
3
5
|
* @param {string} hash Generated hash.
|
|
4
6
|
* @returns {Object} The ERROR_PRODUCT_REVIEWS action.
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const errorProductReviews = hash => ({
|
|
9
|
+
type: ERROR_REVIEWS,
|
|
10
|
+
hash
|
|
11
|
+
});
|
|
12
|
+
export default errorProductReviews;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import{ERROR_SUBMIT_REVIEW}from"../constants"
|
|
1
|
+
import { ERROR_SUBMIT_REVIEW } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the ERROR_SUBMIT_REVIEW action.
|
|
3
5
|
* @param {string} productId The ID of the product.
|
|
4
6
|
* @returns {Object} The ERROR_SUBMIT_REVIEW action.
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const errorSubmitReview = productId => ({
|
|
9
|
+
type: ERROR_SUBMIT_REVIEW,
|
|
10
|
+
productId
|
|
11
|
+
});
|
|
12
|
+
export default errorSubmitReview;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import{ERROR_USER_REVIEW}from"../constants"
|
|
1
|
+
import { ERROR_USER_REVIEW } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the ERROR_USER_REVIEW action.
|
|
3
5
|
* @param {string} productId The ID of the product.
|
|
4
6
|
* @returns {Object} The ERROR_USER_REVIEW action.
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const errorUserReview = productId => ({
|
|
9
|
+
type: ERROR_USER_REVIEW,
|
|
10
|
+
productId
|
|
11
|
+
});
|
|
12
|
+
export default errorUserReview;
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import{FLUSH_USER_REVIEWS}from"../constants"
|
|
1
|
+
import { FLUSH_USER_REVIEWS } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the FLUSH_USER_REVIEWS action.
|
|
3
5
|
* @returns {Object} The FLUSH_USER_REVIEWS action
|
|
4
|
-
*/
|
|
6
|
+
*/
|
|
7
|
+
const receiveProductReviews = () => ({
|
|
8
|
+
type: FLUSH_USER_REVIEWS
|
|
9
|
+
});
|
|
10
|
+
export default receiveProductReviews;
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
-
import{RECEIVE_PRODUCT_REVIEWS}from"../constants"
|
|
1
|
+
import { RECEIVE_PRODUCT_REVIEWS } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the RECEIVE_PRODUCT_REVIEWS action.
|
|
3
5
|
* @param {string} productId The ID of the product
|
|
4
6
|
* @param {Object} reviews The received review data
|
|
5
7
|
* @param {number} totalReviewCount The total number of reviews for a product
|
|
6
8
|
* @returns {Object} The RECEIVE_PRODUCT_REVIEWS action
|
|
7
|
-
*/
|
|
9
|
+
*/
|
|
10
|
+
const receiveProductReviews = (productId, reviews, totalReviewCount) => ({
|
|
11
|
+
type: RECEIVE_PRODUCT_REVIEWS,
|
|
12
|
+
productId,
|
|
13
|
+
reviews,
|
|
14
|
+
totalReviewCount
|
|
15
|
+
});
|
|
16
|
+
export default receiveProductReviews;
|
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
import{RECEIVE_REVIEWS}from"../constants"
|
|
1
|
+
import { RECEIVE_REVIEWS } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the RECEIVE_REVIEWS action.
|
|
3
5
|
* @param {string} hash Generated hash for an entity.
|
|
4
6
|
* @param {string} productId The ID of the product.
|
|
5
7
|
* @param {Array} reviews The received review data.
|
|
6
8
|
* @param {number} totalReviewCount The total number of reviews for a product.
|
|
7
9
|
* @returns {Object} The RECEIVE_PRODUCT_REVIEWS action.
|
|
8
|
-
*/
|
|
10
|
+
*/
|
|
11
|
+
const receiveReviews = (hash, productId, reviews, totalReviewCount) => ({
|
|
12
|
+
type: RECEIVE_REVIEWS,
|
|
13
|
+
hash,
|
|
14
|
+
productId,
|
|
15
|
+
reviews,
|
|
16
|
+
totalReviewCount
|
|
17
|
+
});
|
|
18
|
+
export default receiveReviews;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import{RECEIVE_SUBMIT_REVIEW}from"../constants"
|
|
1
|
+
import { RECEIVE_SUBMIT_REVIEW } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the RECEIVE_SUBMIT_REVIEW action.
|
|
3
5
|
* @param {Object} review The received review data.
|
|
4
6
|
* @returns {Object} The RECEIVE_SUBMIT_REVIEW action.
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const receiveSubmitReview = review => ({
|
|
9
|
+
type: RECEIVE_SUBMIT_REVIEW,
|
|
10
|
+
review
|
|
11
|
+
});
|
|
12
|
+
export default receiveSubmitReview;
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import{RECEIVE_USER_REVIEW}from"../constants"
|
|
1
|
+
import { RECEIVE_USER_REVIEW } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the RECEIVE_USER_REVIEW action.
|
|
3
5
|
* @param {string} productId The ID of the product.
|
|
4
6
|
* @param {Object} review The received review data.
|
|
5
7
|
* @returns {Object} The RECEIVE_USER_REVIEW action.
|
|
6
|
-
*/
|
|
8
|
+
*/
|
|
9
|
+
const receiveUserReview = (productId, review) => ({
|
|
10
|
+
type: RECEIVE_USER_REVIEW,
|
|
11
|
+
productId,
|
|
12
|
+
review
|
|
13
|
+
});
|
|
14
|
+
export default receiveUserReview;
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import{REQUEST_PRODUCT_REVIEWS}from"../constants"
|
|
1
|
+
import { REQUEST_PRODUCT_REVIEWS } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the REQUEST_PRODUCT_REVIEWS action.
|
|
3
5
|
* @param {string} productId The ID of the product
|
|
4
6
|
* @param {number} limit The maximum number of reviews
|
|
5
7
|
* @returns {Object} The REQUEST_PRODUCT_REVIEWS action
|
|
6
|
-
*/
|
|
8
|
+
*/
|
|
9
|
+
const requestProductReviews = (productId, limit) => ({
|
|
10
|
+
type: REQUEST_PRODUCT_REVIEWS,
|
|
11
|
+
productId,
|
|
12
|
+
limit
|
|
13
|
+
});
|
|
14
|
+
export default requestProductReviews;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import{REQUEST_REVIEWS}from"../constants"
|
|
1
|
+
import { REQUEST_REVIEWS } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the REQUEST_REVIEWS action.
|
|
3
5
|
* @param {string} hash Generated hash.
|
|
4
6
|
* @returns {Object} The REQUEST_PRODUCT_REVIEWS action.
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const requestReviews = hash => ({
|
|
9
|
+
type: REQUEST_REVIEWS,
|
|
10
|
+
hash
|
|
11
|
+
});
|
|
12
|
+
export default requestReviews;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import{REQUEST_SUBMIT_REVIEW}from"../constants"
|
|
1
|
+
import { REQUEST_SUBMIT_REVIEW } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the REQUEST_SUBMIT_REVIEW action.
|
|
3
5
|
* @param {Object} review The review data.
|
|
4
6
|
* @returns {Object} The REQUEST_SUBMIT_REVIEW action.
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const requestSubmitReview = review => ({
|
|
9
|
+
type: REQUEST_SUBMIT_REVIEW,
|
|
10
|
+
review
|
|
11
|
+
});
|
|
12
|
+
export default requestSubmitReview;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import{REQUEST_USER_REVIEW}from"../constants"
|
|
1
|
+
import { REQUEST_USER_REVIEW } from "../constants";
|
|
2
|
+
|
|
3
|
+
/**
|
|
2
4
|
* Dispatches the REQUEST_USER_REVIEW action.
|
|
3
5
|
* @param {string} productId The ID of the product.
|
|
4
6
|
* @returns {Object} The REQUEST_USER_REVIEW action.
|
|
5
|
-
*/
|
|
7
|
+
*/
|
|
8
|
+
const requestUserReview = productId => ({
|
|
9
|
+
type: REQUEST_USER_REVIEW,
|
|
10
|
+
productId
|
|
11
|
+
});
|
|
12
|
+
export default requestUserReview;
|