"use client"; import { useEffect, useState } from "react"; import { Card } from "@/components/ui/card"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import GameComponent from "@/components/game-component"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { API_BASE } from "@/lib/constants"; import { VirtualizedCombobox } from "./ui/virtualized-combobox"; import { Info, Shuffle } from "lucide-react"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import { Separator } from "@/components/ui/separator"; import popularNodes from "../../results/popular_nodes.json"; export default function PlayTab({ startArticle, destinationArticle, }: { startArticle?: string; destinationArticle?: string; }) { const [player, setPlayer] = useState<"me" | "model">("model"); const [selectedModel, setSelectedModel] = useState( "Qwen/Qwen3-30B-A3B" ); const [maxHops, setMaxHops] = useState(20); const [isGameStarted, setIsGameStarted] = useState(false); const [startPage, setStartPage] = useState( startArticle || "Capybara" ); const [targetPage, setTargetPage] = useState( destinationArticle || "Pokémon" ); const [maxTokens, setMaxTokens] = useState(3000); const [maxLinks, setMaxLinks] = useState(200); const [isServerConnected, setIsServerConnected] = useState(false); const [isAuthenticated, setIsAuthenticated] = useState(false); const [modelList, setModelList] = useState([ "deepseek-ai/DeepSeek-V3-0324", "Qwen/Qwen3-235B-A22B", "Qwen/Qwen3-30B-A3B", "Qwen/Qwen3-14B", "google/gemma-3-27b-it", ]); const [allArticles, setAllArticles] = useState([]); // Server connection check useEffect(() => { const checkServerConnection = async () => { try { const response = await fetch(API_BASE + "/health"); setIsServerConnected(response.ok); } catch { setIsServerConnected(false); } }; // Check immediately and then every 30 seconds checkServerConnection(); const interval = setInterval(checkServerConnection, 30000); return () => clearInterval(interval); }, []); // Authentication check useEffect(() => { const checkAuthentication = () => { const idToken = window.localStorage.getItem("huggingface_id_token"); const accessToken = window.localStorage.getItem( "huggingface_access_token" ); if (idToken && accessToken) { try { const idTokenObject = JSON.parse(idToken); if (idTokenObject.exp > Date.now() / 1000) { setIsAuthenticated(true); return; } } catch (error) { console.error("Error parsing ID token:", error); } } setIsAuthenticated(false); }; checkAuthentication(); window.addEventListener("storage", checkAuthentication); return () => { window.removeEventListener("storage", checkAuthentication); }; }, []); useEffect(() => { const fetchAllArticles = async () => { const response = await fetch(`${API_BASE}/get_all_articles`); const data = await response.json(); setAllArticles(data); }; fetchAllArticles(); }, []); const handleStartGame = () => { setIsGameStarted(true); }; const handleResetGame = () => { setIsGameStarted(false); }; const handlePlayerChange = (value: string) => { setPlayer(value as "me" | "model"); }; const selectRandomArticle = (setter: (article: string) => void) => { if (popularNodes.length > 0) { const randomIndex = Math.floor(Math.random() * popularNodes.length); setter(popularNodes[randomIndex]); } }; return (
{!isGameStarted ? (

Game Setup

Player Mode

I'll Play AI Will Play

Start Page

setStartPage(value)} /> {/* absorb rest of width */}

Target Page

setTargetPage(value)} /> {/* absorb rest of width */}
{player === "model" && ( <>

Model Settings

setMaxTokens(Number.parseInt(e.target.value)) } min={1} max={10000} />
setMaxLinks(Number.parseInt(e.target.value)) } min={1} max={1000} />
)}
{!isAuthenticated && player === "model" && (

Please sign in with Hugging Face to play the game

)}
{!isServerConnected && (
Server connection issue. Some features may be unavailable.
)}
) : ( )}
); }