import NotFoundPage from "@saleor/components/NotFoundPage"; import { WindowTitle } from "@saleor/components/WindowTitle"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; import useShop from "@saleor/hooks/useShop"; import { commonMessages } from "@saleor/intl"; import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler"; import { useMetadataUpdate, usePrivateMetadataUpdate } from "@saleor/utils/metadata/updateMetadata"; import { useWarehouseList } from "@saleor/warehouses/queries"; import { warehouseListPath } from "@saleor/warehouses/urls"; import React from "react"; import { useIntl } from "react-intl"; import { decimal, weight } from "../../misc"; import ProductVariantCreatePage, { ProductVariantCreatePageSubmitData, ProductVariantCreatePageSubmitNextAction } from "../components/ProductVariantCreatePage"; import { useProductVariantReorderMutation, useVariantCreateMutation } from "../mutations"; import { useProductVariantCreateQuery } from "../queries"; import { productListUrl, productUrl, ProductVariantAddUrlQueryParams, productVariantEditUrl } from "../urls"; import { createVariantReorderHandler } from "./ProductUpdate/handlers"; interface ProductVariantCreateProps { productId: string; params: ProductVariantAddUrlQueryParams; } export const ProductVariant: React.FC = ({ productId }) => { const navigate = useNavigator(); const notify = useNotifier(); const shop = useShop(); const intl = useIntl(); const warehouses = useWarehouseList({ displayLoader: true, variables: { first: 50 } }); const { data, loading: productLoading } = useProductVariantCreateQuery({ displayLoader: true, variables: { id: productId } }); const [variantCreate, variantCreateResult] = useVariantCreateMutation({ onCompleted: data => { if (data.productVariantCreate.errors.length === 0 && !submitNextAction) { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges) }); navigate( productVariantEditUrl( productId, data.productVariantCreate.productVariant.id ) ); } } }); const [updateMetadata] = useMetadataUpdate({}); const [updatePrivateMetadata] = usePrivateMetadataUpdate({}); const product = data?.product; if (product === null) { return navigate(productListUrl())} />; } const [ reorderProductVariants, reorderProductVariantsOpts ] = useProductVariantReorderMutation({}); const handleVariantReorder = createVariantReorderHandler(product, variables => reorderProductVariants({ variables }) ); const handleBack = () => navigate(productUrl(productId)); const handleCreate = async ( formData: ProductVariantCreatePageSubmitData, nextAction?: ProductVariantCreatePageSubmitNextAction ) => { setSubmitNextAction(nextAction); const result = await variantCreate({ variables: { input: { attributes: formData.attributes .filter(attribute => attribute.value !== "") .map(attribute => ({ id: attribute.id, values: [attribute.value] })), costPrice: decimal(formData.costPrice), price: decimal(formData.price), product: productId, sku: formData.sku, stocks: formData.stocks.map(stock => ({ quantity: parseInt(stock.value, 0), warehouse: stock.id })), trackInventory: true, weight: weight(formData.weight) } } }); return result.data.productVariantCreate?.productVariant?.id || null; }; const handleSubmit = createMetadataCreateHandler( handleCreate, updateMetadata, updatePrivateMetadata ); const handleVariantClick = (id: string) => navigate(productVariantEditUrl(productId, id)); const [submitNextAction, setSubmitNextAction] = React.useState< ProductVariantCreatePageSubmitNextAction >(null); const handleSubmitNextAction = ( nextAction?: ProductVariantCreatePageSubmitNextAction ) => { const action = nextAction || submitNextAction; if (action === "warehouse-configure") { navigate(warehouseListPath); } }; const disableForm = productLoading || variantCreateResult.loading || reorderProductVariantsOpts.loading; return ( <> { const errors = await handleSubmit(data, nextAction); if (errors?.length === 0) { handleSubmitNextAction(nextAction); } else { setSubmitNextAction(null); } }} onSubmitSkip={handleSubmitNextAction} onVariantClick={handleVariantClick} onVariantReorder={handleVariantReorder} saveButtonBarState={variantCreateResult.status} warehouses={ warehouses.data?.warehouses.edges.map(edge => edge.node) || [] } weightUnit={shop?.defaultWeightUnit} /> ); }; export default ProductVariant;