diff --git a/src/products/components/ProductCreatePage/ProductCreatePage.tsx b/src/products/components/ProductCreatePage/ProductCreatePage.tsx index 62167700f..f0baedfb2 100644 --- a/src/products/components/ProductCreatePage/ProductCreatePage.tsx +++ b/src/products/components/ProductCreatePage/ProductCreatePage.tsx @@ -106,9 +106,11 @@ interface ProductCreatePageProps { fetchCollections: (data: string) => void; fetchProductTypes: (data: string) => void; onBack?(); - onSubmit?(data: ProductCreatePageSubmitData); - onSubmitReject?(nextAction?: ProductCreatePageSubmitNextAction); - setSubmitNextAction?(nextAction: ProductCreatePageSubmitNextAction); + onSubmit?( + data: ProductCreatePageSubmitData, + nextAction?: ProductCreatePageSubmitNextAction + ); + onSubmitSkip?(nextAction?: ProductCreatePageSubmitNextAction); } export const ProductCreatePage: React.FC = ({ @@ -131,9 +133,7 @@ export const ProductCreatePage: React.FC = ({ fetchProductTypes, weightUnit, onSubmit, - onSubmitReject, - submitNextAction, - setSubmitNextAction + onSubmitSkip }: ProductCreatePageProps) => { const intl = useIntl(); const localizeDate = useDateLocalize(); @@ -210,12 +210,21 @@ export const ProductCreatePage: React.FC = ({ value: taxType.taxCode })) || []; - const handleSubmit = (data: FormData) => - onSubmit({ - ...data, - attributes, - stocks - }); + const [modalWithAction, setModalWithAction] = React.useState< + ProductCreatePageSubmitNextAction + >(null); + + const handleSubmit = (data: FormData) => { + onSubmit( + { + ...data, + attributes, + stocks + }, + modalWithAction + ); + setModalWithAction(null); + }; return (
@@ -331,9 +340,10 @@ export const ProductCreatePage: React.FC = ({ removeStock(id); }} onWarehouseConfigure={() => { - setSubmitNextAction("warehouse-configure"); if (disabled || !onSubmit || !hasChanged) { - onSubmitReject("warehouse-configure"); + onSubmitSkip("warehouse-configure"); + } else { + setModalWithAction("warehouse-configure"); } }} /> @@ -429,10 +439,10 @@ export const ProductCreatePage: React.FC = ({ submit(); }} onRejectChanges={() => { - onSubmitReject("warehouse-configure"); + onSubmitSkip("warehouse-configure"); }} - onClose={() => setSubmitNextAction(null)} - open={submitNextAction === "warehouse-configure"} + onClose={() => setModalWithAction(null)} + open={modalWithAction === "warehouse-configure"} confirmButtonState={saveButtonBarState} /> diff --git a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx index 6efc10bd1..0032769af 100644 --- a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx +++ b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx @@ -88,9 +88,11 @@ export interface ProductUpdatePageProps extends ListActions { onImageReorder?(event: { oldIndex: number; newIndex: number }); onImageUpload(file: File); onSeoClick?(); - onSubmit?(data: ProductUpdatePageSubmitData); - onSubmitReject?(nextAction?: ProductUpdatePageSubmitNextAction); - setSubmitNextAction?(nextAction: ProductUpdatePageSubmitNextAction); + onSubmit?( + data: ProductUpdatePageSubmitData, + nextAction?: ProductUpdatePageSubmitNextAction + ); + onSubmitSkip?(nextAction?: ProductUpdatePageSubmitNextAction); onVariantAdd?(); onSetDefaultVariant(); onWarehouseConfigure(); @@ -130,7 +132,7 @@ export const ProductUpdatePage: React.FC = ({ onImageUpload, onSeoClick, onSubmit, - onSubmitReject, + onSubmitSkip, onVariantAdd, onVariantsAdd, onSetDefaultVariant, @@ -140,9 +142,7 @@ export const ProductUpdatePage: React.FC = ({ selected, toggle, toggleAll, - toolbar, - submitNextAction, - setSubmitNextAction + toolbar }) => { const intl = useIntl(); const localizeDate = useDateLocalize(); @@ -201,6 +201,10 @@ export const ProductUpdatePage: React.FC = ({ value: taxType.taxCode })) || []; + const [modalWithAction, setModalWithAction] = React.useState< + ProductUpdatePageSubmitNextAction + >(null); + const handleSubmit = (data: ProductUpdatePageFormData) => { const metadata = isMetadataModified ? data.metadata : undefined; const privateMetadata = isPrivateMetadataModified @@ -208,15 +212,18 @@ export const ProductUpdatePage: React.FC = ({ : undefined; if (product.productType.hasVariants) { - onSubmit({ - ...data, - addStocks: [], - attributes, - metadata, - privateMetadata, - removeStocks: [], - updateStocks: [] - }); + onSubmit( + { + ...data, + addStocks: [], + attributes, + metadata, + privateMetadata, + removeStocks: [], + updateStocks: [] + }, + modalWithAction + ); } else { const dataStocks = stocks.map(stock => stock.id); const variantStocks = product.variants[0]?.stocks.map( @@ -224,20 +231,25 @@ export const ProductUpdatePage: React.FC = ({ ); const stockDiff = diff(variantStocks, dataStocks); - onSubmit({ - ...data, - addStocks: stocks.filter(stock => - stockDiff.added.some(addedStock => addedStock === stock.id) - ), - attributes, - metadata, - privateMetadata, - removeStocks: stockDiff.removed, - updateStocks: stocks.filter( - stock => !stockDiff.added.some(addedStock => addedStock === stock.id) - ) - }); + onSubmit( + { + ...data, + addStocks: stocks.filter(stock => + stockDiff.added.some(addedStock => addedStock === stock.id) + ), + attributes, + metadata, + privateMetadata, + removeStocks: stockDiff.removed, + updateStocks: stocks.filter( + stock => + !stockDiff.added.some(addedStock => addedStock === stock.id) + ) + }, + modalWithAction + ); } + setModalWithAction(null); }; return ( @@ -381,9 +393,10 @@ export const ProductUpdatePage: React.FC = ({ removeStock(id); }} onWarehouseConfigure={() => { - setSubmitNextAction("warehouse-configure"); if (disabled || !onSubmit || !hasChanged) { - onSubmitReject("warehouse-configure"); + onSubmitSkip("warehouse-configure"); + } else { + setModalWithAction("warehouse-configure"); } }} /> @@ -480,10 +493,10 @@ export const ProductUpdatePage: React.FC = ({ submit(); }} onRejectChanges={() => { - onSubmitReject("warehouse-configure"); + onSubmitSkip("warehouse-configure"); }} - onClose={() => setSubmitNextAction(null)} - open={submitNextAction === "warehouse-configure"} + onClose={() => setModalWithAction(null)} + open={modalWithAction === "warehouse-configure"} confirmButtonState={saveButtonBarState} /> diff --git a/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx b/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx index 2f7c5dceb..7117a09bf 100644 --- a/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx +++ b/src/products/components/ProductVariantCreatePage/ProductVariantCreatePage.tsx @@ -57,14 +57,13 @@ interface ProductVariantCreatePageProps { saveButtonBarState: ConfirmButtonTransitionState; warehouses: SearchWarehouses_search_edges_node[]; weightUnit: string; - submitNextAction?: ProductVariantCreatePageSubmitNextAction; onBack: () => void; - onSubmit: (data: ProductVariantCreatePageSubmitData) => void; - onSubmitReject?: ( + onSubmit: ( + data: ProductVariantCreatePageSubmitData, nextAction?: ProductVariantCreatePageSubmitNextAction ) => void; - setSubmitNextAction?: ( - nextAction: ProductVariantCreatePageSubmitNextAction + onSubmitSkip?: ( + nextAction?: ProductVariantCreatePageSubmitNextAction ) => void; onVariantClick: (variantId: string) => void; onVariantReorder: ReorderAction; @@ -81,11 +80,9 @@ const ProductVariantCreatePage: React.FC = ({ weightUnit, onBack, onSubmit, - onSubmitReject, + onSubmitSkip, onVariantClick, - onVariantReorder, - submitNextAction, - setSubmitNextAction + onVariantReorder }) => { const intl = useIntl(); const attributeInput = React.useMemo( @@ -117,12 +114,21 @@ const ProductVariantCreatePage: React.FC = ({ weight: "" }; - const handleSubmit = (data: ProductVariantCreatePageFormData) => - onSubmit({ - ...data, - attributes, - stocks - }); + const [modalWithAction, setModalWithAction] = React.useState< + ProductVariantCreatePageSubmitNextAction + >(null); + + const handleSubmit = (data: ProductVariantCreatePageFormData) => { + onSubmit( + { + ...data, + attributes, + stocks + }, + modalWithAction + ); + setModalWithAction(null); + }; return ( @@ -202,9 +208,10 @@ const ProductVariantCreatePage: React.FC = ({ removeStock(id); }} onWarehouseConfigure={() => { - setSubmitNextAction("warehouse-configure"); if (disabled || !onSubmit || !hasChanged) { - onSubmitReject("warehouse-configure"); + onSubmitSkip("warehouse-configure"); + } else { + setModalWithAction("warehouse-configure"); } }} /> @@ -233,10 +240,10 @@ const ProductVariantCreatePage: React.FC = ({ submit(); }} onRejectChanges={() => { - onSubmitReject("warehouse-configure"); + onSubmitSkip("warehouse-configure"); }} - onClose={() => setSubmitNextAction(null)} - open={submitNextAction === "warehouse-configure"} + onClose={() => setModalWithAction(null)} + open={modalWithAction === "warehouse-configure"} confirmButtonState={saveButtonBarState} /> diff --git a/src/products/components/ProductVariantPage/ProductVariantPage.tsx b/src/products/components/ProductVariantPage/ProductVariantPage.tsx index 84237a75e..111556daa 100644 --- a/src/products/components/ProductVariantPage/ProductVariantPage.tsx +++ b/src/products/components/ProductVariantPage/ProductVariantPage.tsx @@ -65,14 +65,15 @@ interface ProductVariantPageProps { placeholderImage?: string; header: string; warehouses: WarehouseFragment[]; - submitNextAction?: ProductVariantPageSubmitNextAction; onVariantReorder: ReorderAction; onAdd(); onBack(); onDelete(); - onSubmit(data: ProductVariantPageSubmitData); - onSubmitReject?(nextAction?: ProductVariantPageSubmitNextAction); - setSubmitNextAction?(nextAction: ProductVariantPageSubmitNextAction); + onSubmit( + data: ProductVariantPageSubmitData, + nextAction?: ProductVariantPageSubmitNextAction + ); + onSubmitSkip?(nextAction?: ProductVariantPageSubmitNextAction); onImageSelect(id: string); onVariantClick(variantId: string); onSetDefaultVariant(); @@ -93,13 +94,11 @@ const ProductVariantPage: React.FC = ({ onDelete, onImageSelect, onSubmit, - onSubmitReject, + onSubmitSkip, onVariantClick, onVariantReorder, onSetDefaultVariant, - onWarehouseConfigure, - submitNextAction, - setSubmitNextAction + onWarehouseConfigure }) => { const attributeInput = React.useMemo( () => getAttributeInputFromVariant(variant), @@ -149,6 +148,10 @@ const ProductVariantPage: React.FC = ({ weight: variant?.weight?.value.toString() || "" }; + const [modalWithAction, setModalWithAction] = React.useState< + ProductVariantPageSubmitNextAction + >(null); + const handleSubmit = (data: ProductVariantPageFormData) => { const dataStocks = stocks.map(stock => stock.id); const variantStocks = variant.stocks.map(stock => stock.warehouse.id); @@ -158,19 +161,23 @@ const ProductVariantPage: React.FC = ({ ? data.privateMetadata : undefined; - onSubmit({ - ...data, - addStocks: stocks.filter(stock => - stockDiff.added.some(addedStock => addedStock === stock.id) - ), - attributes, - metadata, - privateMetadata, - removeStocks: stockDiff.removed, - updateStocks: stocks.filter( - stock => !stockDiff.added.some(addedStock => addedStock === stock.id) - ) - }); + onSubmit( + { + ...data, + addStocks: stocks.filter(stock => + stockDiff.added.some(addedStock => addedStock === stock.id) + ), + attributes, + metadata, + privateMetadata, + removeStocks: stockDiff.removed, + updateStocks: stocks.filter( + stock => !stockDiff.added.some(addedStock => addedStock === stock.id) + ) + }, + modalWithAction + ); + setModalWithAction(null); }; return ( @@ -276,9 +283,10 @@ const ProductVariantPage: React.FC = ({ removeStock(id); }} onWarehouseConfigure={() => { - setSubmitNextAction("warehouse-configure"); if (!onSubmit || !hasChanged) { - onSubmitReject("warehouse-configure"); + onSubmitSkip("warehouse-configure"); + } else { + setModalWithAction("warehouse-configure"); } }} /> @@ -298,10 +306,10 @@ const ProductVariantPage: React.FC = ({ submit(); }} onRejectChanges={() => { - onSubmitReject("warehouse-configure"); + onSubmitSkip("warehouse-configure"); }} - onClose={() => setSubmitNextAction(null)} - open={submitNextAction === "warehouse-configure"} + onClose={() => setModalWithAction(null)} + open={modalWithAction === "warehouse-configure"} confirmButtonState={saveButtonBarState} /> diff --git a/src/products/views/ProductCreate.tsx b/src/products/views/ProductCreate.tsx index 28c618ee2..9bee2017e 100644 --- a/src/products/views/ProductCreate.tsx +++ b/src/products/views/ProductCreate.tsx @@ -97,7 +97,12 @@ export const ProductCreateView: React.FC = ({}) => { } }); - const handleCreate = async (formData: ProductCreatePageSubmitData) => { + const handleCreate = async ( + formData: ProductCreatePageSubmitData, + nextAction?: ProductCreatePageSubmitNextAction + ) => { + setSubmitNextAction(nextAction); + const result = await productCreate({ variables: { input: { @@ -198,15 +203,15 @@ export const ProductCreateView: React.FC = ({}) => { edge => edge.node )} onBack={handleBack} - onSubmit={async data => { - const errors = await handleSubmit(data); + onSubmit={async (data, nextAction) => { + const errors = await handleSubmit(data, nextAction); if (errors?.length === 0) { - handleSubmitNextAction(); + handleSubmitNextAction(nextAction); } else { setSubmitNextAction(null); } }} - onSubmitReject={handleSubmitNextAction} + onSubmitSkip={handleSubmitNextAction} saveButtonBarState={productCreateOpts.status} fetchMoreCategories={{ hasMore: searchCategoryOpts.data?.search.pageInfo.hasNextPage, @@ -223,8 +228,6 @@ export const ProductCreateView: React.FC = ({}) => { loading: searchProductTypesOpts.loading, onFetchMore: loadMoreProductTypes }} - submitNextAction={submitNextAction} - setSubmitNextAction={setSubmitNextAction} warehouses={ warehouses.data?.warehouses.edges.map(edge => edge.node) || [] } diff --git a/src/products/views/ProductUpdate/ProductUpdate.tsx b/src/products/views/ProductUpdate/ProductUpdate.tsx index 07d76ca3d..55b7971a4 100644 --- a/src/products/views/ProductUpdate/ProductUpdate.tsx +++ b/src/products/views/ProductUpdate/ProductUpdate.tsx @@ -318,15 +318,15 @@ export const ProductUpdate: React.FC = ({ id, params }) => { onBack={handleBack} onDelete={() => openModal("remove")} onImageReorder={handleImageReorder} - onSubmit={async data => { + onSubmit={async (data, nextAction) => { const errors = await handleSubmit(data); if (errors?.length === 0) { - handleSubmitNextAction(); + handleSubmitNextAction(nextAction); } else { setSubmitNextAction(null); } }} - onSubmitReject={handleSubmitNextAction} + onSubmitSkip={handleSubmitNextAction} onVariantAdd={handleVariantAdd} onVariantsAdd={() => navigate(productVariantCreatorUrl(id))} onVariantShow={variantId => () => @@ -365,8 +365,6 @@ export const ProductUpdate: React.FC = ({ id, params }) => { loading: searchCollectionsOpts.loading, onFetchMore: loadMoreCollections }} - submitNextAction={submitNextAction} - setSubmitNextAction={setSubmitNextAction} /> = ({ onBack={handleBack} onDelete={() => openModal("remove")} onImageSelect={handleImageSelect} - onSubmit={async data => { + onSubmit={async (data, nextAction) => { const errors = await handleSubmit(data); if (errors?.length === 0) { - handleSubmitNextAction(); + handleSubmitNextAction(nextAction); } else { setSubmitNextAction(null); } }} - onSubmitReject={handleSubmitNextAction} + onSubmitSkip={handleSubmitNextAction} onVariantClick={variantId => { navigate(productVariantEditUrl(productId, variantId)); }} onVariantReorder={handleVariantReorder} - submitNextAction={submitNextAction} - setSubmitNextAction={setSubmitNextAction} /> = ({ ); const handleBack = () => navigate(productUrl(productId)); - const handleCreate = async (formData: ProductVariantCreatePageSubmitData) => { + const handleCreate = async ( + formData: ProductVariantCreatePageSubmitData, + nextAction?: ProductVariantCreatePageSubmitNextAction + ) => { + setSubmitNextAction(nextAction); + const result = await variantCreate({ variables: { input: { @@ -160,15 +165,15 @@ export const ProductVariant: React.FC = ({ })} product={data?.product} onBack={handleBack} - onSubmit={async data => { - const errors = await handleSubmit(data); + onSubmit={async (data, nextAction) => { + const errors = await handleSubmit(data, nextAction); if (errors?.length === 0) { - handleSubmitNextAction(); + handleSubmitNextAction(nextAction); } else { setSubmitNextAction(null); } }} - onSubmitReject={handleSubmitNextAction} + onSubmitSkip={handleSubmitNextAction} onVariantClick={handleVariantClick} onVariantReorder={handleVariantReorder} saveButtonBarState={variantCreateResult.status} @@ -176,8 +181,6 @@ export const ProductVariant: React.FC = ({ warehouses.data?.warehouses.edges.map(edge => edge.node) || [] } weightUnit={shop?.defaultWeightUnit} - submitNextAction={submitNextAction} - setSubmitNextAction={setSubmitNextAction} /> ); diff --git a/src/utils/handlers/metadataCreateHandler.ts b/src/utils/handlers/metadataCreateHandler.ts index e24491b80..73bb5a619 100644 --- a/src/utils/handlers/metadataCreateHandler.ts +++ b/src/utils/handlers/metadataCreateHandler.ts @@ -10,16 +10,19 @@ import { UpdatePrivateMetadataVariables } from "../metadata/types/UpdatePrivateMetadata"; -function createMetadataCreateHandler( - create: (data: T) => Promise, +function createMetadataCreateHandler< + T extends MetadataFormData, + N extends string +>( + create: (data: T, nextAction?: N) => Promise, setMetadata: MutationFunction, setPrivateMetadata: MutationFunction< UpdatePrivateMetadata, UpdatePrivateMetadataVariables > ) { - return async (data: T) => { - const id = await create(data); + return async (data: T, nextAction?: N) => { + const id = await create(data, nextAction); if (id === null) { return null;