import AppHeader from "@saleor/components/AppHeader"; import CardSpacer from "@saleor/components/CardSpacer"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import CountryList from "@saleor/components/CountryList"; import Form from "@saleor/components/Form"; import Grid from "@saleor/components/Grid"; import Metadata from "@saleor/components/Metadata/Metadata"; import { MetadataFormData } from "@saleor/components/Metadata/types"; import { MultiAutocompleteChoiceType } from "@saleor/components/MultiAutocompleteSelectField"; import PageHeader from "@saleor/components/PageHeader"; import SaveButtonBar from "@saleor/components/SaveButtonBar"; import { SingleAutocompleteChoiceType } from "@saleor/components/SingleAutocompleteSelectField"; import { ShippingErrorFragment } from "@saleor/fragments/types/ShippingErrorFragment"; import { ShippingZoneDetailsFragment, ShippingZoneDetailsFragment_warehouses } from "@saleor/fragments/types/ShippingZoneDetailsFragment"; import { SubmitPromise } from "@saleor/hooks/useForm"; import useStateFromProps from "@saleor/hooks/useStateFromProps"; import createMultiAutocompleteSelectHandler from "@saleor/utils/handlers/multiAutocompleteSelectChangeHandler"; import { mapMetadataItemToInput } from "@saleor/utils/maps"; import useMetadataChangeTrigger from "@saleor/utils/metadata/useMetadataChangeTrigger"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { getStringOrPlaceholder } from "../../../misc"; import { ChannelProps, FetchMoreProps, SearchProps } from "../../../types"; import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; import ShippingZoneInfo from "../ShippingZoneInfo"; import ShippingZoneRates from "../ShippingZoneRates"; import ShippingZoneWarehouses from "../ShippingZoneWarehouses"; export interface FormData extends MetadataFormData { name: string; warehouses: string[]; } export interface ShippingZoneDetailsPageProps extends FetchMoreProps, SearchProps, ChannelProps { disabled: boolean; errors: ShippingErrorFragment[]; saveButtonBarState: ConfirmButtonTransitionState; shippingZone: ShippingZoneDetailsFragment; warehouses: ShippingZoneDetailsFragment_warehouses[]; onBack: () => void; onCountryAdd: () => void; onCountryRemove: (code: string) => void; onDelete: () => void; onPriceRateAdd: () => void; onPriceRateEdit: (id: string) => void; onRateRemove: (rateId: string) => void; onSubmit: (data: FormData) => SubmitPromise; onWarehouseAdd: () => void; onWeightRateAdd: () => void; onWeightRateEdit: (id: string) => void; } function warehouseToChoice( warehouse: Record<"id" | "name", string> ): SingleAutocompleteChoiceType { return { label: warehouse.name, value: warehouse.id }; } const ShippingZoneDetailsPage: React.FC = ({ disabled, errors, hasMore, loading, onBack, onCountryAdd, onCountryRemove, onDelete, onFetchMore, onPriceRateAdd, onPriceRateEdit, onRateRemove, onSearchChange, onSubmit, onWarehouseAdd, onWeightRateAdd, onWeightRateEdit, saveButtonBarState, selectedChannelId, shippingZone, warehouses }) => { const intl = useIntl(); const initialForm: FormData = { name: shippingZone?.name || "", warehouses: shippingZone?.warehouses?.map(warehouse => warehouse.id) || [], metadata: shippingZone?.metadata.map(mapMetadataItemToInput), privateMetadata: shippingZone?.privateMetadata.map(mapMetadataItemToInput) }; const [warehouseDisplayValues, setWarehouseDisplayValues] = useStateFromProps< MultiAutocompleteChoiceType[] >( shippingZone?.warehouses?.map(warehouse => ({ label: warehouse.name, value: warehouse.id })) || [] ); const warehouseChoices = warehouses.map(warehouseToChoice); const { makeChangeHandler: makeMetadataChangeHandler } = useMetadataChangeTrigger(); return (
{({ change, data, hasChanged, submit, toggleValue }) => { const handleWarehouseChange = createMultiAutocompleteSelectHandler( toggleValue, setWarehouseDisplayValues, warehouseDisplayValues, warehouseChoices ); const changeMetadata = makeMetadataChangeHandler(change); return (
method.type === ShippingMethodTypeEnum.PRICE )} variant="price" selectedChannelId={selectedChannelId} /> method.type === ShippingMethodTypeEnum.WEIGHT )} variant="weight" selectedChannelId={selectedChannelId} />
); }}
); }; ShippingZoneDetailsPage.displayName = "ShippingZoneDetailsPage"; export default ShippingZoneDetailsPage;