[1516] Move product remove logic to create handler

This commit is contained in:
Jakub Majorek 2020-11-19 13:20:36 +01:00
parent c59a7f4349
commit aa9df18fa8
2 changed files with 41 additions and 24 deletions

View file

@ -7,7 +7,6 @@ import useChannels from "@saleor/hooks/useChannels";
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 useShop from "@saleor/hooks/useShop"; import useShop from "@saleor/hooks/useShop";
import { getMutationStatus } from "@saleor/misc";
import ProductCreatePage from "@saleor/products/components/ProductCreatePage"; import ProductCreatePage from "@saleor/products/components/ProductCreatePage";
import { import {
useProductChannelListingUpdate, useProductChannelListingUpdate,
@ -135,41 +134,29 @@ export const ProductCreateView: React.FC = () => {
}); });
const handleSubmit = async data => { const handleSubmit = async data => {
await createMetadataCreateHandler( const result = await createMetadataCreateHandler(
createHandler( createHandler(
productTypes, productTypes,
variables => productCreate({ variables }), variables => productCreate({ variables }),
variables => productVariantCreate({ variables }), variables => productVariantCreate({ variables }),
updateChannels, updateChannels,
updateVariantChannels updateVariantChannels,
deleteProduct
), ),
updateMetadata, updateMetadata,
updatePrivateMetadata updatePrivateMetadata
)(data); )(data);
if (result) {
setProductCreateComplete(true); setProductCreateComplete(true);
}
}; };
React.useEffect(() => { React.useEffect(() => {
const productId = productCreateOpts.data?.productCreate?.product?.id; const productId = productCreateOpts.data?.productCreate?.product?.id;
// INFO: All these mutations contain required fields in Product Create UI
const statuses = [
getMutationStatus(productCreateOpts),
getMutationStatus(productVariantCreateOpts),
getMutationStatus(updateChannelsOpts)
];
if (productId && productCreateComplete) { if (productCreateComplete && productId) {
if (statuses.every(s => s === "success")) {
handleSuccess(productId); handleSuccess(productId);
} else {
/*
INFO: This is a stop-gap solution, where we delete products that didn't meet all required data in the create form
A more robust solution would require merging create and update form into one to persist form state across redirects
*/
setProductCreateComplete(false);
deleteProduct({ variables: { id: productId } });
}
} }
}, [productCreateComplete]); }, [productCreateComplete]);

View file

@ -9,6 +9,10 @@ import {
ProductCreate, ProductCreate,
ProductCreateVariables ProductCreateVariables
} from "@saleor/products/types/ProductCreate"; } from "@saleor/products/types/ProductCreate";
import {
ProductDelete,
ProductDeleteVariables
} from "@saleor/products/types/ProductDelete";
import { import {
ProductVariantChannelListingUpdate, ProductVariantChannelListingUpdate,
ProductVariantChannelListingUpdateVariables ProductVariantChannelListingUpdateVariables
@ -59,7 +63,10 @@ export function createHandler(
}) => Promise<MutationFetchResult<ProductChannelListingUpdate>>, }) => Promise<MutationFetchResult<ProductChannelListingUpdate>>,
updateVariantChannels: (options: { updateVariantChannels: (options: {
variables: ProductVariantChannelListingUpdateVariables; variables: ProductVariantChannelListingUpdateVariables;
}) => Promise<MutationFetchResult<ProductVariantChannelListingUpdate>> }) => Promise<MutationFetchResult<ProductVariantChannelListingUpdate>>,
productDelete: (options: {
variables: ProductDeleteVariables;
}) => Promise<MutationFetchResult<ProductDelete>>
) { ) {
return async (formData: ProductCreateData) => { return async (formData: ProductCreateData) => {
const productVariables: ProductCreateVariables = { const productVariables: ProductCreateVariables = {
@ -85,6 +92,7 @@ export function createHandler(
}; };
const result = await productCreate(productVariables); const result = await productCreate(productVariables);
let hasErrors = false;
const hasVariants = productTypes.find( const hasVariants = productTypes.find(
product => product.id === formData.productType.id product => product.id === formData.productType.id
@ -98,7 +106,13 @@ export function createHandler(
), ),
productVariantCreate(getSimpleProductVariables(formData, productId)) productVariantCreate(getSimpleProductVariables(formData, productId))
]); ]);
const variantErrors = result[1].data.productVariantCreate.errors; const channelErrors = result[0].data?.productChannelListingUpdate?.errors;
const variantErrors = result[1].data?.productVariantCreate?.errors;
if ([...(channelErrors || []), ...(variantErrors || [])].length > 0) {
hasErrors = true;
}
const variantId = result[1].data.productVariantCreate.productVariant?.id; const variantId = result[1].data.productVariantCreate.productVariant?.id;
if (variantErrors.length === 0 && variantId) { if (variantErrors.length === 0 && variantId) {
updateVariantChannels({ updateVariantChannels({
@ -113,7 +127,23 @@ export function createHandler(
}); });
} }
} else { } else {
updateChannels(getChannelsVariables(productId, formData.channelListings)); const result = await updateChannels(
getChannelsVariables(productId, formData.channelListings)
);
if (result.data?.productChannelListingUpdate?.errors.length > 0) {
hasErrors = true;
}
}
/*
INFO: This is a stop-gap solution, where we delete products that didn't meet all required data in the create form
A more robust solution would require merging create and update form into one to persist form state across redirects
*/
if (productId && hasErrors) {
productDelete({ variables: { id: productId } });
return null;
} }
return productId || null; return productId || null;
}; };