Skip to content

Commit e8f0b6a

Browse files
Merge pull request #8 from Zhang-JiahangH/codex/add-loading-state-for-demo
feat(demo): show loading overlay during large diff preparation
2 parents 8c87be2 + de82fde commit e8f0b6a

File tree

2 files changed

+58
-15
lines changed

2 files changed

+58
-15
lines changed

apps/demo/src/pages/DemoPage.tsx

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type PerfMetrics = {
2121

2222
export default function DemoPage() {
2323
const [state, setState] = useState<DemoState>(INITIAL_STATE);
24+
const [isPreparing, setIsPreparing] = useState(false);
2425
const [metrics, setMetrics] = useState<PerfMetrics>({
2526
prepareTime: null,
2627
commitTime: null,
@@ -32,19 +33,38 @@ export default function DemoPage() {
3233

3334
const dataset = useMemo(() => getDatasetByKey(state.dataset), [state.dataset]);
3435

35-
const diffData = useMemo(() => {
36-
const prepareStart = performance.now();
37-
const data = generateDiffText(dataset.lines);
38-
const prepareEnd = performance.now();
39-
40-
prepareEndRef.current = prepareEnd;
36+
const [diffData, setDiffData] = useState(() => {
37+
const initialDataset = getDatasetByKey(INITIAL_STATE.dataset);
38+
return generateDiffText(initialDataset.lines);
39+
});
4140

42-
setMetrics((previous) => ({
43-
...previous,
44-
prepareTime: prepareEnd - prepareStart,
45-
}));
41+
useEffect(() => {
42+
let cancelled = false;
43+
const prepareStart = performance.now();
4644

47-
return data;
45+
setIsPreparing(true);
46+
47+
const timer = window.setTimeout(() => {
48+
const data = generateDiffText(dataset.lines);
49+
const prepareEnd = performance.now();
50+
51+
if (cancelled) {
52+
return;
53+
}
54+
55+
prepareEndRef.current = prepareEnd;
56+
setDiffData(data);
57+
setMetrics((previous) => ({
58+
...previous,
59+
prepareTime: prepareEnd - prepareStart,
60+
}));
61+
setIsPreparing(false);
62+
}, 0);
63+
64+
return () => {
65+
cancelled = true;
66+
window.clearTimeout(timer);
67+
};
4868
}, [dataset.lines]);
4969

5070
const updateStateWithPerfStart = (nextState: DemoState) => {
@@ -59,6 +79,10 @@ export default function DemoPage() {
5979
};
6080

6181
useLayoutEffect(() => {
82+
if (isPreparing) {
83+
return;
84+
}
85+
6286
const interactionStart = interactionStartRef.current;
6387

6488
if (interactionStart === null) {
@@ -73,7 +97,7 @@ export default function DemoPage() {
7397
commitTime: prepareEnd === null ? null : commitMoment - prepareEnd,
7498
totalTime: commitMoment - interactionStart,
7599
}));
76-
}, [diffData, state.contextLines, state.height]);
100+
}, [diffData, state.contextLines, state.height, isPreparing]);
77101

78102
useEffect(() => {
79103
if (interactionStartRef.current === null) {
@@ -117,13 +141,23 @@ export default function DemoPage() {
117141
</div>
118142
</div>
119143

120-
<div className="demo-viewer-card__body">
144+
<div className="demo-viewer-card__body demo-viewer-card__body--relative">
121145
<DiffViewer
122146
original={diffData.oldText}
123147
modified={diffData.newText}
124148
height={state.height}
125149
contextLines={state.contextLines}
126150
/>
151+
{isPreparing ? (
152+
<div className="viewer-loading viewer-loading--overlay" aria-live="polite">
153+
<span className="viewer-loading__spinner" aria-hidden />
154+
<p className="viewer-loading__title">Preparing diff data…</p>
155+
<p className="viewer-loading__text">
156+
Large datasets like 100k lines can take a while. The viewer will update
157+
automatically when preparation is complete.
158+
</p>
159+
</div>
160+
) : null}
127161
</div>
128162
</section>
129163
</div>
@@ -139,4 +173,4 @@ export default function DemoPage() {
139173
</main>
140174
</div>
141175
);
142-
}
176+
}

apps/demo/src/styles.css

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,15 @@ select {
367367
padding: 24px;
368368
}
369369

370+
.viewer-loading--overlay {
371+
position: absolute;
372+
inset: 0;
373+
min-height: 0;
374+
margin: 0;
375+
background: rgba(2, 6, 23, 0.8);
376+
backdrop-filter: blur(2px);
377+
}
378+
370379
.viewer-loading__spinner {
371380
width: 36px;
372381
height: 36px;
@@ -390,4 +399,4 @@ select {
390399
to {
391400
transform: rotate(360deg);
392401
}
393-
}
402+
}

0 commit comments

Comments
 (0)