"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 ( <>
{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?"}
{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?"}
{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?"}