2020-02-05 14:11:37 +00:00
|
|
|
import DialogContentText from "@material-ui/core/DialogContentText";
|
2019-08-09 10:26:22 +00:00
|
|
|
import React from "react";
|
2020-02-05 14:11:37 +00:00
|
|
|
import { FormattedMessage, useIntl } from "react-intl";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
import ActionDialog from "@saleor/components/ActionDialog";
|
2019-06-19 14:40:52 +00:00
|
|
|
import useNavigator from "@saleor/hooks/useNavigator";
|
|
|
|
import useNotifier from "@saleor/hooks/useNotifier";
|
2019-08-26 21:26:36 +00:00
|
|
|
import { commonMessages } from "@saleor/intl";
|
2020-02-03 11:01:18 +00:00
|
|
|
import useWarehouseSearch from "@saleor/searches/useWarehouseSearch";
|
|
|
|
import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
|
2020-02-05 14:11:37 +00:00
|
|
|
import {
|
|
|
|
useShippingRateCreate,
|
|
|
|
useShippingRateUpdate,
|
|
|
|
useShippingRateDelete,
|
|
|
|
useShippingZoneDelete,
|
|
|
|
useShippingZoneUpdate
|
|
|
|
} from "@saleor/shipping/mutations";
|
|
|
|
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
|
|
|
|
import ShippingZoneRateDialog from "@saleor/shipping/components/ShippingZoneRateDialog";
|
|
|
|
import useShop from "@saleor/hooks/useShop";
|
|
|
|
import ShippingZoneCountriesAssignDialog from "@saleor/shipping/components/ShippingZoneCountriesAssignDialog";
|
|
|
|
import NotFoundPage from "@saleor/components/NotFoundPage";
|
|
|
|
import { getStringOrPlaceholder } from "../../../misc";
|
2019-06-19 14:40:52 +00:00
|
|
|
import { ShippingMethodTypeEnum } from "../../../types/globalTypes";
|
2020-02-05 14:11:37 +00:00
|
|
|
import ShippingZoneDetailsPage, {
|
|
|
|
FormData
|
|
|
|
} from "../../components/ShippingZoneDetailsPage";
|
|
|
|
import { useShippingZone } from "../../queries";
|
2019-06-19 14:40:52 +00:00
|
|
|
import {
|
|
|
|
shippingZonesListUrl,
|
|
|
|
shippingZoneUrl,
|
2020-02-05 14:11:37 +00:00
|
|
|
ShippingZoneUrlQueryParams,
|
|
|
|
ShippingZoneUrlDialog
|
2019-06-19 14:40:52 +00:00
|
|
|
} from "../../urls";
|
2020-02-05 14:11:37 +00:00
|
|
|
import {
|
|
|
|
getCreateShippingRateVariables,
|
|
|
|
getUpdateShippingRateVariables
|
|
|
|
} from "./data";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
export interface ShippingZoneDetailsProps {
|
|
|
|
id: string;
|
|
|
|
params: ShippingZoneUrlQueryParams;
|
|
|
|
}
|
|
|
|
|
2019-11-07 11:34:54 +00:00
|
|
|
const ShippingZoneDetails: React.FC<ShippingZoneDetailsProps> = ({
|
|
|
|
id,
|
|
|
|
params
|
|
|
|
}) => {
|
2019-06-19 14:40:52 +00:00
|
|
|
const navigate = useNavigator();
|
|
|
|
const notify = useNotifier();
|
2019-08-26 21:26:36 +00:00
|
|
|
const intl = useIntl();
|
2020-02-05 14:11:37 +00:00
|
|
|
const shop = useShop();
|
2020-02-03 11:01:18 +00:00
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
const { result: searchWarehousesOpts } = useWarehouseSearch({
|
2020-02-03 11:01:18 +00:00
|
|
|
variables: DEFAULT_INITIAL_SEARCH_DATA
|
|
|
|
});
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
const { data, loading } = useShippingZone({
|
|
|
|
displayLoader: true,
|
|
|
|
variables: { id }
|
|
|
|
});
|
|
|
|
|
|
|
|
const [openModal, closeModal] = createDialogActionHandlers<
|
|
|
|
ShippingZoneUrlDialog,
|
|
|
|
ShippingZoneUrlQueryParams
|
|
|
|
>(navigate, params => shippingZoneUrl(id, params), params);
|
|
|
|
const rate = data?.shippingZone?.shippingMethods.find(
|
|
|
|
rate => rate.id === params.id
|
|
|
|
);
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
const [createShippingRate, createShippingRateOpts] = useShippingRateCreate({
|
|
|
|
onCompleted: data => {
|
|
|
|
if (data.shippingPriceCreate.errors.length === 0) {
|
|
|
|
notify({
|
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
|
|
|
});
|
|
|
|
closeModal();
|
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
2020-02-05 14:11:37 +00:00
|
|
|
});
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
const [updateShippingRate, updateShippingRateOpts] = useShippingRateUpdate({
|
|
|
|
onCompleted: data => {
|
|
|
|
if (data.shippingPriceUpdate.errors.length === 0) {
|
|
|
|
notify({
|
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
|
|
|
});
|
|
|
|
closeModal();
|
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
2020-02-05 14:11:37 +00:00
|
|
|
});
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
const [deleteShippingRate, deleteShippingRateOpts] = useShippingRateDelete({
|
|
|
|
onCompleted: data => {
|
|
|
|
if (data.shippingPriceDelete.errors.length === 0) {
|
|
|
|
notify({
|
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
|
|
|
});
|
|
|
|
closeModal();
|
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
2020-02-05 14:11:37 +00:00
|
|
|
});
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
const [deleteShippingZone, deleteShippingZoneOpts] = useShippingZoneDelete({
|
|
|
|
onCompleted: data => {
|
|
|
|
if (data.shippingZoneDelete.errors.length === 0) {
|
|
|
|
notify({
|
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
|
|
|
});
|
|
|
|
navigate(shippingZonesListUrl(), true);
|
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
2020-02-05 14:11:37 +00:00
|
|
|
});
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
const [updateShippingZone, updateShippingZoneOpts] = useShippingZoneUpdate({
|
|
|
|
onCompleted: data => {
|
|
|
|
if (data.shippingZoneUpdate.errors.length === 0) {
|
|
|
|
notify({
|
|
|
|
text: intl.formatMessage(commonMessages.savedChanges)
|
|
|
|
});
|
|
|
|
closeModal();
|
|
|
|
}
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
2020-02-05 14:11:37 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
const handleSubmit = (data: FormData) => {
|
|
|
|
updateShippingZone({
|
|
|
|
variables: {
|
|
|
|
id,
|
|
|
|
input: {
|
|
|
|
name: data.name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2019-06-19 14:40:52 +00:00
|
|
|
};
|
|
|
|
|
2020-02-05 14:11:37 +00:00
|
|
|
if (data?.shippingZone === null) {
|
|
|
|
return <NotFoundPage onBack={() => navigate(shippingZonesListUrl())} />;
|
|
|
|
}
|
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
return (
|
2020-02-05 14:11:37 +00:00
|
|
|
<>
|
|
|
|
<ShippingZoneDetailsPage
|
|
|
|
disabled={loading}
|
|
|
|
errors={updateShippingZoneOpts.data?.shippingZoneUpdate.errors || []}
|
|
|
|
onBack={() => navigate(shippingZonesListUrl())}
|
|
|
|
onCountryAdd={() => openModal("assign-country")}
|
|
|
|
onCountryRemove={code =>
|
|
|
|
openModal("unassign-country", {
|
|
|
|
id: code
|
|
|
|
})
|
|
|
|
}
|
|
|
|
onDelete={() => openModal("remove")}
|
|
|
|
onPriceRateAdd={() =>
|
|
|
|
openModal("add-rate", {
|
|
|
|
type: ShippingMethodTypeEnum.PRICE
|
|
|
|
})
|
|
|
|
}
|
|
|
|
onPriceRateEdit={rateId =>
|
|
|
|
openModal("edit-rate", {
|
|
|
|
id: rateId
|
|
|
|
})
|
|
|
|
}
|
|
|
|
onRateRemove={rateId =>
|
|
|
|
openModal("remove-rate", {
|
|
|
|
id: rateId
|
|
|
|
})
|
|
|
|
}
|
|
|
|
onSubmit={handleSubmit}
|
|
|
|
onWeightRateAdd={() =>
|
|
|
|
openModal("add-rate", {
|
|
|
|
type: ShippingMethodTypeEnum.WEIGHT
|
|
|
|
})
|
|
|
|
}
|
|
|
|
onWeightRateEdit={rateId =>
|
|
|
|
openModal("edit-rate", {
|
|
|
|
id: rateId
|
|
|
|
})
|
|
|
|
}
|
|
|
|
saveButtonBarState={updateShippingZoneOpts.status}
|
|
|
|
shippingZone={data?.shippingZone}
|
|
|
|
warehouses={
|
|
|
|
searchWarehousesOpts.data?.search.edges.map(edge => edge.node) || []
|
|
|
|
}
|
|
|
|
/>
|
|
|
|
<ShippingZoneRateDialog
|
|
|
|
action="edit"
|
|
|
|
confirmButtonState={updateShippingRateOpts.status}
|
|
|
|
defaultCurrency={shop?.defaultCurrency}
|
|
|
|
disabled={updateShippingRateOpts.loading}
|
|
|
|
errors={updateShippingRateOpts.data?.shippingPriceUpdate.errors || []}
|
|
|
|
onClose={closeModal}
|
|
|
|
onSubmit={data =>
|
|
|
|
updateShippingRate({
|
|
|
|
variables: getUpdateShippingRateVariables(data, params, id)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
open={params.action === "edit-rate"}
|
|
|
|
rate={rate}
|
|
|
|
variant={rate?.type}
|
|
|
|
/>
|
|
|
|
<ActionDialog
|
|
|
|
confirmButtonState={deleteShippingRateOpts.status}
|
|
|
|
onClose={closeModal}
|
|
|
|
onConfirm={() =>
|
|
|
|
deleteShippingRate({
|
|
|
|
variables: {
|
|
|
|
id: params.id
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
open={params.action === "remove-rate"}
|
|
|
|
title={intl.formatMessage({
|
|
|
|
defaultMessage: "Delete Shipping Method",
|
|
|
|
description: "dialog header"
|
|
|
|
})}
|
|
|
|
variant="delete"
|
|
|
|
>
|
|
|
|
<DialogContentText>
|
|
|
|
<FormattedMessage
|
|
|
|
defaultMessage="Are you sure you want to delete {name}?"
|
|
|
|
description="delete shipping method"
|
|
|
|
id="shippingZoneDetailsDialogsDeleteShippingMethod"
|
|
|
|
values={{
|
|
|
|
name: getStringOrPlaceholder(rate?.name)
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</DialogContentText>
|
|
|
|
</ActionDialog>
|
|
|
|
<ShippingZoneRateDialog
|
|
|
|
action="create"
|
|
|
|
confirmButtonState={createShippingRateOpts.status}
|
|
|
|
defaultCurrency={shop?.defaultCurrency}
|
|
|
|
disabled={createShippingRateOpts.loading}
|
|
|
|
errors={createShippingRateOpts.data?.shippingPriceCreate.errors || []}
|
|
|
|
onClose={closeModal}
|
|
|
|
onSubmit={data =>
|
|
|
|
createShippingRate({
|
|
|
|
variables: getCreateShippingRateVariables(data, params, id)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
open={params.action === "add-rate"}
|
|
|
|
rate={undefined}
|
|
|
|
variant={params.type}
|
|
|
|
/>
|
|
|
|
<ActionDialog
|
|
|
|
confirmButtonState={deleteShippingZoneOpts.status}
|
|
|
|
onClose={closeModal}
|
|
|
|
onConfirm={() =>
|
|
|
|
deleteShippingZone({
|
|
|
|
variables: {
|
|
|
|
id
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
open={params.action === "remove"}
|
|
|
|
title={intl.formatMessage({
|
|
|
|
defaultMessage: "Delete Shipping Zone",
|
|
|
|
description: "dialog header"
|
|
|
|
})}
|
|
|
|
variant="delete"
|
|
|
|
>
|
|
|
|
<DialogContentText>
|
|
|
|
<FormattedMessage
|
|
|
|
defaultMessage="Are you sure you want to delete {name}?"
|
|
|
|
description="delete shipping zone"
|
|
|
|
id="shippingZoneDetailsDialogsDeleteShippingZone"
|
|
|
|
values={{
|
|
|
|
name: (
|
|
|
|
<strong>
|
|
|
|
{getStringOrPlaceholder(data?.shippingZone.name)}
|
|
|
|
</strong>
|
|
|
|
)
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</DialogContentText>
|
|
|
|
</ActionDialog>
|
|
|
|
<ShippingZoneCountriesAssignDialog
|
|
|
|
confirmButtonState={updateShippingZoneOpts.status}
|
|
|
|
countries={shop?.countries || []}
|
|
|
|
initial={
|
|
|
|
data?.shippingZone?.countries.map(country => country.code) || []
|
|
|
|
}
|
|
|
|
isDefault={data?.shippingZone?.default}
|
|
|
|
onClose={closeModal}
|
|
|
|
onConfirm={formData =>
|
|
|
|
updateShippingZone({
|
|
|
|
variables: {
|
|
|
|
id,
|
|
|
|
input: {
|
|
|
|
countries: formData.countries,
|
|
|
|
default: formData.restOfTheWorld
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
open={params.action === "assign-country"}
|
|
|
|
/>
|
|
|
|
<ActionDialog
|
|
|
|
confirmButtonState={updateShippingZoneOpts.status}
|
|
|
|
onClose={closeModal}
|
|
|
|
onConfirm={() =>
|
|
|
|
updateShippingZone({
|
|
|
|
variables: {
|
|
|
|
id,
|
|
|
|
input: {
|
|
|
|
countries: data.shippingZone.countries
|
|
|
|
.filter(country => country.code !== params.id)
|
|
|
|
.map(country => country.code)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
open={params.action === "unassign-country"}
|
|
|
|
title={intl.formatMessage({
|
|
|
|
defaultMessage: "Delete from Shipping Zone",
|
|
|
|
description: "unassign country, dialog header"
|
|
|
|
})}
|
|
|
|
variant="delete"
|
|
|
|
>
|
|
|
|
<DialogContentText>
|
|
|
|
<FormattedMessage
|
|
|
|
defaultMessage="Are you sure you want to delete {countryName} from this shipping zone?"
|
|
|
|
description="unassign country"
|
|
|
|
values={{
|
|
|
|
countryName: (
|
|
|
|
<strong>
|
|
|
|
{getStringOrPlaceholder(
|
|
|
|
data?.shippingZone?.countries.find(
|
|
|
|
country => country.code === params.id
|
|
|
|
)?.country
|
|
|
|
)}
|
|
|
|
</strong>
|
|
|
|
)
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</DialogContentText>
|
|
|
|
</ActionDialog>
|
|
|
|
</>
|
2019-06-19 14:40:52 +00:00
|
|
|
);
|
|
|
|
};
|
|
|
|
export default ShippingZoneDetails;
|