"use client" import { ArrowLeftIcon, ChevronLeft } from "lucide-react" import Link from "next/link" import { Drawer, DrawerContent, DrawerTrigger } from "@/components/ui/drawer" import { Button } from "@/components/ui/button" import Image from "next/image" import { useEffect, useState } from "react" import { socket } from "@/components/socket" import { usePlateStore } from "@/components/zustand/plate-history" import { Spinner } from "@/components/ui/spinner" const stream_dummy = [ { id: "asssd", url: "/app/static/uploads/ds1.mp4" }, { id: "asaggssd", url: "/app/static/uploads/ds2.mp4" }, { id: "asss112d", url: "/app/static/uploads/ds3.mp4" }, { id: "asgsasssd", url: "/app/static/uploads/ds4.mp4" }, ] export default function Etle() { const [sessionId, setSessionId] = useState(null) const [imageSrc, setImageSrc] = useState("") const [plate, setPlate] = useState("") const [confidence, setConfidence] = useState(null) const activeStream = usePlateStore((s) => s.activeStreamId) const setActiveStream = usePlateStore((s) => s.setActiveStream) const history = usePlateStore((s) => s.history) const addPlate = usePlateStore((s) => s.addPlate) const [loading, setLoading] = useState(true) const currentStream = usePlateStore.getState().activeStreamId const startDetection = (index: number) => { setLoading(true) if (history[activeStream]) setPlate("") setConfidence(null) const stream = stream_dummy[index].url socket.emit("stop_detection") socket.emit("start_detection", { stream_url: stream, }) setTimeout(() => { setLoading(false) }, 2000) } useEffect(() => { if (!socket.connected) { socket.connect() } socket.on("connected", (data) => { setSessionId(data.session_id) const stream = stream_dummy.find((a) => a.id == currentStream) setActiveStream(currentStream) socket.emit("start_detection", { stream_url: stream?.url ?? stream_dummy[0].url, }) setTimeout(() => { setLoading(false) }, 2000) }) socket.on("video_frame", (data) => { const thumb = `data:image/jpeg;base64,${data.frame}` setImageSrc(thumb) }) socket.on("plate_detected", (data) => { setPlate(data.plate_text) setConfidence(data.confidence ?? null) const thumb = `data:image/jpeg;base64,${data.frame_thumb}` if (!currentStream) return addPlate(currentStream, { imgThumb: thumb, plate: data.plate_text, confidence: data.confidence, }) }) socket.on("error", (data) => { console.error(data.message) }) socket.on("detection_stopped", (data) => { console.log("Selesai. Total:", data.total) }) return () => { socket.emit("stop_detection") socket.removeAllListeners() socket.disconnect() } }, []) const [hasMounted, setHasMounted] = useState(false) useEffect(() => { setHasMounted(true) }, []) if (!hasMounted) { return null } return (

ETLE Toll

TRAFFIC VIOLATIONS

now {currentStream}

{stream_dummy.map((stream, index) => ( ))}
{loading ? (
) : ( imageSrc && ( Realtime ) )}

VIOLATIONS

{plate ? `Plat ${plate} terdeteksi dengan confidence ${confidence}` : "Menunggu deteksi..."}

Total Image: {history[activeStream]?.length}
{" "} {history[currentStream]?.map((item, index) => (
{"image"

Plate : {item.plate}

Confidence: {item.confidence}

))}
) }