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 { useShippingZoneChannels } from "@saleor/shipping/queries"; import { shippingRateCreateUrl, 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 } from "@saleor/types/globalTypes"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import React from "react"; import { useIntl } from "react-intl"; const FORM_ID = Symbol(); export interface RateCreateProps { id: string; params: ShippingRateCreateUrlQueryParams; } export const RateCreate: React.FC = ({ id, params }) => { const navigate = useNavigator(); const intl = useIntl(); const [openModal, closeModal] = createDialogActionHandlers< ShippingRateCreateUrlDialog, ShippingRateCreateUrlQueryParams >(navigate, params => shippingRateCreateUrl(id, params), params); const { data: shippingZoneData, loading: channelsLoading } = useShippingZoneChannels({ displayLoader: true, variables: { id } }); const allChannels = createSortedShippingChannels( shippingZoneData?.shippingZone?.channels ); const { channelListElements, channelsToggle, currentChannels, handleChannelsConfirm, handleChannelsModalClose, handleChannelsModalOpen, isChannelSelected, isChannelsModalOpen, setCurrentChannels, toggleAllChannels } = useChannels( allChannels, params?.action, { closeModal, openModal }, { formId: FORM_ID } ); const [state, dispatch] = React.useReducer(postalCodesReducer, { codesToDelete: [], havePostalCodesChanged: false, inclusionType: PostalCodeRuleInclusionTypeEnum.EXCLUDE, originalCodes: [], postalCodeRules: [] }); const { channelErrors, createShippingRate, errors, status } = useShippingRateCreator( id, params.type, 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={params.type} /> ); }; export default RateCreate;