diff --git a/src/pages/customers/components/TransactionsTable.tsx b/src/pages/customers/components/TransactionsTable.tsx index 3d5b6c8..e7a2a3e 100644 --- a/src/pages/customers/components/TransactionsTable.tsx +++ b/src/pages/customers/components/TransactionsTable.tsx @@ -90,7 +90,7 @@ const TransactionsTable: FC = () => { id: 1, number: 1, transactionType: 'پرداخت اینترنتی', - amount: '۴,۰۰۰,۰۰۰ ریال', + amount: '۴,۰۰۰,۰۰۰ تومان', paymentDate: '۱۳۶۹/۰۵/۱۱', status: 'successful', }, @@ -98,7 +98,7 @@ const TransactionsTable: FC = () => { id: 2, number: 1, transactionType: 'پرداخت اینترنتی', - amount: '۴,۰۰۰,۰۰۰ ریال', + amount: '۴,۰۰۰,۰۰۰ تومان', paymentDate: '۱۳۶۹/۰۵/۱۱', status: 'unsuccessful', }, @@ -106,7 +106,7 @@ const TransactionsTable: FC = () => { id: 3, number: 1, transactionType: 'پرداخت اینترنتی', - amount: '۴,۰۰۰,۰۰۰ ریال', + amount: '۴,۰۰۰,۰۰۰ تومان', paymentDate: '۱۳۶۹/۰۵/۱۱', status: 'unknown', }, diff --git a/src/pages/food/Create.tsx b/src/pages/food/Create.tsx index 33dce04..1007347 100644 --- a/src/pages/food/Create.tsx +++ b/src/pages/food/Create.tsx @@ -2,6 +2,7 @@ import { type FC, useState } from 'react' import { useFormik } from 'formik' import * as Yup from 'yup' import { TickCircle } from 'iconsax-react' +import { toast } from 'react-toastify' import Input from '@/components/Input' import Select from '@/components/Select' import Textarea from '@/components/Textarea' @@ -9,7 +10,10 @@ import Button from '@/components/Button' import { Checkbox } from '@/components/ui/checkbox' import CreateFoodSidebar from './components/CreateFoodSidebar' import type { CreateFoodType } from './types/Types' -import { useGetCategories } from './hooks/useFoodData' +import { useCreateFood, useGetCategories } from './hooks/useFoodData' +import { useMultipleUpload } from '../uploader/hooks/useUploaderData' +import { Pages } from '@/config/Pages' +import type { ErrorType } from '@/helpers/types' @@ -19,8 +23,9 @@ const CreateFood: FC = () => { const [isActive, setIsActive] = useState(true) const [isSpecial, setIsSpecial] = useState(false) const [imageFiles, setImageFiles] = useState([]) + const { mutate: createFood } = useCreateFood() + const { mutate: multipleUpload } = useMultipleUpload() - // تبدیل داده‌های دسته‌ها به فرمت مورد نیاز Select const categories = data?.data?.map(category => ({ label: category.title, value: category.id @@ -29,7 +34,8 @@ const CreateFood: FC = () => { const formik = useFormik({ initialValues: { title: '', - content: '', + desc: '', + content: [], categoryIds: [], price: 0, discount: 0, @@ -37,7 +43,6 @@ const CreateFood: FC = () => { prepareTime: 0, stock: 0, stockDefault: 0, - rate: 0, breakfast: false, noon: false, dinner: false, @@ -48,7 +53,6 @@ const CreateFood: FC = () => { fri: false, sat: false, sun: false, - isPickup: false, pickupServe: false, inPlaceServe: false, isActive: true, @@ -56,6 +60,7 @@ const CreateFood: FC = () => { }, validationSchema: Yup.object().shape({ title: Yup.string().required('نام غذا الزامی است'), + desc: Yup.string().required('توضیحات غذا الزامی است'), categoryIds: Yup.array().min(1, 'حداقل یک دسته‌بندی الزامی است'), price: Yup.number().required('قیمت الزامی است').min(0, 'قیمت باید مثبت باشد'), prepareTime: Yup.number().required('زمان آماده‌سازی الزامی است').min(0, 'زمان آماده‌سازی باید مثبت باشد'), @@ -63,22 +68,47 @@ const CreateFood: FC = () => { stockDefault: Yup.number().required('موجودی پیش‌فرض الزامی است').min(0, 'موجودی پیش‌فرض باید مثبت باشد'), points: Yup.number().min(0, 'امتیاز باید مثبت باشد'), discount: Yup.number().min(0, 'تخفیف باید مثبت باشد'), - rate: Yup.number().min(0, 'امتیاز باید مثبت باشد').max(5, 'امتیاز نمی‌تواند بیشتر از ۵ باشد') + content: Yup.array().of(Yup.string()) }), - onSubmit: async (values) => { - const imageUrls = imageFiles.map(file => URL.createObjectURL(file)) - console.log('Form values:', { - ...values, - isActive, - images: imageUrls - }) + onSubmit: (values) => { + const submitFood = (imageUrls: string[] = []) => { + const foodData: CreateFoodType = { + ...values, + isActive, + images: imageUrls + } + + createFood(foodData, { + onSuccess: () => { + toast.success('غذا با موفقیت ایجاد شد') + window.location.href = Pages.foods.list + }, + onError: (error: ErrorType) => { + toast.error(error?.response?.data?.error?.message[0] || 'خطا در ایجاد غذا') + } + }) + } + + if (imageFiles.length > 0) { + multipleUpload(imageFiles, { + onSuccess: (response) => { + const imageUrls = response?.data?.map(item => item.url) || [] + submitFood(imageUrls) + }, + onError: (error: ErrorType) => { + toast.error(error?.response?.data?.error?.message[0] || 'خطا در آپلود تصاویر') + } + }) + } else { + submitFood() + } } }) return (
-
+
غذای جدید
@@ -125,7 +155,7 @@ const CreateFood: FC = () => { { {
- formik.setFieldValue('rate', Number(e.target.value))} - error_text={formik.touched.rate && formik.errors.rate ? formik.errors.rate : ''} + value={formik.values.desc} + onChange={formik.handleChange} + error_text={formik.touched.desc && formik.errors.desc ? formik.errors.desc : ''} />
-