import React, { useState } from 'react'; import { Play, Pause, RotateCcw, Square, Clock, Target, Zap, TrendingUp, } from 'lucide-react'; import { Card, CardHeader, CardContent } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; import { Badge, StatusBadge } from '@/components/ui/Badge'; import { useCurrentEpisode, useResetEpisode, useTerminateEpisode, } from '@/hooks/useEpisode'; import { formatDuration, formatTimestamp, calculateProgress } from '@/utils/helpers'; interface EpisodePanelProps { className?: string; } export const EpisodePanel: React.FC = ({ className }) => { const { data: episode, isLoading } = useCurrentEpisode(); const resetMutation = useResetEpisode(); const terminateMutation = useTerminateEpisode(); const [isRunning, setIsRunning] = useState(false); const handleReset = () => { resetMutation.mutate({ task: { description: 'Default scraping task', targetUrl: 'https://example.com', objectives: ['Extract main content'], }, }); }; const handleToggleRun = () => { setIsRunning(!isRunning); }; const handleTerminate = () => { if (episode?.id) { terminateMutation.mutate(episode.id); } }; const progress = episode ? calculateProgress(episode.currentStep, episode.config.maxSteps) : 0; const elapsedTime = episode ? Date.now() - new Date(episode.startTime).getTime() : 0; return ( } action={ episode && ( ) } /> {/* Control Buttons */}
{/* Progress Bar */}
Progress {progress}%
{/* Stats Grid */}
Step
{isLoading ? '-' : `${episode?.currentStep ?? 0}`} /{episode?.config.maxSteps ?? 100}
Time
{episode ? formatDuration(elapsedTime) : '--:--'}
Total Reward
= 0 ? 'text-green-400' : 'text-red-400' } > {episode?.totalReward?.toFixed(2) ?? '0.00'}
Budget
${episode?.config.budget?.toFixed(2) ?? '0.00'}
{/* Task Info */} {episode?.task && (
Current Task
{episode.task.description}
{episode.task.objectives.slice(0, 3).map((obj, i) => ( {obj} ))}
)} {/* Timeline */} {episode && (
Timeline
{formatTimestamp(episode.startTime)} {' · '}Episode started
{episode.actions.slice(-3).map((action, i) => (
{formatTimestamp(action.timestamp)} {' · '} {action.type}
))}
)} ); }; export default EpisodePanel;