80 lines
2.0 KiB
TypeScript
80 lines
2.0 KiB
TypeScript
import {FocusState} from "./focus-state";
|
|
|
|
export class FocusStats {
|
|
private _focusCycles: number = 0;
|
|
private _focusTimeInMs: number = 0;
|
|
private _focusTime: string = '';
|
|
private _shortBreakCycles: number = 0;
|
|
private _longBreakCycles: number = 0;
|
|
private _breakTimeInMs: number = 0;
|
|
private _breakTime: string = '';
|
|
|
|
inc(state: FocusState, deltaInMs?: number): void {
|
|
switch (state) {
|
|
case FocusState.FOCUS:
|
|
this._focusCycles++;
|
|
this._focusTimeInMs += !!deltaInMs ? deltaInMs : 0;
|
|
this.updateFocusTime();
|
|
break;
|
|
case FocusState.SHORT_BREAK:
|
|
this._shortBreakCycles++;
|
|
this._breakTimeInMs += !!deltaInMs ? deltaInMs : 0;
|
|
this.updateBreakTime();
|
|
break;
|
|
case FocusState.LONG_BREAK:
|
|
this._longBreakCycles++;
|
|
this._breakTimeInMs += !!deltaInMs ? deltaInMs : 0;
|
|
this.updateBreakTime();
|
|
break;
|
|
default:
|
|
// nothing
|
|
break;
|
|
}
|
|
}
|
|
|
|
private updateFocusTime() {
|
|
this._focusTime = this.transformTime(this._focusTimeInMs);
|
|
}
|
|
|
|
private updateBreakTime() {
|
|
this._breakTime = this.transformTime(this._breakTimeInMs);
|
|
}
|
|
|
|
private transformTime(ms: number): string {
|
|
const totalSeconds = Math.floor(ms / 1000);
|
|
const seconds = totalSeconds % 60;
|
|
const totalMinutes = Math.floor(totalSeconds / 60);
|
|
const minutes = totalMinutes % 60;
|
|
const hours = Math.floor(totalMinutes / 60);
|
|
|
|
const pad = (n: number) => n.toString().padStart(2, "0");
|
|
|
|
if (hours > 0) {
|
|
return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
|
|
} else {
|
|
return `${pad(minutes)}:${pad(seconds)}`;
|
|
}
|
|
}
|
|
|
|
get focusCycles(): number {
|
|
return this._focusCycles;
|
|
}
|
|
|
|
get shortBreakCycles(): number {
|
|
return this._shortBreakCycles;
|
|
}
|
|
|
|
get longBreakCycles(): number {
|
|
return this._longBreakCycles;
|
|
}
|
|
|
|
|
|
get focusTime(): string {
|
|
return this._focusTime;
|
|
}
|
|
|
|
get breakTime(): string {
|
|
return this._breakTime;
|
|
}
|
|
}
|