update price bug fixed
deploy to danak / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-07-09 15:45:03 +03:30
parent b37de9ee46
commit 3658e6ffc0
3 changed files with 74 additions and 31 deletions
+4 -11
View File
@@ -12,6 +12,7 @@ import CreateProductSidebar from "./components/CreateProductSidebar";
import { PaymentType, PricingType, PurchaseUnit } from "./enum/Enum";
import { useCreateProduct, useGetCategories } from "./hooks/useProductData";
import type { CreateProductType } from "./types/Types";
import { buildProductPayload } from "./utils/productPayload";
const CreateProduct: FC = () => {
const navigate = useNavigate();
@@ -73,20 +74,12 @@ const CreateProduct: FC = () => {
}),
onSubmit: (values) => {
const submitProduct = (imageUrls: string[] = []) => {
const variants = values.variants.length > 0 ? values.variants : [{ value: "", price: values.price, ...(values.stock !== undefined && values.stock !== null && { stock: values.stock }) }];
const productData: CreateProductType = {
...values,
variants,
const productData = buildProductPayload({
values,
isActive,
isSpecialOffer: isSpecial,
images: imageUrls,
needAdminAcceptance: values.paymentType === PaymentType.AFTER_PREPARATION,
...(values.pricingType === PricingType.FIXED && {
purchaseUnit: values.purchaseUnit ?? PurchaseUnit.NUMBER,
minPurchaseQuantity: values.minPurchaseQuantity ?? 1,
purchasePitch: undefined,
}),
};
});
createProduct(productData, {
onSuccess: () => {
+6 -20
View File
@@ -14,6 +14,7 @@ import CreateProductSidebar from "./components/CreateProductSidebar";
import { PaymentType, PricingType, PurchaseUnit } from "./enum/Enum";
import { useGetCategories, useGetProductDetails, useUpdateProduct } from "./hooks/useProductData";
import type { CreateProductType } from "./types/Types";
import { buildProductPayload } from "./utils/productPayload";
const UpdateProduct: FC = () => {
const { id } = useParams<{ id: string }>();
@@ -30,6 +31,7 @@ const UpdateProduct: FC = () => {
const categories = categoriesData?.data ?? [];
const product = productData?.data;
const isSubmitting = isPending || isUploading;
const formik = useFormik<CreateProductType>({
initialValues: {
@@ -86,28 +88,12 @@ const UpdateProduct: FC = () => {
const submitProduct = (newImageUrls: string[] = []) => {
const allImages = [...values.images, ...newImageUrls];
const variants =
values.variants.length > 0
? values.variants.map((v) => ({
...(v.id && { id: v.id }),
value: v.value ?? "",
price: v.price ?? 0,
...(v.stock !== undefined && v.stock !== null && { stock: v.stock }),
}))
: [{ value: "", price: values.price, ...(values.stock !== undefined && values.stock !== null && { stock: values.stock }) }];
const productData: CreateProductType = {
...values,
variants,
const productData = buildProductPayload({
values,
isActive,
isSpecialOffer: isSpecial,
images: allImages,
needAdminAcceptance: values.paymentType === PaymentType.AFTER_PREPARATION,
...(values.pricingType === PricingType.FIXED && {
purchaseUnit: values.purchaseUnit ?? PurchaseUnit.NUMBER,
minPurchaseQuantity: values.minPurchaseQuantity ?? 1,
purchasePitch: undefined,
}),
};
});
updateProduct(
{ id, params: productData },
@@ -199,7 +185,7 @@ const UpdateProduct: FC = () => {
<div className="flex flex-col sm:flex-row w-full justify-between items-start sm:items-center gap-4">
<div className="text-lg font-light">ویرایش کالا</div>
<div>
<Button className="px-5 w-full sm:w-auto" onClick={() => formik.handleSubmit()} isloading={isPending || isUploading}>
<Button className="px-5 w-full sm:w-auto" onClick={() => formik.handleSubmit()} isloading={isSubmitting}>
<div className="flex gap-2 items-center">
<TickCircle className="size-5" color="white" />
<div>ذخیره تغییرات</div>
+64
View File
@@ -0,0 +1,64 @@
import { PaymentType, PricingType, PurchaseUnit } from "../enum/Enum";
import type { CreateProductType, ProductVariant } from "../types/Types";
const hasMeaningfulVariants = (variants: ProductVariant[]): boolean => {
if (variants.length > 1) return true;
if (variants.length === 0) return false;
return (variants[0].value ?? "").trim() !== "";
};
const mapVariant = (variant: ProductVariant): ProductVariant => ({
...(variant.id && { id: variant.id }),
value: variant.value ?? "",
price: variant.price ?? 0,
...(variant.stock !== undefined && variant.stock !== null && { stock: variant.stock }),
});
const createSingleVariant = (values: CreateProductType): ProductVariant => {
const firstVariant = values.variants[0];
return {
...(firstVariant?.id && { id: firstVariant.id }),
value: "",
price: values.price ?? 0,
...(values.stock !== undefined && values.stock !== null
? { stock: values.stock }
: firstVariant?.stock !== undefined && firstVariant?.stock !== null
? { stock: firstVariant.stock }
: {}),
};
};
const getVariantsForPayload = (values: CreateProductType): ProductVariant[] => {
if (hasMeaningfulVariants(values.variants)) {
return values.variants.map(mapVariant);
}
return [createSingleVariant(values)];
};
type BuildProductPayloadParams = {
values: CreateProductType;
isActive: boolean;
isSpecialOffer: boolean;
images: string[];
};
export const buildProductPayload = ({
values,
isActive,
isSpecialOffer,
images,
}: BuildProductPayloadParams): CreateProductType => {
return {
...values,
variants: getVariantsForPayload(values),
isActive,
isSpecialOffer,
images,
needAdminAcceptance: values.paymentType === PaymentType.AFTER_PREPARATION,
...(values.pricingType === PricingType.FIXED && {
purchaseUnit: values.purchaseUnit ?? PurchaseUnit.NUMBER,
minPurchaseQuantity: values.minPurchaseQuantity ?? 1,
purchasePitch: undefined,
}),
};
};