saleor-dashboard/src/pages/views/PageDetails.tsx

143 lines
5.1 KiB
TypeScript
Raw Normal View History

2019-06-19 14:40:52 +00:00
import DialogContentText from "@material-ui/core/DialogContentText";
import ActionDialog from "@saleor/components/ActionDialog";
import { WindowTitle } from "@saleor/components/WindowTitle";
import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier";
2020-03-17 10:57:02 +00:00
import { commonMessages } from "@saleor/intl";
2020-10-20 11:20:55 +00:00
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
import {
useMetadataUpdate,
usePrivateMetadataUpdate
} from "@saleor/utils/metadata/updateMetadata";
import React from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { getStringOrPlaceholder, maybe } from "../../misc";
2019-06-19 14:40:52 +00:00
import { PageInput } from "../../types/globalTypes";
2020-10-22 11:33:29 +00:00
import PageDetailsPage, {
PageDetailsPageFormData
} from "../components/PageDetailsPage";
2019-06-19 14:40:52 +00:00
import { TypedPageRemove, TypedPageUpdate } from "../mutations";
import { TypedPageDetailsQuery } from "../queries";
import { PageRemove } from "../types/PageRemove";
import { pageListUrl, pageUrl, PageUrlQueryParams } from "../urls";
export interface PageDetailsProps {
id: string;
params: PageUrlQueryParams;
}
2020-10-22 11:33:29 +00:00
const createPageInput = (data: PageDetailsPageFormData): PageInput => ({
2019-12-02 10:49:14 +00:00
contentJson: JSON.stringify(data.content),
isPublished: data.isPublished,
2020-10-19 10:28:43 +00:00
publicationDate: data.publicationDate,
2019-12-02 10:49:14 +00:00
seo: {
description: data.seoDescription,
title: data.seoTitle
},
slug: data.slug === "" ? null : data.slug,
title: data.title
});
2019-06-19 14:40:52 +00:00
export const PageDetails: React.FC<PageDetailsProps> = ({ id, params }) => {
2019-06-19 14:40:52 +00:00
const navigate = useNavigator();
const notify = useNotifier();
const intl = useIntl();
2020-10-20 11:20:55 +00:00
const [updateMetadata] = useMetadataUpdate({});
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
2019-06-19 14:40:52 +00:00
const handlePageRemove = (data: PageRemove) => {
if (data.pageDelete.errors.length === 0) {
notify({
2020-07-01 09:39:36 +00:00
status: "success",
2020-03-17 10:57:02 +00:00
text: intl.formatMessage(commonMessages.savedChanges)
2019-06-19 14:40:52 +00:00
});
navigate(pageListUrl());
}
};
2020-10-20 11:20:55 +00:00
2019-06-19 14:40:52 +00:00
return (
<TypedPageRemove variables={{ id }} onCompleted={handlePageRemove}>
{(pageRemove, pageRemoveOpts) => (
<TypedPageUpdate>
{(pageUpdate, pageUpdateOpts) => (
<TypedPageDetailsQuery variables={{ id }}>
2020-10-20 11:20:55 +00:00
{pageDetails => {
2020-10-22 11:33:29 +00:00
const handleUpdate = async (data: PageDetailsPageFormData) => {
2020-10-20 11:20:55 +00:00
const result = await pageUpdate({
variables: {
id,
input: createPageInput(data)
2019-12-06 17:11:46 +00:00
}
2020-10-20 11:20:55 +00:00
});
return result.data.pageUpdate.errors;
};
const handleSubmit = createMetadataUpdateHandler(
pageDetails.data?.page,
handleUpdate,
variables => updateMetadata({ variables }),
variables => updatePrivateMetadata({ variables })
);
return (
<>
<WindowTitle
title={maybe(() => pageDetails.data.page.title)}
/>
<PageDetailsPage
disabled={pageDetails.loading}
errors={pageUpdateOpts.data?.pageUpdate.errors || []}
saveButtonBarState={pageUpdateOpts.status}
page={pageDetails.data?.page}
onBack={() => navigate(pageListUrl())}
onRemove={() =>
navigate(
pageUrl(id, {
action: "remove"
})
)
}
onSubmit={handleSubmit}
/>
<ActionDialog
open={params.action === "remove"}
confirmButtonState={pageRemoveOpts.status}
title={intl.formatMessage({
defaultMessage: "Delete Page",
description: "dialog header"
})}
onClose={() => navigate(pageUrl(id))}
onConfirm={pageRemove}
variant="delete"
>
<DialogContentText>
<FormattedMessage
defaultMessage="Are you sure you want to delete {title}?"
description="delete page"
values={{
title: (
<strong>
{getStringOrPlaceholder(
pageDetails.data?.page?.title
)}
</strong>
)
}}
/>
</DialogContentText>
</ActionDialog>
</>
);
}}
2019-06-19 14:40:52 +00:00
</TypedPageDetailsQuery>
)}
</TypedPageUpdate>
)}
</TypedPageRemove>
);
};
PageDetails.displayName = "PageDetails";
export default PageDetails;