diff --git a/packages/studio/src/App.tsx b/packages/studio/src/App.tsx index 1d49671fa..fff17410e 100644 --- a/packages/studio/src/App.tsx +++ b/packages/studio/src/App.tsx @@ -261,6 +261,7 @@ export function StudioApp() { const { syncPreviewTimelineHotkey, syncPreviewHistoryHotkey } = appHotkeys; const handlePreviewIframeRef = useCallback( (iframe: HTMLIFrameElement | null) => { + if (previewIframeRef.current === iframe) return; previewIframeRef.current = iframe; setPreviewIframe(iframe); syncPreviewTimelineHotkey(iframe); diff --git a/packages/studio/src/components/nle/NLELayout.tsx b/packages/studio/src/components/nle/NLELayout.tsx index a452de73c..1c3902474 100644 --- a/packages/studio/src/components/nle/NLELayout.tsx +++ b/packages/studio/src/components/nle/NLELayout.tsx @@ -234,9 +234,11 @@ export const NLELayout = memo(function NLELayout({ const currentLevel = compositionStack[compositionStack.length - 1]; const directUrl = compositionStack.length > 1 ? currentLevel.previewUrl : undefined; + const onIframeRefRef = useRef(onIframeRef); + onIframeRefRef.current = onIframeRef; useEffect(() => { - onIframeRef?.(iframeRef.current); - }, [compositionStack.length, onIframeRef, refreshKey, iframeRef]); + onIframeRefRef.current?.(iframeRef.current); + }, [compositionStack.length, refreshKey, iframeRef]); // Save master seek position before drilling down so we can restore it on back-navigation. // saveSeekPosition() sets pendingSeekRef in useTimelinePlayer which onIframeLoad reads.