File size: 2,570 Bytes
4384839
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
"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[];
}

export function TeleoperatorEpisodesView({ teleoperatorData }: TeleoperatorEpisodesViewProps) {
  // State to track which episodes are expanded
  const [expandedEpisodes, setExpandedEpisodes] = useState<Record<number, boolean>>({});
  
  // Toggle expanded state for an episode
  const toggleEpisode = (index: number) => {
    setExpandedEpisodes(prev => ({
      ...prev,
      [index]: !prev[index]
    }));
  };
  
  return (
    <div className="flex flex-col gap-2">
      <div className="text-sm text-center text-muted-foreground mb-2">List of recorded episodes</div>
      <div className="flex flex-col gap-1">
        {/* Header */}
        <div className="flex flex-row font-medium text-sm">
          <div className="flex-1 px-4 py-2">id</div>
          <div className="flex-1 px-4 py-2">time length</div>
          <div className="flex-1 px-4 py-2">frames</div>
        </div>
        
        {/* Body */}
        {teleoperatorData && teleoperatorData.length > 0 ? (
          teleoperatorData.map((episode: LeRobotEpisode, i: number) => (
            <div key={i} className="flex flex-col border-t border-gray-700">
              {/* Episode row */}
              <div className="flex flex-row">
                <div className="flex-1 px-4 py-2 font-mono">{i}</div>
                <div className="flex-1 px-4 py-2 font-mono">{episode.timespan}</div>
                <div className="flex-1 px-4 py-2 font-mono">{episode.length}</div>
                <div className="px-4 py-2 cursor-pointer" onClick={() => toggleEpisode(i)}>
                  {expandedEpisodes[i] ? 
                    <Button>hide frames</Button> : 
                    <Button>show frames</Button>}
                </div>
              </div>
              
              {/* Frames (collapsible) */}
              {expandedEpisodes[i] && (
                <TeleoperatorFramesView frames={episode.frames} />
              )}
            </div>
          ))
        ) : (
          <div className="flex flex-row border-t border-gray-700">
            <div 
              className="flex-1 px-4 py-4 text-center text-muted-foreground"
            >
              No episodes recorded yet. Click "Start Recording" to begin.
            </div>
          </div>
        )}
      </div>
    </div>
  );
}