"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">("me"); const [selectedModel, setSelectedModel] = useState( "deepseek-ai/DeepSeek-V3-0324" ); 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 [modelList, setModelList] = useState< { id: string; name: string; author: string; likes: number; trendingScore: number; }[] >([]); const [allArticles, setAllArticles] = useState([]); // Server connection check useEffect(() => { fetchAvailableModels(); 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); }, []); 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 fetchAvailableModels = async () => { const response = await fetch( "https://huggingface.co/api/models?inference_provider=hyperbolic&pipeline_tag=text-generation" ); const models = await response.json(); const filteredModels = models.filter((m: { tags: string[] }) => m.tags.includes("text-generation") ); const modelList = filteredModels.map( (m: { id: string; likes: number; trendingScore: number }) => ({ id: m.id, likes: m.likes, trendingScore: m.trendingScore, author: m.id.split("/")[0], name: m.id.split("/")[1], }) ); setModelList(modelList); }; 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} />
)}
{!isServerConnected && (
Server connection issue. Some features may be unavailable.
)}
) : ( )}
); }