import React, { useState, useEffect } from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, TextField, Typography, Box, Button, IconButton, InputAdornment, } from '@mui/material'; import AddAPhotoOutlinedIcon from '@mui/icons-material/AddAPhotoOutlined'; import DeleteIcon from '@mui/icons-material/Delete'; import authService from '../../../../services/authService'; import AddIcon from '@mui/icons-material/Add'; const MAX_FILE_SIZE_MB = 2; const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/jpg']; const AddMeal = ({ open, onClose, onAdd, selectedCategory, restaurantId }) => { const [mealName, setMealName] = useState(''); const [description, setDescription] = useState(''); const [additions, setAdditions] = useState(['']); const [price, setPrice] = useState(''); const [mealImage, setMealImage] = useState(null); const [errors, setErrors] = useState({}); const [isSubmitting, setIsSubmitting] = useState(false); useEffect(() => { if (!open) { setMealName(''); setDescription(''); setAdditions(['']); setPrice(''); setMealImage(null); setErrors({}); } }, [open]); const handleImageUpload = (e) => { const file = e.target.files[0]; if (!file) return; if (!ALLOWED_TYPES.includes(file.type)) { setErrors(prev => ({ ...prev, image: 'Allowed types: jpg, jpeg, png' })); return; } if (file.size > MAX_FILE_SIZE_MB * 1024 * 1024) { setErrors(prev => ({ ...prev, image: `Image must be smaller than ${MAX_FILE_SIZE_MB} MB` })); return; } setMealImage(file); setErrors(prev => ({ ...prev, image: '' })); }; const handleAddAddition = () => setAdditions([...additions, '']); const handleRemoveAddition = (index) => setAdditions(additions.filter((_, i) => i !== index)); const handleChangeAddition = (index, value) => { const newAdditions = [...additions]; newAdditions[index] = value; setAdditions(newAdditions); }; const validate = () => { const newErrors = {}; if (!mealName.trim()) newErrors.name = 'Meal name is required'; if (!description.trim()) newErrors.description = 'Description is required'; if (!price || isNaN(price) || Number(price) <= 0) newErrors.price = 'Valid price is required'; if (!mealImage) newErrors.image = 'Meal image is required'; if (!selectedCategory) newErrors.category = 'Category must be selected'; additions.forEach((add, i) => { if (!add.trim()) newErrors[`addition_${i}`] = 'Cannot be empty'; }); setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async () => { if (!validate()) return; setIsSubmitting(true); const mealData = { name: mealName.trim(), category_id: selectedCategory, price, restaurant_id: restaurantId, photo: mealImage, description: [description.trim()], additions: additions.filter(a => a.trim() !== ''), }; try { const result = await authService.addMeal(mealData); // عرض رسالة Snackbar أو alert alert(result.message); // تمرير الوجبة الجديدة للمكون الأب لتحديث القائمة if (result.data && onAdd) { const newMeal = { id: result.data.id, name: result.data.name, price: result.data.price, description: result.data.description || [], additions: result.data.additions || [], unit: result.data.unit || "/pcs", photo: result.data.photo || "/images/default-product.png", category_id: result.data.category_id || selectedCategory, }; onAdd(newMeal); } // إغلاق المودال بعد الإضافة onClose(); } catch (error) { console.error('Add meal error:', error); alert(error.message || "Something went wrong"); } finally { setIsSubmitting(false); } }; return ( Add Meal {/* Meal Image */} Meal Image {mealImage ? ( Preview ) : ( <> Upload Meal Picture )} {errors.image && {errors.image}} {/* Meal Name */} Meal Name setMealName(e.target.value)} error={!!errors.name} helperText={errors.name} sx={{ mb: 2 }} /> {/* Description */} Description setDescription(e.target.value)} error={!!errors.description} helperText={errors.description} sx={{ mb: 2 }} /> {/* Additions */} Additions {additions.map((add, i) => ( handleChangeAddition(i, e.target.value)} error={!!errors[`addition_${i}`]} helperText={errors[`addition_${i}`]} /> handleRemoveAddition(i)} color="error"> ))} {/* Price */} Price setPrice(e.target.value)} error={!!errors.price} helperText={errors.price} sx={{ mb: 2 }} /> ); }; export default AddMeal;