From 6dddd4bdf08722a7f8dc9924c9f6d7ea88ec359f Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Tue, 13 Oct 2020 12:59:43 -0700 Subject: [PATCH] Added application settings and basic filewatcher. --- electron/decoder/decoder.js | 0 electron/file-watcher/file-watcher-ipc.js | 15 ++++++ electron/file-watcher/file-watcher.js | 59 ++++++++++++++++++++ electron/ipc-handler.js | 26 +++++++-- electron/main.js | 24 ++++++--- package-lock.json | 65 ++++++++++++++++++++++- package.json | 3 ++ public/index.html | 3 +- src/App/App.jsx | 19 ++++++- src/ipc.types.js | 11 ++++ 10 files changed, 207 insertions(+), 18 deletions(-) create mode 100644 electron/decoder/decoder.js create mode 100644 electron/file-watcher/file-watcher-ipc.js create mode 100644 electron/file-watcher/file-watcher.js create mode 100644 src/ipc.types.js diff --git a/electron/decoder/decoder.js b/electron/decoder/decoder.js new file mode 100644 index 0000000..e69de29 diff --git a/electron/file-watcher/file-watcher-ipc.js b/electron/file-watcher/file-watcher-ipc.js new file mode 100644 index 0000000..332aa7e --- /dev/null +++ b/electron/file-watcher/file-watcher-ipc.js @@ -0,0 +1,15 @@ +const { ipcMain } = require("electron"); +const { StartWatcher, StopWatcher } = require("./file-watcher"); +const ipcTypes = require("../../src/ipc.types").default; + +ipcMain.on(ipcTypes.filewatcher.start, async (event, arg) => { + console.log(ipcTypes.filewatcher.start); + const filePaths = StartWatcher(); + event.sender.send(ipcTypes.filewatcher.startSuccess, filePaths); +}); + +ipcMain.on(ipcTypes.filewatcher.stop, async (event, arg) => { + console.log(ipcTypes.filewatcher.start); + StopWatcher(); + event.sender.send(ipcTypes.filewatcher.start, { success: true }); +}); diff --git a/electron/file-watcher/file-watcher.js b/electron/file-watcher/file-watcher.js new file mode 100644 index 0000000..9792755 --- /dev/null +++ b/electron/file-watcher/file-watcher.js @@ -0,0 +1,59 @@ +const chokidar = require("chokidar"); +const { file } = require("electron-settings"); +const settings = require("electron-settings"); + +var watcher; + +function StartWatcher() { + const filePaths = settings.getSync("filePaths") || []; + console.log("StartWatcher -> filePaths", filePaths); + watcher = chokidar.watch(filePaths, { + ignored: /[\/\\]\./, + persistent: true, + ignoreInitial: true, + awaitWriteFinish: { + pollInterval: 100, + stabilityThreshold: 2000, + }, + }); + watcher + .on("add", function (path) { + console.log("File", path, "has been added"); + }) + .on("addDir", function (path) { + console.log("Directory", path, "has been added"); + }) + .on("change", function (path) { + console.log("File", path, "has been changed"); + }) + .on("unlink", function (path) { + console.log("File", path, "has been removed"); + }) + .on("unlinkDir", function (path) { + console.log("Directory", path, "has been removed"); + }) + .on("error", function (error) { + console.log("Error happened", error); + }) + .on("ready", onWatcherReady) + .on("raw", function (event, path, details) { + // This event should be triggered everytime something happens. + console.log("Raw event info:", event, path, details); + }); + return filePaths; +} + +function onWatcherReady() { + console.info( + "From here can you check for real changes, the initial scan has been completed." + ); +} + +async function StopWatcher() { + await watcher.close(); + console.log("closed", watcher); +} + +exports.StartWatcher = StartWatcher; +exports.StopWatcher = StopWatcher; +exports.watcher = watcher; diff --git a/electron/ipc-handler.js b/electron/ipc-handler.js index f4e8f23..3c50f3b 100644 --- a/electron/ipc-handler.js +++ b/electron/ipc-handler.js @@ -1,10 +1,26 @@ -const electron = require("electron"); - -const { ipcMain } = electron; +const { ipcMain, dialog } = require("electron"); +const { mainWindow } = require("./main"); +const settings = require("electron-settings"); +const { DecodeEstimate } = require("./decoder/decoder"); +//Import Ipc Handlers +require("./file-watcher/file-watcher-ipc"); console.log("*** Added IPC Handlers ***"); -ipcMain.on("test-start", (event, arg) => { - console.log("Test Start Inbound.", arg); +ipcMain.on("test", async (event, object) => { + DecodeEstimate(); event.sender.send("test-success", { success: true }); }); + +// ipcMain.on("test-start", async (event, arg) => { +// console.log("Test Start Inbound.", arg); +// const result = await dialog.showOpenDialog(mainWindow, { +// properties: ["openDirectory"], +// }); +// await settings.set("filePaths", [ +// ...result.filePaths, +// ...(await settings.get("filePaths")), +// ]); +// console.log(await settings.get("filePaths")); +// event.sender.send("test-success", { success: true }); +// }); diff --git a/electron/main.js b/electron/main.js index 911bee5..201200d 100644 --- a/electron/main.js +++ b/electron/main.js @@ -1,34 +1,39 @@ const path = require("path"); -require("./ipc-handler"); const { app, BrowserWindow } = require("electron"); const isDev = require("electron-is-dev"); +const settings = require("electron-settings"); + +require("./ipc-handler"); // Conditionally include the dev tools installer to load React Dev Tools -let installExtension, REACT_DEVELOPER_TOOLS; // NEW! +let installExtension, REACT_DEVELOPER_TOOLS; if (isDev) { const devTools = require("electron-devtools-installer"); installExtension = devTools.default; REACT_DEVELOPER_TOOLS = devTools.REACT_DEVELOPER_TOOLS; -} // NEW! +} // Handle creating/removing shortcuts on Windows when installing/uninstalling if (require("electron-squirrel-startup")) { app.quit(); -} // NEW! +} +var mainWindow = null; function createWindow() { // Create the browser window. - const win = new BrowserWindow({ + mainWindow = new BrowserWindow({ width: 800, height: 600, + title: "ImEX RPS", webPreferences: { nodeIntegration: true, + enableRemoteModule: true, }, }); // and load the index.html of the app. // win.loadFile("index.html"); - win.loadURL( + mainWindow.loadURL( isDev ? "http://localhost:3000" : `file://${path.join(__dirname, "../build/index.html")}` @@ -36,10 +41,10 @@ function createWindow() { // Open the DevTools. if (isDev) { - win.webContents.openDevTools({ mode: "detach" }); + mainWindow.webContents.openDevTools({ mode: "detach" }); } } - +exports.mainWindow = mainWindow; // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. @@ -48,10 +53,13 @@ app.whenReady().then(() => { createWindow(); if (isDev) { + console.log(`Path to Settings File: ${settings.file()}`); installExtension(REACT_DEVELOPER_TOOLS) .then((name) => console.log(`Added Extension: ${name}`)) .catch((error) => console.log(`An error occurred: , ${error}`)); } + + //Start all of the watchers. }); // Quit when all windows are closed, except on macOS. There, it's common diff --git a/package-lock.json b/package-lock.json index 944ab53..8eeca61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5923,6 +5923,14 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.3.tgz", "integrity": "sha512-V+1SyIvkS+HmNbN1G7A9+ERbFTV9KTXu6Oor98v2xHmzzpp52OIJhQuJSTywWuBY5pyAEmlwbCi1Me87n/SLOw==" }, + "dbffile": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/dbffile/-/dbffile-1.4.3.tgz", + "integrity": "sha512-j7xbvByAT/hEzw/l4x5Zu/Ulf+A/gFdqhG5lu/fVmExbInsPNZB4wns6lEelSCMnMVTvqrdlfZ06qnBuGogghA==", + "requires": { + "iconv-lite": "^0.4.24" + } + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -6829,6 +6837,37 @@ } } }, + "electron-settings": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/electron-settings/-/electron-settings-4.0.2.tgz", + "integrity": "sha512-WnUlrnBsO784oXcag0ym+A3ySoIwonz5GhYFsWroMHVzslzmsP+81f/Fof41T9UrRUxuPPKiZPZMwGO+yvWChg==", + "requires": { + "lodash.get": "^4.4.2", + "lodash.has": "^4.5.2", + "lodash.set": "^4.3.2", + "lodash.unset": "^4.5.2", + "mkdirp": "^1.0.4", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, "electron-squirrel-startup": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz", @@ -12185,8 +12224,12 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" }, "lodash.isequal": { "version": "4.5.0", @@ -12199,6 +12242,11 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -12226,6 +12274,11 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, + "lodash.unset": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.unset/-/lodash.unset-4.5.2.tgz", + "integrity": "sha1-Nw0dPoW3Kn4bDN8tJyEhMG8j5O0=" + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -19342,6 +19395,14 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript-compare": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", diff --git a/package.json b/package.json index 0b4c921..0b94a9d 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,11 @@ "dependencies": { "@fingerprintjs/fingerprintjs": "^2.1.4", "antd": "^4.7.0", + "chokidar": "^3.4.3", + "dbffile": "^1.4.3", "dotenv": "^8.2.0", "electron-is-dev": "^1.2.0", + "electron-settings": "^4.0.2", "electron-squirrel-startup": "^1.0.0", "node-sass": "^4.14.1", "react": "^16.13.1", diff --git a/public/index.html b/public/index.html index 6a90e1d..3ef2c51 100644 --- a/public/index.html +++ b/public/index.html @@ -3,6 +3,7 @@ + - New Web App + ImEX RPS diff --git a/src/App/App.jsx b/src/App/App.jsx index 36a56a6..9a0452b 100644 --- a/src/App/App.jsx +++ b/src/App/App.jsx @@ -2,7 +2,10 @@ import { Button, Layout } from "antd"; import React, { useEffect } from "react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; +import ipcTypes from "../ipc.types"; + const { ipcRenderer } = window.require("electron"); +const settings = window.require("electron-settings"); const mapStateToProps = createStructuredSelector({}); const mapDispatchToProps = (dispatch) => ({}); @@ -12,10 +15,15 @@ export function App() { ipcRenderer.on("test-success", (event, obj) => { console.log("Test Success", obj); }); - + ipcRenderer.on(ipcTypes.default.filewatcher.startSuccess, (event, obj) => { + console.log(ipcTypes.default.filewatcher.startSuccess, obj); + }); // Cleanup the listener events so that memory leaks are avoided. return function cleanup() { - ipcRenderer.removeAllListeners("test-success"); + ipcRenderer.removeAllListeners( + "test-success", + ipcTypes.default.filewatcher.startSuccess + ); }; }, []); @@ -33,6 +41,13 @@ export function App() { > Test IPC + ); diff --git a/src/ipc.types.js b/src/ipc.types.js new file mode 100644 index 0000000..aba77a8 --- /dev/null +++ b/src/ipc.types.js @@ -0,0 +1,11 @@ +exports.default = { + test: { + start: "test-start", + }, + filewatcher: { + start: "filewatcher__start", + startSuccess: "filewatcher__start-success", + startFailure: "filewatcher__start-failure", + stop: "filewatcher__stop", + }, +};