Skip to content

Commit 6c88a78

Browse files
committed
Send daily summary notification
1 parent cdfcc9a commit 6c88a78

File tree

9 files changed

+134
-24
lines changed

9 files changed

+134
-24
lines changed

src/components/Limits.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ function getTimeForLimit(time: number) {
110110
function deleteFromLimitList(url: string) {
111111
limitList.value = limitList.value!.filter(x => x.domain != url);
112112
save(limitList.value);
113+
newWebsiteForLimitList.value = '';
114+
isEdit.value = false;
113115
}
114116
115117
function editItemFromLimitList(url: string, timeForUrl: number) {

src/components/Notifications.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
DAILY_NOTIFICATION_DEFAULT,
4545
DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT,
4646
} from '../storage/storage-params';
47-
import { convertHHMMToSeconds, convertSecondsToHHMM } from '../utils/converter';
47+
import { convertHHMMToMilliSeconds, convertMilliSecondsToHHMM } from '../utils/converter';
4848
import { Time } from '../utils/time';
4949
5050
const settingsStorage = injecStorage();
@@ -64,7 +64,7 @@ onMounted(async () => {
6464
DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT,
6565
)) as number;
6666
67-
const timeObj = convertSecondsToHHMM(dailyNotificationTime.value);
67+
const timeObj = convertMilliSecondsToHHMM(dailyNotificationTime.value);
6868
notificationTime.value = timeObj;
6969
});
7070
@@ -73,7 +73,7 @@ function handleDate(modelData: Time) {
7373
notificationTime.value = modelData;
7474
save(
7575
StorageParams.DAILY_SUMMARY_NOTIFICATION_TIME,
76-
convertHHMMToSeconds(notificationTime.value.hours, notificationTime.value.minutes),
76+
convertHHMMToMilliSeconds(notificationTime.value.hours, notificationTime.value.minutes),
7777
);
7878
}
7979
}

src/compositions/deferList.ts

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { differenceInCalendarDays } from 'date-fns';
1+
import { differenceInHours } from 'date-fns';
22
import { StorageParams } from '../storage/storage-params';
33
import { isDomainEquals } from '../utils/common';
44
import { Settings } from './settings';
@@ -15,16 +15,12 @@ export async function isInDeferList(url: string): Promise<boolean> {
1515
const item = array?.find(x => isDomainEquals(x.domain, url));
1616
if (item != undefined)
1717
log(
18-
`Deferring time ${url} ${new Date(item.time)} diff ${differenceInCalendarDays(
18+
`Deferring time ${url} ${new Date(item.time)} diff ${differenceInHours(
1919
new Date(item.time),
2020
new Date(),
2121
)}`,
2222
);
23-
return (
24-
item != undefined &&
25-
item.time > Date.now() &&
26-
differenceInCalendarDays(new Date(item.time), new Date()) == 0
27-
);
23+
return item != undefined && item.time > Date.now();
2824
}
2925

3026
export async function canDefering(url: string): Promise<boolean> {
@@ -35,16 +31,14 @@ export async function canDefering(url: string): Promise<boolean> {
3531
const item = array?.find(x => isDomainEquals(x.domain, url));
3632
if (item != undefined)
3733
log(
38-
`Deferring time ${url} ${new Date(item.time)} diff ${differenceInCalendarDays(
34+
`Deferring time ${url} ${new Date(item.time)} diff ${differenceInHours(
3935
new Date(item.time),
4036
new Date(),
4137
)}`,
4238
);
43-
return !(
44-
item != undefined &&
45-
((item.time < Date.now() && differenceInCalendarDays(new Date(item.time), new Date()) == 0) ||
46-
item.time > Date.now())
47-
);
39+
if (item == undefined) return true;
40+
41+
return item != undefined && differenceInHours(new Date(item.time), new Date()) > 24;
4842
}
4943

5044
export async function defering(url: string, timeInMinutes: number): Promise<void> {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { Tab } from '../entity/tab';
2+
import { injectTabsRepository } from '../repository/inject-tabs-repository';
3+
import { todayLocalDate } from '../utils/date';
4+
import { DaySummary } from '../dto/daySummary';
5+
import { startOfYesterday } from 'date-fns';
6+
import { getPercentage } from '../utils/common';
7+
8+
export async function useWebUsageSummaryForDay(): Promise<DaySummary | null> {
9+
const repo = await injectTabsRepository();
10+
const unSortedTabs = repo.getTodayTabs();
11+
let tabs: Tab[] = [];
12+
13+
if (unSortedTabs.length == 0) return null;
14+
15+
const dataToday = getData(todayLocalDate(), unSortedTabs);
16+
const dataYesterday = getData(startOfYesterday().toLocaleDateString('en-US'), unSortedTabs);
17+
18+
return {
19+
time: dataToday.time,
20+
mostVisitedSite: dataToday.mostVisitedSite,
21+
mostVisitedSiteTime: dataToday.mostVisitedSiteTime,
22+
timeYesterDay: dataYesterday.time,
23+
percentageFromYesterday: `${getPercentage(dataToday.time, dataYesterday.time)}%`,
24+
};
25+
}
26+
27+
function getData(date: string, unSortedTabs: Tab[]) {
28+
const tabs = unSortedTabs.sort(function (a: Tab, b: Tab) {
29+
return b.days.find(s => s.date === date)!.summary - a.days.find(s => s.date === date)!.summary;
30+
});
31+
32+
const summaryTimeList = tabs?.map(function (tab) {
33+
return tab.days.find(day => day.date === date)!.summary;
34+
});
35+
36+
const summaryTime =
37+
summaryTimeList != undefined && summaryTimeList.length > 0
38+
? summaryTimeList.reduce(function (a, b) {
39+
return a + b;
40+
})
41+
: 0;
42+
43+
const mostVisitedTab = tabs[0];
44+
const mostVisitedSite = mostVisitedTab.url;
45+
const mostVisitedSiteTime = mostVisitedTab.days.find(s => s.date === date)?.summary!;
46+
47+
return {
48+
time: summaryTime,
49+
mostVisitedSite: mostVisitedSite,
50+
mostVisitedSiteTime: mostVisitedSiteTime,
51+
};
52+
}

src/dto/daySummary.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export type DaySummary = {
2+
time: number;
3+
timeYesterDay: number;
4+
percentageFromYesterday: string;
5+
mostVisitedSite: string;
6+
mostVisitedSiteTime: number;
7+
};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Browser from 'webextension-polyfill';
2+
import { useWebUsageSummaryForDay } from '../compositions/summary-data-today';
3+
import { convertLimitTimeToString } from '../utils/converter';
4+
import { Settings } from '../compositions/settings';
5+
import { StorageParams } from '../storage/storage-params';
6+
7+
const NOTIFICATION_ID = 'daily-summary-notification';
8+
9+
export async function dailySummaryNotification() {
10+
const showDailyNotifacation = (await Settings.getInstance().getSetting(
11+
StorageParams.DAILY_NOTIFICATION,
12+
)) as boolean;
13+
14+
if (showDailyNotifacation) {
15+
const data = await useWebUsageSummaryForDay();
16+
if (data == null) return;
17+
18+
const title = `Today's total usage time ${convertLimitTimeToString(data.time)}`;
19+
const message = `${data?.percentageFromYesterday} compared to yesterday \n${
20+
data.mostVisitedSite
21+
} most visited website ${convertLimitTimeToString(data.mostVisitedSiteTime)}`;
22+
23+
await showNotification(title, message);
24+
}
25+
}
26+
27+
async function showNotification(title: string, message: string) {
28+
await Browser.notifications.clear(NOTIFICATION_ID);
29+
await Browser.notifications.create(NOTIFICATION_ID, {
30+
type: 'basic',
31+
title: title,
32+
message: message,
33+
iconUrl: Browser.runtime.getURL('128x128.png'),
34+
isClickable: false,
35+
});
36+
}

src/jobs/sheduler.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,38 @@
11
import Browser, { Alarms } from 'webextension-polyfill';
2-
import { logger } from '../compositions/logger';
2+
import { log } from '../compositions/logger';
33
import { StorageParams } from '../storage/storage-params';
44
import { DAY_MINUTES, getNextTimeOfDay } from '../utils/time';
55
import { Settings } from '../compositions/settings';
6+
import { dailySummaryNotification } from './daily-summary-notification';
67

78
export enum JobId {
89
DailySummaryNotification = '@alarm/daily-summary-notification',
910
}
1011

1112
export function scheduleJobs(): void {
1213
Browser.alarms.onAlarm.addListener(async alarm => {
13-
logger.log(`[schedule-jobs] Alarm ${alarm.name} triggered`, alarm);
14+
log(`[schedule-jobs] Alarm ${alarm.name} triggered`, alarm);
1415
switch (alarm.name) {
1516
case JobId.DailySummaryNotification: {
16-
//await dailySummaryNotification();
17+
await dailySummaryNotification();
1718
break;
1819
}
1920
}
20-
logger.log(`[schedule-jobs] ${alarm.name} finished`);
21+
log(`[schedule-jobs] ${alarm.name} finished`);
2122
});
2223

23-
Browser.runtime.onInstalled.addListener(rescheduleJobs);
24+
rescheduleJobs();
2425
}
2526

26-
async function rescheduleJobs(): Promise<void> {
27+
export async function rescheduleJobs(): Promise<void> {
28+
log('Reschedule jobs');
2729
const dailySummaryNotificationTime = (await Settings.getInstance().getSetting(
2830
StorageParams.DAILY_SUMMARY_NOTIFICATION_TIME,
2931
)) as number;
3032
await Browser.alarms.clear(JobId.DailySummaryNotification);
3133
Browser.alarms.create(JobId.DailySummaryNotification, {
3234
when: getNextTimeOfDay(dailySummaryNotificationTime),
33-
periodInMinutes: DAY_MINUTES,
35+
periodInMinutes: 1,
3436
});
3537
}
3638

src/storage/storage-params.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,7 @@ export function getDefaultValue(param: StorageParams) {
7878
return [];
7979
case StorageParams.DAILY_SUMMARY_NOTIFICATION_TIME:
8080
return DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT;
81+
case StorageParams.DAILY_NOTIFICATION:
82+
return DAILY_NOTIFICATION_DEFAULT;
8183
}
8284
}

src/utils/converter.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
import { Time } from './time';
1+
import { HOUR, MINUTE, Time } from './time';
22

33
export function convertHHMMToSeconds(hours: number, minutes: number) {
44
return hours * 3600 + minutes * 60;
55
}
66

7+
export function convertHHMMToMilliSeconds(hours: number, minutes: number) {
8+
return hours * HOUR + minutes * MINUTE;
9+
}
10+
711
export function convertSecondsToHHMM(seconds: number): Time {
812
const hours = Math.floor(seconds / 3600);
913
const totalSeconds = seconds % 3600;
@@ -15,6 +19,17 @@ export function convertSecondsToHHMM(seconds: number): Time {
1519
};
1620
}
1721

22+
export function convertMilliSecondsToHHMM(seconds: number): Time {
23+
const hours = Math.floor(seconds / HOUR);
24+
const totalSeconds = seconds % HOUR;
25+
const mins = Math.floor(totalSeconds / MINUTE);
26+
27+
return {
28+
hours: hours,
29+
minutes: mins,
30+
};
31+
}
32+
1833
export function convertSummaryTimeToBadgeString(summaryTime: number): string {
1934
const sec = summaryTime;
2035
const min = Number((summaryTime / 60).toFixed(0));

0 commit comments

Comments
 (0)