"use client"; import { useEffect, useState } from "react"; import axios from "axios"; import { useRouter } from "next/navigation"; import { MapPin, Users, Calendar, X, Clock, FileText } from "lucide-react"; // Tipe Data interface Room { room_id: number; name: string; category: string; capacity: number; floor: string; status: string; } export default function Dashboard() { const router = useRouter(); const [user, setUser] = useState(null); const [rooms, setRooms] = useState([]); const [loading, setLoading] = useState(true); const [apiError, setApiError] = useState(""); // State baru untuk menangkap pesan error API // --- STATE UNTUK MODAL BOOKING --- const [isModalOpen, setIsModalOpen] = useState(false); const [selectedRoom, setSelectedRoom] = useState(null); const [startTime, setStartTime] = useState(""); const [endTime, setEndTime] = useState(""); const [purpose, setPurpose] = useState(""); const [submitLoading, setSubmitLoading] = useState(false); // ---------------------------------- useEffect(() => { const token = localStorage.getItem("token"); const userData = localStorage.getItem("user"); if (!token || !userData) { router.push("/login"); return; } setUser(JSON.parse(userData)); fetchRooms(token); }, []); const fetchRooms = async (token: string) => { try { // UBAH IP KE SERVER KAMPUS (172.17.172.17) const response = await axios.get("http://172.17.172.17:8080/api/rooms", { headers: { Authorization: `Bearer ${token}` }, }); setRooms(response.data.data); } catch (error: any) { console.error("Error fetching rooms:", error); // Jangan langsung tendang ke login, tampilkan pesan errornya di layar setApiError(error.response?.data?.error || "Gagal memuat data ruangan dari server."); } finally { setLoading(false); } }; // --- BUKA MODAL --- const openBookingModal = (room: Room) => { setSelectedRoom(room); setIsModalOpen(true); setStartTime(""); setEndTime(""); setPurpose(""); }; // --- SUBMIT BOOKING --- const handleBookingSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSubmitLoading(true); const token = localStorage.getItem("token"); try { const startISO = new Date(startTime).toISOString(); const endISO = new Date(endTime).toISOString(); // UBAH IP KE SERVER KAMPUS (172.17.172.17) await axios.post( "http://172.17.172.17:8080/api/bookings", { room_id: selectedRoom?.room_id, start_time: startISO, end_time: endISO, purpose: purpose, }, { headers: { Authorization: `Bearer ${token}` }, } ); alert("Booking Berhasil Diajukan! Menunggu persetujuan."); setIsModalOpen(false); fetchRooms(token!); // Refresh data ruangan setelah booking } catch (error: any) { const errorMsg = error.response?.data?.error || "Gagal melakukan booking."; alert("GAGAL: " + errorMsg); } finally { setSubmitLoading(false); } }; if (loading) return
Memuat data kelas S-CLASS...
; return (
{/* Header Konten: Judul & Tombol Riwayat */}

Pilih Ruangan

{/* Jika terjadi error koneksi ke Backend */} {apiError && (
Terjadi Kesalahan: {apiError}
)} {/* Grid Daftar Kelas */}
{[...rooms] .sort((a, b) => a.name.localeCompare(b.name)) .map((room) => (
{room.status}

{room.name}

{room.floor}
Kapasitas: {room.capacity}
))}
{/* --- MODAL POPUP FORMULIR --- */} {isModalOpen && selectedRoom && (

Form Peminjaman

Ruangan: {selectedRoom.name}

{selectedRoom.floor}

setStartTime(e.target.value)} />
setEndTime(e.target.value)} />