@shopgate/engage
Version:
Shopgate's ENGAGE library.
68 lines (64 loc) • 3.67 kB
JavaScript
import { connect } from 'react-redux';
import showModal from '@shopgate/pwa-common/actions/modal/showModal';
import { getBaseProduct, getProduct } from '@shopgate/pwa-common-commerce/product/selectors/product';
import addProductsToCart from '@shopgate/pwa-common-commerce/cart/actions/addProductsToCart';
import updateProductsInCart from '@shopgate/pwa-common-commerce/cart/actions/updateProductsInCart';
import { getCartProducts, getActiveFulfillmentSlot, getActiveFulfillmentSlotLocationCode } from '@shopgate/engage/cart/cart.selectors';
import { makeGetFulfillmentPaths, makeGetEnabledFulfillmentMethods, getShopSettings } from '@shopgate/engage/core/config';
import { getRestrictMultiLocationOrders, getFulfillmentSchedulingEnabled } from '@shopgate/engage/core';
import { selectLocation, storeFormInput } from "../action-creators";
import { getFilteredLocations, makeGetLocationInventory, makeGetLocationsForProduct, getPreferredLocation, getUserFormInput, getProductFulfillmentMethods, getIsFetching } from "../selectors";
import { submitReservation } from "../actions";
/**
* @typedef {import('./FulfillmentProvider.types').OwnProps} OwnProps
* @typedef {import('./FulfillmentProvider.types').StateProps} StateProps
* @typedef {import('./FulfillmentProvider.types').DispatchProps} DispatchProps
*/
/**
* @returns {Function}
*/
function makeMapStateToProps() {
/* eslint-disable require-jsdoc */
const getProductCode = (_, props) => props.variantId || props.productId || null;
/* eslint-enable require-jsdoc */
const getInventory = makeGetLocationInventory((state, props) => getPreferredLocation(state, props)?.code || null, getProductCode);
const getProductLocations = makeGetLocationsForProduct(getProductCode);
const getFulfillmentPaths = makeGetFulfillmentPaths();
const getEnabledFulfillmentMethods = makeGetEnabledFulfillmentMethods();
/**
* @param {StateProps} state The application state.
* @param {OwnProps} props The component props.
* @returns {Object}
*/
return (state, props) => ({
locations: props.noProduct ? getFilteredLocations(state, props) : getProductLocations(state, props),
baseProduct: getBaseProduct(state, props),
product: getProduct(state, props),
location: getPreferredLocation(state, props),
inventory: getInventory(state, props),
userInput: getUserFormInput(state),
fulfillmentPaths: getFulfillmentPaths(state),
fulfillmentMethods: getProductFulfillmentMethods(state, props),
enabledFulfillmentMethods: getEnabledFulfillmentMethods(state, props),
shopSettings: getShopSettings(state),
isFetching: getIsFetching(state),
restrictMultiLocationOrders: getRestrictMultiLocationOrders(state),
cartProducts: getCartProducts(state),
fulfillmentSchedulingEnabled: getFulfillmentSchedulingEnabled(state),
activeFulfillmentSlot: getActiveFulfillmentSlot(state),
activeFulfillmentSlotLocationCode: getActiveFulfillmentSlotLocationCode(state)
});
}
/**
* @param {DispatchProps} dispatch The dispatch function.
* @returns {Object}
*/
const mapDispatchToProps = dispatch => ({
selectLocation: (...params) => dispatch(selectLocation.apply(void 0, params)),
submitReservation: (...params) => dispatch(submitReservation.apply(void 0, params)),
storeFormInput: (...params) => dispatch(storeFormInput.apply(void 0, params)),
addProductsToCart: (...params) => dispatch(addProductsToCart.apply(void 0, params)),
updateProductsInCart: (...params) => dispatch(updateProductsInCart.apply(void 0, params)),
showModal: (...params) => dispatch(showModal.apply(void 0, params))
});
export default connect(makeMapStateToProps, mapDispatchToProps);