import React, { useState, useEffect } from 'react'; import { useMediaQuery, Box, Typography, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Button, Chip, Menu, MenuItem, Dialog, DialogTitle, DialogContent, DialogActions, } from '@mui/material'; import TuneIcon from '@mui/icons-material/Tune'; import AddEmployModal from './AddEmployModal'; import authService from '../../../../services/authService'; import IOSSwitch from './IOSSwitch'; import { useTheme } from '@mui/material/styles'; import DeleteForeverIcon from '@mui/icons-material/DeleteForever'; import EmployeeDetailsModal from './EmployeeDetailsModal'; const Waiter = ({ restaurantId }) => { const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down('sm')); const [modalOpen, setModalOpen] = useState(false); const [showAll, setShowAll] = useState(false); const [switchStates, setSwitchStates] = useState({}); const [shiftFilter, setShiftFilter] = useState('all'); const [filterAnchorEl, setFilterAnchorEl] = useState(null); const [waiters, setWaiters] = useState([]); const [loading, setLoading] = useState(true); const [detailsModalOpen, setDetailsModalOpen] = useState(false); const [waiterDetails, setWaiterDetails] = useState(null); // حالات الحذف const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); const [selectedWaiter, setSelectedWaiter] = useState(null); const [isDeleting, setIsDeleting] = useState(false); // استدعاء API useEffect(() => { const fetchWaiters = async () => { setLoading(true); try { const response = await authService.getAllWaiters(restaurantId); if (response.waiters) { setWaiters(response.waiters); // تهيئة switchStates حسب قيمة active const initialStates = {}; response.waiters.forEach(waiter => { initialStates[waiter.id] = waiter.active === 1; // أو Boolean(waiter.active) }); setSwitchStates(initialStates); } else { setWaiters([]); } } catch (error) { console.error("Failed to fetch waiters:", error); setWaiters([]); } finally { setLoading(false); } }; fetchWaiters(); }, [restaurantId]); const handleSwitchChange = async (id, email) => { try { const response = await authService.toggleAccountStatus(email, "Waiter"); if (response.success) { setSwitchStates((prev) => ({ ...prev, [id]: response.data, })); // alert(response.message); } else { alert("Failed: " + response.message); } } catch (error) { alert("Error: " + error.message); } }; const handleOpenModal = () => setModalOpen(true); const handleCloseModal = () => setModalOpen(false); const handleConfirm = async (formData) => { try { const waiterData = { ...formData, restaurant_id: restaurantId, }; const response = await authService.registerWaiter(waiterData); if (response.success) { alert('Waiter registered successfully!'); setModalOpen(false); // إعادة التحميل بعد الإضافة const updated = await authService.getAllWaiters(restaurantId); if (updated.waiters) setWaiters(updated.waiters); } else { if (response.errors) { const errorsList = Object.entries(response.errors) .map(([field, msgs]) => `${field}: ${msgs.join(', ')}`) .join('\n'); alert(`Failed to register waiter due to validation errors:\n${errorsList}`); } else { alert('Failed to register waiter: ' + response.message); } } } catch (error) { alert('An error occurred: ' + error.message); } }; const getShiftChipProps = (shiftType) => { switch (shiftType?.toLowerCase()) { case 'morning': return { label: 'Morning', sx: { backgroundColor: '#E7F4EE', color: '#0D894F', fontWeight: 600, fontSize: '14px', minWidth: 80, textTransform: 'capitalize', }, }; case 'evening': return { label: 'Evening', sx: { backgroundColor: '#FDF1E8', color: '#E46A11', fontWeight: 600, fontSize: '14px', minWidth: 80, textTransform: 'capitalize', }, }; default: return { label: shiftType, sx: { backgroundColor: '#E0E0E0', color: '#424242', fontWeight: 600, fontSize: '14px', minWidth: 80, textTransform: 'capitalize', }, }; } }; const filteredWaiters = shiftFilter === 'all' ? waiters : waiters.filter((w) => w.shift_type.toLowerCase() === shiftFilter); const displayedWaiters = showAll ? filteredWaiters : filteredWaiters.slice(0, 3); const handleFilterClick = (event) => { setFilterAnchorEl(event.currentTarget); }; const handleFilterClose = () => { setFilterAnchorEl(null); }; const handleFilterSelect = (value) => { setShiftFilter(value); setFilterAnchorEl(null); }; // فتح مودال الحذف const handleDeleteClick = (waiter) => { setSelectedWaiter(waiter); setConfirmDeleteOpen(true); }; // تأكيد الحذف const handleDeleteConfirm = async () => { if (!selectedWaiter) return; setIsDeleting(true); try { const response = await authService.deleteWaiter(selectedWaiter.id); // هنا تحقق من وجود message بدل success if (response.message && response.message.toLowerCase().includes("successfully")) { // alert(response.message); setWaiters((prev) => prev.filter((w) => w.id !== selectedWaiter.id)); } else { alert("Failed to delete waiter: " + (response.message || "Unknown error")); } } catch (error) { alert("An error occurred: " + error.message); } finally { setIsDeleting(false); setConfirmDeleteOpen(false); setSelectedWaiter(null); } }; const handleOpenDetails = async (id) => { try { const response = await authService.getWaiterById(id); if (response.waiter) { setWaiterDetails(response.waiter); setDetailsModalOpen(true); } else { alert("Failed to fetch waiter details"); } } catch (error) { alert("Error: " + error.message); } }; return ( Waiter {waiters.length > 3 && ( )} Name Email Shift Type Actions {loading ? ( Loading... ) : displayedWaiters.length === 0 ? ( No activities found. ) : ( displayedWaiters.map((waiter) => ( handleOpenDetails(waiter.id)} > {waiter.name} {waiter.email} handleSwitchChange(waiter.id, waiter.email)} inputProps={{ 'aria-label': 'accountant switch' }} /> handleDeleteClick(waiter)} /> )) )}
{['all', 'morning', 'evening'].map((shift) => ( handleFilterSelect(shift)} sx={{ color: shiftFilter === shift ? '#FF914D' : '#4F5867', backgroundColor: shiftFilter === shift ? '#fffcf9d5' : 'transparent', '&:hover': { backgroundColor: '#f0f0f0ff', transition: 'background-color 150ms ease-in-out', }, }} > {shift.charAt(0).toUpperCase() + shift.slice(1)} ))} {/* مودال تأكيد الحذف */} setConfirmDeleteOpen(false)}> Confirm Delete Are you sure you want to delete "{selectedWaiter?.name}"? This action cannot be undone. setDetailsModalOpen(false)} employee={waiterDetails} // بدل waiter type="waiter" />
); }; export default Waiter;