diff --git a/src/pages/food/Create.tsx b/src/pages/food/Create.tsx index 33ee1a8..cf26972 100644 --- a/src/pages/food/Create.tsx +++ b/src/pages/food/Create.tsx @@ -9,6 +9,8 @@ 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' @@ -40,22 +42,13 @@ const CreateFood: FC = () => { price: 0, discount: 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, + weekDays: [0, 1, 2, 3, 4, 5, 6], + mealTypes: ['breakfast', 'lunch', 'dinner'], + pickupServe: true, + inPlaceServe: true, isActive: true, - images: [] + images: [], + isSpecialOffer: false }, validationSchema: Yup.object().shape({ title: Yup.string().required('نام غذا الزامی است'), @@ -63,16 +56,17 @@ const CreateFood: FC = () => { 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, 'موجودی پیش‌فرض باید مثبت باشد'), discount: Yup.number().min(0, 'تخفیف باید مثبت باشد'), - content: Yup.array().of(Yup.string()) + 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) } @@ -183,26 +177,6 @@ const CreateFood: FC = () => { onChange={(e) => 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 : ''} - />
@@ -254,87 +228,8 @@ const CreateFood: FC = () => {
-
-
وعده‌های غذایی
-
-
- formik.setFieldValue('breakfast', checked)} - /> - -
-
- formik.setFieldValue('noon', checked)} - /> - -
-
- formik.setFieldValue('dinner', checked)} - /> - -
-
-
- -
-
روزهای هفته
-
-
- formik.setFieldValue('sat', checked)} - /> - -
-
- formik.setFieldValue('sun', checked)} - /> - -
-
- formik.setFieldValue('mon', checked)} - /> - -
-
- formik.setFieldValue('tue', checked)} - /> - -
-
- formik.setFieldValue('wed', checked)} - /> - -
-
- formik.setFieldValue('thu', checked)} - /> - -
-
- formik.setFieldValue('fri', checked)} - /> - -
-
-
+ +
گزینه‌های سرویس
diff --git a/src/pages/food/Update.tsx b/src/pages/food/Update.tsx index fe30fab..6c04567 100644 --- a/src/pages/food/Update.tsx +++ b/src/pages/food/Update.tsx @@ -45,22 +45,13 @@ const UpdateFood: FC = () => { price: 0, discount: 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, + weekDays: [], + mealTypes: [], pickupServe: false, inPlaceServe: false, isActive: true, - images: [] + images: [], + isSpecialOffer: false }, validationSchema: Yup.object().shape({ title: Yup.string().required('نام غذا الزامی است'), @@ -68,10 +59,10 @@ const UpdateFood: FC = () => { 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, 'موجودی پیش‌فرض باید مثبت باشد'), discount: Yup.number().min(0, 'تخفیف باید مثبت باشد'), - content: Yup.array().of(Yup.string()) + content: Yup.array().of(Yup.string()), + weekDays: Yup.array().of(Yup.number()), + mealTypes: Yup.array().of(Yup.string()) }), onSubmit: (values) => { if (!id) { @@ -84,6 +75,7 @@ const UpdateFood: FC = () => { const foodData: CreateFoodType = { ...values, isActive, + isSpecialOffer: isSpecial, images: allImages, content: values.content.filter(item => item && item.trim().length > 0) } @@ -125,24 +117,16 @@ const UpdateFood: FC = () => { price: food.price || 0, discount: food.discount || 0, prepareTime: food.prepareTime || 0, - stock: food.stock || 0, - stockDefault: food.stockDefault || 0, - breakfast: food.breakfast || false, - noon: food.noon || false, - dinner: food.dinner || false, - mon: food.mon || false, - tue: false, - wed: false, - thu: false, - fri: false, - sat: food.sat || false, - sun: food.sun || false, + weekDays: food.weekDays || [], + mealTypes: food.mealTypes || [], pickupServe: food.pickupServe || false, inPlaceServe: food.inPlaceServe || false, isActive: food.isActive || false, - images: food.images || [] + images: food.images || [], + isSpecialOffer: food.isSpecialOffer || false }) setIsActive(food.isActive || false) + setIsSpecial(food.isSpecialOffer || false) setExistingImages(food.images || []) } // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/src/pages/food/components/BasicInfoSection.tsx b/src/pages/food/components/BasicInfoSection.tsx index a85a886..a5d38e7 100644 --- a/src/pages/food/components/BasicInfoSection.tsx +++ b/src/pages/food/components/BasicInfoSection.tsx @@ -62,7 +62,7 @@ const BasicInfoSection: FC = ({ formik, categories }) =>
-
+
= ({ formik, categories }) => onChange={(e) => 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 : ''} - />
diff --git a/src/pages/food/components/MealTimesSection.tsx b/src/pages/food/components/MealTimesSection.tsx index 4e3ab9f..166946b 100644 --- a/src/pages/food/components/MealTimesSection.tsx +++ b/src/pages/food/components/MealTimesSection.tsx @@ -8,31 +8,36 @@ type MealTimesSectionProps = { } const MealTimesSection: FC = ({ formik }) => { + const mealTypes = [ + { value: 'breakfast', label: 'صبحانه' }, + { value: 'lunch', label: 'ناهار' }, + { value: 'dinner', label: 'شام' } + ] as const + + const handleMealTypeChange = (mealType: string, checked: boolean) => { + const currentMealTypes = formik.values.mealTypes || [] + if (checked) { + if (!currentMealTypes.includes(mealType)) { + formik.setFieldValue('mealTypes', [...currentMealTypes, mealType]) + } + } else { + formik.setFieldValue('mealTypes', currentMealTypes.filter(m => m !== mealType)) + } + } + return (
وعده‌های غذایی
-
- formik.setFieldValue('breakfast', checked)} - /> - -
-
- formik.setFieldValue('noon', checked)} - /> - -
-
- formik.setFieldValue('dinner', checked)} - /> - -
+ {mealTypes.map((mealType) => ( +
+ handleMealTypeChange(mealType.value, checked as boolean)} + /> + +
+ ))}
) diff --git a/src/pages/food/components/WeekDaysSection.tsx b/src/pages/food/components/WeekDaysSection.tsx index 0459d40..5eb3b18 100644 --- a/src/pages/food/components/WeekDaysSection.tsx +++ b/src/pages/food/components/WeekDaysSection.tsx @@ -9,24 +9,35 @@ type WeekDaysSectionProps = { const WeekDaysSection: FC = ({ formik }) => { const weekDays = [ - { key: 'sat', label: 'شنبه' }, - { key: 'sun', label: 'یکشنبه' }, - { key: 'mon', label: 'دوشنبه' }, - { key: 'tue', label: 'سه‌شنبه' }, - { key: 'wed', label: 'چهارشنبه' }, - { key: 'thu', label: 'پنج‌شنبه' }, - { key: 'fri', label: 'جمعه' } + { value: 0, label: 'شنبه' }, + { value: 1, label: 'یکشنبه' }, + { value: 2, label: 'دوشنبه' }, + { value: 3, label: 'سه‌شنبه' }, + { value: 4, label: 'چهارشنبه' }, + { value: 5, label: 'پنج‌شنبه' }, + { value: 6, label: 'جمعه' } ] as const + const handleDayChange = (dayValue: number, checked: boolean) => { + const currentDays = formik.values.weekDays || [] + if (checked) { + if (!currentDays.includes(dayValue)) { + formik.setFieldValue('weekDays', [...currentDays, dayValue]) + } + } else { + formik.setFieldValue('weekDays', currentDays.filter(d => d !== dayValue)) + } + } + return (
روزهای هفته
{weekDays.map((day) => ( -
+
formik.setFieldValue(day.key, checked)} + checked={(formik.values.weekDays || []).includes(day.value)} + onCheckedChange={(checked) => handleDayChange(day.value, checked as boolean)} />
diff --git a/src/pages/food/types/Types.ts b/src/pages/food/types/Types.ts index 5cdaa38..1404261 100644 --- a/src/pages/food/types/Types.ts +++ b/src/pages/food/types/Types.ts @@ -1,29 +1,20 @@ import type { IResponse } from "@/types/response.types"; export type CreateFoodType = { - breakfast: boolean; - tue: boolean; - wed: boolean; - thu: boolean; - fri: boolean; + categoryId: string; title: string; desc: string; content: string[]; + weekDays: number[]; + mealTypes: string[]; price: number; prepareTime: number; - sat: boolean; - sun: boolean; - mon: boolean; - noon: boolean; - dinner: boolean; - stock: number; - stockDefault: number; isActive: boolean; images: string[]; inPlaceServe: boolean; pickupServe: boolean; discount: number; - categoryId: string; + isSpecialOffer: boolean; }; export type Category = { @@ -98,26 +89,22 @@ export type FoodDetails = { deletedAt: string | null; restaurant: string; category: FoodDetailsCategory; + inventory: number | null; title: string; desc: string | null; content: string[]; price: number; order: number | null; prepareTime: number; - sat: boolean; - sun: boolean; - mon: boolean; - breakfast: boolean; - noon: boolean; - dinner: boolean; - stock: number; - stockDefault: number; + weekDays: number[]; + mealTypes: string[]; isActive: boolean; images: string[]; inPlaceServe: boolean; pickupServe: boolean; - rate: number; + score: number | null; discount: number; + isSpecialOffer: boolean; }; export type GetCategoriesResponseType = IResponse;