import React, { useRef, useState, useEffect } from 'react'; import { Eraser, Check } from 'lucide-react'; interface SignatureCaptureProps { onSignatureComplete: (signatureDataUrl: string) => void; width?: number; height?: number; } export const SignatureCapture: React.FC = ({ onSignatureComplete, width = 600, height = 200 }) => { const canvasRef = useRef(null); const [isDrawing, setIsDrawing] = useState(false); const [hasSignature, setHasSignature] = useState(false); // Initialize canvas context useEffect(() => { const canvas = canvasRef.current; if (!canvas) return; const ctx = canvas.getContext('2d'); if (!ctx) return; // Detect theme for stroke color const isDark = document.documentElement.classList.contains('dark'); ctx.strokeStyle = isDark ? '#fafafa' : '#09090b'; ctx.lineWidth = 3; ctx.lineCap = 'round'; ctx.lineJoin = 'round'; // Handle high DPI displays for crisp rendering const dpr = window.devicePixelRatio || 1; canvas.width = width * dpr; canvas.height = height * dpr; canvas.style.width = `${width}px`; canvas.style.height = `${height}px`; ctx.scale(dpr, dpr); }, [width, height]); // Adjust stroke color if theme toggles during active view useEffect(() => { const canvas = canvasRef.current; if (!canvas) return; const ctx = canvas.getContext('2d'); if (!ctx) return; const isDark = document.documentElement.classList.contains('dark'); ctx.strokeStyle = isDark ? '#fafafa' : '#09090b'; }); const startDrawing = (e: React.MouseEvent | React.TouchEvent) => { e.preventDefault(); const canvas = canvasRef.current; if (!canvas) return; const ctx = canvas.getContext('2d'); if (!ctx) return; const rect = canvas.getBoundingClientRect(); let clientX, clientY; if ('touches' in e) { clientX = e.touches[0].clientX; clientY = e.touches[0].clientY; } else { clientX = (e as React.MouseEvent).clientX; clientY = (e as React.MouseEvent).clientY; } ctx.beginPath(); ctx.moveTo(clientX - rect.left, clientY - rect.top); setIsDrawing(true); }; const draw = (e: React.MouseEvent | React.TouchEvent) => { e.preventDefault(); if (!isDrawing) return; const canvas = canvasRef.current; if (!canvas) return; const ctx = canvas.getContext('2d'); if (!ctx) return; const rect = canvas.getBoundingClientRect(); let clientX, clientY; if ('touches' in e) { clientX = e.touches[0].clientX; clientY = e.touches[0].clientY; } else { clientX = (e as React.MouseEvent).clientX; clientY = (e as React.MouseEvent).clientY; } ctx.lineTo(clientX - rect.left, clientY - rect.top); ctx.stroke(); setHasSignature(true); }; const stopDrawing = () => { setIsDrawing(false); }; const clearSignature = () => { const canvas = canvasRef.current; if (!canvas) return; const ctx = canvas.getContext('2d'); if (!ctx) return; ctx.clearRect(0, 0, canvas.width, canvas.height); setHasSignature(false); }; const handleSave = () => { const canvas = canvasRef.current; if (!canvas || !hasSignature) return; const dataUrl = canvas.toDataURL('image/png'); onSignatureComplete(dataUrl); }; return (
{/* Helper Text */} {!hasSignature && (

Draw your signature here

)}
); };