diff --git a/src/pages/food/Create.tsx b/src/pages/food/Create.tsx index 5420dc2..d5d8031 100644 --- a/src/pages/food/Create.tsx +++ b/src/pages/food/Create.tsx @@ -1,310 +1,288 @@ -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 WeekDaysSection from './components/WeekDaysSection' -import MealTimesSection from './components/MealTimesSection' -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' - - +import Button from "@/components/Button"; +import Input from "@/components/Input"; +import Select from "@/components/Select"; +import Textarea from "@/components/Textarea"; +import { Checkbox } from "@/components/ui/checkbox"; +import type { ErrorType } from "@/helpers/types"; +import { useFormik } from "formik"; +import { TickCircle } from "iconsax-react"; +import { type FC, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { toast } from "react-toastify"; +import * as Yup from "yup"; +import { useMultipleUpload } from "../uploader/hooks/useUploaderData"; +import CreateFoodSidebar from "./components/CreateFoodSidebar"; +import MealTimesSection from "./components/MealTimesSection"; +import WeekDaysSection from "./components/WeekDaysSection"; +import { useCreateFood, useGetCategories } from "./hooks/useFoodData"; +import type { CreateFoodType } from "./types/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 navigate = useNavigate(); + const categories = + data?.data?.map((category) => ({ + label: category.title, + value: category.id, + })) || []; - 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 formik = useFormik({ + initialValues: { + title: "", + desc: "", + content: [], + categoryId: "", + price: 0, + discount: 0, + prepareTime: 0, + weekDays: [0, 1, 2, 3, 4, 5, 6], + mealTypes: ["breakfast", "lunch", "dinner"], + pickupServe: true, + inPlaceServe: true, + isActive: true, + images: [], + isSpecialOffer: false, + dailyStock: 0, + availableStock: 0, + order: 0, + }, + validationSchema: Yup.object().shape({ + title: Yup.string().required("نام غذا الزامی است"), + categoryId: Yup.string().required("دسته‌بندی الزامی است"), + price: Yup.number().required("قیمت الزامی است").min(0, "قیمت باید مثبت باشد"), + prepareTime: Yup.number().required("زمان آماده‌سازی الزامی است").min(0, "زمان آماده‌سازی باید مثبت باشد"), + discount: Yup.number().min(0, "تخفیف باید مثبت باشد"), + dailyStock: Yup.number().required("موجودی روزانه الزامی است").min(0, "موجودی روزانه باید مثبت باشد"), + availableStock: Yup.number().required("موجودی فعلی الزامی است").min(0, "موجودی فعلی باید مثبت باشد"), + content: Yup.array().of(Yup.string()), + weekDays: Yup.array().of(Yup.number()), + mealTypes: Yup.array().of(Yup.string()), + }), + onSubmit: (values) => { + const submitFood = (imageUrls: string[] = []) => { + const foodData: CreateFoodType = { + ...values, + isActive, + isSpecialOffer: isSpecial, + images: imageUrls, + content: values.content.filter((item) => item && item.trim().length > 0), + }; - const categories = data?.data?.map(category => ({ - label: category.title, - value: category.id - })) || [] + createFood(foodData, { + onSuccess: () => { + toast.success("غذا با موفقیت ایجاد شد"); + navigate(-1); + }, + onError: (error: ErrorType) => { + toast.error(error?.response?.data?.error?.message[0] || "خطا در ایجاد غذا"); + }, + }); + }; - const formik = useFormik({ - initialValues: { - title: '', - desc: '', - content: [], - categoryId: '', - price: 0, - discount: 0, - prepareTime: 0, - weekDays: [0, 1, 2, 3, 4, 5, 6], - mealTypes: ['breakfast', 'lunch', 'dinner'], - pickupServe: true, - inPlaceServe: true, - isActive: true, - images: [], - isSpecialOffer: false, - dailyStock: 0, - availableStock: 0, - order: 0 - }, - validationSchema: Yup.object().shape({ - title: Yup.string().required('نام غذا الزامی است'), - categoryId: Yup.string().required('دسته‌بندی الزامی است'), - price: Yup.number().required('قیمت الزامی است').min(0, 'قیمت باید مثبت باشد'), - prepareTime: Yup.number().required('زمان آماده‌سازی الزامی است').min(0, 'زمان آماده‌سازی باید مثبت باشد'), - discount: Yup.number().min(0, 'تخفیف باید مثبت باشد'), - dailyStock: Yup.number().required('موجودی روزانه الزامی است').min(0, 'موجودی روزانه باید مثبت باشد'), - availableStock: Yup.number() - .required('موجودی فعلی الزامی است') - .min(0, 'موجودی فعلی باید مثبت باشد'), - content: Yup.array().of(Yup.string()), - weekDays: Yup.array().of(Yup.number()), - mealTypes: Yup.array().of(Yup.string()) - }), - onSubmit: (values) => { - const submitFood = (imageUrls: string[] = []) => { - const foodData: CreateFoodType = { - ...values, - isActive, - isSpecialOffer: isSpecial, - images: imageUrls, - content: values.content.filter(item => item && item.trim().length > 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(); + } + }, + }); - 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('prepareTime', Number(e.target.value))} - error_text={formik.touched.prepareTime && formik.errors.prepareTime ? formik.errors.prepareTime : ''} - /> - - formik.setFieldValue('dailyStock', Number(e.target.value))} - error_text={formik.touched.dailyStock && formik.errors.dailyStock ? formik.errors.dailyStock : ''} - /> - - formik.setFieldValue('availableStock', Number(e.target.value))} - error_text={formik.touched.availableStock && formik.errors.availableStock ? formik.errors.availableStock : ''} - /> -
- -
-