@shopgate/engage
Version:
Shopgate's ENGAGE library.
67 lines (65 loc) • 1.9 kB
JavaScript
import React, { useState, useMemo, useCallback, useEffect } from 'react';
import PropTypes from 'prop-types';
import { useRoute, LoadingProvider } from '@shopgate/engage/core';
import connect from "./OrderDetailsPrivateProvider.connector";
import Context from "./OrderDetailsProvider.context";
/**
* @param {Object} props The component props.
* @returns {JSX}
*/
import { jsx as _jsx } from "react/jsx-runtime";
const OrderDetailsProvider = ({
order,
orderNumber,
shopSettings,
userLocation,
fetchOrderDetails,
cancelOrder,
children
}) => {
const {
pathname
} = useRoute();
const [isLoading, setIsLoading] = useState(false);
const handleRequest = useCallback(async () => {
setIsLoading(true);
await fetchOrderDetails(orderNumber);
setIsLoading(false);
}, [fetchOrderDetails, orderNumber]);
const handleCancel = useCallback(async () => {
setIsLoading(true);
await cancelOrder(orderNumber);
setIsLoading(false);
}, [cancelOrder, orderNumber]);
// Loading state
useEffect(() => {
if (isLoading) {
LoadingProvider.setLoading(pathname);
return;
}
LoadingProvider.unsetLoading(pathname);
}, [isLoading, pathname]);
useEffect(() => {
handleRequest();
}, [handleRequest]);
const value = useMemo(() => ({
order,
isLoading,
supportedCountries: shopSettings.supportedCountries,
countrySortOrder: shopSettings.countrySortOrder,
userLocation,
fetchOrderDetails,
cancelOrder: handleCancel
}), [order, isLoading, shopSettings.supportedCountries, shopSettings.countrySortOrder, userLocation, fetchOrderDetails, handleCancel]);
return /*#__PURE__*/_jsx(Context.Provider, {
value: value,
children: children
});
};
OrderDetailsProvider.defaultProps = {
children: null,
shopSettings: null,
userLocation: null,
order: null
};
export default connect(OrderDetailsProvider);