Skip to content

Commit 3d34bcb

Browse files
committed
Scheduler for jobs
1 parent efe600a commit 3d34bcb

File tree

5 files changed

+66
-2
lines changed

5 files changed

+66
-2
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
},
1616
"dependencies": {
1717
"vue": "^3.2.47"
18+
"date-fns": "^2.30.0",
1819
},
1920
"devDependencies": {
2021
"@types/webextension-polyfill": "^0.10.0",

src/background.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import Browser from 'webextension-polyfill';
22
import { initTracker } from './tracker';
33
import { logger } from './compositions/logger';
4+
import { scheduleJobs } from './jobs/sheduler';
45

56
logger.log('Start background script');
67

78
Browser.runtime.onInstalled.addListener(details => {
89
logger.log('Extension installed:', details);
910
});
1011

12+
scheduleJobs();
1113
initTracker();

src/jobs/sheduler.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import Browser, { Alarms } from 'webextension-polyfill';
2+
import { logger } from '../compositions/logger';
3+
import { StorageParams } from '../storage/storage-params';
4+
import { injecStorage } from '../storage/inject-storage';
5+
import { DAY_MINUTES, getNextTimeOfDay } from '../utils/time';
6+
7+
export enum JobId {
8+
DailySummaryNotification = '@alarm/daily-summary-notification',
9+
}
10+
11+
export function scheduleJobs(): void {
12+
Browser.alarms.onAlarm.addListener(async alarm => {
13+
logger.log(`[schedule-jobs] Alarm ${alarm.name} triggered`, alarm);
14+
switch (alarm.name) {
15+
case JobId.DailySummaryNotification: {
16+
//await dailySummaryNotification();
17+
break;
18+
}
19+
}
20+
logger.log(`[schedule-jobs] ${alarm.name} finished`);
21+
});
22+
23+
Browser.runtime.onInstalled.addListener(rescheduleJobs);
24+
}
25+
26+
async function rescheduleJobs(): Promise<void> {
27+
const storage = injecStorage();
28+
const dailySummaryNotificationTime = (await storage.getValue(
29+
StorageParams.DAILY_SUMMARY_NOTIFICATION_TIME,
30+
)) as number;
31+
await Browser.alarms.clear(JobId.DailySummaryNotification);
32+
Browser.alarms.create(JobId.DailySummaryNotification, {
33+
when: getNextTimeOfDay(dailySummaryNotificationTime),
34+
periodInMinutes: DAY_MINUTES,
35+
});
36+
}
37+
38+
async function createAlarmIfMissing(
39+
name: string,
40+
alarmInfo: Alarms.CreateAlarmInfoType,
41+
): Promise<void> {
42+
const existing = await Browser.alarms.get(name).catch(() => undefined);
43+
if (existing == null) {
44+
Browser.alarms.create(name, alarmInfo);
45+
}
46+
}

src/utils/time.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { getToday } from './today';
2+
3+
//Every day - 60 minutes * 24 hours
4+
export const DAY_MINUTES = 1440;
5+
6+
export function getNextTimeOfDay(timeOfDay: number): number {
7+
const todaysTime = getToday() + timeOfDay;
8+
return todaysTime > Date.now() ? todaysTime : todaysTime + DAY_MINUTES;
9+
}

src/utils/today.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
import startOfToday from 'date-fns/startOfToday';
2+
13
export function todayLocalDate() {
2-
return new Date().toLocaleDateString('en-US');
3-
}
4+
return new Date().toLocaleDateString('en-US');
5+
}
6+
7+
export function getToday(): number {
8+
return startOfToday().getTime();
9+
}

0 commit comments

Comments
 (0)