"use client" import { useState, useEffect, useCallback } from "react" import { useRouter, useParams } from "next/navigation" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Loader2, TrendingUp } from "lucide-react" import { PageHeader } from "@/components/page-header" import { PoweredBy } from "@/components/powered-by" import { loadSession, } from "@/lib/api" import { SessionContext } from "@/types" import { ROUTES } from "@/utils/routes" import { Button } from "@/components/ui/button" const API_URL = process.env.NEXT_PUBLIC_API_URL const WS_URL = API_URL?.replace(/^https:\/\//, "wss://").replace(/^http:\/\//, "ws://") export default function VideoProcessingPage() { const router = useRouter() const { videoId } = useParams() as { videoId: string } const [session, setSession] = useState(null) const [isLoading, setIsLoading] = useState(true) // Processing states const [progress, setProgress] = useState(0) const [statusMessage, setStatusMessage] = useState("Initializing...") const [error, setError] = useState(null) const connectWebSocket = useCallback((vid: string) => { const ws = new WebSocket(`${WS_URL}/ws/${vid}`) ws.onmessage = async (event) => { const data = JSON.parse(event.data) if (data.type === "progress" || data.progress !== undefined) { setProgress(data.progress || 0) let message = data.message || "Processing..." if (data.unique_potholes !== undefined) { message += ` | Unique: ${data.unique_potholes} | Total: ${data.total_detections || 0}` } else if (data.unique_signboards !== undefined) { message += ` | Unique: ${data.unique_signboards} | Total: ${data.total_detections || 0}` } setStatusMessage(message) } if (data.type === "complete" || data.status === "completed") { setStatusMessage("Processing completed! Finalizing...") ws.close() // Navigate to results setTimeout(() => router.push(`/results/${vid}`), 1000) } if (data.type === "error") { setError("Error: " + data.message) setStatusMessage("") ws.close() } } ws.onerror = () => { setStatusMessage("Connection lost. Reconnecting...") setTimeout(() => connectWebSocket(vid), 3000) } return ws }, [router]) useEffect(() => { const storedSession = loadSession() setSession(storedSession) const checkStatus = async () => { try { const response = await fetch(`${API_URL}/status/${videoId}`, { headers: { "ngrok-skip-browser-warning": "true" } }) if (response.status === 404) { router.replace(ROUTES.UPLOAD) return } if (!response.ok) { throw new Error("Failed to fetch status") } const statusData = await response.json() if (statusData.status === "completed") { router.replace(`/results/${videoId}`) return } if (statusData.status === "error") { setError(statusData.message || "An error occurred during processing.") setIsLoading(false) return } // If processing, start WebSocket setProgress(statusData.progress || 0) setStatusMessage(statusData.message || "Resuming processing...") connectWebSocket(videoId) setIsLoading(false) } catch (err) { console.error("Status check failed:", err) setError("Failed to connect to server.") setIsLoading(false) } } if (videoId) { checkStatus() } }, [videoId, router, connectWebSocket]) if (isLoading) { return (
) } return (
{session && (
Project {session.projectName}
Package {session.packageName}
Location {session.locationName}
)}

Processing Analysis

ID: {videoId}

Progress {progress}%

{statusMessage}

{error && (

{error}

)}
) }