Skip to content

Commit 2d318d6

Browse files
committed
feat: Stop Tasks plugin from running on inactive tabs
Fixes #2999
1 parent 5ce50ff commit 2d318d6

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

src/Renderer/QueryRenderer.ts

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class QueryRenderChild extends MarkdownRenderChild {
9191

9292
private renderEventRef: EventRef | undefined;
9393
private queryReloadTimeout: NodeJS.Timeout | undefined;
94+
95+
private isCacheChangedSinceLastRedraw = false;
9496
private observer: IntersectionObserver | null = null;
9597

9698
private readonly queryResultsRenderer: QueryResultsRenderer;
@@ -176,10 +178,14 @@ class QueryRenderChild extends MarkdownRenderChild {
176178
for (const entry of entries) {
177179
const visible = entry.isIntersecting && this.containerEl.isShown();
178180
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+
}
183189
}
184190
}
185191
});
@@ -245,15 +251,29 @@ ${this.queryResultsRenderer.query.source}
245251
}
246252

247253
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+
248258
requestAnimationFrame(async () => {
249259
// 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().
251261
// (setTimeout(, 0) seemed to work too...)
252262
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+
253270
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+
}
257277

258278
const content = createAndAppendElement('div', this.containerEl);
259279
await this.queryResultsRenderer.render(state, tasks, content, {
@@ -265,6 +285,9 @@ ${this.queryResultsRenderer.query.source}
265285
});
266286

267287
this.containerEl.firstChild?.replaceWith(content);
288+
289+
// Our results are now up-to-date:
290+
this.isCacheChangedSinceLastRedraw = false;
268291
});
269292
}
270293
}

src/main.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Plugin } from 'obsidian';
22

33
import type { Task } from 'Task/Task';
44
import { i18n, initializeI18n } from './i18n/i18n';
5-
import { Cache } from './Obsidian/Cache';
5+
import { Cache, State } from './Obsidian/Cache';
66
import { Commands } from './Commands';
77
import { GlobalQuery } from './Config/GlobalQuery';
88
import { TasksEvents } from './Obsidian/TasksEvents';
@@ -107,6 +107,13 @@ export default class TasksPlugin extends Plugin {
107107
}
108108
}
109109

110+
public getState(): State {
111+
if (this.cache === undefined) {
112+
return State.Cold;
113+
}
114+
return this.cache.getState();
115+
}
116+
110117
/**
111118
* Add {@link QueryFileDefaults} properties to the Obsidian vault's types.json file,
112119
* so that they are available via auto-complete in the File Properties panel.

0 commit comments

Comments
 (0)