diff --git a/src/pages/category/List.tsx b/src/pages/category/List.tsx index deed16d..f359253 100644 --- a/src/pages/category/List.tsx +++ b/src/pages/category/List.tsx @@ -14,12 +14,15 @@ import { extractErrorMessage } from '@/helpers/utils' const CategoryList: FC = () => { const navigate = useNavigate(); - const { data, isLoading } = useGetCategories(); + const { data, isLoading, refetch } = useGetCategories(); const deleteCategoryMutation = useDeleteCategory(); const [expandedCategories, setExpandedCategories] = useState>(new Set()); const handleDeleteCategory = async (categoryId: string) => { await deleteCategoryMutation.mutateAsync(categoryId, { + onSuccess: () => { + refetch(); + }, onError: (error) => { toast.error(extractErrorMessage(error)); } diff --git a/src/pages/category/hooks/useVariantLogic.tsx b/src/pages/category/hooks/useVariantLogic.tsx index b8aa058..decba02 100644 --- a/src/pages/category/hooks/useVariantLogic.tsx +++ b/src/pages/category/hooks/useVariantLogic.tsx @@ -106,12 +106,14 @@ export const useVariantLogic = ({ id }: UseVariantLogicProps) => { const mutation = hasExistingVariants ? updateVariantMutation : createVariantMutation mutation.mutate(variantData, { + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['category', 'variants', id] }) + resetModal() + }, onError: (error) => { toast.error(extractErrorMessage(error)) } }) - resetModal() - queryClient.invalidateQueries({ queryKey: ['category', 'variants', id] }) } const deleteVariant = async (variantType: 'sizes' | 'colors' | 'meterages', index: number) => { @@ -140,8 +142,14 @@ export const useVariantLogic = ({ id }: UseVariantLogicProps) => { return } - await updateVariantMutation.mutateAsync({ ...variantData, theme: theme! }) - queryClient.invalidateQueries({ queryKey: ['category', 'variants', id] }) + await updateVariantMutation.mutateAsync({ ...variantData, theme: theme! }, { + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['category', 'variants', id] }) + }, + onError: (error) => { + toast.error(extractErrorMessage(error)) + } + }) } return { diff --git a/src/pages/products/ProductVariant.tsx b/src/pages/products/ProductVariant.tsx index 96dc5ab..7b871dd 100644 --- a/src/pages/products/ProductVariant.tsx +++ b/src/pages/products/ProductVariant.tsx @@ -29,8 +29,8 @@ const ProductVariant: FC = () => { const getVariantValue = (variant: ProductVariantDetailType) => { switch (categoryTheme) { case 'Size': return variant.size?.value || '-' - case 'Color': return 'رنگ' // TODO: باید نام رنگ را نمایش دهیم - case 'Meterage': return '-' // TODO: باید فیلد meterage اضافه شود + case 'Color': return variant.color?.name || '-' + case 'Meterage': return variant.meterage?.value || '-' default: return '-' } } diff --git a/src/pages/products/components/CreateVariant.tsx b/src/pages/products/components/CreateVariant.tsx index 1902edf..5046982 100644 --- a/src/pages/products/components/CreateVariant.tsx +++ b/src/pages/products/components/CreateVariant.tsx @@ -4,7 +4,7 @@ import Input from '@/components/Input' import Select from '@/components/Select' import { useState, type FC } from 'react' import { useParams } from 'react-router-dom' -import { useCreateProductVariant, useGetProductById } from '../hooks/useProductData' +import { useCreateProductVariant, useGetProductById, useGetProductVariants } from '../hooks/useProductData' import { useGetCategoryVariants } from '@/pages/category' import type { CreateProductVariantRequestType } from '../types/Types' import { useGetWarranties } from '@/pages/warranty/hooks/useWarrantyData' @@ -13,6 +13,7 @@ import { extractErrorMessage } from '@/helpers/utils' import { Formik, Form, Field, ErrorMessage } from 'formik' import type { FieldInputProps } from 'formik' import * as Yup from 'yup' +import { useQueryClient } from '@tanstack/react-query' interface FormikFieldProps { field: FieldInputProps @@ -21,9 +22,11 @@ interface FormikFieldProps { const CreateVariant: FC = () => { const { id } = useParams() + const queryClient = useQueryClient() const { data: productData } = useGetProductById(id!) const { data: categoryData } = useGetCategoryVariants(productData?.results?.product?.category?._id ?? '') + const { data: variantsData, refetch: refetchVariants } = useGetProductVariants(id!) const createProductVariant = useCreateProductVariant() const { data: warrantiesData } = useGetWarranties() @@ -31,9 +34,14 @@ const CreateVariant: FC = () => { const categoryTheme = productData?.results?.product?.category?.theme const categoryVariants = categoryData?.results?.data?.category?.categoryVariants + const isNoVariantTheme = categoryTheme === 'noColor_noSize' + const existingVariantsCount = variantsData?.results?.count || 0 + const canCreateVariant = !isNoVariantTheme || existingVariantsCount === 0 const validationSchema = Yup.object().shape({ - variantId: Yup.string().required('انتخاب تنوع الزامی است'), + variantId: isNoVariantTheme + ? Yup.string().optional() + : Yup.string().required('انتخاب تنوع الزامی است'), warrantyId: Yup.string().required('انتخاب گارانتی الزامی است'), order_limit: Yup.number().required('محدودیت سفارش الزامی است').min(1, 'حداقل ۱ عدد'), sellerSpecialCode: Yup.string().required('کد ویژه فروشنده الزامی است'), @@ -116,7 +124,10 @@ const CreateVariant: FC = () => { // اضافه کردن variant بر اساس theme let variantData: CreateProductVariantRequestType - if (categoryTheme === 'Size') { + if (isNoVariantTheme) { + // در حالت noColor_noSize هیچ variantId ارسال نمی‌شود + variantData = baseData + } else if (categoryTheme === 'Size') { variantData = { ...baseData, sizeId: parseInt(values.variantId) } } else if (categoryTheme === 'Color') { // برای رنگ‌ها از index به عنوان ID استفاده می‌کنیم @@ -131,6 +142,10 @@ const CreateVariant: FC = () => { onSuccess: () => { setShowModal(false) toast.success('تنوع جدید با موفقیت ایجاد شد') + // Refetch لیست تنوع‌ها + refetchVariants() + // یا می‌توانید از invalidateQueries استفاده کنید + queryClient.invalidateQueries({ queryKey: ['product-variants', id] }) }, onError: (error) => { toast.error(extractErrorMessage(error)) @@ -140,7 +155,19 @@ const CreateVariant: FC = () => { return (
-