2
respostas

A um erro no exercicio 2

aaaaaa

2 respostas

quando faço o exercicio dois da esse erro

Uncaught Exception:
TypeError: Invalid template for Menu
    at Function.Menu.buildFromTemplate (/Users/yagosilva/Desktop/alura-timer/node_modules/electron/dist/Electron.app/Contents/Resources/electron.asar/browser/api/menu.js:171:11)
    at App.app.on (/Users/yagosilva/Desktop/alura-timer/main.js:21:30)
    at emitTwo (events.js:130:20)
    at App.emit (events.js:213:7

segue o codigo main:

const { app, BrowserWindow, ipcMain,Tray, Menu }  = require('electron');
const data = require('./data')
const templateGenerator = require('./template');

let tray = null;

let mainWindow = null;

app.on('ready', () => {

    let mainWindow = new BrowserWindow({
        width: 600,
        height: 400,
    });

    tray = new Tray(__dirname + '/app/img/icon-tray.png');
    let template = templateGenerator.geraTrayTemplate(mainWindow);
    let trayMenu = Menu.buildFromTemplate(template);

    let templateMenu = templateGenerator.geraMenuPrincipalTemplate(app);
    let menuPrincipal = Menu.buildFromTemplate(templateMenu);
    Menu.setApplicationMenu(menuPrincipal);

    tray.setContextMenu(trayMenu);

    mainWindow.loadURL(`file://${__dirname}/app/index.html`);

});

app.on('window-all-closed', () => {
    app.quit();
});

let sobreWindow = null;
ipcMain.on('abrir-janela-sobre', () => {
    if(sobreWindow == null){
        sobreWindow = new BrowserWindow({
            width: 300,
            height: 220,
            alwaysOnTop: true,
            frame: false
        });
        sobreWindow.on('closed', () => {
            sobreWindow = null;
        })
    }
    sobreWindow.loadURL(`file://${__dirname}/app/sobre.html`);

});

ipcMain.on('fechar-janela-sobre', () => {
    sobreWindow.close();
});

ipcMain.on('curso-parado', (event,curso, tempoEstudado) => {
    console.log(`O curso ${curso} foi estudado por ${tempoEstudado}`);
    data.salvaDados(curso, tempoEstudado);
});
ipcMain.on('curso-adicionado', (event, novoCurso) =>{
    let novoTemplate = templateGenerator.adicionarCursoNotray(novoCurso,mainWindow);
    let novoTrayTemplate = Menu.buildFromTemplate(novoTemplate);
    tray.setContextMenu(novoTrayTemplate);
});

template:

const data = require('./data');
const ipcMain = require('electron');

module.exports = {
        templateInicial: null,

        geraTrayTemplate(win){
            let template = [
                {
                    label: 'Cursos'
                },

                {
                    type:'separator'
                }
            ];
            this.templateInicial = template;

            let cursos = data.pegaNomeDosCursos();
            cursos.forEach((curso) => {
                let menuItem ={
                    label: curso,
                    type: 'radio',
                    click: () => {
                        win.send('curso-trocado', curso);
                    }
                }
                template.push(menuItem);
            })

            return template;

        },
        adicionarCursoNotray(curso,win){
            this.templateInicial.push({
                label: curso,
                type: 'radio',
                checked: true,
                click: () => {
                    win.send('curso-adicionado', curso);
                }
            })
            return this.templateInicial;
        },

        geraMenuPrincipalTemplate(app){
            let templateMenu = [            
                {
                    label: 'Sobre',
                    submenu: [
                        {
                            label: 'Sobre o Alura Timer',
                            click:() =>{ 
                                ipcMain.emit('abrir-janela-sobre');
                        }
                        }  
                    ]      
                }
            ];
            if( process.platform == 'darwin'){
                templateMenu.unshift(
                    {
                        label: app.getName(),
                        submenu: [
                            {
                                label: 'Estou rodando no Mac!'
                            }
                        ]
                    }
                )
             }
    }
}

Fala ai Yago, tudo bem? Olhando o erro:

TypeError: Invalid template for Menu

Parece que algum template que você está passando para a função buildFromTemplate do Menu está inválido, talvez por algum problema na estrutura ou sintaxe do mesmo.

Sendo assim, para a gente testar se realmente o problema é essa função, tente comentar as duas, no caso comentar os seguintes trechos de código:

let trayMenu = Menu.buildFromTemplate(template);
tray.setContextMenu(trayMenu);

e

let menuPrincipal = Menu.buildFromTemplate(templateMenu);
Menu.setApplicationMenu(menuPrincipal);

E tente rodar a aplicação novamente, caso tudo funcione, remova o comentários de apenas um deles, pode ser qualquer um. Se funcionar, remove o comentários do segundo, provavelmente se o problema for essa função, um deles irá dar erro.

Espero ter ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software