FastVLMBoxes / src /components /WebcamCapture.tsx
Quazim0t0's picture
Upload 36 files
1a9c884 verified
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>
</>
);
}