Skip to content

Commit b1b4b83

Browse files
committed
feat(heartbeat): track unsynced local seconds and update status bar accordingly
1 parent 1a26bec commit b1b4b83

1 file changed

Lines changed: 34 additions & 5 deletions

File tree

src/heartbeat.ts

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export class HeartbeatManager {
3434
private lastActivity: number = Date.now();
3535
private todayLocalTotalSeconds: number = 0;
3636
private isWindowFocused: boolean = true;
37+
private unsyncedLocalSeconds: number = 0;
3738

3839
constructor(
3940
private context: vscode.ExtensionContext,
@@ -170,7 +171,14 @@ export class HeartbeatManager {
170171
};
171172

172173
private updateActivity(): void {
173-
this.lastActivity = Date.now();
174+
const now = Date.now();
175+
if (this.isUserActive() && this.lastActivity > 0) {
176+
const elapsedSeconds = Math.floor((now - this.lastActivity) / 1000);
177+
if (elapsedSeconds > 0) {
178+
this.unsyncedLocalSeconds += elapsedSeconds;
179+
}
180+
}
181+
this.lastActivity = now;
174182
}
175183

176184
private scheduleHeartbeat(): void {
@@ -180,6 +188,7 @@ export class HeartbeatManager {
180188

181189
setInterval(() => {
182190
if (this.activeDocumentInfo && this.isUserActive()) {
191+
this.updateActivity();
183192
this.sendHeartbeat();
184193
} else {
185194
log("User inactive or no active document, skipping heartbeat");
@@ -202,6 +211,8 @@ export class HeartbeatManager {
202211
}
203212

204213
public async fetchDailySummary(): Promise<void> {
214+
this.updateActivity();
215+
205216
const apiKey = await getApiKey();
206217
const baseUrl = await getBaseUrl();
207218
if (!apiKey || !baseUrl) {
@@ -256,15 +267,20 @@ export class HeartbeatManager {
256267
const todaySummary = apiResponse.summaries[0];
257268
this.todayLocalTotalSeconds = todaySummary.totalSeconds;
258269

270+
const totalSeconds =
271+
this.todayLocalTotalSeconds + this.unsyncedLocalSeconds;
272+
259273
if (this.statusBar) {
260-
const hours = Math.floor(this.todayLocalTotalSeconds / 3600);
261-
const minutes = Math.floor((this.todayLocalTotalSeconds % 3600) / 60);
274+
const hours = Math.floor(totalSeconds / 3600);
275+
const minutes = Math.floor((totalSeconds % 3600) / 60);
262276
this.statusBar.updateTime(hours, minutes);
263277
}
264278
} else {
265-
this.todayLocalTotalSeconds = 0;
279+
const totalSeconds = this.unsyncedLocalSeconds;
266280
if (this.statusBar) {
267-
this.statusBar.updateTime(0, 0);
281+
const hours = Math.floor(totalSeconds / 3600);
282+
const minutes = Math.floor((totalSeconds % 3600) / 60);
283+
this.statusBar.updateTime(hours, minutes);
268284
}
269285
}
270286
} catch (error) {
@@ -275,6 +291,14 @@ export class HeartbeatManager {
275291
this.setOnlineStatus(false);
276292
log(`Error fetching daily summary: ${error}`);
277293
}
294+
295+
if (this.statusBar && this.unsyncedLocalSeconds > 0) {
296+
const totalSeconds =
297+
this.todayLocalTotalSeconds + this.unsyncedLocalSeconds;
298+
const hours = Math.floor(totalSeconds / 3600);
299+
const minutes = Math.floor((totalSeconds % 3600) / 60);
300+
this.statusBar.updateTime(hours, minutes);
301+
}
278302
}
279303
}
280304

@@ -347,6 +371,8 @@ export class HeartbeatManager {
347371
this.setOnlineStatus(true);
348372
this.setApiKeyStatus(true);
349373
this.saveOfflineHeartbeats();
374+
375+
this.unsyncedLocalSeconds = 0;
350376
} catch (error) {
351377
log(
352378
`Error syncing offline heartbeats batch: ${
@@ -463,6 +489,9 @@ export class HeartbeatManager {
463489
this.successCount++;
464490
this.setOnlineStatus(true);
465491
this.setApiKeyStatus(true);
492+
493+
this.unsyncedLocalSeconds = 0;
494+
466495
resolve();
467496
} else if (res.statusCode === 401) {
468497
this.setApiKeyStatus(false);

0 commit comments

Comments
 (0)