"use client" import MasterLayout from "@/masterLayout/MasterLayout"; import { useRouter, useSearchParams } from "next/navigation"; import { Suspense, useEffect, useState } from "react"; import client from "@auth"; import classNames from "classnames"; import Link from "next/link"; import PageLoader from "@/components/common-component/PageLoader"; import PageNoData from "@/components/common-component/PageNoData"; import Breadcrumb from "@/components/Breadcrumb"; import { Icon } from "@iconify/react"; import axios from "axios"; import { Baseurl } from "@utils/BaseUrl.utils"; const DineInInner = () => { const router = useRouter(); const searchParams = useSearchParams(); const roomName = decodeURIComponent(searchParams.get("roomname") || ""); const FloorName = decodeURIComponent(searchParams.get("floor") || ""); const [tables, setTables] = useState([]); const [showModalTable, setShowModalTable] = useState(false); const [showModal, setShowModal] = useState(false); const [isEditMode, setIsEditMode] = useState(false); const [selectedFloorId, setSelectedFloorId] = useState(null); const [selectedTable, setSelectedTable] = useState(null); const [seatCount, setSeatCount] = useState(1); const [error, setError] = useState(''); const [loading, setLoading] = useState(true) const [formData, setFormData] = useState({ tablename: "", minimumoccupancy: "", totalcapacity: "", description: "", enable: 0, }); const [errors, setErrors] = useState({}); const [deleteConfirm, setDeleteConfirm] = useState({ show: false, id: null, isDeleted: null }); const [restaruntBranch, setRestaruntBranch] = useState("") const [floorData, setFloorData] = useState(null); const [roomData, setRoomData] = useState(null); const [selectedFloor, setSelectedFloor] = useState(""); const [selectedRoom, setSelectedRoom] = useState(""); // Floor const [showFloorModal, setShowFloorModal] = useState(false); const [isFloorEditMode, setIsFloorEditMode] = useState(false); // const [selectedFloorId, setSelectedFloorId] = useState(null); const [floorFormData, setFloorFormData] = useState({ floorname: "", description: "", }); const [floorErrors, setFloorErrors] = useState({}); const [floorDeleteConfirm, setFloorDeleteConfirm] = useState({ show: false, id: null, isDeleted: null }); // Room const [showRoomModal, setShowRoomModal] = useState(false); const [editRoomMode, setEditRoomMode] = useState(false); const [editingRoomId, setEditingRoomId] = useState(null); const [roomFormData, setRoomFormData] = useState({ roomname: "", description: "", }); const [roomErrors, setRoomErrors] = useState({}); const [roomDeleteConfirm, setRoomDeleteConfirm] = useState({ show: false, id: null, isDeleted: null }); useEffect(() => { const restarunt = localStorage.getItem("restaurantbranch") setRestaruntBranch(restarunt) }, []) useEffect(() => { const isLogin = JSON.parse(localStorage.getItem("isLogin")); if (!isLogin) { router.push(`/admin?restaurantbranch=${restaruntBranch}`); } }, [router]); // Get floor data when branch is ready useEffect(() => { if (restaruntBranch) { getFloor(); } }, [restaruntBranch]); const getFloor = async () => { try { const res = await client.get( `/Dine360 Floor?fields=["*"]&limit_page_length=100&filters=[["restaurantbranch","=","${restaruntBranch}"]]` ); const floors = res?.data?.data || []; setFloorData(floors); if (floors.length > 0) { setSelectedFloor(floors[0].name); setSelectedRoom(null); getRoomData(floors[0].name); } else { setSelectedFloor(null); setRoomData([]); setTables([]); } } catch (error) { console.error("Error fetching floor data:", error); } }; const getRoomData = async (floorName) => { try { const res = await client.get( `/Dine360 Room?fields=["*"]&limit_page_length=100&filters=[["floor","=","${floorName}"]]` ); const rooms = res?.data?.data || []; setRoomData(rooms); if (rooms.length > 0) { setSelectedRoom(rooms[0].name); getTableData(rooms[0].name); } else { setSelectedRoom(null); // clear selection if no rooms setTables([]); // clear table data } } catch (error) { console.error("Error fetching room data:", error); } }; const getTableData = async (roomName) => { try { setLoading(true) const tableRes = await client.get(`/Dine360%20Table?fields=[\"*\"]&limit_page_length=100&filters=[["room","=","${roomName}"]]`); console.log("tableRes", tableRes); setTables(tableRes.data.data); setLoading(false) } catch (error) { console.error("Error fetching data:", error); setLoading(false) } } // floor start const handleFloorChange = (e) => { const { name, value } = e.target; setFloorFormData((prev) => ({ ...prev, [name]: value })); }; const handleFloorSubmit = async (e) => { e.preventDefault(); const newErrors = {}; Object.entries(floorFormData).forEach(([key, value]) => { if (!value.trim()) newErrors[key] = `${key} is required`; }); setFloorErrors(newErrors); if (Object.keys(newErrors).length > 0) return; const body = { // ...(isFloorEditMode && { name: selectedFloorId }), // only adds `name` if editing floorname: floorFormData?.floorname, description: floorFormData?.description, restaurantbranch: restaruntBranch }; try { if (isFloorEditMode) { await client.put(`/Dine360 Floor/${selectedFloorId}`, body); } else { await client.post(`/Dine360 Floor`, body); } getFloor(); resetFloorForm(); } catch (error) { if ( error?.response?.data?.exception?.includes("DuplicateEntryError") || error?.response?.data?.message?.includes("Duplicate entry") ) { alert("Floor with this name already exists. Please use a different name."); } else if ( error?.response?.data?.exception?.includes("UniqueValidationError") || error?.response?.data?.message?.includes("UniqueValidationError entry") ) { alert("Floor with this name already exists. Please use a different name."); } else { alert("An error occurred. Please try again."); } } }; const resetFloorForm = () => { setFloorFormData({ floorname: "", description: "", }); setShowFloorModal(false); setIsFloorEditMode(false); setSelectedFloorId(null); setFloorErrors({}); }; const handleFloorEdit = (floor) => { setIsFloorEditMode(true); setSelectedFloorId(floor.name); setFloorFormData({ floorname: floor.floorname || "", description: floor.description || "", }); setShowFloorModal(true); }; const handleFloorDelete = async () => { try { const body = { isdeleted: floorDeleteConfirm?.isDeleted == 0 ? 1 : 0 } await client.put(`/Dine360 Floor/${floorDeleteConfirm.id}`, body); setFloorDeleteConfirm({ show: false, id: null, isDeleted: null }); getFloor(); } catch (error) { if ( error?.response?.data?.exception?.includes("DuplicateEntryError") || error?.response?.data?.message?.includes("Duplicate entry") ) { alert("Floor with this name already exists. Please use a different name."); } else if (error?.response?.data?.exception?.includes("LinkExistsError") || error?.response?.data?.message?.includes("LinkExistsError")) { alert(" Cannot delete or cancel because Dine360 Floor three is linked with Dine360 Room "); } } }; // floor end // Room Start const handleRoomChange = (e) => { const { name, value } = e.target; setRoomFormData((prev) => ({ ...prev, [name]: value })); }; const handleRoomSubmit = async (e) => { e.preventDefault(); const newErrors = {}; Object.entries(roomFormData).forEach(([key, value]) => { if (!value.trim()) newErrors[key] = `${key} is required`; }); setRoomErrors(newErrors); if (Object.keys(newErrors).length > 0) return; const body = { roomname: roomFormData.roomname, description: roomFormData.description, floor: selectedFloor, restaurantbranch: restaruntBranch }; try { if (editRoomMode) { await client.put(`/Dine360 Room/${editingRoomId}`, body); } else { await client.post(`/Dine360 Room`, body); } getRoomData(selectedFloor); resetRoomForm(); } catch (error) { console.error("❌ Submission error:", error); } }; const handleRoomEdit = (room) => { setRoomFormData({ roomname: room.roomname || "", description: room.description || "", // branch: room.branch || "", }); setEditingRoomId(room.name); setEditRoomMode(true); setShowRoomModal(true); }; const handleRoomDelete = async () => { try { const body = { isdeleted: roomDeleteConfirm?.isDeleted == 0 ? 1 : 0 } await client.put(`/Dine360 Room/${roomDeleteConfirm?.id}`, body); setRoomDeleteConfirm({ show: false, id: null, isDeleted: null }); getRoomData(selectedFloor); } catch (error) { if ( error?.response?.data?.exception?.includes("DuplicateEntryError") || error?.response?.data?.message?.includes("Duplicate entry") ) { alert("Floor with this name already exists. Please use a different name."); } else if (error?.response?.data?.exception?.includes("LinkExistsError") || error?.response?.data?.message?.includes("LinkExistsError")) { alert(" Cannot delete or cancel because Dine360 Floor three is linked with Dine360 Room fsrf65ahb5"); } } }; const resetRoomForm = () => { setRoomFormData({ roomname: "", description: "", }); setRoomErrors({}); setEditRoomMode(false); setEditingRoomId(null); setShowRoomModal(false); }; // Room End console.log("selectedFloor", selectedFloor) const handleTableClick = (table) => { setSelectedTable(table); setSeatCount(1); setError(''); setShowModalTable(true); }; const handleSeatChange = (e) => { const value = parseInt(e.target.value); if (value > selectedTable?.totalcapacity) { setError(`Maximum capacity is ${selectedTable?.totalcapacity} seats`); } else { setError(''); } setSeatCount(value); }; const handleSeatSubmit = () => { if ( selectedTable && seatCount > 0 && seatCount <= selectedTable?.totalcapacity ) { const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, '0'); // month is 0-based const day = String(now.getDate()).padStart(2, '0'); const hour = String(now.getHours()).padStart(2, '0'); const minute = String(now.getMinutes()).padStart(2, '0'); const second = String(now.getSeconds()).padStart(2, '0'); const formattedTime = `${year}-${month}-${day} ${hour}:${minute}:${second}`; console.log(formattedTime); // Push the route with formatted timestamp router.push( `/admin/pos/menu-items?restaurantbranch=${restaruntBranch}&table=${encodeURIComponent(selectedTable.name)}&seats=${seatCount}&time=${encodeURIComponent(formattedTime)}` ); } }; const handleChange = (e) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; const handleSubmit = async (e) => { e.preventDefault(); const newErrors = {}; Object.entries(formData).forEach(([key, value]) => { if (!String(value).trim()) { newErrors[key] = `${key} is required`; } }); setErrors(newErrors); if (Object.keys(newErrors).length > 0) return; const Body = { tablename: formData?.tablename, minimumoccupancy: formData?.minimumoccupancy, totalcapacity: formData?.totalcapacity, description: formData?.description, room: selectedRoom, floor: selectedFloor, status: "Available", restaurantbranch: restaruntBranch } try { if (isEditMode) { await client.put(`/Dine360 Table/${selectedFloorId}`, Body); } else { const createTable = await client.post(`/Dine360 Table`, Body); if (formData.enable == 1) { const tableName = createTable?.data?.data?.name; const RestaurantBranch = createTable?.data?.data?.restaurantbranch; const AutoCreateBody = { name: tableName, restaurantbranch: RestaurantBranch, enabled: formData.enable, // Uncomment if needed }; try { await axios.post(`${Baseurl}/Add-Table-To-Day`, AutoCreateBody); } catch (apiError) { console.error("Error while auto-creating table for the day:", apiError); alert("Table created, but failed to assign it to the day."); } } } getTableData(selectedRoom); resetForm(); } catch (error) { if ( error?.response?.data?.exception?.includes("DuplicateEntryError") || error?.response?.data?.message?.includes("Duplicate entry") ) { alert("Floor with this name already exists. Please use a different name."); } else { alert("An error occurred. Please try again."); } } }; const resetForm = () => { setFormData({ tablename: "", minimumoccupancy: "", totalcapacity: "", // branch: "", description: "", enable: 0, }); setShowModal(false); setIsEditMode(false); setSelectedFloorId(null); setErrors({}); }; const handleEdit = (table) => { setIsEditMode(true); setSelectedFloorId(table.name); setFormData({ tablename: table.tablename || "", minimumoccupancy: table.minimumoccupancy || "", totalcapacity: table.totalcapacity || "", description: table.description || "", // branch: room.branch || "", }); setShowModal(true); }; const handleDelete = async () => { try { const body = { isdeleted: deleteConfirm?.isDeleted == 0 ? 1 : 0 } await client.put(`/Dine360 Table/${deleteConfirm.id}`, body); setDeleteConfirm({ show: false, id: null, isDeleted: null }); getTableData(selectedRoom); } catch (error) { console.error("Delete error:", error); } }; return ( <>
{/* Floor & Room Wrapper Row */}
{/* Floor Section */}
{/* Add Floor Card */}
setShowFloorModal(true)} >
{/* Floor Cards */} {floorData?.map((floor) => (
{ setSelectedFloor(floor.name); getRoomData(floor.name); }} >
{ floor?.isdeleted == 1 && () } {floor.floorname}
{/* Dropdown */}
  • { e.preventDefault(); handleFloorEdit(floor); }}> Edit
  • { e.preventDefault(); setFloorDeleteConfirm({ show: true, id: floor.name, isDeleted: floor.isdeleted }); }}> {floor.isdeleted === 1 ? ( <> Restore ) : ( <> Delete )}
))}
{/* Room Section */}
{/* Add Room Card */}
setShowRoomModal(true)} >
{/* Room Cards */} {roomData?.map((room) => (
{ setSelectedRoom(room.name); getTableData(room.name); }} >
{ room?.isdeleted == 1 && () } {room.roomname}
{/* Dropdown */}
  • { e.preventDefault(); handleRoomEdit(room); }}> Edit
  • { e.preventDefault(); setRoomDeleteConfirm({ show: true, id: room.name, isDeleted: room.isdeleted }); }}> {room.isdeleted === 1 ? ( <> Restore ) : ( <> Delete )}
))}
{/*
Table
*/} {loading ? ( ) : tables.length === 0 ? (
setShowModal(true)} >
Add New
) : ( <>
setShowModal(true)} >
Add New
{tables.map((table) => (
{/* Top-right action buttons */}
handleTableClick(table)} >
{ if (table?.totalcapacity <= 2) return 'seating-24.png'; if (table?.totalcapacity <= 4) return 'seating-25.png'; if (table?.totalcapacity <= 6) return 'seating-26.png'; if (table?.totalcapacity <= 8) return 'seating-27.png'; if (table?.totalcapacity <= 10) return 'seating-28.png'; return 'default.png'; // fallback image })()}`} alt="table" className={classNames( 'w-100 h-100 object-fit-cover radius-8', { 'grayscale': table.status === 'booked' } )} /> { table?.isdeleted == 1 && () }
{table?.tablename}
  • { e.preventDefault(); handleEdit(table) }} > Edit
  • { e.preventDefault(); setDeleteConfirm({ show: true, id: table.name, isDeleted: table.isdeleted }) }} > {table.isdeleted === 1 ? ( <> Restore ) : ( <> Delete )}
))} ) }
{/* floor create/update start */} {showFloorModal && (
{isFloorEditMode ? "Edit Floor" : "Create Floor"}
{floorErrors.floorname && (
{floorErrors.floorname}
)}
{floorErrors.description && (
{floorErrors.description}
)}
)} {/* Floor create/update end */} {/* Floor Delete Start */} {floorDeleteConfirm.show && (
{floorDeleteConfirm?.isDeleted === 0 ? "Confirm to Delete" : "Confirm to Restore"}

{floorDeleteConfirm?.isDeleted === 0 ? "Are you sure you want to set this floor as Delete?" : "Are you sure you want to set this floor as Restore?"}

)} {/* Floor Delete End */} {/* Room start */} {/* Modal */} {showRoomModal && (
{editRoomMode ? "Edit Room" : "Create Room"}
{roomErrors.roomname && (
{roomErrors.roomname}
)}
{roomErrors.description && (
{roomErrors.description}
)}
)} {/* Delete Confirmation Modal */} {roomDeleteConfirm.show && (
{roomDeleteConfirm?.isDeleted === 0 ? "Confirm to Delete" : "Confirm to Restore"}

{roomDeleteConfirm?.isDeleted === 0 ? "Are you sure you want to set this room as Delete?" : "Are you sure you want to set this room as Restore?"}

)} {/* room end */} {/* Seat Count Modal */} {showModalTable && (
Enter Seat Count
{error ? (
{error}
) : ( Maximum capacity: {selectedTable?.totalcapacity} )}
)} {/* Modal */} {showModal && (
{isEditMode ? "Edit Table" : "Create Table"}
{errors.tablename && (
{errors.tablename}
)}
{errors.minimumoccupancy && (
{errors.minimumoccupancy}
)}
{errors.totalcapacity && (
{errors.totalcapacity}
)}
{errors.description && (
{errors.description}
)}
{/*
{errors.branch && (
{errors.branch}
)}
*/} { !isEditMode && (
setFormData({ ...formData, enable: e.target.checked ? 1 : 0, }) } />
) }
)} {/* Delete Confirmation Modal */} {deleteConfirm.show && (
{deleteConfirm?.isDeleted === 0 ? "Confirm to Delete" : "Confirm to Restore"}

{deleteConfirm?.isDeleted === 0 ? "Are you sure you want to set this table as Delete?" : "Are you sure you want to set this table as Restore?"}

)} ); }; const DineIn = (() => { return ( {/* Breadcrumb */} }> ) }) export default DineIn;