From 2433d4e6cfa39e370ee192182fc591e0ca248f45 Mon Sep 17 00:00:00 2001 From: "alan.cl" <1165243776@qq.com> Date: Thu, 5 Mar 2026 12:53:00 +0800 Subject: [PATCH] feat: multi round palyback --- web/pages/share/[token].tsx | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/web/pages/share/[token].tsx b/web/pages/share/[token].tsx index 2d4d8fded..a12fddf89 100644 --- a/web/pages/share/[token].tsx +++ b/web/pages/share/[token].tsx @@ -26,7 +26,7 @@ import { import { Button, Tooltip, message } from 'antd'; import { GetServerSideProps, NextPage } from 'next'; import Head from 'next/head'; -import { useCallback, useEffect, useRef, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; // --------------------------------------------------------------------------- // Types mirroring index.tsx @@ -347,9 +347,26 @@ function useReplayEngine(rounds: ReplayRound[], speed: number, autoPlay = false) for (let ri = stateRef.current.roundIndex; ri < rounds.length; ri++) { const round = rounds[ri]; - // Restore already-finished rounds instantly + // Skip already-finished rounds (defensive: if re-entered after restart) if (ri < stateRef.current.roundIndex) continue; + // If this round's final summary was already shown (e.g. runLoop restarted + // after showing final but before advancing to next round), skip ahead. + if (ri === stateRef.current.roundIndex && stateRef.current.showFinalForRound) { + if (ri < rounds.length - 1) { + await delay(BASE_DELAYS.betweenRounds); + if (!playingRef.current) return; + setState(prev => ({ + ...prev, + roundIndex: ri + 1, + visibleStepCount: 0, + activeStepId: null, + showFinalForRound: false, + })); + } + continue; + } + for (let si = stateRef.current.visibleStepCount; si < round.steps.length; si++) { if (!playingRef.current) return; // paused @@ -485,7 +502,7 @@ const SharePage: NextPage = ({ const [speed, setSpeed] = useState(1); const [rightPanelView, setRightPanelView] = useState('execution'); - const rounds = initMessages ? buildReplayRounds(initMessages) : []; + const rounds = useMemo(() => (initMessages ? buildReplayRounds(initMessages) : []), [initMessages]); const { state, playing, play, pause, jumpToRound, restart } = useReplayEngine(rounds, speed, true); // -------------------------------------------------------------------------