Use apollo hooks

This commit is contained in:
dominik-zeglen 2020-02-05 15:11:37 +01:00
parent ed3e9fbc45
commit 321c9a5712
9 changed files with 503 additions and 447 deletions

View file

@ -13,7 +13,7 @@ import SaveButtonBar from "@saleor/components/SaveButtonBar";
import { ShippingErrorFragment } from "@saleor/shipping/types/ShippingErrorFragment"; import { ShippingErrorFragment } from "@saleor/shipping/types/ShippingErrorFragment";
import createMultiAutocompleteSelectHandler from "@saleor/utils/handlers/multiAutocompleteSelectChangeHandler"; import createMultiAutocompleteSelectHandler from "@saleor/utils/handlers/multiAutocompleteSelectChangeHandler";
import { MultiAutocompleteChoiceType } from "@saleor/components/MultiAutocompleteSelectField"; import { MultiAutocompleteChoiceType } from "@saleor/components/MultiAutocompleteSelectField";
import { maybe, getStringOrPlaceholder } from "../../../misc"; import { maybe } from "../../../misc";
import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; import { ShippingMethodTypeEnum } from "../../../types/globalTypes";
import { import {
ShippingZoneDetailsFragment, ShippingZoneDetailsFragment,

View file

@ -1,6 +1,6 @@
import gql from "graphql-tag"; import gql from "graphql-tag";
import { TypedMutation } from "../mutations"; import makeMutation from "@saleor/hooks/makeMutation";
import { countryFragment } from "../taxes/queries"; import { countryFragment } from "../taxes/queries";
import { shippingMethodFragment, shippingZoneDetailsFragment } from "./queries"; import { shippingMethodFragment, shippingZoneDetailsFragment } from "./queries";
import { import {
@ -39,6 +39,14 @@ import {
UpdateShippingZone, UpdateShippingZone,
UpdateShippingZoneVariables UpdateShippingZoneVariables
} from "./types/UpdateShippingZone"; } from "./types/UpdateShippingZone";
import {
AssignShippingZoneToWarehouse,
AssignShippingZoneToWarehouseVariables
} from "./types/AssignShippingZoneToWarehouse";
import {
UnassignShippingZoneToWarehouse,
UnassignShippingZoneToWarehouseVariables
} from "./types/UnassignShippingZoneToWarehouse";
export const shippingErrorFragment = gql` export const shippingErrorFragment = gql`
fragment ShippingErrorFragment on ShippingError { fragment ShippingErrorFragment on ShippingError {
@ -57,7 +65,7 @@ const deleteShippingZone = gql`
} }
} }
`; `;
export const TypedDeleteShippingZone = TypedMutation< export const useShippingZoneDelete = makeMutation<
DeleteShippingZone, DeleteShippingZone,
DeleteShippingZoneVariables DeleteShippingZoneVariables
>(deleteShippingZone); >(deleteShippingZone);
@ -72,7 +80,7 @@ const bulkDeleteShippingZone = gql`
} }
} }
`; `;
export const TypedBulkDeleteShippingZone = TypedMutation< export const useShippingZoneBulkDelete = makeMutation<
BulkDeleteShippingZone, BulkDeleteShippingZone,
BulkDeleteShippingZoneVariables BulkDeleteShippingZoneVariables
>(bulkDeleteShippingZone); >(bulkDeleteShippingZone);
@ -90,7 +98,7 @@ const updateDefaultWeightUnit = gql`
} }
} }
`; `;
export const TypedUpdateDefaultWeightUnit = TypedMutation< export const useDefaultWeightUnitUpdate = makeMutation<
UpdateDefaultWeightUnit, UpdateDefaultWeightUnit,
UpdateDefaultWeightUnitVariables UpdateDefaultWeightUnitVariables
>(updateDefaultWeightUnit); >(updateDefaultWeightUnit);
@ -114,7 +122,7 @@ const createShippingZone = gql`
} }
} }
`; `;
export const TypedCreateShippingZone = TypedMutation< export const useShippingZoneCreate = makeMutation<
CreateShippingZone, CreateShippingZone,
CreateShippingZoneVariables CreateShippingZoneVariables
>(createShippingZone); >(createShippingZone);
@ -138,7 +146,7 @@ const updateShippingZone = gql`
} }
} }
`; `;
export const TypedUpdateShippingZone = TypedMutation< export const useShippingZoneUpdate = makeMutation<
UpdateShippingZone, UpdateShippingZone,
UpdateShippingZoneVariables UpdateShippingZoneVariables
>(updateShippingZone); >(updateShippingZone);
@ -157,7 +165,7 @@ const updateShippingRate = gql`
} }
} }
`; `;
export const TypedUpdateShippingRate = TypedMutation< export const useShippingRateUpdate = makeMutation<
UpdateShippingRate, UpdateShippingRate,
UpdateShippingRateVariables UpdateShippingRateVariables
>(updateShippingRate); >(updateShippingRate);
@ -176,7 +184,7 @@ const createShippingRate = gql`
} }
} }
`; `;
export const TypedCreateShippingRate = TypedMutation< export const useShippingRateCreate = makeMutation<
CreateShippingRate, CreateShippingRate,
CreateShippingRateVariables CreateShippingRateVariables
>(createShippingRate); >(createShippingRate);
@ -195,7 +203,7 @@ const deleteShippingRate = gql`
} }
} }
`; `;
export const TypedDeleteShippingRate = TypedMutation< export const useShippingRateDelete = makeMutation<
DeleteShippingRate, DeleteShippingRate,
DeleteShippingRateVariables DeleteShippingRateVariables
>(deleteShippingRate); >(deleteShippingRate);
@ -210,7 +218,49 @@ const bulkDeleteShippingRate = gql`
} }
} }
`; `;
export const TypedBulkDeleteShippingRate = TypedMutation< export const useShippingRateBulkDelete = makeMutation<
BulkDeleteShippingRate, BulkDeleteShippingRate,
BulkDeleteShippingRateVariables BulkDeleteShippingRateVariables
>(bulkDeleteShippingRate); >(bulkDeleteShippingRate);
const assignShippingZoneToWarehouse = gql`
mutation AssignShippingZoneToWarehouse(
$warehouseId: ID!
$shippingZoneId: ID!
) {
assignWarehouseShippingZone(
id: $warehouseId
shippingZoneIds: [$shippingZoneId]
) {
warehouseErrors {
code
field
}
}
}
`;
export const useAassignShippingZoneToWarehouse = makeMutation<
AssignShippingZoneToWarehouse,
AssignShippingZoneToWarehouseVariables
>(assignShippingZoneToWarehouse);
const unassignShippingZoneToWarehouse = gql`
mutation UnassignShippingZoneToWarehouse(
$warehouseId: ID!
$shippingZoneId: ID!
) {
unassignWarehouseShippingZone(
id: $warehouseId
shippingZoneIds: [$shippingZoneId]
) {
warehouseErrors {
code
field
}
}
}
`;
export const useUnassignShippingZoneToWarehouse = makeMutation<
UnassignShippingZoneToWarehouse,
UnassignShippingZoneToWarehouseVariables
>(unassignShippingZoneToWarehouse);

View file

@ -1,5 +1,6 @@
import gql from "graphql-tag"; import gql from "graphql-tag";
import makeQuery from "@saleor/hooks/makeQuery";
import { pageInfoFragment, TypedQuery } from "../queries"; import { pageInfoFragment, TypedQuery } from "../queries";
import { ShippingZone, ShippingZoneVariables } from "./types/ShippingZone"; import { ShippingZone, ShippingZoneVariables } from "./types/ShippingZone";
import { ShippingZones, ShippingZonesVariables } from "./types/ShippingZones"; import { ShippingZones, ShippingZonesVariables } from "./types/ShippingZones";
@ -91,7 +92,6 @@ const shippingZone = gql`
} }
} }
`; `;
export const TypedShippingZone = TypedQuery< export const useShippingZone = makeQuery<ShippingZone, ShippingZoneVariables>(
ShippingZone, shippingZone
ShippingZoneVariables );
>(shippingZone);

View file

@ -0,0 +1,29 @@
/* tslint:disable */
/* eslint-disable */
// This file was automatically generated and should not be edited.
import { WarehouseErrorCode } from "./../../types/globalTypes";
// ====================================================
// GraphQL mutation operation: AssignShippingZoneToWarehouse
// ====================================================
export interface AssignShippingZoneToWarehouse_assignWarehouseShippingZone_warehouseErrors {
__typename: "WarehouseError";
code: WarehouseErrorCode | null;
field: string | null;
}
export interface AssignShippingZoneToWarehouse_assignWarehouseShippingZone {
__typename: "WarehouseShippingZoneAssign";
warehouseErrors: AssignShippingZoneToWarehouse_assignWarehouseShippingZone_warehouseErrors[] | null;
}
export interface AssignShippingZoneToWarehouse {
assignWarehouseShippingZone: AssignShippingZoneToWarehouse_assignWarehouseShippingZone | null;
}
export interface AssignShippingZoneToWarehouseVariables {
warehouseId: string;
shippingZoneId: string;
}

View file

@ -0,0 +1,29 @@
/* tslint:disable */
/* eslint-disable */
// This file was automatically generated and should not be edited.
import { WarehouseErrorCode } from "./../../types/globalTypes";
// ====================================================
// GraphQL mutation operation: UnassignShippingZoneToWarehouse
// ====================================================
export interface UnassignShippingZoneToWarehouse_unassignWarehouseShippingZone_warehouseErrors {
__typename: "WarehouseError";
code: WarehouseErrorCode | null;
field: string | null;
}
export interface UnassignShippingZoneToWarehouse_unassignWarehouseShippingZone {
__typename: "WarehouseShippingZoneUnassign";
warehouseErrors: UnassignShippingZoneToWarehouse_unassignWarehouseShippingZone_warehouseErrors[] | null;
}
export interface UnassignShippingZoneToWarehouse {
unassignWarehouseShippingZone: UnassignShippingZoneToWarehouse_unassignWarehouseShippingZone | null;
}
export interface UnassignShippingZoneToWarehouseVariables {
warehouseId: string;
shippingZoneId: string;
}

View file

@ -1,244 +0,0 @@
import DialogContentText from "@material-ui/core/DialogContentText";
import React from "react";
import { FormattedMessage, useIntl } from "react-intl";
import ActionDialog from "@saleor/components/ActionDialog";
import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton";
import useNavigator from "@saleor/hooks/useNavigator";
import useShop from "@saleor/hooks/useShop";
import { getStringOrPlaceholder } from "../../../misc";
import { ShippingMethodTypeEnum } from "../../../types/globalTypes";
import ShippingZoneCountriesAssignDialog from "../../components/ShippingZoneCountriesAssignDialog";
import ShippingZoneRateDialog from "../../components/ShippingZoneRateDialog";
import { ShippingZoneDetailsFragment } from "../../types/ShippingZoneDetailsFragment";
import { shippingZoneUrl, ShippingZoneUrlQueryParams } from "../../urls";
import { ShippingZoneOperationsOutput } from "./ShippingZoneOperations";
export interface ShippingZoneDetailsDialogsProps {
assignCountryTransitionState: ConfirmButtonTransitionState;
createRateTransitionState: ConfirmButtonTransitionState;
deleteRateTransitionState: ConfirmButtonTransitionState;
deleteZoneTransitionState: ConfirmButtonTransitionState;
id: string;
ops: ShippingZoneOperationsOutput;
params: ShippingZoneUrlQueryParams;
shippingZone: ShippingZoneDetailsFragment;
unassignCountryTransitionState: ConfirmButtonTransitionState;
updateRateTransitionState: ConfirmButtonTransitionState;
}
const ShippingZoneDetailsDialogs: React.FC<ShippingZoneDetailsDialogsProps> = ({
assignCountryTransitionState,
createRateTransitionState,
deleteRateTransitionState,
deleteZoneTransitionState,
id,
ops,
params,
shippingZone,
unassignCountryTransitionState,
updateRateTransitionState
}) => {
const navigate = useNavigator();
const shop = useShop();
const intl = useIntl();
const closeModal = () => navigate(shippingZoneUrl(id), true);
const rate = shippingZone?.shippingMethods?.find(
rate => rate.id === params.id
);
return (
<>
<ShippingZoneRateDialog
action="edit"
confirmButtonState={updateRateTransitionState}
defaultCurrency={shop?.defaultCurrency}
disabled={ops.shippingRateUpdate.opts.loading}
errors={
ops.shippingRateUpdate.opts.data?.shippingPriceUpdate.errors || []
}
onClose={closeModal}
onSubmit={formData =>
ops.shippingRateUpdate.mutate({
id: params.id,
input: {
maximumOrderPrice: formData.noLimits
? null
: parseFloat(formData.maxValue),
minimumOrderPrice: formData.noLimits
? null
: parseFloat(formData.minValue),
name: formData.name,
price: formData.isFree ? 0 : parseFloat(formData.price),
shippingZone: id,
type: rate?.type
}
})
}
open={params.action === "edit-rate"}
rate={rate}
variant={rate?.type}
/>
<ActionDialog
confirmButtonState={deleteRateTransitionState}
onClose={closeModal}
onConfirm={() =>
ops.shippingRateDelete.mutate({
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={createRateTransitionState}
defaultCurrency={shop?.defaultCurrency}
disabled={ops.shippingRateCreate.opts.loading}
errors={
ops.shippingRateCreate.opts.data?.shippingPriceCreate.errors || []
}
onClose={closeModal}
onSubmit={formData =>
ops.shippingRateCreate.mutate({
input: {
maximumOrderPrice:
params.type === ShippingMethodTypeEnum.PRICE
? formData.noLimits
? null
: parseFloat(formData.maxValue)
: null,
maximumOrderWeight:
params.type === ShippingMethodTypeEnum.WEIGHT
? formData.noLimits
? null
: parseFloat(formData.maxValue)
: null,
minimumOrderPrice:
params.type === ShippingMethodTypeEnum.PRICE
? formData.noLimits
? null
: parseFloat(formData.minValue)
: null,
minimumOrderWeight:
params.type === ShippingMethodTypeEnum.WEIGHT
? formData.noLimits
? null
: parseFloat(formData.minValue)
: null,
name: formData.name,
price: formData.isFree ? 0 : parseFloat(formData.price),
shippingZone: id,
type: params.type
}
})
}
open={params.action === "add-rate"}
rate={undefined}
variant={params.type}
/>
<ActionDialog
confirmButtonState={deleteZoneTransitionState}
onClose={closeModal}
onConfirm={() =>
ops.shippingZoneDelete.mutate({
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(shippingZone?.name)}</strong>
)
}}
/>
</DialogContentText>
</ActionDialog>
<ShippingZoneCountriesAssignDialog
confirmButtonState={assignCountryTransitionState}
countries={shop?.countries}
initial={shippingZone?.countries.map(country => country.code) || []}
isDefault={!!shippingZone?.default}
onClose={closeModal}
onConfirm={formData =>
ops.shippingZoneUpdate.mutate({
id,
input: {
countries: formData.countries,
default: formData.restOfTheWorld
}
})
}
open={params.action === "assign-country"}
/>
<ActionDialog
confirmButtonState={unassignCountryTransitionState}
onClose={closeModal}
onConfirm={() =>
ops.shippingZoneUpdate.mutate({
id,
input: {
countries: 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(
shippingZone?.countries.find(
country => country.code === params.id
)?.country
)}
</strong>
)
}}
/>
</DialogContentText>
</ActionDialog>
</>
);
};
export default ShippingZoneDetailsDialogs;

View file

@ -0,0 +1,62 @@
import { ShippingZoneUrlQueryParams } from "@saleor/shipping/urls";
import { ShippingMethodTypeEnum } from "@saleor/types/globalTypes";
import { UpdateShippingRateVariables } from "@saleor/shipping/types/UpdateShippingRate";
import { CreateShippingRateVariables } from "@saleor/shipping/types/CreateShippingRate";
import { FormData as ShippingZoneRateDialogFormData } from "../../components/ShippingZoneRateDialog";
export function getCreateShippingRateVariables(
data: ShippingZoneRateDialogFormData,
params: ShippingZoneUrlQueryParams,
id: string
): CreateShippingRateVariables {
return {
input: {
maximumOrderPrice:
params.type === ShippingMethodTypeEnum.PRICE
? data.noLimits
? null
: parseFloat(data.maxValue)
: null,
maximumOrderWeight:
params.type === ShippingMethodTypeEnum.WEIGHT
? data.noLimits
? null
: parseFloat(data.maxValue)
: null,
minimumOrderPrice:
params.type === ShippingMethodTypeEnum.PRICE
? data.noLimits
? null
: parseFloat(data.minValue)
: null,
minimumOrderWeight:
params.type === ShippingMethodTypeEnum.WEIGHT
? data.noLimits
? null
: parseFloat(data.minValue)
: null,
name: data.name,
price: data.isFree ? 0 : parseFloat(data.price),
shippingZone: id,
type: params.type
}
};
}
export function getUpdateShippingRateVariables(
data: ShippingZoneRateDialogFormData,
params: ShippingZoneUrlQueryParams,
id: string
): UpdateShippingRateVariables {
return {
id: params.id,
input: {
maximumOrderPrice: data.noLimits ? null : parseFloat(data.maxValue),
minimumOrderPrice: data.noLimits ? null : parseFloat(data.minValue),
name: data.name,
price: data.isFree ? 0 : parseFloat(data.price),
shippingZone: id
}
};
}

View file

@ -1,28 +1,41 @@
import DialogContentText from "@material-ui/core/DialogContentText";
import React from "react"; import React from "react";
import { useIntl } from "react-intl"; import { FormattedMessage, useIntl } from "react-intl";
import ActionDialog from "@saleor/components/ActionDialog";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import useWarehouseSearch from "@saleor/searches/useWarehouseSearch"; import useWarehouseSearch from "@saleor/searches/useWarehouseSearch";
import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config"; import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
import { useWarehouseUpdate } from "@saleor/warehouses/mutations"; import {
import { maybe } from "../../../misc"; 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";
import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; import { ShippingMethodTypeEnum } from "../../../types/globalTypes";
import ShippingZoneDetailsPage from "../../components/ShippingZoneDetailsPage"; import ShippingZoneDetailsPage, {
import { TypedShippingZone } from "../../queries"; FormData
import { CreateShippingRate } from "../../types/CreateShippingRate"; } from "../../components/ShippingZoneDetailsPage";
import { DeleteShippingRate } from "../../types/DeleteShippingRate"; import { useShippingZone } from "../../queries";
import { DeleteShippingZone } from "../../types/DeleteShippingZone";
import { UpdateShippingRate } from "../../types/UpdateShippingRate";
import { UpdateShippingZone } from "../../types/UpdateShippingZone";
import { import {
shippingZonesListUrl, shippingZonesListUrl,
shippingZoneUrl, shippingZoneUrl,
ShippingZoneUrlQueryParams ShippingZoneUrlQueryParams,
ShippingZoneUrlDialog
} from "../../urls"; } from "../../urls";
import ShippingZoneDetailsDialogs from "./ShippingZoneDetailsDialogs"; import {
import ShippingZoneOperations from "./ShippingZoneOperations"; getCreateShippingRateVariables,
getUpdateShippingRateVariables
} from "./data";
export interface ShippingZoneDetailsProps { export interface ShippingZoneDetailsProps {
id: string; id: string;
@ -36,187 +49,294 @@ const ShippingZoneDetails: React.FC<ShippingZoneDetailsProps> = ({
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const intl = useIntl(); const intl = useIntl();
const [updateWarehouse, updateWarehouseOpts] = useWarehouseUpdate({}); const shop = useShop();
const { const { result: searchWarehousesOpts } = useWarehouseSearch({
search: searchWarehouses,
result: searchWarehousesOpts
} = useWarehouseSearch({
variables: DEFAULT_INITIAL_SEARCH_DATA variables: DEFAULT_INITIAL_SEARCH_DATA
}); });
const closeModal = () => navigate(shippingZoneUrl(id), true); const { data, loading } = useShippingZone({
displayLoader: true,
variables: { id }
});
const onShippingRateCreate = (data: CreateShippingRate) => { const [openModal, closeModal] = createDialogActionHandlers<
if (data.shippingPriceCreate.errors.length === 0) { ShippingZoneUrlDialog,
notify({ ShippingZoneUrlQueryParams
text: intl.formatMessage(commonMessages.savedChanges) >(navigate, params => shippingZoneUrl(id, params), params);
}); const rate = data?.shippingZone?.shippingMethods.find(
closeModal(); rate => rate.id === params.id
);
const [createShippingRate, createShippingRateOpts] = useShippingRateCreate({
onCompleted: data => {
if (data.shippingPriceCreate.errors.length === 0) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
closeModal();
}
} }
});
const [updateShippingRate, updateShippingRateOpts] = useShippingRateUpdate({
onCompleted: data => {
if (data.shippingPriceUpdate.errors.length === 0) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
closeModal();
}
}
});
const [deleteShippingRate, deleteShippingRateOpts] = useShippingRateDelete({
onCompleted: data => {
if (data.shippingPriceDelete.errors.length === 0) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
closeModal();
}
}
});
const [deleteShippingZone, deleteShippingZoneOpts] = useShippingZoneDelete({
onCompleted: data => {
if (data.shippingZoneDelete.errors.length === 0) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
navigate(shippingZonesListUrl(), true);
}
}
});
const [updateShippingZone, updateShippingZoneOpts] = useShippingZoneUpdate({
onCompleted: data => {
if (data.shippingZoneUpdate.errors.length === 0) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
});
closeModal();
}
}
});
const handleSubmit = (data: FormData) => {
updateShippingZone({
variables: {
id,
input: {
name: data.name
}
}
});
}; };
const onShippingRateUpdate = (data: UpdateShippingRate) => { if (data?.shippingZone === null) {
if (data.shippingPriceUpdate.errors.length === 0) { return <NotFoundPage onBack={() => navigate(shippingZonesListUrl())} />;
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 ( return (
<ShippingZoneOperations <>
onShippingRateCreate={onShippingRateCreate} <ShippingZoneDetailsPage
onShippingRateDelete={onShippingRateDelete} disabled={loading}
onShippingRateUpdate={onShippingRateUpdate} errors={updateShippingZoneOpts.data?.shippingZoneUpdate.errors || []}
onShippingZoneDelete={onShippingZoneDelete} onBack={() => navigate(shippingZonesListUrl())}
onShippingZoneUpdate={onShippingZoneUpdate} onCountryAdd={() => openModal("assign-country")}
> onCountryRemove={code =>
{ops => ( openModal("unassign-country", {
<TypedShippingZone variables={{ id }}> id: code
{({ data, loading }) => ( })
<> }
<ShippingZoneDetailsPage onDelete={() => openModal("remove")}
disabled={loading} onPriceRateAdd={() =>
errors={ openModal("add-rate", {
ops.shippingZoneUpdate.opts.data?.shippingZoneUpdate.errors || type: ShippingMethodTypeEnum.PRICE
[] })
} }
onBack={() => navigate(shippingZonesListUrl())} onPriceRateEdit={rateId =>
onCountryAdd={() => openModal("edit-rate", {
navigate( id: rateId
shippingZoneUrl(id, { })
action: "assign-country" }
}) onRateRemove={rateId =>
) openModal("remove-rate", {
} id: rateId
onCountryRemove={code => })
navigate( }
shippingZoneUrl(id, { onSubmit={handleSubmit}
action: "unassign-country", onWeightRateAdd={() =>
id: code openModal("add-rate", {
}) type: ShippingMethodTypeEnum.WEIGHT
) })
} }
onDelete={() => onWeightRateEdit={rateId =>
navigate( openModal("edit-rate", {
shippingZoneUrl(id, { id: rateId
action: "remove" })
}) }
) saveButtonBarState={updateShippingZoneOpts.status}
} shippingZone={data?.shippingZone}
onPriceRateAdd={() => warehouses={
navigate( searchWarehousesOpts.data?.search.edges.map(edge => edge.node) || []
shippingZoneUrl(id, { }
action: "add-rate", />
type: ShippingMethodTypeEnum.PRICE <ShippingZoneRateDialog
}) action="edit"
) confirmButtonState={updateShippingRateOpts.status}
} defaultCurrency={shop?.defaultCurrency}
onPriceRateEdit={rateId => disabled={updateShippingRateOpts.loading}
navigate( errors={updateShippingRateOpts.data?.shippingPriceUpdate.errors || []}
shippingZoneUrl(id, { onClose={closeModal}
action: "edit-rate", onSubmit={data =>
id: rateId updateShippingRate({
}) variables: getUpdateShippingRateVariables(data, params, id)
) })
} }
onRateRemove={rateId => open={params.action === "edit-rate"}
navigate( rate={rate}
shippingZoneUrl(id, { variant={rate?.type}
action: "remove-rate", />
id: rateId <ActionDialog
}) confirmButtonState={deleteShippingRateOpts.status}
) onClose={closeModal}
} onConfirm={() =>
onSubmit={formData => { deleteShippingRate({
ops.shippingZoneUpdate.mutate({ variables: {
id, id: params.id
input: { }
name: formData.name })
} }
}); open={params.action === "remove-rate"}
updateWarehouse({ title={intl.formatMessage({
variables: { defaultMessage: "Delete Shipping Method",
id: formData.warehouse description: "dialog header"
} })}
}); variant="delete"
}} >
onWeightRateAdd={() => <DialogContentText>
navigate( <FormattedMessage
shippingZoneUrl(id, { defaultMessage="Are you sure you want to delete {name}?"
action: "add-rate", description="delete shipping method"
type: ShippingMethodTypeEnum.WEIGHT id="shippingZoneDetailsDialogsDeleteShippingMethod"
}) values={{
) name: getStringOrPlaceholder(rate?.name)
} }}
onWeightRateEdit={rateId => />
navigate( </DialogContentText>
shippingZoneUrl(id, { </ActionDialog>
action: "edit-rate", <ShippingZoneRateDialog
id: rateId action="create"
}) confirmButtonState={createShippingRateOpts.status}
) defaultCurrency={shop?.defaultCurrency}
} disabled={createShippingRateOpts.loading}
saveButtonBarState={ops.shippingZoneUpdate.opts.status} errors={createShippingRateOpts.data?.shippingPriceCreate.errors || []}
shippingZone={maybe(() => data.shippingZone)} onClose={closeModal}
warehouses={maybe( onSubmit={data =>
() => createShippingRate({
searchWarehousesOpts.data.search.edges.map( variables: getCreateShippingRateVariables(data, params, id)
edge => edge.node })
), }
[] open={params.action === "add-rate"}
)} rate={undefined}
/> variant={params.type}
<ShippingZoneDetailsDialogs />
assignCountryTransitionState={ <ActionDialog
ops.shippingZoneUpdate.opts.status confirmButtonState={deleteShippingZoneOpts.status}
} onClose={closeModal}
createRateTransitionState={ops.shippingRateCreate.opts.status} onConfirm={() =>
deleteRateTransitionState={ops.shippingRateDelete.opts.status} deleteShippingZone({
deleteZoneTransitionState={ops.shippingZoneDelete.opts.status} variables: {
id={id} id
ops={ops} }
params={params} })
shippingZone={data?.shippingZone} }
unassignCountryTransitionState={ open={params.action === "remove"}
ops.shippingZoneUpdate.opts.status title={intl.formatMessage({
} defaultMessage: "Delete Shipping Zone",
updateRateTransitionState={ops.shippingRateUpdate.opts.status} description: "dialog header"
/> })}
</> variant="delete"
)} >
</TypedShippingZone> <DialogContentText>
)} <FormattedMessage
</ShippingZoneOperations> 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>
</>
); );
}; };
export default ShippingZoneDetails; export default ShippingZoneDetails;

View file

@ -746,6 +746,15 @@ export enum VoucherTypeEnum {
SPECIFIC_PRODUCT = "SPECIFIC_PRODUCT", SPECIFIC_PRODUCT = "SPECIFIC_PRODUCT",
} }
export enum WarehouseErrorCode {
ALREADY_EXISTS = "ALREADY_EXISTS",
GRAPHQL_ERROR = "GRAPHQL_ERROR",
INVALID = "INVALID",
NOT_FOUND = "NOT_FOUND",
REQUIRED = "REQUIRED",
UNIQUE = "UNIQUE",
}
export enum WarehouseSortField { export enum WarehouseSortField {
NAME = "NAME", NAME = "NAME",
} }
@ -1431,11 +1440,12 @@ export interface WarehouseAddressInput {
} }
export interface WarehouseCreateInput { export interface WarehouseCreateInput {
name: string; slug?: string | null;
companyName?: string | null; companyName?: string | null;
shippingZones?: (string | null)[] | null;
email?: string | null; email?: string | null;
name: string;
address: WarehouseAddressInput; address: WarehouseAddressInput;
shippingZones?: (string | null)[] | null;
} }
export interface WarehouseFilterInput { export interface WarehouseFilterInput {
@ -1448,10 +1458,10 @@ export interface WarehouseSortingInput {
} }
export interface WarehouseUpdateInput { export interface WarehouseUpdateInput {
name: string; slug?: string | null;
companyName?: string | null; companyName?: string | null;
shippingZones?: (string | null)[] | null;
email?: string | null; email?: string | null;
name?: string | null;
address?: WarehouseAddressInput | null; address?: WarehouseAddressInput | null;
} }