'use client'; import { useEffect, useState } from 'react'; import { TaskManager } from '@/components/admin/TaskManager'; import { ExperimentForm } from '@/components/admin/ExperimentForm'; type Experiment = { id: string; subject_name: string; xp_human_only: boolean; xp_market_mode: string; created_at: string; task?: { id: string; task_name: string; }; }; export default function ExperimentsAdmin() { const [exps, setExps] = useState([]); const [selectedTaskId, setSelectedTaskId] = useState(); const [error, setError] = useState(null); const [showForm, setShowForm] = useState(false); const fetchExps = async () => { try { const res = await fetch('/api/admin/experiments'); if (!res.ok) throw new Error(`fetch failed: ${res.status}`); const data = await res.json(); setExps(data.experiments || []); } catch (err: any) { setError(err.message); } }; useEffect(() => { fetchExps(); }, []); const handleExperimentCreated = async () => { setShowForm(false); setSelectedTaskId(undefined); await fetchExps(); }; return (

Experiment Management

configure tasks and run experiments

{error && (
{error}
)}
{/* left column: task manager */}
{/* right column: experiment form + list */}

Experiments

{showForm && ( )}
{exps.length === 0 ? ( ) : ( exps.map((exp) => { const baseUrl = exp.xp_market_mode === 'airline' ? 'https://phantom-airline.vercel.app' : 'https://phantom-hotel.vercel.app'; const link = `${baseUrl}/start-task?uuid=${exp.id}`; return ( ); }) )}
subject mode human task created link
no experiments yet
{exp.subject_name} {exp.xp_market_mode || 'none'} {exp.xp_human_only ? ( yes ) : ( no )} {exp.task ? exp.task.task_name : '—'} {new Date(exp.created_at).toLocaleDateString()}
); }