in 3-ai-native-e2e-sample/frontend/src/pages/trials.tsx [9:127]
export function TrialsPage() {
const [events, setEvents] = useState<TrialEvent[]>([])
const [loading, setLoading] = useState(false)
const [error, setError] = useState<string | null>(null)
const [simulationActive, setSimulationActive] = useState(false)
const simulateTrialData = async () => {
setLoading(true)
setError(null)
try {
console.log('Calling simulateTrialData API...')
const { data, error: apiError } = await api.simulateTrialData()
console.log('API Response:', { data, error: apiError })
if (apiError) {
throw new Error(apiError)
}
if (!data || typeof data !== 'object') {
console.error('No data received from API')
throw new Error("No data received from API")
}
setEvents(data.events)
} catch (error) {
const errorMessage = error instanceof Error ? error.message : "Failed to simulate trial data"
console.error('Trial simulation error:', error)
setError(errorMessage)
setEvents([])
} finally {
setLoading(false)
}
}
useEffect(() => {
let interval: NodeJS.Timeout
if (simulationActive) {
interval = setInterval(simulateTrialData, 5000)
}
return () => clearInterval(interval)
}, [simulationActive])
if (loading) {
return (
<div className="flex items-center justify-center min-h-[60vh]">
<div className="flex flex-col items-center space-y-4">
<div className="h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent"></div>
<p className="text-muted-foreground">Loading clinical trials data...</p>
</div>
</div>
)
}
return (
<div className="space-y-6">
<div className="flex justify-between items-center">
<div>
<h1 className="text-4xl font-bold">Clinical Trials Monitor</h1>
<p className="text-lg text-muted-foreground mt-2">
Monitor and analyze ongoing clinical trials.
</p>
</div>
<div className="flex items-center space-x-4">
<div className="flex items-center space-x-4">
<Button
onClick={() => setSimulationActive(!simulationActive)}
variant="outline"
className="border-2"
disabled={loading}
>
<div className="flex items-center space-x-2">
<RefreshCw className={`h-4 w-4 ${simulationActive ? 'animate-spin' : ''}`} />
<span>{simulationActive ? "Stop Simulation" : "Start Continuous Simulation"}</span>
</div>
</Button>
<Button
onClick={simulateTrialData}
disabled={loading || simulationActive}
variant="outline"
className="border-2"
>
{loading ? (
<div className="flex items-center space-x-2">
<div className="h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent"></div>
<span>Simulating...</span>
</div>
) : (
<div className="flex items-center space-x-2">
<RefreshCw className="h-4 w-4" />
<span>Single Event</span>
</div>
)}
</Button>
</div>
</div>
</div>
{error && (
<Card className="border-destructive">
<CardContent className="p-6">
<p className="text-center text-destructive">{error}</p>
</CardContent>
</Card>
)}
<TrialVisualization
events={events}
data={events.map(event => ({
timestamp: event.timestamp,
efficacy: Math.random() * 100,
safety: Math.random() * 100,
adherence: Math.random() * 100
}))}
/>
</div>
)
}