I decided to use node_notifier to handle OS notifications of my electron application. The whole project is based on Electron JS alongside with React JS and the package.json is something like this.
{
...
"build": {
"appId": "pod.talk.land"
},
"main": "public/electron.js",
"homepage": "./",
"dependencies": {
"cross-env": "^6.0.0",
"electron-is-dev": "^1.1.0",
"node-notifier": "^6.0.0",
"podauth": "^1.2.4",
"podchatweb": "^0.48.2",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"react-scripts": "3.1.2"
},
"scripts": {
"release": "yarn react-build && electron-builder --publish=always",
"build": "yarn react-build && yarn electron-build",
"start": "concurrently \"cross-env BROWSER=none yarn react-start\" \"wait-on http://localhost:3000 && electron .\""
},
"devDependencies": {
"concurrently": "^4.1.2",
"electron": "^6.0.10",
"electron-builder": "^21.2.0",
"wait-on": "^3.3.0"
}
}
Project tree structure looks like this:
- Project
| + node_modules
|
| - public
| | + assets
| | * electron.js
| | * index.html
|
| - src
| | * App.js
| | * App.css
| | * index.js
|
| * package.json
Problem is, when I try to use node_notifier in App.js as below:
const notifier = require('node-notifier');
notifier.notify('Some Notification');
It throws an error and says:
TypeError: net.connect is not a function
at push../node_modules/node-notifier/lib/checkGrowl.js.module.exports (checkGrowl.js:14)
at Growl.push../node_modules/node-notifier/notifiers/growl.js.Growl.notify (growl.js:70)
at onNewMessage (App.js:40)
at t.value (index.js:11702)
at commitLifeCycles (react-dom.development.js:21157)
at commitLayoutEffects (react-dom.development.js:24138)
at HTMLUnknownElement.callCallback (react-dom.development.js:363)
at Object.invokeGuardedCallbackDev (react-dom.development.js:412)
at invokeGuardedCallback (react-dom.development.js:466)
at commitRootImpl (react-dom.development.js:23903)
at unstable_runWithPriority (scheduler.development.js:674)
at runWithPriority$2 (react-dom.development.js:11834)
at commitRoot (react-dom.development.js:23723)
at runRootCallback (react-dom.development.js:22809)
at react-dom.development.js:11886
at unstable_runWithPriority (scheduler.development.js:674)
at runWithPriority$2 (react-dom.development.js:11834)
at flushSyncCallbackQueueImpl (react-dom.development.js:11881)
at flushSyncCallbackQueue (react-dom.development.js:11869)
at scheduleUpdateOnFiber (react-dom.development.js:22667)
at Object.enqueueSetState (react-dom.development.js:13710)
at l.b.setState (index.js:38267)
at l.onStateChange (index.js:2630)
at g (index.js:18791)
at index.js:43241
at index.js:147155
at dispatch (index.js:18928)
at e.onMessageEvents (index.js:6864)
at Object.ad7ed17e-d748-476c-9fbf-70153cf3f50f (index.js:123573)
at fireEvent (index.js:126717)
at newMessageHandler (index.js:125444)
at chatMessageHandler (index.js:124885)
at receivedAsyncMessageHandler (index.js:124870)
at Object.0d539f41-9266-4489-e794-c3b154d86521 (index.js:124458)
at Z (index.js:128606)
at U (index.js:128520)
at Object.message (index.js:128451)
at WebSocket.r.onmessage (index.js:128722)
The package author mentioned this in the issues part of his project:
This seems like being run from Webpack or something similar? Inside either electron or on a page. In any case, node-notifier needs to be run in a node-context, having access to child processes.
How should I run and build the code in a node context?
You can make use of preload argument in webPreferences while creating the main BrowserWindow. In the main.js,
In the preload.js
In this way, you can avoid ejecting the webpack & access the electron/node function in your react project.