Skip to content

Commit 239486f

Browse files
committed
Show notifications for websites
1 parent 952e5aa commit 239486f

File tree

6 files changed

+105
-16
lines changed

6 files changed

+105
-16
lines changed

src/components/Notifications.vue

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,23 @@
3434
</p>
3535
<ListWithTimeComponent :type="ListWithTime.Notifications" />
3636
</div>
37+
<div class="settings-item">
38+
<label class="setting-header">Notification message</label>
39+
<p class="description">You will see this message in notification for websites every time</p>
40+
<input
41+
type="text"
42+
class=""
43+
placeholder="Enter notification message name..."
44+
v-model="notificationMessage"
45+
/>
46+
<input
47+
type="button"
48+
class="d-inline-block small-btn ml-10 width"
49+
value="Save"
50+
:disabled="notificationMessage == ''"
51+
@click="saveNotificationMessage()"
52+
/>
53+
</div>
3754
</div>
3855
</template>
3956

@@ -46,7 +63,7 @@ export default {
4663
<script lang="ts" setup>
4764
import { onMounted, ref } from 'vue';
4865
import { injecStorage } from '../storage/inject-storage';
49-
import { StorageParams } from '../storage/storage-params';
66+
import { NOTIFICATION_MESSAGE_DEFAULT, StorageParams } from '../storage/storage-params';
5067
import {
5168
DAILY_NOTIFICATION_DEFAULT,
5269
DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT,
@@ -62,13 +79,19 @@ const settingsStorage = injecStorage();
6279
const showDailyNotifacation = ref<boolean>();
6380
const dailyNotificationTime = ref<number>();
6481
const notificationTime = ref<Time>();
82+
const notificationMessage = ref<string>();
6583
6684
onMounted(async () => {
6785
showDailyNotifacation.value = await settingsStorage.getValue(
6886
StorageParams.DAILY_NOTIFICATION,
6987
DAILY_NOTIFICATION_DEFAULT,
7088
);
7189
90+
notificationMessage.value = await settingsStorage.getValue(
91+
StorageParams.NOTIFICATION_MESSAGE,
92+
NOTIFICATION_MESSAGE_DEFAULT,
93+
);
94+
7295
dailyNotificationTime.value = (await settingsStorage.getValue(
7396
StorageParams.DAILY_SUMMARY_NOTIFICATION_TIME,
7497
DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT,
@@ -78,6 +101,10 @@ onMounted(async () => {
78101
notificationTime.value = timeObj;
79102
});
80103
104+
async function saveNotificationMessage() {
105+
save(StorageParams.NOTIFICATION_MESSAGE, notificationMessage.value);
106+
}
107+
81108
async function handleDate(modelData: Time) {
82109
if (modelData != null) {
83110
notificationTime.value = modelData;
@@ -103,4 +130,7 @@ async function save(storageParam: StorageParams, value: any) {
103130
width: 120px;
104131
margin: 0 15px;
105132
}
133+
.width {
134+
width: 540px;
135+
}
106136
</style>

src/compositions/limit-list.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export async function isLimitExceeded(url: string, tab: Tab): Promise<LimitExcee
2424
if (date.summary >= item.time) {
2525
log(`Limit Exceeded: website ${url} limit ${item.time} summary time ${date.summary}`);
2626
if (await isInDeferList(url)) {
27+
log(`Page ${url} is in deffering list`);
2728
return {
2829
IsLimitExceeded: false,
2930
LimitTime: null,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { Notifications } from '../entity/notification';
2+
import { Tab } from '../entity/tab';
3+
import { StorageParams } from '../storage/storage-params';
4+
import { isDomainEquals } from '../utils/common';
5+
import { todayLocalDate } from '../utils/date';
6+
import { log } from './logger';
7+
import { Settings } from './settings';
8+
9+
export type LimitExceed = {
10+
IsLimitExceeded: boolean;
11+
LimitTime: number | null;
12+
};
13+
14+
export async function isNeedToShowNotification(url: string, tab: Tab): Promise<boolean> {
15+
const notificationList = (await Settings.getInstance().getSetting(
16+
StorageParams.NOTIFICATION_LIST,
17+
)) as Notifications[];
18+
const array = Object.values(notificationList);
19+
const item = array?.find(x => isDomainEquals(x.domain, url));
20+
if (item != undefined) {
21+
const date = tab.days.find(x => x.date == todayLocalDate());
22+
if (date != undefined) {
23+
if (date.summary == item.time || date.summary % item.time == 0) {
24+
log(`Time for notification: website ${url} time ${item.time} summary time ${date.summary}`);
25+
return true;
26+
}
27+
}
28+
}
29+
30+
return false;
31+
}
32+
33+
export async function isDomainInNotificationsLimit(url: string): Promise<boolean> {
34+
const notificationList = (await Settings.getInstance().getSetting(
35+
StorageParams.NOTIFICATION_LIST,
36+
)) as Notifications[];
37+
const array = Object.values(notificationList);
38+
const item = array?.find(x => isDomainEquals(x.domain, url));
39+
return item != undefined;
40+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Browser from 'webextension-polyfill';
2+
3+
export enum NotificationType {
4+
DailySummaryNotification = 'daily-summary-notification',
5+
WebSiteNotification = 'website-notification',
6+
}
7+
8+
export async function showNotification(
9+
notificationType: NotificationType,
10+
title: string,
11+
message: string,
12+
): Promise<void> {
13+
await Browser.notifications.clear(notificationType);
14+
await Browser.notifications.create(notificationType, {
15+
type: 'basic',
16+
title: title,
17+
message: message,
18+
iconUrl: Browser.runtime.getURL('128x128.png'),
19+
isClickable: false,
20+
});
21+
}
Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import Browser from 'webextension-polyfill';
21
import { useWebUsageSummaryForDay } from '../compositions/summary-data-today';
32
import { convertLimitTimeToString } from '../utils/converter';
43
import { Settings } from '../compositions/settings';
54
import { StorageParams } from '../storage/storage-params';
6-
7-
const NOTIFICATION_ID = 'daily-summary-notification';
5+
import { NotificationType, showNotification } from '../compositions/show-notification';
86

97
export async function dailySummaryNotification() {
108
const showDailyNotifacation = (await Settings.getInstance().getSetting(
@@ -20,17 +18,6 @@ export async function dailySummaryNotification() {
2018
data.mostVisitedSite
2119
} most visited website ${convertLimitTimeToString(data.mostVisitedSiteTime)}`;
2220

23-
await showNotification(title, message);
21+
await showNotification(NotificationType.DailySummaryNotification, title, message);
2422
}
2523
}
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/tracker.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import { Tab } from './entity/tab';
1414
import { useBlockPage } from './compositions/block-page';
1515
import { convertSummaryTimeToBadgeString } from './utils/converter';
1616
import { Settings } from './compositions/settings';
17+
import { isNeedToShowNotification } from './compositions/notification-list';
18+
import { NotificationType, showNotification } from './compositions/show-notification';
1719

1820
const activeTabInstance = ActiveTab.getInstance();
1921

@@ -102,6 +104,14 @@ async function mainTracker(
102104
if (tab.favicon == '' && activeTab.favIconUrl != undefined)
103105
tab.setFavicon(activeTab.favIconUrl);
104106

107+
if (await isNeedToShowNotification(activeDomain, tab)) {
108+
const message = (await Settings.getInstance().getSetting(
109+
StorageParams.NOTIFICATION_MESSAGE,
110+
)) as string;
111+
const title = `${activeDomain} notification`;
112+
await showNotification(NotificationType.WebSiteNotification, title, message);
113+
}
114+
105115
tab.incSummaryTime();
106116

107117
const viewInBadge = await Settings.getInstance().getSetting(StorageParams.VIEW_TIME_IN_BADGE);

0 commit comments

Comments
 (0)