├── .DS_Store ├── .gitignore ├── camera.html ├── camera.js ├── cameraPreload.js ├── index.html ├── index.js ├── main.js ├── package-lock.json ├── package.json └── preload.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitfumes/electronjs-crash-course/147d632e81a8bdf4fc662f6ed1606080f60a5208/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | out/ -------------------------------------------------------------------------------- /camera.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 11 | Window 2 12 | 13 | 14 | 15 |

Camera Access

16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /camera.js: -------------------------------------------------------------------------------- 1 | const video = document.getElementById("camera"); 2 | const captureButton = document.getElementById("capture-image"); 3 | const imageTag = document.getElementById("image"); 4 | 5 | captureButton.addEventListener("click", () => { 6 | const canvas = document.createElement("canvas"); 7 | canvas.width = video.videoWidth; 8 | canvas.height = video.videoHeight; 9 | canvas.getContext("2d").drawImage(video, 0, 0, canvas.width, canvas.height); 10 | const dataURL = canvas.toDataURL(); 11 | window.electronAPI.sendImage(dataURL); 12 | 13 | new Notification("Image Captured", { 14 | body: "Image is successfully captured from live video.", 15 | }); 16 | }); 17 | 18 | navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => { 19 | video.srcObject = stream; 20 | }); 21 | -------------------------------------------------------------------------------- /cameraPreload.js: -------------------------------------------------------------------------------- 1 | const { contextBridge, ipcRenderer } = require("electron"); 2 | 3 | contextBridge.exposeInMainWorld("electronAPI", { 4 | sendImage: (data) => ipcRenderer.send("set-image", data), 5 | }); 6 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 11 | Hello World! 12 | 13 | 14 | 15 |

Hello World! from Sarthak

16 | We are using Node.js , 17 | Chromium , 18 | and Electron . 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const imageTag = document.getElementById("imageTag"); 2 | 3 | window.electronAPI.getImage((event, data) => { 4 | imageTag.src = data; 5 | window.electronAPI.closeWindow2(); 6 | }); 7 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const { app, BrowserWindow, Menu, shell, ipcMain } = require("electron"); 2 | const path = require("path"); 3 | 4 | const menuItems = [ 5 | { 6 | label: "Menu", 7 | submenu: [ 8 | { 9 | label: "About", 10 | }, 11 | ], 12 | }, 13 | { 14 | label: "File", 15 | submenu: [ 16 | { 17 | label: "Open Camera", 18 | click: async () => { 19 | const win2 = new BrowserWindow({ 20 | height: 500, 21 | width: 800, 22 | show: false, 23 | webPreferences: { 24 | preload: path.join(__dirname, "cameraPreload.js"), 25 | }, 26 | }); 27 | 28 | ipcMain.on("close-window-2", () => win2.close()); 29 | 30 | // win2.webContents.openDevTools(); 31 | win2.loadFile("camera.html"); 32 | win2.once("ready-to-show", () => win2.show()); 33 | }, 34 | }, 35 | { 36 | label: "Learn More", 37 | click: async () => { 38 | await shell.openExternal("https://bitfumes.com"); 39 | }, 40 | }, 41 | { 42 | type: "separator", 43 | }, 44 | { 45 | label: "Exit", 46 | click: () => app.quit(), 47 | }, 48 | ], 49 | }, 50 | { 51 | label: "Window", 52 | submenu: [ 53 | { 54 | role: "Minimize", 55 | }, 56 | { 57 | role: "close", 58 | }, 59 | ], 60 | }, 61 | ]; 62 | 63 | const menu = Menu.buildFromTemplate(menuItems); 64 | Menu.setApplicationMenu(menu); 65 | 66 | const createWindow = () => { 67 | const win = new BrowserWindow({ 68 | height: 500, 69 | width: 800, 70 | webPreferences: { 71 | preload: path.join(__dirname, "preload.js"), 72 | }, 73 | }); 74 | 75 | ipcMain.on("set-image", (event, data) => { 76 | win.webContents.send("get-image", data); 77 | }); 78 | 79 | // win.webContents.openDevTools(); 80 | win.loadFile("index.html"); 81 | }; 82 | 83 | app.whenReady().then(() => { 84 | createWindow(); 85 | 86 | app.on("activate", () => { 87 | if (BrowserWindow.getAllWindows().length === 0) createWindow(); 88 | }); 89 | }); 90 | 91 | app.on("window-all-closed", () => { 92 | if (process.platform !== "darwin") app.quit(); 93 | }); 94 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "electron-app", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "main.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "electron-forge start", 9 | "package": "electron-forge package", 10 | "make": "electron-forge make" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "@electron-forge/cli": "^6.0.0-beta.63", 17 | "@electron-forge/maker-deb": "^6.0.0-beta.63", 18 | "@electron-forge/maker-rpm": "^6.0.0-beta.63", 19 | "@electron-forge/maker-squirrel": "^6.0.0-beta.63", 20 | "@electron-forge/maker-zip": "^6.0.0-beta.63", 21 | "electron": "^18.2.0" 22 | }, 23 | "dependencies": { 24 | "electron-squirrel-startup": "^1.0.0" 25 | }, 26 | "config": { 27 | "forge": { 28 | "packagerConfig": {}, 29 | "makers": [ 30 | { 31 | "name": "@electron-forge/maker-squirrel", 32 | "config": { 33 | "name": "electron_app" 34 | } 35 | }, 36 | { 37 | "name": "@electron-forge/maker-zip", 38 | "platforms": [ 39 | "darwin" 40 | ] 41 | }, 42 | { 43 | "name": "@electron-forge/maker-deb", 44 | "config": {} 45 | }, 46 | { 47 | "name": "@electron-forge/maker-rpm", 48 | "config": {} 49 | } 50 | ] 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /preload.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("DOMContentLoaded", () => { 2 | const replaceText = (selector, text) => { 3 | const element = document.getElementById(selector); 4 | if (element) element.innerText = text; 5 | }; 6 | 7 | for (const dependency of ["chrome", "node", "electron"]) { 8 | replaceText(`${dependency}-version`, process.versions[dependency]); 9 | } 10 | }); 11 | 12 | const { contextBridge, ipcRenderer } = require("electron"); 13 | 14 | contextBridge.exposeInMainWorld("electronAPI", { 15 | getImage: (callback) => ipcRenderer.on("get-image", callback), 16 | closeWindow2: () => ipcRenderer.send("close-window-2"), 17 | }); 18 | --------------------------------------------------------------------------------