'use client' import {useState} from 'react' import PropTypes from 'prop-types' import Button from '@mui/material/Button' import CircularProgress from '@mui/material/CircularProgress' import Snackbar from '@mui/material/Snackbar' import Alert from '@mui/material/Alert' import PrintIcon from '@mui/icons-material/Print' import {formatDate} from '@/lib/format.js' // Helper function to render markdown to HTML (reused from PDF export) const renderMarkdownToHtml = async content => { if (!content) { return 'Aucun contenu disponible' } // Check if content contains markdown syntax const hasMarkdown = content.includes('**') || content.includes('*') || content.includes('#') || content.includes('[') || content.includes('`') || content.includes('> ') || content.includes('- ') || content.includes('1. ') if (!hasMarkdown) { // Simple text with line breaks return content.replaceAll('\n', '
') } try { // Dynamic import of markdown parser const {marked} = await import('marked') // Configure marked for better print rendering marked.setOptions({ breaks: true, // Convert \n to
gfm: true, // GitHub flavored markdown headerIds: false, // No header IDs needed for print mangle: false // Don't mangle email addresses }) return marked(content) } catch (error) { console.warn('Failed to parse markdown, falling back to plain text:', error) return content.replaceAll('\n', '
') } } export default function PrintButton({versionData, isOutdated = false, size = 'medium', variant = 'outlined'}) { const [isPrinting, setIsPrinting] = useState(false) const [snackbar, setSnackbar] = useState({open: false, message: '', severity: 'success'}) const handlePrint = async () => { setIsPrinting(true) try { // Calculate vote status 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 isExpired = createdAt < threeDaysAgo const voteStatus = (isExpired || isOutdated) ? 'fermé' : 'ouvert' const voteColor = voteStatus === 'ouvert' ? '#2e7d32' : '#d32f2f' // Render markdown content to HTML const renderedContent = await renderMarkdownToHtml(versionData.delta?.contenu) // Create print window const printWindow = window.open('', '_blank', 'width=800,height=600') if (!printWindow) { throw new Error('Impossible d\'ouvrir la fenêtre d\'impression. Vérifiez que les popups ne sont pas bloqués.') } // Build print-optimized HTML const printHtml = ` ${versionData.name} - Konstitisyon.nu

${versionData.name}

Auteur : @${authorName}
Date de création : ${formatDate(versionData.date_created, 'PPpp')}
Statut du vote : ${voteStatus}

Contenu

${renderedContent}
` printWindow.document.write(printHtml) printWindow.document.close() // Auto-focus the print window printWindow.focus() setSnackbar({ open: true, message: 'Fenêtre d\'impression ouverte', severity: 'success' }) } catch (error) { console.error('Erreur lors de l\'impression:', error) setSnackbar({ open: true, message: error.message || 'Une erreur est survenue lors de l\'impression', severity: 'error' }) } finally { setIsPrinting(false) } } const handleCloseSnackbar = () => { setSnackbar(prev => ({...prev, open: false})) } return ( <> {snackbar.message} ) } PrintButton.propTypes = { versionData: PropTypes.object.isRequired, isOutdated: PropTypes.bool, size: PropTypes.oneOf(['small', 'medium', 'large']), variant: PropTypes.oneOf(['text', 'outlined', 'contained']) }