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' import Button from '@/components/Button' import { Checkbox } from '@/components/ui/checkbox' import CreateFoodSidebar from './components/CreateFoodSidebar' import type { CreateFoodType } from './types/Types' import { useCreateFood, useGetCategories } from './hooks/useFoodData' import { useMultipleUpload } from '../uploader/hooks/useUploaderData' import { Pages } from '@/config/Pages' import type { ErrorType } from '@/helpers/types' const CreateFood: FC = () => { const { data } = useGetCategories(); const [isActive, setIsActive] = useState(true) const [isSpecial, setIsSpecial] = useState(false) const [imageFiles, setImageFiles] = useState([]) const { mutate: createFood, isPending } = useCreateFood() const { mutate: multipleUpload, isPending: isUploading } = useMultipleUpload() const categories = data?.data?.map(category => ({ label: category.title, value: category.id })) || [] const formik = useFormik({ initialValues: { title: '', desc: '', content: [], categoryId: '', price: 0, discount: 0, points: 0, prepareTime: 0, stock: 0, stockDefault: 0, breakfast: false, noon: false, dinner: false, mon: false, tue: false, wed: false, thu: false, fri: false, sat: false, sun: false, pickupServe: false, inPlaceServe: false, isActive: true, images: [] }, validationSchema: Yup.object().shape({ title: Yup.string().required('نام غذا الزامی است'), desc: Yup.string().required('توضیحات غذا الزامی است'), categoryId: Yup.string().required('دسته‌بندی الزامی است'), price: Yup.number().required('قیمت الزامی است').min(0, 'قیمت باید مثبت باشد'), prepareTime: Yup.number().required('زمان آماده‌سازی الزامی است').min(0, 'زمان آماده‌سازی باید مثبت باشد'), stock: Yup.number().required('موجودی الزامی است').min(0, 'موجودی باید مثبت باشد'), stockDefault: Yup.number().required('موجودی پیش‌فرض الزامی است').min(0, 'موجودی پیش‌فرض باید مثبت باشد'), points: Yup.number().min(0, 'امتیاز باید مثبت باشد'), discount: Yup.number().min(0, 'تخفیف باید مثبت باشد'), content: Yup.array().of(Yup.string()) }), onSubmit: (values) => { const submitFood = (imageUrls: string[] = []) => { const foodData: CreateFoodType = { ...values, isActive, images: imageUrls, content: values.content.filter(item => item && item.trim().length > 0) } 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 (
غذای جدید
formik.setFieldValue('price', Number(e.target.value))} error_text={formik.touched.price && formik.errors.price ? formik.errors.price : ''} /> formik.setFieldValue('discount', Number(e.target.value))} error_text={formik.touched.discount && formik.errors.discount ? formik.errors.discount : ''} /> formik.setFieldValue('points', Number(e.target.value))} error_text={formik.touched.points && formik.errors.points ? formik.errors.points : ''} />
formik.setFieldValue('prepareTime', Number(e.target.value))} error_text={formik.touched.prepareTime && formik.errors.prepareTime ? formik.errors.prepareTime : ''} /> formik.setFieldValue('stock', Number(e.target.value))} error_text={formik.touched.stock && formik.errors.stock ? formik.errors.stock : ''} /> formik.setFieldValue('stockDefault', Number(e.target.value))} error_text={formik.touched.stockDefault && formik.errors.stockDefault ? formik.errors.stockDefault : ''} />