"use client"; import React, { useRef, useState, useCallback, useEffect } from 'react'; import Webcam from 'react-webcam'; import { Card, CardBody } from '@nextui-org/card'; import { Button } from '@nextui-org/button'; import screenfull from 'screenfull'; const TrashScanner: React.FC = () => { const webcamRef = useRef(null); const canvasRef = useRef(null); const [isDrawing, setIsDrawing] = useState(false); const [startPos, setStartPos] = useState({ x: 0, y: 0 }); const [endPos, setEndPos] = useState({ x: 0, y: 0 }); const containerRef = useRef(null); //canvas size const setCanvasSize = useCallback(() => { const video = webcamRef.current?.video; const canvas = canvasRef.current; if (video && canvas) { canvas.width = video.videoWidth; canvas.height = video.videoHeight; } }, []); // listener to set canvas size when video is ready useEffect(() => { const video = webcamRef.current?.video; if (video) { video.addEventListener('loadedmetadata', setCanvasSize); } return () => { if (video) { video.removeEventListener('loadedmetadata', setCanvasSize); } }; }, [setCanvasSize]); const handleMouseDown = useCallback((e: React.MouseEvent) => { const canvas = canvasRef.current; if (!canvas) return; const rect = canvas.getBoundingClientRect(); const scaleX = canvas.width / rect.width; const scaleY = canvas.height / rect.height; const x = (e.clientX - rect.left) * scaleX; const y = (e.clientY - rect.top) * scaleY; setIsDrawing(true); setStartPos({ x, y }); setEndPos({ x, y }); }, []); const handleMouseMove = useCallback((e: React.MouseEvent) => { if (!isDrawing) return; const canvas = canvasRef.current; if (!canvas) return; const rect = canvas.getBoundingClientRect(); const scaleX = canvas.width / rect.width; const scaleY = canvas.height / rect.height; const x = (e.clientX - rect.left) * scaleX; const y = (e.clientY - rect.top) * scaleY; setEndPos({ x, y }); }, [isDrawing]); const handleMouseUp = useCallback(() => { setIsDrawing(false); }, []); const drawBox = useCallback(() => { const canvas = canvasRef.current; const ctx = canvas?.getContext('2d'); if (!ctx || !canvas) return; ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.strokeStyle = 'red'; ctx.lineWidth = 2; ctx.strokeRect( Math.min(startPos.x, endPos.x), Math.min(startPos.y, endPos.y), Math.abs(endPos.x - startPos.x), Math.abs(endPos.y - startPos.y) ); }, [startPos, endPos]); React.useEffect(() => { drawBox(); }, [drawBox]); const toggleFullScreen = useCallback(() => { if (containerRef.current && screenfull.isEnabled) { screenfull.toggle(containerRef.current); } }, []); return (

Trash Scanner

); }; export default TrashScanner;