osboxes/osboxes.org
cd electron-workshop
git fetch origin
npm install
npm start
renderer.js
https://pogodynka.ml/Bielsko-biała
// OR
https://wttr.pluszczewski.pl/Bielsko-biała
const getWeatherData = (city = 'Bielsko-biała') => {
return fetch(`https://pogodynka.ml/${encodeURI(city)}`)
.then(response => response.json());
};
getWeatherData()
.then(weatherData => updateCurrentWeather(weatherData.now));
electron-json-storage
renderer.js
Chrome DevTools
const storage = require('electron-json-storage'); // 👈
const getWeatherData = (city = 'Bielsko-biała') => {
return fetch(`https://pogodynka.ml/${encodeURI(city)}`)
.then(response => response.json())
.then(weatherData => {
storage.set('weatherData', weatherData); // 👈
return weatherData;
})
.catch(() => { // 👈
return new Promise((resolve, reject) =>
storage.get('weatherData', (error, data) => {
error ? reject(error) : resolve(data);
}));
});
};
Szyna IPC
dialog
Menu
fs
// emisja zdarzeń
window.webContents.send(
'event-name',
dataToSend
);
// obsługa zdarzeń
const { ipcMain } =
require('electron');
ipcMain.on(
'another-event',
(event, data) => {
console.log(data);
}
);
// emisja zdarzeń
const { ipcRenderer } =
require('electron');
ipcRenderer.send(
'another-event',
data
);
// obsługa zdarzeń
ipcRenderer.on(
'event-name',
(event, data) => {
console.log(data);
}
);
// renderer.js
const { ipcRenderer } = require('electron'); // 👈
const saveToJson = async () => { // 👈
try {
const data = await getWeatherData();
updateCurrentWeather(data);
ipcRenderer.send('save-to-json', data);
} catch (error) { /* [...] */ }
};
getWeatherData()
.then((weatherData) => {
// [...]
document.getElementById('saveToJsonBtn')
.addEventListener('click', saveToJson); // 👈
});
// main.js
const { ipcMain, dialog } = require('electron'); // 👈
const fs = require('fs');
ipcMain.on('save-to-json', (event, data) => { // 👈
dialog.showSaveDialog(mainWindow, {
title: 'Save to JSON',
}, (filename) => {
if (filename) {
const serializedData = JSON.stringify(data, null, 2);
fs.writeFile(filename, serializedData, (error) => { // 👈
if (error) {
console.error(error);
}
});
}
});
});
// main.js
const { Menu } = require('electron');
const menuTemplate = [{ // 👈
label: app.getName(),
submenu: [
{
label: 'Save to JSON',
click: () => {
window.webContents.send('save-to-json-shortcut'); // 👈
},
accelerator: 'CmdOrCtrl+S',
},
// [...]
],
}];
const menu = Menu.buildFromTemplate(menuTemplate); // 👈
Menu.setApplicationMenu(menu);
// main.js
app.on('ready', () => {
const window = createWindow();
createMenu(window); // 👈
});
// renderer.js
getWeatherData()
.then((weatherData) => {
// [...]
ipcRenderer.on('save-to-json-shortcut', saveToJson); // 👈
});
getWeatherData()
Tray
Menu
electron-main-notification
// main.js
let tray;
const createTray = (window) => {
const trayMenuTemplate = [{ // 👈
label: 'Show application',
click: () => { window.show(); },
},
{ label: 'Show weather', click: showNotification }, // 👈
{ role: 'separator' },
{ label: 'Quit', click: () => app.exit(0) },
];
tray = new Tray('icons/cloud.png'); // 👈
const contextMenu = Menu.buildFromTemplate(trayMenuTemplate); // 👈
tray.setContextMenu(contextMenu); // 👈
};
// main.js
app.on('ready', () => {
const window = createWindow();
createMenu(window);
createTray(window); // 👈
});
// main.js
const notify = require('electron-main-notification');
const getWeatherData = /* require it */
const showNotification = async () => {
const weatherData = await getWeatherData();
notify('Weather', {
body: `
Temperature: ${weatherData.now.temperatureLow},
Wind direction: ${weatherData.now.windDirectionIcon},
Wind speed: ${weatherData.now.windLow} km/h`,
});
};
Tray.setImage()
globalShortcut