'use client'
import {useState} from 'react'
import PropTypes from 'prop-types'
import Button from '@mui/material/Button'
import CircularProgress from '@mui/material/CircularProgress'
import PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf'
import {formatDate} from '@/lib/format.js'
export default function ExportPdfButton({versionData, size = 'medium', variant = 'outlined'}) {
const [isExporting, setIsExporting] = useState(false)
const handleExportPdf = async () => {
setIsExporting(true)
try {
const {default: jsPDF} = await import('jspdf')
const {default: html2canvas} = await import('html2canvas')
// Créer un élément temporaire avec le contenu formaté
const tempDiv = document.createElement('div')
tempDiv.style.cssText = `
padding: 40px;
font-family: 'Roboto', Arial, sans-serif;
line-height: 1.6;
color: #333;
background-color: white;
width: 210mm;
position: fixed;
top: -9999px;
left: -9999px;
z-index: -1;
`
const authorName = versionData.user_created?.split('-')[0] || 'Système'
const createdAt = new Date(versionData.date_created)
const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000))
const voteStatus = createdAt < threeDaysAgo ? 'fermé' : 'ouvert'
const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f'
tempDiv.innerHTML = `
${versionData.name}
Auteur : @${authorName}
Date de création : ${formatDate(versionData.date_created, 'PPpp')}
Statut du vote :
${voteStatus}
Contenu
${versionData.delta?.contenu || 'Aucun contenu disponible'}
Exporté depuis Konstitisyon.la le ${formatDate(new Date(), 'PPpp')}
`
document.body.append(tempDiv)
// Générer le canvas avec une meilleure qualité
const canvas = await html2canvas(tempDiv, {
scale: 2,
useCORS: true,
allowTaint: true,
backgroundColor: '#ffffff',
width: tempDiv.scrollWidth,
height: tempDiv.scrollHeight
})
tempDiv.remove()
// Créer le PDF
const imgData = canvas.toDataURL('image/png', 1)
const pdf = new jsPDF('p', 'mm', 'a4') // eslint-disable-line new-cap
const pageWidth = pdf.internal.pageSize.getWidth()
const pageHeight = pdf.internal.pageSize.getHeight()
const imgWidth = pageWidth
const imgHeight = (canvas.height * imgWidth) / canvas.width
let heightLeft = imgHeight
let position = 0
// Ajouter la première page
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight)
heightLeft -= pageHeight
// Ajouter des pages supplémentaires si nécessaire
while (heightLeft >= 0) {
position = heightLeft - imgHeight
pdf.addPage()
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight)
heightLeft -= pageHeight
}
// Nom du fichier sécurisé
const fileName = `${versionData.name.replaceAll(/[^a-zA-Z\d\s]/g, '').replaceAll(/\s+/g, '_')}_${formatDate(new Date(), 'yyyy-MM-dd')}.pdf`
pdf.save(fileName)
} catch (error) {
console.error('Erreur lors de l\'export PDF:', error)
} finally {
setIsExporting(false)
}
}
return (
: }
disabled={isExporting}
sx={{
minWidth: size === 'small' ? 'auto' : undefined,
'&:disabled': {
opacity: 0.6
}
}}
onClick={handleExportPdf}
>
{isExporting ? 'Export...' : (size === 'small' ? 'PDF' : 'Exporter PDF')}
)
}
ExportPdfButton.propTypes = {
versionData: PropTypes.object.isRequired,
size: PropTypes.oneOf(['small', 'medium', 'large']),
variant: PropTypes.oneOf(['text', 'outlined', 'contained'])
}