import React, { useEffect, useState } from 'react'; import { AiOutlineClose, AiOutlineUpload, AiOutlineEdit } from 'react-icons/ai'; import { MdImage, MdCloudUpload } from 'react-icons/md'; import api from '../../../config/api'; import DrawSignatureCanvas from './DrawSignatureCanvas'; import { FaSpinner } from "react-icons/fa"; import { GrCheckboxSelected } from "react-icons/gr"; interface AddSignatureModalProps { setShowAddSignature?: (value: boolean) => void; getAllSignatures: () => Promise; } interface Account { id: number; isDefault: boolean; name: string; } interface UserData { id: string; firstName: string; lastName: string; email: string; language: string; account: Account; } interface SelectStyle { id: number, style: string } const AddSignatureModal: React.FC = ({ setShowAddSignature , getAllSignatures }) => { const [activeTab, setActiveTab] = useState<'SELECT' | 'DRAW' | 'UPLOAD'>('SELECT'); const [fullName, setFullName] = useState(''); const [initials, setInitials] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [signatures, setSignatures] = useState<{ fullSignature: string | null; initials: string | null; }>({ fullSignature: null, initials: null }); const signatureOptions = [ { id: 1, name: 'print', initials: 'LA', style: 'print' }, { id: 2, name: 'cursive', initials: 'LA', style: 'cursive' }, { id: 3, name: 'script', initials: 'LA', style: 'script' }, { id: 4, name: 'elegant', initials: 'LA', style: 'elegant' }, { id: 5, name: 'modern', initials: 'LA', style: 'modern' }, { id: 6, name: 'classic', initials: 'LA', style: 'classic' }, ]; const [selectedSignature, setSelectedSignature] = useState( signatureOptions.length > 0 ? { id: signatureOptions[0].id, style: signatureOptions[0].style } : { id: 0, style: "" } ); // Store the actual file const [file1, setFile1] = useState(null); const [file2, setFile2] = useState(null); // Store the preview URL const [preview1, setPreview1] = useState(null); const [preview2, setPreview2] = useState(null); //user const [user, setUser] = useState({ id: "", firstName: "", lastName: "", email: "", language: "", account: { id: 0, isDefault: false, name: "", }, }); // Navigation items const navigationItems = [ { id: 'SELECT', label: 'SELECT', icon: }, { id: 'DRAW', label: 'DRAW', icon: }, { id: 'UPLOAD', label: 'UPLOAD', icon: }, ]; console.log("signatures", signatures) const handleSignatureChange = (data: { fullSignature: string | null; initials: string | null }) => { setSignatures(data); }; console.log("activeTab", activeTab) console.log("selectedSignature", selectedSignature); console.log('file1', file1) console.log("file1", file2) // Cleanup preview URLs when component unmounts or image changes useEffect(() => { return () => { if (preview1) URL.revokeObjectURL(preview1); if (preview2) URL.revokeObjectURL(preview2); }; }, [preview1, preview2]); const handleImageChange = async ( e: React.ChangeEvent, setFile: React.Dispatch>, setPreview: React.Dispatch>, type: "fullSignature" | "initials" ) => { const file = e.target.files?.[0]; if (file) { setFile(file); const previewUrl = URL.createObjectURL(file); setPreview(previewUrl); // Convert to base64 const base64 = await convertToBase64(file); // Update the appropriate signature setSignatures((prev) => ({ ...prev, [type]: base64, })); } }; const convertToBase64 = (file: File): Promise => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result as string); reader.onerror = (error) => reject(error); }); }; const handleSubmit = async () => { setIsSubmitting(true) if (!signatures.fullSignature || !signatures.initials) { alert('Please provide both signature and initials'); return; } try { const payload = { signatureType: activeTab, // "signatureId": 0, this work on only the put req. signatureBase64: signatures.fullSignature, initialsBase64: signatures.initials, firstName: user.firstName, lastName: user.lastName, font: selectedSignature.style }; console.log('Submitting Signature:', payload); let res = await api.post(`/api/user/signatures`, payload) console.log("handleSubmit", res) if (res?.data) { getAllSignatures() setShowAddSignature?.(false) } } catch (error) { console.error("Error fetching user details:", error); } finally { setIsSubmitting(false) } }; const renderContent = () => { switch (activeTab) { case 'SELECT': return (

Choose Signature Style

Select from pre-designed signature styles

{signatureOptions.map((option) => (
setSelectedSignature({ id: option.id, style: option.style })} className="w-4 h-4 text-blue-600 focus:ring-blue-500" />
Signed by:
{fullName || option.name}
dca3e646-62cd-4cc...
DS
{initials || option.initials}
))}
); case 'DRAW': return ( ); case 'UPLOAD': return (

Upload Signature

{/* Upload 1 */}
handleImageChange(e, setFile1, setPreview1, "fullSignature")} />
{/* Upload 2 */}
handleImageChange(e, setFile2, setPreview2, "initials")} />
); default: return null; } }; const getUserDetails = async () => { try { let res = await api.get(`/api/user/details`) console.log("getuser", res) let currUser = res?.data setUser(currUser) setFullName(currUser.firstName + " " + currUser.lastName) setInitials(currUser.firstName.slice(0, 1) + currUser.lastName.slice(0, 1)) } catch (error) { console.error("Error fetching user details:", error); } } useEffect(() => { getUserDetails() }, []) return (
{/* Sidebar Navigation */}
{/* Header */}

Add Signature

Create your digital signature

{/* Form Inputs */}
setFullName(e.target.value)} placeholder="Enter full name" className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
setInitials(e.target.value)} placeholder="Enter initials" className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Navigation Menu */}
{/* Main Content Area */}
{/* Header with close button */} {/* Content */}
{/* */} {renderContent()}
{/* Footer Buttons in Main Area */}
); }; export default AddSignatureModal;