diff --git a/apps/demo/src/pages/DemoPage.tsx b/apps/demo/src/pages/DemoPage.tsx index e25322a..d9d23ff 100644 --- a/apps/demo/src/pages/DemoPage.tsx +++ b/apps/demo/src/pages/DemoPage.tsx @@ -21,6 +21,7 @@ type PerfMetrics = { export default function DemoPage() { const [state, setState] = useState(INITIAL_STATE); + const [isPreparing, setIsPreparing] = useState(false); const [metrics, setMetrics] = useState({ prepareTime: null, commitTime: null, @@ -32,19 +33,38 @@ export default function DemoPage() { const dataset = useMemo(() => getDatasetByKey(state.dataset), [state.dataset]); - const diffData = useMemo(() => { - const prepareStart = performance.now(); - const data = generateDiffText(dataset.lines); - const prepareEnd = performance.now(); - - prepareEndRef.current = prepareEnd; + const [diffData, setDiffData] = useState(() => { + const initialDataset = getDatasetByKey(INITIAL_STATE.dataset); + return generateDiffText(initialDataset.lines); + }); - setMetrics((previous) => ({ - ...previous, - prepareTime: prepareEnd - prepareStart, - })); + useEffect(() => { + let cancelled = false; + const prepareStart = performance.now(); - return data; + setIsPreparing(true); + + const timer = window.setTimeout(() => { + const data = generateDiffText(dataset.lines); + const prepareEnd = performance.now(); + + if (cancelled) { + return; + } + + prepareEndRef.current = prepareEnd; + setDiffData(data); + setMetrics((previous) => ({ + ...previous, + prepareTime: prepareEnd - prepareStart, + })); + setIsPreparing(false); + }, 0); + + return () => { + cancelled = true; + window.clearTimeout(timer); + }; }, [dataset.lines]); const updateStateWithPerfStart = (nextState: DemoState) => { @@ -59,6 +79,10 @@ export default function DemoPage() { }; useLayoutEffect(() => { + if (isPreparing) { + return; + } + const interactionStart = interactionStartRef.current; if (interactionStart === null) { @@ -73,7 +97,7 @@ export default function DemoPage() { commitTime: prepareEnd === null ? null : commitMoment - prepareEnd, totalTime: commitMoment - interactionStart, })); - }, [diffData, state.contextLines, state.height]); + }, [diffData, state.contextLines, state.height, isPreparing]); useEffect(() => { if (interactionStartRef.current === null) { @@ -117,13 +141,23 @@ export default function DemoPage() { -
+
+ {isPreparing ? ( +
+ +

Preparing diff data…

+

+ Large datasets like 100k lines can take a while. The viewer will update + automatically when preparation is complete. +

+
+ ) : null}
@@ -139,4 +173,4 @@ export default function DemoPage() { ); -} \ No newline at end of file +} diff --git a/apps/demo/src/styles.css b/apps/demo/src/styles.css index 5c6276c..df85683 100644 --- a/apps/demo/src/styles.css +++ b/apps/demo/src/styles.css @@ -367,6 +367,15 @@ select { padding: 24px; } +.viewer-loading--overlay { + position: absolute; + inset: 0; + min-height: 0; + margin: 0; + background: rgba(2, 6, 23, 0.8); + backdrop-filter: blur(2px); +} + .viewer-loading__spinner { width: 36px; height: 36px; @@ -390,4 +399,4 @@ select { to { transform: rotate(360deg); } -} \ No newline at end of file +}