@@ -10,15 +10,19 @@ export const usePomodoroStats = (): PomodoroStats => {
1010 const minutes = ( start : number , end : number ) =>
1111 Math . round ( ( end - start ) / 60000 ) ;
1212 const locale = i18n . language === "de" ? "de-DE" : "en-US" ;
13- const totalWorkMinutes = sessions . reduce (
13+
14+ const workSessions = sessions . filter ( s => s . type === 'work' ) ;
15+ const breakSessions = sessions . filter ( s => s . type === 'break' ) ;
16+
17+ const totalWorkMinutes = workSessions . reduce (
1418 ( sum , s ) => sum + minutes ( s . start , s . end ) ,
1519 0 ,
1620 ) ;
17- const totalBreakMinutes = sessions . reduce (
18- ( sum , s ) => sum + minutes ( s . end , s . breakEnd ?? s . end ) ,
21+ const totalBreakMinutes = breakSessions . reduce (
22+ ( sum , s ) => sum + minutes ( s . start , s . end ) ,
1923 0 ,
2024 ) ;
21- const totalCycles = sessions . length ;
25+ const totalCycles = workSessions . length ;
2226
2327 const todayStart = new Date ( ) ;
2428 todayStart . setHours ( 0 , 0 , 0 , 0 ) ;
@@ -32,21 +36,27 @@ export const usePomodoroStats = (): PomodoroStats => {
3236 yearStart . setMonth ( 0 , 1 ) ;
3337 yearStart . setHours ( 0 , 0 , 0 , 0 ) ;
3438
35- const today = sessions . filter ( ( s ) => s . start >= todayStart . getTime ( ) ) ;
36- const week = sessions . filter ( ( s ) => s . start >= weekStart . getTime ( ) ) ;
37- const month = sessions . filter ( ( s ) => s . start >= monthStart . getTime ( ) ) ;
38- const year = sessions . filter ( ( s ) => s . start >= yearStart . getTime ( ) ) ;
39+ const filterByDate = ( arr : typeof sessions , date : Date ) => arr . filter ( s => s . start >= date . getTime ( ) ) ;
40+
41+ const todayWork = filterByDate ( workSessions , todayStart ) ;
42+ const todayBreak = filterByDate ( breakSessions , todayStart ) ;
43+
44+ // For lists, we just use all sessions but formatted
45+ const todayAll = filterByDate ( sessions , todayStart ) ;
46+ const weekAll = filterByDate ( sessions , weekStart ) ;
47+ const monthAll = filterByDate ( sessions , monthStart ) ;
48+ const yearAll = filterByDate ( sessions , yearStart ) ;
3949
4050 const fmt = ( t : number ) =>
4151 new Date ( t ) . toLocaleTimeString ( locale , {
4252 hour : "2-digit" ,
4353 minute : "2-digit" ,
4454 } ) ;
4555
46- const todayData = today . map ( ( s ) => ( {
56+ const todayData = todayAll . map ( ( s ) => ( {
4757 time : `${ fmt ( s . start ) } -${ fmt ( s . end ) } ` ,
48- work : minutes ( s . start , s . end ) ,
49- break : minutes ( s . end , s . breakEnd ?? s . end ) ,
58+ work : s . type === 'work' ? minutes ( s . start , s . end ) : 0 ,
59+ break : s . type === 'break' ? minutes ( s . start , s . end ) : 0 ,
5060 } ) ) ;
5161
5262 const aggregateBy = (
@@ -67,40 +77,38 @@ export const usePomodoroStats = (): PomodoroStats => {
6777 const d = new Date ( s . start ) ;
6878 const key = fmt ( d ) ;
6979 if ( key in data ) {
70- data [ key ] . work += minutes ( s . start , s . end ) ;
71- data [ key ] . break += minutes ( s . end , s . breakEnd ?? s . end ) ;
80+ const m = minutes ( s . start , s . end ) ;
81+ if ( s . type === 'work' ) data [ key ] . work += m ;
82+ else data [ key ] . break += m ;
7283 }
7384 } ) ;
7485 return Object . keys ( data ) . map ( ( key ) => ( { date : key , ...data [ key ] } ) ) ;
7586 } ;
7687
7788 const weekData = aggregateBy (
78- week ,
89+ weekAll ,
7990 ( d ) => d . toLocaleDateString ( locale , { weekday : "short" } ) ,
8091 7 ,
8192 "day" ,
8293 ) ;
8394 const daysInMonth = new Date ( ) . getDate ( ) ;
8495 const monthData = aggregateBy (
85- month ,
96+ monthAll ,
8697 ( d ) => d . getDate ( ) . toString ( ) ,
8798 daysInMonth ,
8899 "day" ,
89100 ) ;
90101 const yearData = aggregateBy (
91- year ,
102+ yearAll ,
92103 ( d ) => d . toLocaleDateString ( locale , { month : "short" } ) ,
93104 12 ,
94105 "month" ,
95- ) ;
106+ ) . map ( d => ( { month : d . date , work : d . work , break : d . break } ) ) ;
96107
97108 const todayTotals = {
98- workMinutes : today . reduce ( ( sum , s ) => sum + minutes ( s . start , s . end ) , 0 ) ,
99- breakMinutes : today . reduce (
100- ( sum , s ) => sum + minutes ( s . end , s . breakEnd ?? s . end ) ,
101- 0 ,
102- ) ,
103- cycles : today . length ,
109+ workMinutes : todayWork . reduce ( ( sum , s ) => sum + minutes ( s . start , s . end ) , 0 ) ,
110+ breakMinutes : todayBreak . reduce ( ( sum , s ) => sum + minutes ( s . start , s . end ) , 0 ) ,
111+ cycles : todayWork . length ,
104112 } ;
105113
106114 const timeOfDay = {
@@ -110,7 +118,9 @@ export const usePomodoroStats = (): PomodoroStats => {
110118 night : 0 ,
111119 } ;
112120 sessions . forEach ( ( s ) => {
113- const start = new Date ( s . start ) ;
121+ // Only count work for time of day distribution? Or both? Usually focus is on work.
122+ // Let's count both for "activity"
123+ const start = new Date ( s . start ) ;
114124 const h = start . getHours ( ) ;
115125 const m = minutes ( s . start , s . end ) ;
116126 if ( h >= 6 && h < 12 ) timeOfDay . morning += m ;
0 commit comments