forked from Stigmatoz/web-activity-time-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseTabListByDays.ts
More file actions
97 lines (85 loc) · 2.57 KB
/
useTabListByDays.ts
File metadata and controls
97 lines (85 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import { CurrentTabItem } from '../dto/currentTabItem';
import { DayTabs, TabListByDays } from '../dto/tabListSummary';
import { injectTabsRepository } from '../repository/inject-tabs-repository';
import { isSameDay } from 'date-fns';
export async function useTabListByDays(
dateFrom: Date,
dateTo: Date,
): Promise<TabListByDays | null> {
const repo = await injectTabsRepository();
const unSortedTabs = repo.getTabs();
let daysTabs: DayTabs[] = [];
if (unSortedTabs.length == 0) return null;
const isTheSameDay = isSameDay(dateFrom, dateTo);
const unSortedTabsByDays = unSortedTabs.filter(x =>
isTheSameDay
? x.days.find(s => isSameDay(new Date(s.date), dateFrom)) != undefined
: x.days.find(s => new Date(s.date) >= dateFrom && new Date(s.date) <= dateTo) != undefined,
);
if (unSortedTabsByDays.length == 0)
return {
days: [],
averageTime: 0,
summaryTime: 0,
sessions: 0,
};
unSortedTabsByDays.forEach(tab => {
tab.days.forEach(day => {
if (
(new Date(day.date) >= dateFrom && new Date(day.date) <= dateTo) ||
(isTheSameDay && isSameDay(new Date(day.date), dateFrom))
) {
let dayTab = daysTabs.find(x => x.day == day.date);
if (dayTab == undefined) {
dayTab = {
day: day.date,
tabs: [],
time: day.summary,
sessions: day.counter,
};
dayTab.tabs.push({
favicon: tab.favicon,
url: tab.url,
sessions: day.counter,
summaryTime: day.summary,
});
daysTabs.push(dayTab);
} else {
dayTab.time += day.summary;
dayTab.sessions += day.counter;
dayTab.tabs.push({
favicon: tab.favicon,
url: tab.url,
sessions: day.counter,
summaryTime: day.summary,
});
}
}
});
});
daysTabs.sort(function (a, b) {
return new Date(a.day).valueOf() - new Date(b.day).valueOf();
});
daysTabs.forEach(dayTab => {
dayTab.tabs.sort(function (a: CurrentTabItem, b: CurrentTabItem) {
return b.summaryTime - a.summaryTime;
});
});
const summaryTime = daysTabs
.map(x => x.time)
.reduce(function (a, b) {
return a + b;
});
const totalSessions = daysTabs
.map(x => x.sessions)
.reduce(function (a, b) {
return a + b;
});
const averageTime = Math.round(summaryTime / daysTabs.length);
return {
days: daysTabs,
summaryTime: summaryTime,
averageTime: averageTime,
sessions: totalSessions,
};
}