electron auto-update on click











up vote
1
down vote

favorite












I'm trying to make my electron app auto-updatable, and after searching on google I found nice guide that works. The only problem is that I want to create a button for when update is downloaded so that the user can decide when he wants to update and restart the app. So far I was able to put this code together



renderer.js



const electron = require('electron')
const ipcRenderer = electron.ipcRenderer

let lastMsgId = 0

window.quitAndInstall = function () {
electron.remote.autoUpdater.quitAndInstall()
}

ipcRenderer.on('console', (event, consoleMsg) => {
console.log(consoleMsg)
})

ipcRenderer.on('message', (event, data) => {
showMessage(data.msg, data.hide, data.replaceAll)
})

function showMessage(message, hide = true, replaceAll = false) {
const messagesContainer = document.querySelector('.messages-container')
const msgId = lastMsgId++ + 1
const msgTemplate = `<div id="${msgId}" class="alert alert-info alert-info-message animated fadeIn">${message}</div>`

if (replaceAll) {
messagesContainer.innerHTML = msgTemplate
} else {
messagesContainer.insertAdjacentHTML('afterbegin', msgTemplate)
}

if (hide) {
setTimeout(() => {
const msgEl = document.getElementById(msgId)
msgEl.classList.remove('fadeIn')
msgEl.classList.add('fadeOut')
}, 4000)
}
}


and this is my index.js where messages are storred



const electron = require('electron');
const {autoUpdater} = require('electron-updater');
const log = require('electron-log');
const appVersion = require('./package.json').version

// configure logging
autoUpdater.logger = log;
autoUpdater.logger.transports.file.level = 'info';
log.info('App starting...');

const app = electron.app;
const BrowserWindow = electron.BrowserWindow;

let mainWindow;

function createWindow() {
mainWindow = new BrowserWindow({
width: 1020,
height: 800,
});
mainWindow.loadURL('file://' +__dirname + '/public/index.html');

// Open the DevTools.
//mainWindow.webContents.openDevTools();

mainWindow.on('closed', function() {
mainWindow = null;
});
}

app.on('ready', createWindow);

// Quit when all windows are closed.
app.on('window-all-closed', function() {
app.quit();
});

app.on('activate', function() {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) {
createWindow();
}
});

//-------------------------------------------------------------------
// Auto updates
//-------------------------------------------------------------------
const sendStatusToWindow = (text) => {
log.info(text);
if (mainWindow) {
mainWindow.webContents.send('console', `App version: ${appVersion}`)
mainWindow.webContents.send('message', { msg: `App version: ${appVersion}` })
}
};

autoUpdater.on('error', (ev, err) => {
mainWindow.webContents.send('message', { msg: `Error: ${err}` })
})

autoUpdater.once('checking-for-update', (ev, err) => {
mainWindow.webContents.send('message', { msg: 'Checking for updates' })
})

autoUpdater.once('update-available', (ev, err) => {
mainWindow.webContents.send('message', { msg: 'Update available. Downloading ⌛️', hide: false })
})

autoUpdater.once('update-not-available', (ev, err) => {
mainWindow.webContents.send('message', { msg: 'Update not available' })
})

autoUpdater.once('update-downloaded', (ev, err) => {
const msg = 'Update downloaded - <button onclick="quitAndInstall()">Restart</button>'
mainWindow.webContents.send('message', { msg, hide: false, replaceAll: true })
})

autoUpdater.checkForUpdates()


As you can see I added a button to call for function but it doesnt work. When I press the button nothing happens. If I remove button and just say auto.updater.quitAndInstall() it works. It auto close window and install new version. What am I missing?










share|improve this question


























    up vote
    1
    down vote

    favorite












    I'm trying to make my electron app auto-updatable, and after searching on google I found nice guide that works. The only problem is that I want to create a button for when update is downloaded so that the user can decide when he wants to update and restart the app. So far I was able to put this code together



    renderer.js



    const electron = require('electron')
    const ipcRenderer = electron.ipcRenderer

    let lastMsgId = 0

    window.quitAndInstall = function () {
    electron.remote.autoUpdater.quitAndInstall()
    }

    ipcRenderer.on('console', (event, consoleMsg) => {
    console.log(consoleMsg)
    })

    ipcRenderer.on('message', (event, data) => {
    showMessage(data.msg, data.hide, data.replaceAll)
    })

    function showMessage(message, hide = true, replaceAll = false) {
    const messagesContainer = document.querySelector('.messages-container')
    const msgId = lastMsgId++ + 1
    const msgTemplate = `<div id="${msgId}" class="alert alert-info alert-info-message animated fadeIn">${message}</div>`

    if (replaceAll) {
    messagesContainer.innerHTML = msgTemplate
    } else {
    messagesContainer.insertAdjacentHTML('afterbegin', msgTemplate)
    }

    if (hide) {
    setTimeout(() => {
    const msgEl = document.getElementById(msgId)
    msgEl.classList.remove('fadeIn')
    msgEl.classList.add('fadeOut')
    }, 4000)
    }
    }


    and this is my index.js where messages are storred



    const electron = require('electron');
    const {autoUpdater} = require('electron-updater');
    const log = require('electron-log');
    const appVersion = require('./package.json').version

    // configure logging
    autoUpdater.logger = log;
    autoUpdater.logger.transports.file.level = 'info';
    log.info('App starting...');

    const app = electron.app;
    const BrowserWindow = electron.BrowserWindow;

    let mainWindow;

    function createWindow() {
    mainWindow = new BrowserWindow({
    width: 1020,
    height: 800,
    });
    mainWindow.loadURL('file://' +__dirname + '/public/index.html');

    // Open the DevTools.
    //mainWindow.webContents.openDevTools();

    mainWindow.on('closed', function() {
    mainWindow = null;
    });
    }

    app.on('ready', createWindow);

    // Quit when all windows are closed.
    app.on('window-all-closed', function() {
    app.quit();
    });

    app.on('activate', function() {
    // On OS X it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (mainWindow === null) {
    createWindow();
    }
    });

    //-------------------------------------------------------------------
    // Auto updates
    //-------------------------------------------------------------------
    const sendStatusToWindow = (text) => {
    log.info(text);
    if (mainWindow) {
    mainWindow.webContents.send('console', `App version: ${appVersion}`)
    mainWindow.webContents.send('message', { msg: `App version: ${appVersion}` })
    }
    };

    autoUpdater.on('error', (ev, err) => {
    mainWindow.webContents.send('message', { msg: `Error: ${err}` })
    })

    autoUpdater.once('checking-for-update', (ev, err) => {
    mainWindow.webContents.send('message', { msg: 'Checking for updates' })
    })

    autoUpdater.once('update-available', (ev, err) => {
    mainWindow.webContents.send('message', { msg: 'Update available. Downloading ⌛️', hide: false })
    })

    autoUpdater.once('update-not-available', (ev, err) => {
    mainWindow.webContents.send('message', { msg: 'Update not available' })
    })

    autoUpdater.once('update-downloaded', (ev, err) => {
    const msg = 'Update downloaded - <button onclick="quitAndInstall()">Restart</button>'
    mainWindow.webContents.send('message', { msg, hide: false, replaceAll: true })
    })

    autoUpdater.checkForUpdates()


    As you can see I added a button to call for function but it doesnt work. When I press the button nothing happens. If I remove button and just say auto.updater.quitAndInstall() it works. It auto close window and install new version. What am I missing?










    share|improve this question
























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I'm trying to make my electron app auto-updatable, and after searching on google I found nice guide that works. The only problem is that I want to create a button for when update is downloaded so that the user can decide when he wants to update and restart the app. So far I was able to put this code together



      renderer.js



      const electron = require('electron')
      const ipcRenderer = electron.ipcRenderer

      let lastMsgId = 0

      window.quitAndInstall = function () {
      electron.remote.autoUpdater.quitAndInstall()
      }

      ipcRenderer.on('console', (event, consoleMsg) => {
      console.log(consoleMsg)
      })

      ipcRenderer.on('message', (event, data) => {
      showMessage(data.msg, data.hide, data.replaceAll)
      })

      function showMessage(message, hide = true, replaceAll = false) {
      const messagesContainer = document.querySelector('.messages-container')
      const msgId = lastMsgId++ + 1
      const msgTemplate = `<div id="${msgId}" class="alert alert-info alert-info-message animated fadeIn">${message}</div>`

      if (replaceAll) {
      messagesContainer.innerHTML = msgTemplate
      } else {
      messagesContainer.insertAdjacentHTML('afterbegin', msgTemplate)
      }

      if (hide) {
      setTimeout(() => {
      const msgEl = document.getElementById(msgId)
      msgEl.classList.remove('fadeIn')
      msgEl.classList.add('fadeOut')
      }, 4000)
      }
      }


      and this is my index.js where messages are storred



      const electron = require('electron');
      const {autoUpdater} = require('electron-updater');
      const log = require('electron-log');
      const appVersion = require('./package.json').version

      // configure logging
      autoUpdater.logger = log;
      autoUpdater.logger.transports.file.level = 'info';
      log.info('App starting...');

      const app = electron.app;
      const BrowserWindow = electron.BrowserWindow;

      let mainWindow;

      function createWindow() {
      mainWindow = new BrowserWindow({
      width: 1020,
      height: 800,
      });
      mainWindow.loadURL('file://' +__dirname + '/public/index.html');

      // Open the DevTools.
      //mainWindow.webContents.openDevTools();

      mainWindow.on('closed', function() {
      mainWindow = null;
      });
      }

      app.on('ready', createWindow);

      // Quit when all windows are closed.
      app.on('window-all-closed', function() {
      app.quit();
      });

      app.on('activate', function() {
      // On OS X it's common to re-create a window in the app when the
      // dock icon is clicked and there are no other windows open.
      if (mainWindow === null) {
      createWindow();
      }
      });

      //-------------------------------------------------------------------
      // Auto updates
      //-------------------------------------------------------------------
      const sendStatusToWindow = (text) => {
      log.info(text);
      if (mainWindow) {
      mainWindow.webContents.send('console', `App version: ${appVersion}`)
      mainWindow.webContents.send('message', { msg: `App version: ${appVersion}` })
      }
      };

      autoUpdater.on('error', (ev, err) => {
      mainWindow.webContents.send('message', { msg: `Error: ${err}` })
      })

      autoUpdater.once('checking-for-update', (ev, err) => {
      mainWindow.webContents.send('message', { msg: 'Checking for updates' })
      })

      autoUpdater.once('update-available', (ev, err) => {
      mainWindow.webContents.send('message', { msg: 'Update available. Downloading ⌛️', hide: false })
      })

      autoUpdater.once('update-not-available', (ev, err) => {
      mainWindow.webContents.send('message', { msg: 'Update not available' })
      })

      autoUpdater.once('update-downloaded', (ev, err) => {
      const msg = 'Update downloaded - <button onclick="quitAndInstall()">Restart</button>'
      mainWindow.webContents.send('message', { msg, hide: false, replaceAll: true })
      })

      autoUpdater.checkForUpdates()


      As you can see I added a button to call for function but it doesnt work. When I press the button nothing happens. If I remove button and just say auto.updater.quitAndInstall() it works. It auto close window and install new version. What am I missing?










      share|improve this question













      I'm trying to make my electron app auto-updatable, and after searching on google I found nice guide that works. The only problem is that I want to create a button for when update is downloaded so that the user can decide when he wants to update and restart the app. So far I was able to put this code together



      renderer.js



      const electron = require('electron')
      const ipcRenderer = electron.ipcRenderer

      let lastMsgId = 0

      window.quitAndInstall = function () {
      electron.remote.autoUpdater.quitAndInstall()
      }

      ipcRenderer.on('console', (event, consoleMsg) => {
      console.log(consoleMsg)
      })

      ipcRenderer.on('message', (event, data) => {
      showMessage(data.msg, data.hide, data.replaceAll)
      })

      function showMessage(message, hide = true, replaceAll = false) {
      const messagesContainer = document.querySelector('.messages-container')
      const msgId = lastMsgId++ + 1
      const msgTemplate = `<div id="${msgId}" class="alert alert-info alert-info-message animated fadeIn">${message}</div>`

      if (replaceAll) {
      messagesContainer.innerHTML = msgTemplate
      } else {
      messagesContainer.insertAdjacentHTML('afterbegin', msgTemplate)
      }

      if (hide) {
      setTimeout(() => {
      const msgEl = document.getElementById(msgId)
      msgEl.classList.remove('fadeIn')
      msgEl.classList.add('fadeOut')
      }, 4000)
      }
      }


      and this is my index.js where messages are storred



      const electron = require('electron');
      const {autoUpdater} = require('electron-updater');
      const log = require('electron-log');
      const appVersion = require('./package.json').version

      // configure logging
      autoUpdater.logger = log;
      autoUpdater.logger.transports.file.level = 'info';
      log.info('App starting...');

      const app = electron.app;
      const BrowserWindow = electron.BrowserWindow;

      let mainWindow;

      function createWindow() {
      mainWindow = new BrowserWindow({
      width: 1020,
      height: 800,
      });
      mainWindow.loadURL('file://' +__dirname + '/public/index.html');

      // Open the DevTools.
      //mainWindow.webContents.openDevTools();

      mainWindow.on('closed', function() {
      mainWindow = null;
      });
      }

      app.on('ready', createWindow);

      // Quit when all windows are closed.
      app.on('window-all-closed', function() {
      app.quit();
      });

      app.on('activate', function() {
      // On OS X it's common to re-create a window in the app when the
      // dock icon is clicked and there are no other windows open.
      if (mainWindow === null) {
      createWindow();
      }
      });

      //-------------------------------------------------------------------
      // Auto updates
      //-------------------------------------------------------------------
      const sendStatusToWindow = (text) => {
      log.info(text);
      if (mainWindow) {
      mainWindow.webContents.send('console', `App version: ${appVersion}`)
      mainWindow.webContents.send('message', { msg: `App version: ${appVersion}` })
      }
      };

      autoUpdater.on('error', (ev, err) => {
      mainWindow.webContents.send('message', { msg: `Error: ${err}` })
      })

      autoUpdater.once('checking-for-update', (ev, err) => {
      mainWindow.webContents.send('message', { msg: 'Checking for updates' })
      })

      autoUpdater.once('update-available', (ev, err) => {
      mainWindow.webContents.send('message', { msg: 'Update available. Downloading ⌛️', hide: false })
      })

      autoUpdater.once('update-not-available', (ev, err) => {
      mainWindow.webContents.send('message', { msg: 'Update not available' })
      })

      autoUpdater.once('update-downloaded', (ev, err) => {
      const msg = 'Update downloaded - <button onclick="quitAndInstall()">Restart</button>'
      mainWindow.webContents.send('message', { msg, hide: false, replaceAll: true })
      })

      autoUpdater.checkForUpdates()


      As you can see I added a button to call for function but it doesnt work. When I press the button nothing happens. If I remove button and just say auto.updater.quitAndInstall() it works. It auto close window and install new version. What am I missing?







      electron auto-update






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 18 at 17:13









      Miran Urbas

      439




      439
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          I think it's that electron.remote.autoUpdater.quitAndInstall() doesn't work when run in the renderer.



          In the docs it doesn't say anything against running it in the renderer process but I think sending a message back to the main process to run the quitAndInstall function would work.



          Inside of the quitAndInstall function put this instead:



          ipcRenderer.send('asynchronous-message', 'quitAndInstall');


          Then in the main process put:



          electron.ipcMain.on('asynchronous-message', function (evt, message) {
          if (message == 'quitAndInstall') {
          autoUpdater.quitAndInstall();
          }
          });





          share|improve this answer





















          • I tried you solution but it doesn’t work for me. I think you’re right about quitAndInstall doesn’t work in the renderer because I get an error that the code is incorrect.
            – Miran Urbas
            Nov 23 at 20:20










          • Ah, @MiranUrbas could you edit your question to include the error message?
            – Mike
            Nov 23 at 22:50











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53363478%2felectron-auto-update-on-click%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          0
          down vote













          I think it's that electron.remote.autoUpdater.quitAndInstall() doesn't work when run in the renderer.



          In the docs it doesn't say anything against running it in the renderer process but I think sending a message back to the main process to run the quitAndInstall function would work.



          Inside of the quitAndInstall function put this instead:



          ipcRenderer.send('asynchronous-message', 'quitAndInstall');


          Then in the main process put:



          electron.ipcMain.on('asynchronous-message', function (evt, message) {
          if (message == 'quitAndInstall') {
          autoUpdater.quitAndInstall();
          }
          });





          share|improve this answer





















          • I tried you solution but it doesn’t work for me. I think you’re right about quitAndInstall doesn’t work in the renderer because I get an error that the code is incorrect.
            – Miran Urbas
            Nov 23 at 20:20










          • Ah, @MiranUrbas could you edit your question to include the error message?
            – Mike
            Nov 23 at 22:50















          up vote
          0
          down vote













          I think it's that electron.remote.autoUpdater.quitAndInstall() doesn't work when run in the renderer.



          In the docs it doesn't say anything against running it in the renderer process but I think sending a message back to the main process to run the quitAndInstall function would work.



          Inside of the quitAndInstall function put this instead:



          ipcRenderer.send('asynchronous-message', 'quitAndInstall');


          Then in the main process put:



          electron.ipcMain.on('asynchronous-message', function (evt, message) {
          if (message == 'quitAndInstall') {
          autoUpdater.quitAndInstall();
          }
          });





          share|improve this answer





















          • I tried you solution but it doesn’t work for me. I think you’re right about quitAndInstall doesn’t work in the renderer because I get an error that the code is incorrect.
            – Miran Urbas
            Nov 23 at 20:20










          • Ah, @MiranUrbas could you edit your question to include the error message?
            – Mike
            Nov 23 at 22:50













          up vote
          0
          down vote










          up vote
          0
          down vote









          I think it's that electron.remote.autoUpdater.quitAndInstall() doesn't work when run in the renderer.



          In the docs it doesn't say anything against running it in the renderer process but I think sending a message back to the main process to run the quitAndInstall function would work.



          Inside of the quitAndInstall function put this instead:



          ipcRenderer.send('asynchronous-message', 'quitAndInstall');


          Then in the main process put:



          electron.ipcMain.on('asynchronous-message', function (evt, message) {
          if (message == 'quitAndInstall') {
          autoUpdater.quitAndInstall();
          }
          });





          share|improve this answer












          I think it's that electron.remote.autoUpdater.quitAndInstall() doesn't work when run in the renderer.



          In the docs it doesn't say anything against running it in the renderer process but I think sending a message back to the main process to run the quitAndInstall function would work.



          Inside of the quitAndInstall function put this instead:



          ipcRenderer.send('asynchronous-message', 'quitAndInstall');


          Then in the main process put:



          electron.ipcMain.on('asynchronous-message', function (evt, message) {
          if (message == 'quitAndInstall') {
          autoUpdater.quitAndInstall();
          }
          });






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 19 at 22:52









          Mike

          1,3461823




          1,3461823












          • I tried you solution but it doesn’t work for me. I think you’re right about quitAndInstall doesn’t work in the renderer because I get an error that the code is incorrect.
            – Miran Urbas
            Nov 23 at 20:20










          • Ah, @MiranUrbas could you edit your question to include the error message?
            – Mike
            Nov 23 at 22:50


















          • I tried you solution but it doesn’t work for me. I think you’re right about quitAndInstall doesn’t work in the renderer because I get an error that the code is incorrect.
            – Miran Urbas
            Nov 23 at 20:20










          • Ah, @MiranUrbas could you edit your question to include the error message?
            – Mike
            Nov 23 at 22:50
















          I tried you solution but it doesn’t work for me. I think you’re right about quitAndInstall doesn’t work in the renderer because I get an error that the code is incorrect.
          – Miran Urbas
          Nov 23 at 20:20




          I tried you solution but it doesn’t work for me. I think you’re right about quitAndInstall doesn’t work in the renderer because I get an error that the code is incorrect.
          – Miran Urbas
          Nov 23 at 20:20












          Ah, @MiranUrbas could you edit your question to include the error message?
          – Mike
          Nov 23 at 22:50




          Ah, @MiranUrbas could you edit your question to include the error message?
          – Mike
          Nov 23 at 22:50


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53363478%2felectron-auto-update-on-click%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Create new schema in PostgreSQL using DBeaver

          Deepest pit of an array with Javascript: test on Codility

          Costa Masnaga