@@ -91,6 +91,8 @@ class QueryRenderChild extends MarkdownRenderChild {
91
91
92
92
private renderEventRef : EventRef | undefined ;
93
93
private queryReloadTimeout : NodeJS . Timeout | undefined ;
94
+
95
+ private isCacheChangedSinceLastRedraw = false ;
94
96
private observer : IntersectionObserver | null = null ;
95
97
96
98
private readonly queryResultsRenderer : QueryResultsRenderer ;
@@ -176,10 +178,14 @@ class QueryRenderChild extends MarkdownRenderChild {
176
178
for ( const entry of entries ) {
177
179
const visible = entry . isIntersecting && this . containerEl . isShown ( ) ;
178
180
if ( visible ) {
179
- this . queryResultsRenderer . query . warn ( `[render][observer] Became visible, with this source:
180
- ---
181
- ${ this . queryResultsRenderer . query . source }
182
- ---` ) ;
181
+ this . queryResultsRenderer . query . warn (
182
+ `[render][observer] Became visible, isCacheChangedSinceLastRedraw:${ this . isCacheChangedSinceLastRedraw } ` ,
183
+ ) ;
184
+ if ( this . isCacheChangedSinceLastRedraw ) {
185
+ // TODO Should handle exceptions here...
186
+ this . queryResultsRenderer . query . warn ( '[render][observer] ... updating search results' ) ;
187
+ this . render ( { tasks : this . plugin . getTasks ( ) , state : this . plugin . getState ( ) } ) . then ( ( ) => { } ) ;
188
+ }
183
189
}
184
190
}
185
191
} ) ;
@@ -245,15 +251,29 @@ ${this.queryResultsRenderer.query.source}
245
251
}
246
252
247
253
private async render ( { tasks, state } : { tasks : Task [ ] ; state : State } ) {
254
+ // We got here because the Cache reported a change in at least one task in the vault.
255
+ // So note that any results we have already drawn are now out-of-date:
256
+ this . isCacheChangedSinceLastRedraw = true ;
257
+
248
258
requestAnimationFrame ( async ( ) => {
249
259
// We have to wrap the rendering inside requestAnimationFrame() to ensure
250
- // that we get correct values for isConnected and isShown.
260
+ // that we get correct values for isConnected and isShown() .
251
261
// (setTimeout(, 0) seemed to work too...)
252
262
const isConnected = this . containerEl . isConnected ;
263
+ if ( ! isConnected ) {
264
+ this . queryResultsRenderer . query . warn (
265
+ '[render] QueryRenderChild.render() Ignoring redraw request, as code block is not connected.' ,
266
+ ) ;
267
+ return ;
268
+ }
269
+
253
270
const isShown = this . containerEl . isShown ( ) ;
254
- this . queryResultsRenderer . query . warn (
255
- `[render] QueryRenderChild.render() AFTER FRAME state:${ state } ; isConnected:${ isConnected } ; isShown:${ isShown } ;` ,
256
- ) ;
271
+ if ( ! isShown ) {
272
+ this . queryResultsRenderer . query . warn (
273
+ '[render] QueryRenderChild.render() Ignoring redraw request, as code block is not shown.' ,
274
+ ) ;
275
+ return ;
276
+ }
257
277
258
278
const content = createAndAppendElement ( 'div' , this . containerEl ) ;
259
279
await this . queryResultsRenderer . render ( state , tasks , content , {
@@ -265,6 +285,9 @@ ${this.queryResultsRenderer.query.source}
265
285
} ) ;
266
286
267
287
this . containerEl . firstChild ?. replaceWith ( content ) ;
288
+
289
+ // Our results are now up-to-date:
290
+ this . isCacheChangedSinceLastRedraw = false ;
268
291
} ) ;
269
292
}
270
293
}
0 commit comments