diff --git a/backend/src/index.js b/backend/src/index.js index dfca288..d4cc779 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -256,6 +256,17 @@ io.on('connection', (socket) => { } }); + throttled('poker:sync', async ({ sessionId }) => { + try { + if (!sessionId) return; + const snapshot = await getSessionSnapshot(sessionId, socket.user.jiraCloudId); + if (!snapshot) return; + await emitSessionState(snapshot.session.roomId, sessionId, socket.user.jiraCloudId); + } catch (error) { + console.error('[socket] poker:sync failed:', error); + } + }); + throttled('poker:vote', async ({ sessionId, vote }) => { try { if (!sessionId) { diff --git a/frontend/src/components/PokerRoom.jsx b/frontend/src/components/PokerRoom.jsx index be3022d..6373afa 100644 --- a/frontend/src/components/PokerRoom.jsx +++ b/frontend/src/components/PokerRoom.jsx @@ -29,6 +29,11 @@ export default function PokerRoom({ session, issue, user, members, roomId, onSav const socket = useMemo(() => getSocket(), []); + // Sync current vote state on mount (catches votes cast before this component rendered) + useEffect(() => { + socket.emit('poker:sync', { sessionId: session.id }); + }, [session.id, socket]); + useEffect(() => { function onVoteUpdate(payload) { if (payload.sessionId !== session.id) return; @@ -82,10 +87,6 @@ export default function PokerRoom({ session, issue, user, members, roomId, onSav socket.emit('poker:kick', { roomId, userKey }); } - function handleReveal() { - socket.emit('poker:reveal', { sessionId: session.id }); - } - function handleSave() { const estimate = Number(manualEstimate || suggestedEstimate); if (!Number.isFinite(estimate)) { @@ -184,14 +185,6 @@ export default function PokerRoom({ session, issue, user, members, roomId, onSav ); })} - {votedUserKeys.length > 0 && ( - - )} )}