"use client"; import { LogOut } from "lucide-react"; import Link from "next/link"; import { signOut } from "next-auth/react"; import { type ReactNode, useCallback, useEffect, useState, } from "react"; import { createPortal } from "react-dom"; function ToolbarBtn({ onClick, title, children, href, }: { onClick?: () => void; title: string; children: ReactNode; href?: string; }) { const cls = "w-7 h-7 sm:w-8 sm:h-8 rounded-lg border-2 cursor-pointer flex items-center justify-center shadow-lg transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl active:translate-y-0"; const style = { borderColor: "color-mix(in srgb, var(--color-primary, #eeb425) 75%, black)", background: "linear-gradient(135deg, var(--color-primary, #eeb425) 0%, color-mix(in srgb, var(--color-primary, #eeb425) 80%, black) 100%)", color: "var(--button-text-color-readable, var(--button-text-color, #1a1a2e))", } as const; if (href) { return ( {children} ); } return ( ); } export function ClientView({ ticket, clientUrl, hotelName, initialOnline, }: { ticket: string; clientUrl: string; hotelName: string; initialOnline: number; }) { const [_isFullscreen, setIsFullscreen] = useState(false); const [onlineCount, setOnlineCount] = useState(initialOnline); useEffect(() => { const interval = setInterval(async () => { try { const res = await fetch("/api/online/count"); if (res.ok) setOnlineCount((await res.json()).count ?? 0); } catch {} }, 15000); return () => clearInterval(interval); }, []); const toggleFullscreen = useCallback(() => { if (!document.fullscreenElement) { document.documentElement.requestFullscreen().catch(() => {}); setIsFullscreen(true); } else { document.exitFullscreen().catch(() => {}); setIsFullscreen(false); } }, []); useEffect(() => { function onChange() { setIsFullscreen(!!document.fullscreenElement); } document.addEventListener("fullscreenchange", onChange); return () => document.removeEventListener("fullscreenchange", onChange); }, []); const base = clientUrl.replace(/(\?|&)sso=[^&]*/, ""); const sep = base.includes("?") ? "&" : "?"; const clientSrc = `${base}${sep}sso=${encodeURIComponent(ticket)}`; const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); }, []); const toolbar = (