Skip to content

Commit 8141ff3

Browse files
committed
Defering limits
1 parent 70a6a9c commit 8141ff3

File tree

9 files changed

+136
-12
lines changed

9 files changed

+136
-12
lines changed

src/components/Limits.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div>
3-
<p class="setting-header mt-0">Daily restrictions on access to websites:</p>
3+
<p class="setting-header mt-0">Daily restrictions on access to websites</p>
44
<p class="description">
55
Set the maximum time allowed to visit the site per day. After this time, the site will be
66
blocked.

src/compositions/block-page.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { buildBlockQuery } from '../utils/block-page';
33

44
export async function useBlockPage(
55
url: string,
6-
summaryTime: number,
6+
liimitTime: number,
77
summaryCounter: number,
88
): Promise<void> {
99
const blockUrl =
10-
Browser.runtime.getURL('src/block.html') + buildBlockQuery(url, summaryTime, summaryCounter);
10+
Browser.runtime.getURL('src/block.html') + buildBlockQuery(url, liimitTime, summaryCounter);
1111
const tab = await Browser.tabs.query({ currentWindow: true, active: true });
1212
Browser.tabs.update(tab[0].id, { url: blockUrl });
1313
}

src/compositions/deferList.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { differenceInCalendarDays } from 'date-fns';
2+
import { StorageParams } from '../storage/storage-params';
3+
import { isDomainEquals } from '../utils/common';
4+
import { Settings } from './settings';
5+
import { Deffering } from '../entity/deffering';
6+
import { injecStorage } from '../storage/inject-storage';
7+
import { MINUTE } from '../utils/time';
8+
import { log } from './logger';
9+
10+
export async function isInDeferList(url: string): Promise<boolean> {
11+
const deferList = (await Settings.getInstance().getSetting(
12+
StorageParams.BLOCK_DEFERRAL_TIME,
13+
)) as Deffering[];
14+
const array = Object.values(deferList);
15+
const item = array?.find(x => isDomainEquals(x.domain, url));
16+
if (item != undefined)
17+
log(
18+
`Deferring time ${url} ${new Date(item.time)} diff ${differenceInCalendarDays(
19+
new Date(item.time),
20+
new Date(),
21+
)}`,
22+
);
23+
return (
24+
item != undefined &&
25+
item.time > Date.now() &&
26+
differenceInCalendarDays(new Date(item.time), new Date()) == 0
27+
);
28+
}
29+
30+
export async function canDefering(url: string): Promise<boolean> {
31+
const deferList = (await Settings.getInstance().getSetting(
32+
StorageParams.BLOCK_DEFERRAL_TIME,
33+
)) as Deffering[];
34+
const array = Object.values(deferList);
35+
const item = array?.find(x => isDomainEquals(x.domain, url));
36+
if (item != undefined)
37+
log(
38+
`Deferring time ${url} ${new Date(item.time)} diff ${differenceInCalendarDays(
39+
new Date(item.time),
40+
new Date(),
41+
)}`,
42+
);
43+
return !(
44+
item != undefined &&
45+
((item.time < Date.now() && differenceInCalendarDays(new Date(item.time), new Date()) == 0) ||
46+
item.time > Date.now())
47+
);
48+
}
49+
50+
export async function defering(url: string, timeInMinutes: number): Promise<void> {
51+
const settingsStorage = injecStorage();
52+
53+
const deferList = (await Settings.getInstance().getSetting(
54+
StorageParams.BLOCK_DEFERRAL_TIME,
55+
)) as Deffering[];
56+
const array = Object.values(deferList);
57+
const item = array?.find(x => isDomainEquals(x.domain, url));
58+
if (item != undefined) item.time = Date.now() + timeInMinutes * MINUTE;
59+
else array.push(new Deffering(url, 5));
60+
61+
await settingsStorage.saveValue(StorageParams.BLOCK_DEFERRAL_TIME, array);
62+
}

src/compositions/limit-list.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { Tab } from '../entity/tab';
33
import { StorageParams } from '../storage/storage-params';
44
import { isDomainEquals } from '../utils/common';
55
import { todayLocalDate } from '../utils/date';
6+
import { isInDeferList } from './deferList';
7+
import { log } from './logger';
68
import { Settings } from './settings';
79

810
export type LimitExceed = {
@@ -19,11 +21,20 @@ export async function isLimitExceeded(url: string, tab: Tab): Promise<LimitExcee
1921
if (item != undefined) {
2022
const date = tab.days.find(x => x.date == todayLocalDate());
2123
if (date != undefined) {
22-
if (date.summary >= item.time)
24+
if (date.summary >= item.time) {
25+
log(`Limit Exceeded: website ${url} limit ${item.time} summary time ${date.summary}`);
26+
if (await isInDeferList(url)) {
27+
return {
28+
IsLimitExceeded: false,
29+
LimitTime: null,
30+
};
31+
}
32+
2333
return {
2434
IsLimitExceeded: true,
2535
LimitTime: item.time,
2636
};
37+
}
2738
}
2839
}
2940

src/entity/deffering.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { MINUTE } from '../utils/time';
2+
3+
export class Deffering {
4+
domain: string;
5+
time: number;
6+
7+
constructor(domain: string, minutes: number) {
8+
this.domain = domain;
9+
this.time = Date.now() + minutes * MINUTE;
10+
}
11+
}

src/pages/Block.vue

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,65 @@
1010
<table>
1111
<tr>
1212
<td class="title">Limit:</td>
13-
<td class="value">{{ limitTime }}</td>
13+
<td class="value">{{ limitTimeString }}</td>
1414
</tr>
1515
<tr>
1616
<td class="title">Sessions:</td>
1717
<td class="value">{{ summaryCounter }}</td>
1818
</tr>
1919
</table>
20+
<input
21+
v-if="allowDeferringBlock && haveToShowDeffering"
22+
type="button"
23+
class="mt-20"
24+
value="+5 minutes"
25+
@click="deferring()"
26+
/>
2027
</div>
2128
</template>
2229

2330
<script lang="ts" setup>
2431
import { onMounted, ref } from 'vue';
2532
import { getValueFromQuery } from '../utils/block-page';
33+
import { injecStorage } from '../storage/inject-storage';
34+
import { BLOCK_DEFERRAL_DEFAULT, StorageParams } from '../storage/storage-params';
35+
import { convertLimitTimeToString } from '../utils/converter';
36+
import { defering, canDefering } from '../compositions/deferList';
37+
38+
const settingsStorage = injecStorage();
2639
2740
const webSite = ref<string>();
28-
const limitTime = ref<string>();
41+
const limitTime = ref<number>();
42+
const limitTimeString = ref<string>();
2943
const summaryCounter = ref<number>();
44+
const allowDeferringBlock = ref<boolean>();
45+
const haveToShowDeffering = ref<boolean>();
3046
31-
onMounted(() => {
47+
onMounted(async () => {
3248
const queryObj = getValueFromQuery(location.href);
3349
webSite.value = queryObj.domain ?? '';
3450
limitTime.value = queryObj.limitTime;
51+
limitTimeString.value = convertLimitTimeToString(queryObj.limitTime);
3552
summaryCounter.value = queryObj.summaryCounter ?? 0;
53+
54+
allowDeferringBlock.value = await settingsStorage.getValue(
55+
StorageParams.BLOCK_DEFERRAL,
56+
BLOCK_DEFERRAL_DEFAULT,
57+
);
58+
haveToShowDeffering.value = await canDefering(webSite.value);
3659
});
60+
61+
async function deferring() {
62+
if (
63+
webSite.value != undefined &&
64+
limitTime.value != undefined &&
65+
allowDeferringBlock.value &&
66+
haveToShowDeffering.value
67+
) {
68+
await defering(webSite.value, 5);
69+
//window.open(document.referrer);
70+
}
71+
}
3772
</script>
3873

3974
<style scoped>

src/storage/storage-params.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Tab } from '../entity/tab';
22
import { TimeInterval } from '../entity/time-interval';
3+
import { HOUR } from '../utils/time';
34

45
export enum StorageParams {
56
BLACK_LIST = 'black_list',
@@ -10,7 +11,8 @@ export enum StorageParams {
1011
DARK_MODE = 'night_mode',
1112
VIEW_TIME_IN_BADGE = 'view_time_in_badge',
1213
BLOCK_DEFERRAL = 'view_block_deferral',
13-
DAILY_SUMMARY_NOTIFICATION_TIME = 'dailySummaryNotificationTime',
14+
BLOCK_DEFERRAL_TIME = 'view_block_deferral_time',
15+
DAILY_SUMMARY_NOTIFICATION_TIME = 'daily-summary-notification-time',
1416
}
1517

1618
export enum StorageDeserializeParam {
@@ -50,7 +52,7 @@ export const VIEW_TIME_IN_BADGE_DEFAULT = true;
5052
export const BLOCK_DEFERRAL_DEFAULT = true;
5153
export const SHOW_HINT_DEFAULT = true;
5254
// default time is 20:00, time in miliseconds
53-
export const DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT = 20 * 60 * 60 * 1000;
55+
export const DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT = 20 * HOUR;
5456

5557
export function getDefaultValue(param: StorageParams) {
5658
switch (param) {
@@ -70,6 +72,8 @@ export function getDefaultValue(param: StorageParams) {
7072
return VIEW_TIME_IN_BADGE_DEFAULT;
7173
case StorageParams.BLOCK_DEFERRAL:
7274
return BLOCK_DEFERRAL_DEFAULT;
75+
case StorageParams.BLOCK_DEFERRAL_TIME:
76+
return [];
7377
case StorageParams.DAILY_SUMMARY_NOTIFICATION_TIME:
7478
return DAILY_SUMMARY_NOTIFICATION_TIME_DEFAULT;
7579
}

src/utils/block-page.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { convertLimitTimeToString } from './converter';
2-
31
export enum BlockParams {
42
Domain = 'url',
53
LimitTime = 'summaryTime',
@@ -18,7 +16,7 @@ export function getValueFromQuery(url: string) {
1816

1917
return {
2018
domain: domain,
21-
limitTime: convertLimitTimeToString(limitTime),
19+
limitTime: limitTime,
2220
summaryCounter: summaryCounter,
2321
};
2422
}

src/utils/time.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ export type Time = {
77

88
//Every day - 60 minutes * 24 hours
99
export const DAY_MINUTES = 1440;
10+
export const SECOND = 1000;
11+
export const MINUTE = 60 * SECOND;
12+
export const HOUR = 60 * MINUTE;
1013

1114
export function getNextTimeOfDay(timeOfDay: number): number {
1215
const todaysTime = getToday() + timeOfDay;

0 commit comments

Comments
 (0)