ffef1d1bebbfbdcb3298b49ee364cc38e1082638

Author
Christian Stewart <christian@aperture.us>
Committer
GitHub <noreply@github.com>
Date

Message

fix(ui): clear stale footer timeouts (#15)

Signed-off-by: Christian Stewart <christian@aperture.us>

Diff

 1diff --git a/index.ts b/index.ts
 2index 777a9ed8c51605ff637a6bd0ab71ab373c78757c..507e3c3dc3c5c38b33fbb19ec9b49630099849bd 100644
 3--- a/index.ts
 4+++ b/index.ts
 5@@ -195,6 +195,14 @@ export default async function (pi: ExtensionAPI) {
 6 
 7 	const discoveredMetadata = new Set<string>();
 8 	const pendingMetadata = new Set<string>();
 9+	let statusTimeout: ReturnType<typeof setTimeout> | undefined;
10+
11+	function clearFooterStatusTimeout(): void {
12+		if (statusTimeout !== undefined) {
13+			clearTimeout(statusTimeout);
14+			statusTimeout = undefined;
15+		}
16+	}
17 
18 	async function discoverModelMetadata(
19 		modelId: string,
20@@ -225,8 +233,13 @@ export default async function (pi: ExtensionAPI) {
21 		const controller = new AbortController();
22 		const timer = setTimeout(() => controller.abort(), timeoutMs);
23 		const propsUrl = `${baseUrl.replace(/\/v1$/, "")}/props?model=${encodeURIComponent(modelId)}&autoload=${autoload}`;
24-		const clearFooterStatusLater = () =>
25-			setTimeout(() => ctx?.ui.setStatus(PROVIDER_ID, undefined), 8000);
26+		const clearFooterStatusLater = () => {
27+			clearFooterStatusTimeout();
28+			statusTimeout = setTimeout(() => {
29+				statusTimeout = undefined;
30+				ctx?.ui.setStatus(PROVIDER_ID, undefined);
31+			}, 8000);
32+		};
33 
34 		try {
35 			if (autoload && ctx) {
36@@ -317,4 +330,8 @@ export default async function (pi: ExtensionAPI) {
37 			void discoverModelMetadata(modelId, ctx, true, PROPS_TIMEOUT_MS, activeModel);
38 		}
39 	});
40+
41+	pi.on("session_shutdown", () => {
42+		clearFooterStatusTimeout();
43+	});
44 }