about summary refs log blame commit diff stats
path: root/js/pomo/pomo.js
blob: a5b793fd3e68f5b1e0d5b23002835cc00da8033e (plain) (tree)

























                                                             










                                                            





                                                                            
                   
                              
                                       

                                  





                                                                  
                                             












                                  







                                     
         









                                                                                           

     







                                             
const canvas = document.getElementById('pomoCanvas');
const ctx = canvas.getContext('2d');

const resizeCanvas = () => {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
};

window.addEventListener('resize', resizeCanvas);
resizeCanvas();

Notification.requestPermission().then(function (permission) {
    if (permission === 'granted') {
        console.log('Notification permission granted.');
    } else {
        console.log('Unable to get permission to notify.');
    }
});

let isRunning = false;
let intervalId = null;
// const duration = 10;
const duration = 25 * 60; // 25 minutes
let progress = 0;
let isPaused = false;

const displayText = (text) => {
    ctx.fillStyle = 'black';
    ctx.font = '30px Arial';
    ctx.textAlign = 'center';
    ctx.fillText(text, canvas.width / 2, canvas.height / 2);
}

if (!isRunning && !isPaused && progress === 0) {
    displayText('Tap to start');
}

const draw = () => {
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    ctx.fillStyle = progress === duration ? '#17B169' : '#ff6347';
    ctx.fillRect(0, 0, (progress / duration) * canvas.width, canvas.height);

    if (isPaused) {
        displayText('Paused');
    } else if (progress === duration) {
        displayText('🍅');
        new Notification('Pomo', {
            body: 'Take a rest!',
            icon: 'https://eli.li/_assets/_images/pomo-tomato.png'
        });
    } else {
        const minutes = Math.floor(progress / 60);
        const seconds = ('0' + (progress % 60)).slice(-2);
        displayText(`${minutes}:${seconds}`);
    }
};

const update = () => {
    if (progress < duration) {
        progress++;
        draw();
    } else {
        clearInterval(intervalId);
        isRunning = false;
    }
};

const handleUserInteraction = () => {
    if (isRunning) {
        clearInterval(intervalId);
        isRunning = false;
        isPaused = true;
    } else {
        if (progress === duration) {
            progress = 0;
        }
        isPaused = false;
        intervalId = setInterval(update, 1000);
        isRunning = true;
    }
    draw();
};

window.addEventListener('keydown', (event) => {
    if (event.code === 'Space' || event.code === 'Enter' || event.code === 'NumpadEnter') {
        handleUserInteraction();
    }
});

window.addEventListener('click', () => {
    handleUserInteraction();
});

window.addEventListener('touchstart', () => {
    handleUserInteraction();
});