import { useChannelsList } from "@saleor/channels/queries"; import { createShippingChannelsFromRate, 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 useNotifier from "@saleor/hooks/useNotifier"; import { sectionNames } from "@saleor/intl"; import { commonMessages } from "@saleor/intl"; import DeleteShippingRateDialog from "@saleor/shipping/components/DeleteShippingRateDialog"; import ShippingRateZipCodeRangeRemoveDialog from "@saleor/shipping/components/ShippingRateZipCodeRangeRemoveDialog"; import ShippingZoneRatesPage, { FormData } from "@saleor/shipping/components/ShippingZoneRatesPage"; import ShippingZoneZipCodeRangeDialog from "@saleor/shipping/components/ShippingZoneZipCodeRangeDialog"; import { getShippingMethodChannelVariables, getUpdateShippingWeightRateVariables } from "@saleor/shipping/handlers"; import { useShippingMethodZipCodeRangeAssign, useShippingMethodZipCodeRangeUnassign, useShippingRateDelete, useShippingRateUpdate } from "@saleor/shipping/mutations"; import { useShippingMethodChannelListingUpdate } from "@saleor/shipping/mutations"; import { useShippingZone } from "@saleor/shipping/queries"; import { ShippingRateUrlDialog, ShippingRateUrlQueryParams, shippingWeightRatesEditUrl, shippingZoneUrl } from "@saleor/shipping/urls"; import { ShippingMethodTypeEnum } from "@saleor/types/globalTypes"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import React from "react"; import { useIntl } from "react-intl"; export interface WeightRatesUpdateProps { id: string; rateId: string; params: ShippingRateUrlQueryParams; } export const WeightRatesUpdate: React.FC = ({ id, rateId, params }) => { const navigate = useNavigator(); const notify = useNotifier(); const intl = useIntl(); const { data, loading } = useShippingZone({ displayLoader: true, variables: { id } }); const [openModal, closeModal] = createDialogActionHandlers< ShippingRateUrlDialog, ShippingRateUrlQueryParams >(navigate, params => shippingWeightRatesEditUrl(id, rateId, params), params); const rate = data?.shippingZone?.shippingMethods.find( rate => rate.id === rateId ); const { data: channelsData } = useChannelsList({}); const [ updateShippingMethodChannelListing, updateShippingMethodChannelListingOpts ] = useShippingMethodChannelListingUpdate({}); const shippingChannels = createShippingChannelsFromRate( rate?.channelListings ); const allChannels = createSortedShippingChannels(channelsData?.channels); const { channelListElements, channelsToggle, currentChannels, handleChannelsConfirm, handleChannelsModalClose, handleChannelsModalOpen, isChannelSelected, isChannelsModalOpen, setCurrentChannels, toggleAllChannels } = useChannels(shippingChannels); const [updateShippingRate, updateShippingRateOpts] = useShippingRateUpdate( {} ); const handleSuccess = () => { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges) }); }; const [deleteShippingRate, deleteShippingRateOpts] = useShippingRateDelete({ onCompleted: data => { if (data.shippingPriceDelete.errors.length === 0) { handleSuccess(); navigate(shippingZoneUrl(id)); } } }); const [ assignZipCodeRange, assignZipCodeRangeOpts ] = useShippingMethodZipCodeRangeAssign({ onCompleted: data => { if (data.shippingMethodZipCodeRulesCreate.errors.length === 0) { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges) }); closeModal(); } else { notify({ status: "error", text: intl.formatMessage({ defaultMessage: "Cannot add specified zip codes range.", description: "zip code range add error text" }) }); } } }); const [ unassignZipCodeRange, unassignZipCodeRangeOpts ] = useShippingMethodZipCodeRangeUnassign({ onCompleted: data => { if (data.shippingMethodZipCodeRulesDelete.errors.length === 0) { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges) }); closeModal(); } } }); const handleSubmit = async (data: FormData) => { const response = await updateShippingRate({ variables: getUpdateShippingWeightRateVariables(data, id, rateId) }); const errors = response.data.shippingPriceUpdate.errors; if (errors.length === 0) { handleSuccess(); updateShippingMethodChannelListing({ variables: getShippingMethodChannelVariables( rateId, data.noLimits, data.channelListings, shippingChannels ) }); } }; const handleBack = () => navigate(shippingZoneUrl(id)); return ( <> {!!allChannels?.length && ( )} deleteShippingRate({ variables: { id: rateId } }) } open={params.action === "remove"} name={rate?.name} /> openModal("remove")} onSubmit={handleSubmit} onBack={handleBack} rate={rate} errors={updateShippingRateOpts.data?.shippingPriceUpdate.errors || []} channelErrors={ updateShippingMethodChannelListingOpts?.data ?.shippingMethodChannelListingUpdate?.errors || [] } openChannelsModal={handleChannelsModalOpen} onChannelsChange={setCurrentChannels} variant={ShippingMethodTypeEnum.WEIGHT} onZipCodeAssign={() => openModal("add-range")} onZipCodeUnassign={id => openModal("remove-range", { id }) } /> assignZipCodeRange({ variables: { id: rateId, input: { zipCodeRules: [ { end: data.max || null, start: data.min } ] } } }) } open={params.action === "add-range"} /> unassignZipCodeRange({ variables: { id: params.id } }) } open={params.action === "remove-range"} /> ); }; export default WeightRatesUpdate;