saleor-dashboard/src/attributes/views/AttributeDetails/AttributeDetails.tsx

321 lines
14 KiB
TypeScript
Raw Normal View History

2019-08-09 10:17:04 +00:00
import React from "react";
import { useIntl } from "react-intl";
2019-08-09 10:17:04 +00:00
import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier";
import { commonMessages } from "@saleor/intl";
2019-12-06 17:11:46 +00:00
import { maybe } from "@saleor/misc";
2019-08-09 10:17:04 +00:00
import { ReorderEvent } from "@saleor/types";
import { move } from "@saleor/utils/lists";
2019-12-06 14:58:28 +00:00
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
2020-03-04 12:50:25 +00:00
import { getProductErrorMessage } from "@saleor/utils/errors";
2019-08-09 10:17:04 +00:00
import AttributeDeleteDialog from "../../components/AttributeDeleteDialog";
import AttributePage from "../../components/AttributePage";
import AttributeValueDeleteDialog from "../../components/AttributeValueDeleteDialog";
import AttributeValueEditDialog from "../../components/AttributeValueEditDialog";
import {
AttributeDeleteMutation,
AttributeUpdateMutation,
AttributeValueCreateMutation,
AttributeValueDeleteMutation,
AttributeValueReorderMutation,
AttributeValueUpdateMutation
} from "../../mutations";
import { AttributeDetailsQuery } from "../../queries";
import { AttributeDelete } from "../../types/AttributeDelete";
import { AttributeUpdate } from "../../types/AttributeUpdate";
import { AttributeValueCreate } from "../../types/AttributeValueCreate";
import { AttributeValueDelete } from "../../types/AttributeValueDelete";
import { AttributeValueReorder } from "../../types/AttributeValueReorder";
import { AttributeValueUpdate } from "../../types/AttributeValueUpdate";
import {
attributeListUrl,
attributeUrl,
2019-12-06 14:58:28 +00:00
AttributeUrlQueryParams,
AttributeUrlDialog
2019-08-09 10:17:04 +00:00
} from "../../urls";
interface AttributeDetailsProps {
id: string;
params: AttributeUrlQueryParams;
}
const AttributeDetails: React.FC<AttributeDetailsProps> = ({ id, params }) => {
const navigate = useNavigator();
const notify = useNotifier();
const intl = useIntl();
2019-08-09 10:17:04 +00:00
2019-12-06 14:58:28 +00:00
const [openModal, closeModal] = createDialogActionHandlers<
AttributeUrlDialog,
AttributeUrlQueryParams
>(navigate, params => attributeUrl(id, params), params);
2019-08-09 10:17:04 +00:00
const handleDelete = (data: AttributeDelete) => {
if (data.attributeDelete.errors.length === 0) {
notify({
text: intl.formatMessage({
2019-08-22 16:25:55 +00:00
defaultMessage: "Attribute deleted"
})
});
2019-08-09 10:17:04 +00:00
navigate(attributeListUrl());
}
};
const handleValueDelete = (data: AttributeValueDelete) => {
if (data.attributeValueDelete.errors.length === 0) {
notify({
text: intl.formatMessage({
2019-08-20 10:05:08 +00:00
defaultMessage: "Value deleted",
2019-08-22 16:25:55 +00:00
description: "attribute value deleted"
})
});
2019-08-09 10:17:04 +00:00
closeModal();
}
};
const handleUpdate = (data: AttributeUpdate) => {
if (data.attributeUpdate.errors.length === 0) {
notify({ text: intl.formatMessage(commonMessages.savedChanges) });
2019-08-09 10:17:04 +00:00
}
};
const handleValueUpdate = (data: AttributeValueUpdate) => {
if (data.attributeValueUpdate.errors.length === 0) {
notify({ text: intl.formatMessage(commonMessages.savedChanges) });
2019-08-09 10:17:04 +00:00
closeModal();
}
};
const handleValueCreate = (data: AttributeValueCreate) => {
if (data.attributeValueCreate.errors.length === 0) {
notify({
text: intl.formatMessage({
defaultMessage: "Added new value",
2019-08-22 16:25:55 +00:00
description: "added new attribute value"
})
});
2019-08-09 10:17:04 +00:00
closeModal();
}
};
const handleValueReorderMutation = (data: AttributeValueReorder) => {
if (data.attributeReorderValues.errors.length !== 0) {
notify({
2020-03-04 12:50:25 +00:00
text: getProductErrorMessage(
data.attributeReorderValues.errors[0],
intl
)
2019-08-09 10:17:04 +00:00
});
}
};
return (
<AttributeDetailsQuery variables={{ id }}>
{({ data, loading }) => (
<AttributeDeleteMutation onCompleted={handleDelete}>
{(attributeDelete, attributeDeleteOpts) => (
<AttributeValueDeleteMutation onCompleted={handleValueDelete}>
{(attributeValueDelete, attributeValueDeleteOpts) => (
<AttributeUpdateMutation onCompleted={handleUpdate}>
{(attributeUpdate, attributeUpdateOpts) => (
<AttributeValueUpdateMutation
onCompleted={handleValueUpdate}
>
{(attributeValueUpdate, attributeValueUpdateOpts) => (
<AttributeValueCreateMutation
onCompleted={handleValueCreate}
>
{(attributeValueCreate, attributeValueCreateOpts) => (
<AttributeValueReorderMutation
onCompleted={handleValueReorderMutation}
>
{attributeValueReorder => {
const handleValueReorder = ({
newIndex,
oldIndex
}: ReorderEvent) =>
attributeValueReorder({
optimisticResponse: {
attributeReorderValues: {
__typename: "AttributeReorderValues",
attribute: {
...data.attribute,
values: move(
data.attribute.values[oldIndex],
data.attribute.values,
(a, b) => a.id === b.id,
newIndex
)
},
errors: []
}
},
variables: {
id,
move: {
id: data.attribute.values[oldIndex].id,
sortOrder: newIndex - oldIndex
}
}
});
return (
<>
<AttributePage
attribute={maybe(() => data.attribute)}
disabled={loading}
2020-03-04 12:50:25 +00:00
errors={
attributeUpdateOpts.data
?.attributeUpdate.errors || []
}
2019-08-09 10:17:04 +00:00
onBack={() =>
navigate(attributeListUrl())
}
onDelete={() => openModal("remove")}
onSubmit={data => {
const input = {
...data,
inputType: undefined
};
attributeUpdate({
variables: {
id,
input: {
...input,
storefrontSearchPosition: parseInt(
input.storefrontSearchPosition,
0
)
}
}
});
}}
onValueAdd={() => openModal("add-value")}
onValueDelete={id =>
2019-12-06 14:58:28 +00:00
openModal("remove-value", {
id
})
2019-08-09 10:17:04 +00:00
}
onValueReorder={handleValueReorder}
onValueUpdate={id =>
2019-12-06 14:58:28 +00:00
openModal("edit-value", {
id
})
2019-08-09 10:17:04 +00:00
}
2019-12-06 17:11:46 +00:00
saveButtonBarState={
2019-12-06 17:17:44 +00:00
attributeUpdateOpts.status
2019-12-06 17:11:46 +00:00
}
2019-08-09 10:17:04 +00:00
values={maybe(
() => data.attribute.values
)}
/>
<AttributeDeleteDialog
open={params.action === "remove"}
name={maybe(
() => data.attribute.name,
"..."
)}
2019-12-06 17:11:46 +00:00
confirmButtonState={
2019-12-06 17:17:44 +00:00
attributeDeleteOpts.status
2019-12-06 17:11:46 +00:00
}
2019-08-09 10:17:04 +00:00
onClose={closeModal}
onConfirm={() =>
attributeDelete({
variables: {
id
}
})
}
/>
<AttributeValueDeleteDialog
attributeName={maybe(
() => data.attribute.name,
"..."
)}
open={params.action === "remove-value"}
name={maybe(
() =>
data.attribute.values.find(
value => params.id === value.id
).name,
"..."
)}
useName={true}
confirmButtonState={
2019-12-06 17:17:44 +00:00
attributeValueDeleteOpts.status
2019-08-09 10:17:04 +00:00
}
onClose={closeModal}
onConfirm={() =>
attributeValueDelete({
variables: {
id: params.id
}
})
}
/>
<AttributeValueEditDialog
attributeValue={null}
confirmButtonState={
2019-12-06 17:17:44 +00:00
attributeValueCreateOpts.status
2019-08-09 10:17:04 +00:00
}
disabled={loading}
2020-03-04 12:50:25 +00:00
errors={
attributeValueCreateOpts.data
?.attributeValueCreate.errors || []
}
2019-08-09 10:17:04 +00:00
open={params.action === "add-value"}
onClose={closeModal}
onSubmit={input =>
attributeValueCreate({
variables: {
id,
input
}
})
}
/>
<AttributeValueEditDialog
attributeValue={maybe(() =>
data.attribute.values.find(
value => params.id === value.id
)
)}
confirmButtonState={
2019-12-06 17:17:44 +00:00
attributeValueUpdateOpts.status
2019-08-09 10:17:04 +00:00
}
disabled={loading}
2020-03-04 12:50:25 +00:00
errors={
attributeValueUpdateOpts.data
?.attributeValueUpdate.errors || []
}
2019-08-09 10:17:04 +00:00
open={params.action === "edit-value"}
onClose={closeModal}
onSubmit={input =>
attributeValueUpdate({
variables: {
id: data.attribute.values.find(
value => params.id === value.id
).id,
input
}
})
}
/>
</>
);
}}
</AttributeValueReorderMutation>
)}
</AttributeValueCreateMutation>
)}
</AttributeValueUpdateMutation>
)}
</AttributeUpdateMutation>
)}
</AttributeValueDeleteMutation>
)}
</AttributeDeleteMutation>
)}
</AttributeDetailsQuery>
);
};
AttributeDetails.displayName = "AttributeDetails";
export default AttributeDetails;