import React, { useState, useEffect } from 'react'; const Base64Converter = ({ addToMessage, sharedInput, setSharedInput }) => { const [output, setOutput] = useState(''); const [copied, setCopied] = useState(false); const [toBase64, setToBase64] = useState(true); const [hasError, setHasError] = useState(false); const convertToBase64 = (text) => { try { // Handle unicode characters const encoded = btoa(unescape(encodeURIComponent(text))); setOutput(encoded); setHasError(false); } catch (error) { setOutput('Error: Invalid input for Base64 encoding.'); setHasError(true); } }; const convertFromBase64 = (base64) => { try { // Handle unicode characters const decoded = decodeURIComponent(escape(atob(base64))); setOutput(decoded); setHasError(false); } catch (error) { setOutput('Error: Invalid Base64 string.'); setHasError(true); } }; const handleInputChange = (e) => { const newText = e.target.value; // Limit input to 50,000 characters to prevent performance issues if (newText.length > 50000) { return; } setSharedInput(newText); if (toBase64) { convertToBase64(newText); } else { convertFromBase64(newText); } }; // Recalculate output when component mounts or sharedInput changes from another converter useEffect(() => { if (sharedInput) { if (toBase64) { convertToBase64(sharedInput); } else { convertFromBase64(sharedInput); } } else { setOutput(''); setHasError(false); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [sharedInput, toBase64]); const copyToClipboard = () => { navigator.clipboard.writeText(output); setCopied(true); setTimeout(() => setCopied(false), 2000); }; const swapConversion = () => { const oldInput = sharedInput; setSharedInput(output); setOutput(oldInput); setToBase64(!toBase64); }; return (

🔐 Base64 Converter