@@ -21,6 +21,7 @@ type PerfMetrics = {
2121
2222export 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+ }
0 commit comments