'use client'; import { useEffect } from 'react'; import Link from 'next/link'; import { Button } from '@/components/ui/button'; import { CameraInferenceView } from '@/components/camera/camera-inference-view'; import { InferencePanel } from '@/components/inference/inference-panel'; import { FlashDialog } from '@/components/devices/flash-dialog'; import { useDeviceStore } from '@/stores/device-store'; import { useInferenceStore } from '@/stores/inference-store'; import { useInferenceOptionsStore } from '@/stores/inference-options-store'; import { useInferenceStream } from '@/hooks/use-inference-stream'; import { useCameraStore } from '@/stores/camera-store'; import { useResolvedParams } from '@/hooks/use-resolved-params'; import { api } from '@/lib/api'; export default function WorkspaceClient() { const { deviceId } = useResolvedParams(); const { selectedDevice, fetchDevice } = useDeviceStore(); const { isRunning, setRunning, reset } = useInferenceStore(); const resetInferenceOptions = useInferenceOptionsStore((s) => s.reset); const { isStreaming, sourceType } = useCameraStore(); // For image/video mode, inference runs automatically as part of the pipeline const isMediaMode = sourceType === 'image' || sourceType === 'video' || sourceType === 'batch_image'; // Enable WebSocket stream when inference is running OR when media pipeline is active useInferenceStream(deviceId, isRunning || (isStreaming && isMediaMode)); // Auto-set isRunning when media upload starts streaming useEffect(() => { if (isStreaming && isMediaMode) { setRunning(true); } }, [isStreaming, isMediaMode, setRunning]); const { fetchCameras } = useCameraStore(); useEffect(() => { if (deviceId) { fetchDevice(deviceId); fetchCameras(); } return () => { reset(); // Options are per-session and per-device; leaving them set would apply a // label mapping uploaded for one device to the next one opened. resetInferenceOptions(); }; }, [deviceId, fetchDevice, fetchCameras, reset, resetInferenceOptions]); const handleStartInference = async () => { await api.post(`/devices/${deviceId}/inference/start`); setRunning(true); }; const handleStopInference = async () => { await api.post(`/devices/${deviceId}/inference/stop`); setRunning(false); }; return (