import React from "react"; import { useIntl } from "react-intl"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; import { commonMessages } from "@saleor/intl"; import useWarehouseSearch from "@saleor/searches/useWarehouseSearch"; import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config"; import { useWarehouseUpdate } from "@saleor/warehouses/mutations"; import { maybe } from "../../../misc"; import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; import ShippingZoneDetailsPage from "../../components/ShippingZoneDetailsPage"; import { TypedShippingZone } from "../../queries"; import { CreateShippingRate } from "../../types/CreateShippingRate"; import { DeleteShippingRate } from "../../types/DeleteShippingRate"; import { DeleteShippingZone } from "../../types/DeleteShippingZone"; import { UpdateShippingRate } from "../../types/UpdateShippingRate"; import { UpdateShippingZone } from "../../types/UpdateShippingZone"; import { shippingZonesListUrl, shippingZoneUrl, ShippingZoneUrlQueryParams } from "../../urls"; import ShippingZoneDetailsDialogs from "./ShippingZoneDetailsDialogs"; import ShippingZoneOperations from "./ShippingZoneOperations"; export interface ShippingZoneDetailsProps { id: string; params: ShippingZoneUrlQueryParams; } const ShippingZoneDetails: React.FC = ({ id, params }) => { const navigate = useNavigator(); const notify = useNotifier(); const intl = useIntl(); const [updateWarehouse, updateWarehouseOpts] = useWarehouseUpdate({}); const { search: searchWarehouses, result: searchWarehousesOpts } = useWarehouseSearch({ variables: DEFAULT_INITIAL_SEARCH_DATA }); const closeModal = () => navigate(shippingZoneUrl(id), true); const onShippingRateCreate = (data: CreateShippingRate) => { if (data.shippingPriceCreate.errors.length === 0) { notify({ text: intl.formatMessage(commonMessages.savedChanges) }); closeModal(); } }; const onShippingRateUpdate = (data: UpdateShippingRate) => { if (data.shippingPriceUpdate.errors.length === 0) { notify({ text: intl.formatMessage(commonMessages.savedChanges) }); closeModal(); } }; const onShippingRateDelete = (data: DeleteShippingRate) => { if (data.shippingPriceDelete.errors.length === 0) { notify({ text: intl.formatMessage(commonMessages.savedChanges) }); closeModal(); } }; const onShippingZoneDelete = (data: DeleteShippingZone) => { if (data.shippingZoneDelete.errors.length === 0) { notify({ text: intl.formatMessage(commonMessages.savedChanges) }); navigate(shippingZonesListUrl(), true); } }; const onShippingZoneUpdate = (data: UpdateShippingZone) => { if (data.shippingZoneUpdate.errors.length === 0) { notify({ text: intl.formatMessage(commonMessages.savedChanges) }); closeModal(); } }; return ( {ops => ( {({ data, loading }) => ( <> navigate(shippingZonesListUrl())} onCountryAdd={() => navigate( shippingZoneUrl(id, { action: "assign-country" }) ) } onCountryRemove={code => navigate( shippingZoneUrl(id, { action: "unassign-country", id: code }) ) } onDelete={() => navigate( shippingZoneUrl(id, { action: "remove" }) ) } onPriceRateAdd={() => navigate( shippingZoneUrl(id, { action: "add-rate", type: ShippingMethodTypeEnum.PRICE }) ) } onPriceRateEdit={rateId => navigate( shippingZoneUrl(id, { action: "edit-rate", id: rateId }) ) } onRateRemove={rateId => navigate( shippingZoneUrl(id, { action: "remove-rate", id: rateId }) ) } onSubmit={formData => { ops.shippingZoneUpdate.mutate({ id, input: { name: formData.name } }); updateWarehouse({ variables: { id: formData.warehouse } }); }} onWeightRateAdd={() => navigate( shippingZoneUrl(id, { action: "add-rate", type: ShippingMethodTypeEnum.WEIGHT }) ) } onWeightRateEdit={rateId => navigate( shippingZoneUrl(id, { action: "edit-rate", id: rateId }) ) } saveButtonBarState={ops.shippingZoneUpdate.opts.status} shippingZone={maybe(() => data.shippingZone)} warehouses={maybe( () => searchWarehousesOpts.data.search.edges.map( edge => edge.node ), [] )} /> )} )} ); }; export default ShippingZoneDetails;