99 lines
2.8 KiB
TypeScript
99 lines
2.8 KiB
TypeScript
|
|
export class PomodoroTimer {
|
|
private pomodoroDuration: number; // in seconds
|
|
private shortBreakDuration: number; // in seconds
|
|
private longBreakDuration: number; // in seconds
|
|
private cyclesBeforeLongBreak: number;
|
|
|
|
private timerId: NodeJS.Timeout | null = null;
|
|
private remainingTime: number; // in seconds
|
|
private isRunning: boolean = false;
|
|
private currentCycle: number = 0;
|
|
private isPomodoro: boolean = true; // true for pomodoro, false for break
|
|
|
|
constructor(
|
|
pomodoroDuration: number = 25 * 60,
|
|
shortBreakDuration: number = 5 * 60,
|
|
longBreakDuration: number = 15 * 60,
|
|
cyclesBeforeLongBreak: number = 4
|
|
) {
|
|
this.pomodoroDuration = pomodoroDuration;
|
|
this.shortBreakDuration = shortBreakDuration;
|
|
this.longBreakDuration = longBreakDuration;
|
|
this.cyclesBeforeLongBreak = cyclesBeforeLongBreak;
|
|
this.remainingTime = this.pomodoroDuration;
|
|
}
|
|
|
|
public start(onTick: (remainingTime: number, isPomodoro: boolean) => void, onComplete: () => void) {
|
|
if (this.isRunning) {
|
|
return;
|
|
}
|
|
this.isRunning = true;
|
|
this.timerId = setInterval(() => {
|
|
this.remainingTime--;
|
|
onTick(this.remainingTime, this.isPomodoro);
|
|
if (this.remainingTime <= 0) {
|
|
this.stop();
|
|
onComplete();
|
|
this.nextCycle();
|
|
}
|
|
}, 1000);
|
|
}
|
|
|
|
public pause() {
|
|
if (this.timerId) {
|
|
clearInterval(this.timerId);
|
|
this.timerId = null;
|
|
}
|
|
this.isRunning = false;
|
|
}
|
|
|
|
public reset() {
|
|
this.pause();
|
|
this.currentCycle = 0;
|
|
this.isPomodoro = true;
|
|
this.remainingTime = this.pomodoroDuration;
|
|
}
|
|
|
|
public skip() {
|
|
this.pause();
|
|
this.nextCycle();
|
|
}
|
|
|
|
private stop() {
|
|
if (this.timerId) {
|
|
clearInterval(this.timerId);
|
|
this.timerId = null;
|
|
}
|
|
this.isRunning = false;
|
|
}
|
|
|
|
private nextCycle() {
|
|
if (this.isPomodoro) {
|
|
this.currentCycle++;
|
|
if (this.currentCycle % this.cyclesBeforeLongBreak === 0) {
|
|
this.isPomodoro = false;
|
|
this.remainingTime = this.longBreakDuration;
|
|
} else {
|
|
this.isPomodoro = false;
|
|
this.remainingTime = this.shortBreakDuration;
|
|
}
|
|
} else {
|
|
this.isPomodoro = true;
|
|
this.remainingTime = this.pomodoroDuration;
|
|
}
|
|
}
|
|
|
|
public getRemainingTime(): number {
|
|
return this.remainingTime;
|
|
}
|
|
|
|
public getIsRunning(): boolean {
|
|
return this.isRunning;
|
|
}
|
|
|
|
public getIsPomodoro(): boolean {
|
|
return this.isPomodoro;
|
|
}
|
|
}
|