import React, { useState, useEffect, useRef } from 'react' import { visionApi } from '../services/api' interface CameraPreviewModalProps { cameraName: string isOpen: boolean onClose: () => void onError?: (error: string) => void } export const CameraPreviewModal: React.FC = ({ cameraName, isOpen, onClose, onError, }) => { const [loading, setLoading] = useState(false) const [streaming, setStreaming] = useState(false) const [error, setError] = useState(null) const imgRef = useRef(null) const streamUrlRef = useRef(null) useEffect(() => { if (isOpen && cameraName) { startStreaming() } return () => { if (streaming) { stopStreaming() } } }, [isOpen, cameraName]) const startStreaming = async () => { try { setLoading(true) setError(null) const result = await visionApi.startStream(cameraName) if (result.success) { setStreaming(true) const streamUrl = visionApi.getStreamUrl(cameraName) streamUrlRef.current = streamUrl if (imgRef.current) { imgRef.current.src = `${streamUrl}?t=${Date.now()}` } } else { throw new Error(result.message) } } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Failed to start stream' setError(errorMessage) onError?.(errorMessage) } finally { setLoading(false) } } const stopStreaming = async () => { try { if (streaming) { await visionApi.stopStream(cameraName) setStreaming(false) streamUrlRef.current = null if (imgRef.current) { imgRef.current.src = '' } } } catch (err) { console.error('Error stopping stream:', err) } } const handleClose = () => { stopStreaming() onClose() } if (!isOpen) return null return (
e.stopPropagation()}> {/* Close Button */}
{/* Header */}

Camera Preview: {cameraName}

{/* Content */}
{loading && (

Starting camera stream...

)} {error && (

Stream Error

{error}

)} {streaming && !loading && !error && (
{`Live setError('Failed to load camera stream')} />
)}
{/* Footer */}
{streaming && (
Live Stream Active
)}
) }