/* eslint-disable */ // [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. "use client"; import { useState, useEffect } from "react"; import { useParams } from "next/navigation"; import { io, Socket } from "../../../lib/zero-socket"; export default function GuestPortal() { const params = useParams(); const room = params.room as string; const [name, setName] = useState(""); const [pin, setPin] = useState(""); const [status, setStatus] = useState<"idle" | "knocking" | "approved" | "denied">("idle"); const [socket, setSocket] = useState(null); useEffect(() => { const newSocket = io(window.location.origin, { path: '/c/socket.io', transports: ['websocket'] }); setSocket(newSocket); newSocket.on("guest_approved", () => { setStatus("approved"); // Set a temporary cookie or local storage to bypass auth in the Chat UI // In this specific implementation, we will just redirect to the room with a temporary token // For simplicity, we just change the state to 'approved' and render the chat UI here or redirect window.location.href = `/?guest_room=${encodeURIComponent(room)}&guest_name=${encodeURIComponent(name)}&guest_token=true`; }); newSocket.on("guest_denied", () => { setStatus("denied"); newSocket.disconnect(); }); return () => { newSocket.disconnect(); }; }, [room, name]); const handleKnock = async () => { if (!name.trim() || !pin.trim()) return alert("Nama dan PIN wajib diisi!"); if (!socket) return; // Validasi PIN ke API sebelum mengetuk try { setStatus("knocking"); const resp = await fetch('/c/api/guest/knock', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ room, pin, name }) }); const data = await resp.json(); if (data.success) { // PIN Valid, sekarang server menembakkan notifikasi ke Host socket.emit('guest_knock', { room, name, pinId: data.pinId }); } else { alert(data.error || "PIN tidak valid atau sudah kedaluwarsa."); setStatus("idle"); } } catch (e) { alert("Terjadi kesalahan."); setStatus("idle"); } }; if (status === "approved") { return
Memasuki Ruangan...
; } return (
{/* Background Decorators */}

Akses Tamu (Guest)

Anda diundang ke ruangan:
{decodeURIComponent(room)}

{status === "idle" && (
setName(e.target.value)} placeholder="Contoh: Budi (Kemenkes)" className="w-full bg-[#202c33] text-white px-4 py-3 rounded-xl outline-none focus:ring-2 focus:ring-brand border border-transparent transition-all" />
setPin(e.target.value.replace(/\D/g, ''))} placeholder="000000" className="w-full bg-[#202c33] text-white px-4 py-3 rounded-xl outline-none focus:ring-2 focus:ring-brand border border-transparent transition-all text-center tracking-[0.5em] font-mono text-xl" />
)} {status === "knocking" && (

Menunggu Tuan Rumah...

PIN Anda valid. Host sedang meninjau permintaan Anda untuk masuk ke ruangan.

)} {status === "denied" && (

Akses Ditolak

Tuan rumah menolak permintaan Anda untuk masuk ke ruangan ini.

)}
); }