From 4391e79a90b6ef52790ec18b5fe33905b6f5e174 Mon Sep 17 00:00:00 2001 From: dominik-zeglen Date: Tue, 1 Sep 2020 13:53:28 +0200 Subject: [PATCH] Add metadata editor to product type creator --- .../ProductTypeCreatePage.tsx | 109 ++++++++++-------- src/productTypes/views/ProductTypeCreate.tsx | 31 +++-- 2 files changed, 84 insertions(+), 56 deletions(-) diff --git a/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx b/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx index 93506b17e..79568ae1c 100644 --- a/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx +++ b/src/productTypes/components/ProductTypeCreatePage/ProductTypeCreatePage.tsx @@ -4,6 +4,7 @@ import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; import Grid from "@saleor/components/Grid"; +import Metadata, { MetadataFormData } from "@saleor/components/Metadata"; import PageHeader from "@saleor/components/PageHeader"; import SaveButtonBar from "@saleor/components/SaveButtonBar"; import { ChangeEvent, FormChange } from "@saleor/hooks/useForm"; @@ -12,6 +13,7 @@ import { sectionNames } from "@saleor/intl"; import { ProductTypeDetails_taxTypes } from "@saleor/productTypes/types/ProductTypeDetails"; import { UserError } from "@saleor/types"; import { WeightUnitsEnum } from "@saleor/types/globalTypes"; +import useMetadataChangeTrigger from "@saleor/utils/metadata/useMetadataChangeTrigger"; import React from "react"; import { useIntl } from "react-intl"; @@ -19,7 +21,7 @@ import ProductTypeDetails from "../ProductTypeDetails/ProductTypeDetails"; import ProductTypeShipping from "../ProductTypeShipping/ProductTypeShipping"; import ProductTypeTaxes from "../ProductTypeTaxes/ProductTypeTaxes"; -export interface ProductTypeForm { +export interface ProductTypeForm extends MetadataFormData { name: string; isShippingRequired: boolean; taxType: string; @@ -39,7 +41,9 @@ export interface ProductTypeCreatePageProps { const formInitialData: ProductTypeForm = { isShippingRequired: false, + metadata: [], name: "", + privateMetadata: [], taxType: "", weight: 0 }; @@ -68,56 +72,65 @@ const ProductTypeCreatePage: React.FC = ({ }: ProductTypeCreatePageProps) => { const intl = useIntl(); const [taxTypeDisplayName, setTaxTypeDisplayName] = useStateFromProps(""); + const { + makeChangeHandler: makeMetadataChangeHandler + } = useMetadataChangeTrigger(); return (
- {({ change, data, hasChanged, submit }) => ( - - - {intl.formatMessage(sectionNames.productTypes)} - - - -
- - - - handleTaxTypeChange( - event, - taxTypes, - change, - setTaxTypeDisplayName - ) - } - /> -
-
- -
-
- -
- )} + {({ change, data, hasChanged, submit }) => { + const changeMetadata = makeMetadataChangeHandler(change); + + return ( + + + {intl.formatMessage(sectionNames.productTypes)} + + + +
+ + + + handleTaxTypeChange( + event, + taxTypes, + change, + setTaxTypeDisplayName + ) + } + /> + + +
+
+ +
+
+ +
+ ); + }}
); }; diff --git a/src/productTypes/views/ProductTypeCreate.tsx b/src/productTypes/views/ProductTypeCreate.tsx index 0c2c9a70a..80317b77a 100644 --- a/src/productTypes/views/ProductTypeCreate.tsx +++ b/src/productTypes/views/ProductTypeCreate.tsx @@ -1,6 +1,11 @@ import { WindowTitle } from "@saleor/components/WindowTitle"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; +import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler"; +import { + useMetadataUpdate, + usePrivateMetadataUpdate +} from "@saleor/utils/metadata/updateMetadata"; import React from "react"; import { useIntl } from "react-intl"; @@ -17,6 +22,8 @@ export const ProductTypeCreate: React.FC = () => { const navigate = useNavigator(); const notify = useNotifier(); const intl = useIntl(); + const [updateMetadata] = useMetadataUpdate({}); + const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const handleCreateSuccess = (updateData: ProductTypeCreateMutation) => { if (updateData.productTypeCreate.errors.length === 0) { @@ -32,8 +39,8 @@ export const ProductTypeCreate: React.FC = () => { return ( {(createProductType, createProductTypeOpts) => { - const handleCreate = (formData: ProductTypeForm) => - createProductType({ + const handleCreate = async (formData: ProductTypeForm) => { + const result = await createProductType({ variables: { input: { hasVariants: false, @@ -44,6 +51,15 @@ export const ProductTypeCreate: React.FC = () => { } } }); + + return result.data?.productTypeCreate.productType?.id || null; + }; + const handleSubmit = createMetadataCreateHandler( + handleCreate, + updateMetadata, + updatePrivateMetadata + ); + return ( {({ data, loading }) => ( @@ -58,19 +74,18 @@ export const ProductTypeCreate: React.FC = () => { data.shop.defaultWeightUnit)} disabled={loading} - errors={maybe( - () => createProductTypeOpts.data.productTypeCreate.errors, - [] - )} + errors={ + createProductTypeOpts.data?.productTypeCreate.errors || [] + } pageTitle={intl.formatMessage({ defaultMessage: "Create Product Type", description: "header", id: "productTypeCreatePageHeader" })} saveButtonBarState={createProductTypeOpts.status} - taxTypes={maybe(() => data.taxTypes, [])} + taxTypes={data?.taxTypes || []} onBack={() => navigate(productTypeListUrl())} - onSubmit={handleCreate} + onSubmit={handleSubmit} /> )}