"use client"; import { useState } from "react"; import { LeRobotEpisode } from "@lerobot/web"; import { TeleoperatorFramesView } from "./teleoperator-frames-view"; import { Button } from "./ui/button"; interface TeleoperatorEpisodesViewProps { teleoperatorData?: LeRobotEpisode[]; isRecording?: boolean; refreshTick?: number; } export function TeleoperatorEpisodesView({ teleoperatorData, isRecording, refreshTick, }: TeleoperatorEpisodesViewProps) { // State to track which episodes are expanded const [expandedEpisodes, setExpandedEpisodes] = useState< Record >({}); const formatSeconds = (s: number): string => { if (!Number.isFinite(s)) return String(s); return s.toFixed(3); }; // Toggle expanded state for an episode const toggleEpisode = (index: number) => { setExpandedEpisodes((prev) => ({ ...prev, [index]: !prev[index], })); }; return (
List of recorded episodes
{/* Header */}
id
time length
frames
{/* Body */} {teleoperatorData && teleoperatorData.length > 0 ? ( teleoperatorData.map((episode: LeRobotEpisode, i: number) => (
{/* Episode row */}
{i}
{formatSeconds(episode.timespan)}
{episode.length}
toggleEpisode(i)} > {expandedEpisodes[i] ? ( ) : ( )}
{/* Frames (collapsible) */} {expandedEpisodes[i] && ( )}
)) ) : (
No episodes recorded yet. Click "Start Recording" to begin.
)}
); }