import { OutputData } from "@editorjs/editorjs"; import { ChannelShippingData } from "@saleor/channels/utils"; import CardSpacer from "@saleor/components/CardSpacer"; import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; import Grid from "@saleor/components/Grid"; import Metadata from "@saleor/components/Metadata/Metadata"; import PageHeader from "@saleor/components/PageHeader"; import Savebar from "@saleor/components/Savebar"; import { ShippingChannelsErrorFragment } from "@saleor/fragments/types/ShippingChannelsErrorFragment"; import { ShippingErrorFragment } from "@saleor/fragments/types/ShippingErrorFragment"; import { ShippingMethodFragment_postalCodeRules } from "@saleor/fragments/types/ShippingMethodFragment"; import { Backlink } from "@saleor/macaw-ui"; import { validatePrice } from "@saleor/products/utils/validation"; import OrderValue from "@saleor/shipping/components/OrderValue"; import OrderWeight from "@saleor/shipping/components/OrderWeight"; import PricingCard from "@saleor/shipping/components/PricingCard"; import ShippingMethodProducts from "@saleor/shipping/components/ShippingMethodProducts"; import ShippingRateInfo from "@saleor/shipping/components/ShippingRateInfo"; import { createChannelsChangeHandler } from "@saleor/shipping/handlers"; import { ShippingZone_shippingZone_shippingMethods, ShippingZone_shippingZone_shippingMethods_postalCodeRules } from "@saleor/shipping/types/ShippingZone"; import { ListActions, ListProps } from "@saleor/types"; import { PermissionEnum, PostalCodeRuleInclusionTypeEnum, ShippingMethodTypeEnum } from "@saleor/types/globalTypes"; import { mapEdgesToItems, mapMetadataItemToInput } from "@saleor/utils/maps"; import useMetadataChangeTrigger from "@saleor/utils/metadata/useMetadataChangeTrigger"; import React from "react"; import { FormattedMessage } from "react-intl"; import ShippingZonePostalCodes from "../ShippingZonePostalCodes"; import { ShippingZoneRateUpdateFormData } from "./types"; export interface ShippingZoneRatesPageProps extends Pick>, ListActions { allChannelsCount?: number; shippingChannels: ChannelShippingData[]; disabled: boolean; hasChannelChanged?: boolean; havePostalCodesChanged?: boolean; rate: ShippingZone_shippingZone_shippingMethods; channelErrors: ShippingChannelsErrorFragment[]; errors: ShippingErrorFragment[]; saveButtonBarState: ConfirmButtonTransitionState; postalCodeRules: ShippingZone_shippingZone_shippingMethods_postalCodeRules[]; onBack: () => void; onDelete?: () => void; onSubmit: (data: ShippingZoneRateUpdateFormData) => void; onPostalCodeInclusionChange: ( inclusion: PostalCodeRuleInclusionTypeEnum ) => void; onPostalCodeAssign: () => void; onPostalCodeUnassign: (code: ShippingMethodFragment_postalCodeRules) => void; onChannelsChange: (data: ChannelShippingData[]) => void; openChannelsModal: () => void; onProductAssign: () => void; onProductUnassign: (ids: string[]) => void; variant: ShippingMethodTypeEnum; } export const ShippingZoneRatesPage: React.FC = ({ allChannelsCount, shippingChannels, channelErrors, disabled, errors, hasChannelChanged, havePostalCodesChanged, onBack, onDelete, onSubmit, onPostalCodeInclusionChange, onChannelsChange, onPostalCodeAssign, onPostalCodeUnassign, onProductAssign, onProductUnassign, openChannelsModal, rate, saveButtonBarState, postalCodeRules, variant, ...listProps }) => { const isPriceVariant = variant === ShippingMethodTypeEnum.PRICE; const initialForm: ShippingZoneRateUpdateFormData = { channelListings: shippingChannels, maxDays: rate?.maximumDeliveryDays?.toString() || "", maxValue: rate?.maximumOrderWeight?.value.toString() || "", metadata: rate?.metadata.map(mapMetadataItemToInput), minDays: rate?.minimumDeliveryDays?.toString() || "", minValue: rate?.minimumOrderWeight?.value.toString() || "", name: rate?.name || "", description: rate?.description && JSON.parse(rate.description), orderValueRestricted: !!rate?.channelListings.length, privateMetadata: rate?.privateMetadata.map(mapMetadataItemToInput), type: rate?.type || null }; const { makeChangeHandler: makeMetadataChangeHandler } = useMetadataChangeTrigger(); return (
{({ change, data, hasChanged, submit, set, triggerChange }) => { const handleChannelsChange = createChannelsChangeHandler( shippingChannels, onChannelsChange, triggerChange ); const formDisabled = data.channelListings?.some(channel => validatePrice(channel.price) ); const onDescriptionChange = (description: OutputData) => { set({ description }); triggerChange(); }; const changeMetadata = makeMetadataChangeHandler(change); const formIsUnchanged = !hasChanged && !hasChannelChanged && !havePostalCodesChanged; return (
{isPriceVariant ? ( ) : ( )}
({ id: channel.id, name: channel.name }))} openModal={openChannelsModal} />
); }}
); }; export default ShippingZoneRatesPage;