I wrote a Pomodoro app use Electronjs used function setInterval()
to count down from 25:00 to 00:00. When user click minimize or close, the app hide to the tray. But then, sometimes it’s stopped (may be by Windows). How I keep it alive after hide to the tray?
Here my main.js
:
const { app, BrowserWindow, Tray, Menu, powerSaveBlocker } = require('electron');
const path = require('node:path');
let win;
let tray = null;
let powerSaveId;
app.whenReady().then(() => {
createWindow();
// hide menu bar
win.setMenuBarVisibility(false);
// create tray
tray = new Tray(path.join(__dirname, 'assets/icon.png'));
const contextMenu = Menu.buildFromTemplate([
{
label: 'Show App', click: function() {
win.show();
}
},
{
label: 'Quit', click: function() {
//powerSaveBlocker.stop(powerSaveId);
app.isQuiting = true;
app.quit();
}
}
]);
tray.setToolTip('Pomodoro');
tray.setContextMenu(contextMenu);
tray.on('click', function() {
win.isVisible() ? win.hide() : win.show();
});
win.on('minimize', function(event) {
event.preventDefault();
win.hide();
});
win.on('close', function(event) {
if (!app.isQuiting) {
event.preventDefault();
win.hide();
}
else {
//powerSaveBlocker.stop(powerSaveId);
}
return false;
});
app.on('window-all-closed', function() {
if (process.platform !== 'darwin') app.quit();
});
// start power save blocker
powerSaveId = powerSaveBlocker.start('prevent-app-suspension');
});
// check the status of powerSaveBlocker
const checkPowerSaveBlocker = () => {
//let currentDateTime = new Date();
//console.log('Power save blocker is active:', powerSaveBlocker.isStarted(powerSaveId));
//console.log(currentDateTime.toString());
};
// Check interval per 10 seconds
//setInterval(checkPowerSaveBlocker, 10000);
function createWindow()
{
win = new BrowserWindow({
width: 300,
height: 300,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: false,
contextIsolation: true,
},
});
win.loadFile('index.html');
}
Here my renderer.js
:
// renderer.js
let timer;
let cycleTime = 25;
let timeLeft = cycleTime * 60; // 25 minutes in seconds
let isRunning = false;
const timerDisplay = document.getElementById('timer');
const startStopBtn = document.getElementById('start-stop-btn');
function updateDisplay() {
const minutes = Math.floor(timeLeft / 60);
const seconds = timeLeft % 60;
timerDisplay.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
}
function startTimer() {
if (!isRunning) {
isRunning = true;
startStopBtn.textContent = 'STOP';
timer = setInterval(() => {
timeLeft--;
updateDisplay();
if (timeLeft <= 0) {
clearInterval(timer);
isRunning = false;
startStopBtn.textContent = 'START';
timeLeft = cycleTime * 60; // Reset to 25 minutes
updateDisplay();
}
}, 1000);
}
else {
clearInterval(timer);
isRunning = false;
startStopBtn.textContent = 'START';
}
}
startStopBtn.addEventListener('click', startTimer);
updateDisplay();
I tried powerSaveBlocker but not work. In window task manager, the app is marked “Efficiency mode” after hide to the tray