import Box from '@mui/material/Box' import Typography from '@mui/material/Typography' import Paper from '@mui/material/Paper' import Grid from '@mui/material/Grid' import Chip from '@mui/material/Chip' import PropTypes from 'prop-types' import Snackbar from '@mui/material/Snackbar' import Alert from '@mui/material/Alert' import ThumbUpIcon from '@mui/icons-material/ThumbUp' import ThumbDownIcon from '@mui/icons-material/ThumbDown' import {useState, useEffect} from 'react' import {useSession} from 'next-auth/react' import MarkdownRenderer from '../markdown-renderer/index.js' import VoteButtons from './vote-buttons.js' import CopyButton from './copy-button.js' import {formatDate} from '@/lib/format.js' import {getVoteCounts} from '@/lib/directus.js' export default function VersionComparison({versionData, versionCompare, voteRefreshKey = 0, onVoteResult}) { const {data: session} = useSession() const {current, main, outdated} = versionCompare const [snackbar, setSnackbar] = useState({open: false, message: '', severity: 'success'}) const [voteCounts, setVoteCounts] = useState({positive: 0, negative: 0, total: 0}) useEffect(() => { async function fetchVoteCounts() { if (session?.user?.accessToken && versionCompare?.versionId) { const counts = await getVoteCounts({ accessToken: session.user.accessToken, versionId: versionCompare.versionId }) setVoteCounts(counts) } } fetchVoteCounts() }, [session?.user?.accessToken, versionCompare?.versionId, voteRefreshKey]) const handleVoteResult = async result => { if (result.success && session?.user?.accessToken && versionCompare?.versionId) { const counts = await getVoteCounts({ accessToken: session.user.accessToken, versionId: versionCompare.versionId }) setVoteCounts(counts) } if (onVoteResult) { // Use the parent's vote result handler if provided onVoteResult(result) } else { // Fallback to local snackbar if no parent handler setSnackbar({ open: true, message: result.message, severity: result.success ? 'success' : 'error' }) } } const handleCloseSnackbar = () => { setSnackbar(prev => ({...prev, open: false})) } const createdAt = new Date(versionData.date_created) const threeDaysAgo = new Date(Date.now() - (3 * 24 * 60 * 60 * 1000)) const isExpired = createdAt < threeDaysAgo const isVoteDisabled = isExpired || outdated return ( ( {children} )} /> @{main.user_created?.split('-')[0] || 'Système'} ( {children} )} /> @{versionData.user_created?.split('-')[0] || 'Système'} {versionData && ( {formatDate(versionData.date_created)} )} } label={voteCounts.positive} size='small' color='success' variant='outlined' /> } label={voteCounts.negative} size='small' color='error' variant='outlined' /> = 0 ? '+' : ''}${voteCounts.total}`} size='small' color={voteCounts.total > 0 ? 'success' : (voteCounts.total < 0 ? 'error' : 'default')} /> LÉGENDE Version de référence En cours de révision Remplacée / Publiée {!onVoteResult && ( {snackbar.message} )} ) } VersionComparison.propTypes = { versionData: PropTypes.object, versionCompare: PropTypes.shape({ outdated: PropTypes.bool.isRequired, mainHash: PropTypes.string.isRequired, current: PropTypes.object.isRequired, main: PropTypes.object.isRequired, versionId: PropTypes.string }).isRequired, voteRefreshKey: PropTypes.number, onVoteResult: PropTypes.func }