From db8b5dd1c2c53bf91c962c1585200cd206b509f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Wed, 23 Jul 2025 20:13:07 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20synchronis=C3=A9=20votes=20entre=20head?= =?UTF-8?q?er=20et=20comparaison?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - État voteRefreshKey partagé pour forcer refresh des VoteButtons - Props onVoteResult passées à VersionComparison - Clés uniques pour chaque VoteButtons (header/comparison) - Snackbar local dans VersionComparison si pas de callback parent --- components/versions/version-comparison.js | 49 +++++++++++++++-------- components/versions/version-page.js | 11 ++++- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/components/versions/version-comparison.js b/components/versions/version-comparison.js index 54c3f94..8c6222a 100644 --- a/components/versions/version-comparison.js +++ b/components/versions/version-comparison.js @@ -11,16 +11,22 @@ import VoteButtons from './vote-buttons.js' import CopyButton from './copy-button.js' import {formatDate} from '@/lib/format.js' -export default function VersionComparison({versionData, versionCompare}) { +export default function VersionComparison({versionData, versionCompare, voteRefreshKey = 0, onVoteResult}) { const {current, main, outdated} = versionCompare const [snackbar, setSnackbar] = useState({open: false, message: '', severity: 'success'}) const handleVoteResult = result => { - setSnackbar({ - open: true, - message: result.message, - severity: result.success ? 'success' : 'error' - }) + 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 = () => { @@ -117,7 +123,12 @@ export default function VersionComparison({versionData, versionCompare}) { hasSnackbarVisible={false} /> - + )} @@ -177,16 +188,18 @@ export default function VersionComparison({versionData, versionCompare}) { - - - {snackbar.message} - - + {!onVoteResult && ( + + + {snackbar.message} + + + )} ) } @@ -200,4 +213,6 @@ VersionComparison.propTypes = { main: PropTypes.object.isRequired, versionId: PropTypes.string }).isRequired, + voteRefreshKey: PropTypes.number, + onVoteResult: PropTypes.func } diff --git a/components/versions/version-page.js b/components/versions/version-page.js index f5e450d..e7a0836 100644 --- a/components/versions/version-page.js +++ b/components/versions/version-page.js @@ -36,6 +36,7 @@ export default function VersionPage({session, versionId, viewMode}) { const [error, setError] = useState('') const [isErrorAlertOpen, setIsErrorAlertOpen] = useState(false) const [snackbar, setSnackbar] = useState({open: false, message: '', severity: 'success'}) + const [voteRefreshKey, setVoteRefreshKey] = useState(0) useEffect(() => { async function fetchVersionData() { @@ -88,6 +89,8 @@ export default function VersionPage({session, versionId, viewMode}) { message: result.message, severity: result.success ? 'success' : 'error' }) + // Force refresh of both VoteButtons components by changing the key + setVoteRefreshKey(prev => prev + 1) } const handleCloseSnackbar = () => { @@ -223,7 +226,11 @@ export default function VersionPage({session, versionId, viewMode}) { label='Copier le contenu de cette version' /> {!isVoteDisabled && ( - + )} @@ -234,6 +241,8 @@ export default function VersionPage({session, versionId, viewMode}) { ) : (