File size: 1,634 Bytes
1a9c884
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import GlassButton from "./GlassButton";
import GlassContainer from "./GlassContainer";
import { GLASS_EFFECTS } from "../constants";

interface WebcamCaptureProps {
  isRunning: boolean;
  onToggleRunning: () => void;
  error?: string | null;
}

export default function WebcamCapture({ isRunning, onToggleRunning, error }: WebcamCaptureProps) {
  const hasError = Boolean(error);
  const [statusText, statusColor, containerBgColor] = hasError
    ? ["Error", "bg-red-500", GLASS_EFFECTS.COLORS.ERROR_BG]
    : isRunning
      ? ["Live", "bg-green-500 animate-pulse", GLASS_EFFECTS.COLORS.DEFAULT_BG]
      : ["Paused", "bg-red-500", GLASS_EFFECTS.COLORS.DEFAULT_BG];

  return (
    <>

      {/* Control buttons - positioned absolutely over the video */}

      <div className="absolute top-4 right-4 flex space-x-2 z-20">

        <GlassButton onClick={onToggleRunning} aria-label={isRunning ? "Pause captioning" : "Resume captioning"}>

          {isRunning ? "Pause" : "Resume"}

        </GlassButton>

      </div>



      {/* Status indicator with glass morphism */}

      <div className="absolute top-4 left-4 z-20">

        <GlassContainer

          bgColor={containerBgColor}

          className="px-3 py-2 rounded-lg"

          role="status"

          aria-label={`Caption status: ${statusText}`}

        >

          <div className="flex items-center space-x-2">

            <div className={`w-2 h-2 rounded-full ${statusColor}`} />

            <span className="text-white text-sm font-medium">{statusText}</span>

          </div>

        </GlassContainer>

      </div>

    </>
  );
}