import { useChannelsList } from "@saleor/channels/queries"; import { createSortedShippingChannels } from "@saleor/channels/utils"; import ChannelsAvailabilityDialog from "@saleor/components/ChannelsAvailabilityDialog"; import { WindowTitle } from "@saleor/components/WindowTitle"; import useChannels from "@saleor/hooks/useChannels"; import useNavigator from "@saleor/hooks/useNavigator"; import { sectionNames } from "@saleor/intl"; import ShippingZonePostalCodeRangeDialog from "@saleor/shipping/components/ShippingZonePostalCodeRangeDialog"; import ShippingZoneRatesCreatePage from "@saleor/shipping/components/ShippingZoneRatesCreatePage"; import { useShippingRateCreator } from "@saleor/shipping/handlers"; import { shippingPriceRatesUrl, ShippingRateCreateUrlDialog, ShippingRateCreateUrlQueryParams, shippingZoneUrl } from "@saleor/shipping/urls"; import postalCodesReducer from "@saleor/shipping/views/reducer"; import { filterPostalCodes, getPostalCodeRuleByMinMax, getRuleObject } from "@saleor/shipping/views/utils"; import { MinMax } from "@saleor/types"; import { PostalCodeRuleInclusionTypeEnum, ShippingMethodTypeEnum } from "@saleor/types/globalTypes"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import React from "react"; import { useIntl } from "react-intl"; export interface PriceRatesCreateProps { id: string; params: ShippingRateCreateUrlQueryParams; } export const PriceRatesCreate: React.FC = ({ id, params }) => { const navigate = useNavigator(); const intl = useIntl(); const { data: channelsData, loading: channelsLoading } = useChannelsList({}); const [openModal, closeModal] = createDialogActionHandlers< ShippingRateCreateUrlDialog, ShippingRateCreateUrlQueryParams >(navigate, params => shippingPriceRatesUrl(id, params), params); const allChannels = createSortedShippingChannels(channelsData?.channels); const { channelListElements, channelsToggle, currentChannels, handleChannelsConfirm, handleChannelsModalClose, handleChannelsModalOpen, isChannelSelected, isChannelsModalOpen, setCurrentChannels, toggleAllChannels } = useChannels(allChannels, params?.action, { closeModal, openModal }); const [state, dispatch] = React.useReducer(postalCodesReducer, { codesToDelete: [], havePostalCodesChanged: false, inclusionType: PostalCodeRuleInclusionTypeEnum.EXCLUDE, originalCodes: [], postalCodeRules: [] }); const { channelErrors, createShippingRate, errors, status } = useShippingRateCreator( id, ShippingMethodTypeEnum.PRICE, state.postalCodeRules, state.inclusionType ); const handleBack = () => navigate(shippingZoneUrl(id)); const onPostalCodeAssign = (rule: MinMax) => { if ( state.postalCodeRules.filter(getPostalCodeRuleByMinMax(rule)).length > 0 ) { closeModal(); return; } const newCode = getRuleObject(rule, state.inclusionType); dispatch({ havePostalCodesChanged: true, postalCodeRules: [...state.postalCodeRules, newCode] }); closeModal(); }; const onPostalCodeInclusionChange = ( inclusion: PostalCodeRuleInclusionTypeEnum ) => { dispatch({ inclusionType: inclusion, postalCodeRules: [] }); }; const onPostalCodeUnassign = code => { dispatch({ havePostalCodesChanged: true, postalCodeRules: filterPostalCodes(state.postalCodeRules, code) }); }; return ( <> {!!allChannels?.length && ( )} openModal("add-range")} onPostalCodeUnassign={onPostalCodeUnassign} onPostalCodeInclusionChange={onPostalCodeInclusionChange} variant={ShippingMethodTypeEnum.PRICE} /> ); }; export default PriceRatesCreate;