From 5732af1852d43e68ea0ab28b472ce09f9d5d91fb Mon Sep 17 00:00:00 2001 From: A1Gard Date: Wed, 12 May 2021 06:51:48 +0430 Subject: [PATCH] make bridge between electron vue app --- package.json | 2 ++ src/assets/js/winVars.js | 10 +++++-- src/background.js | 20 ++++++++++++- src/components/elements/AppMenuElement.vue | 34 +++++++++++++++------ src/components/pages/MainAppPage.vue | 8 ++--- src/main.js | 1 + src/preload.js | 35 ++++++++++++++++++++++ vue.config.js | 9 ++++++ 8 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 src/preload.js create mode 100644 vue.config.js diff --git a/package.json b/package.json index 0939b34..687a543 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,12 @@ "@fortawesome/fontawesome-free": "^5.15.3", "core-js": "^3.6.5", "electron": "^12.0.7", + "fs": "0.0.1-security", "html2canvas": "^1.0.0-rc.7", "jquery": "^3.6.0", "jquery.nicescroll": "github:tolc/jquery.nicescroll#master", "material-icons": "^0.6.3", + "path": "^0.12.7", "semantic-ui-css": "^2.4.1", "vazir-font": "^28.0.0", "vue": "^2.6.11", diff --git a/src/assets/js/winVars.js b/src/assets/js/winVars.js index 2ef0081..cc44d7a 100644 --- a/src/assets/js/winVars.js +++ b/src/assets/js/winVars.js @@ -8,11 +8,15 @@ window.appData = { textColor: '', bgColor: '', }, - pages: [ - - ] + pages: [] }; +window.project = { + 'folder': '', + 'file': '', + isSave: false, +} + window.colors = [ { name: 'Pink', diff --git a/src/background.js b/src/background.js index 90e13e3..9a5032b 100644 --- a/src/background.js +++ b/src/background.js @@ -3,6 +3,10 @@ import { app, protocol, BrowserWindow } from 'electron' import { createProtocol } from 'vue-cli-plugin-electron-builder/lib' import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer' +import path from 'path' +const ipc = require('electron').ipcMain +const dialog = require('electron').dialog + const isDevelopment = process.env.NODE_ENV !== 'production' // Scheme must be registered before the app is ready @@ -11,6 +15,7 @@ protocol.registerSchemesAsPrivileged([ ]) async function createWindow() { + // Create the browser window. const win = new BrowserWindow({ width: 800, @@ -19,7 +24,11 @@ async function createWindow() { // Use pluginOptions.nodeIntegration, leave this alone // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info - nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION + // nodeIntegration: true, + // enableRemoteModule: true, + // contextIsolation: false , + nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION, + preload: path.join(__dirname, 'preload.js') } }) win.removeMenu(); @@ -64,6 +73,7 @@ app.on('ready', async () => { } } createWindow() + }) // Exit cleanly on request from parent process in development mode. @@ -80,3 +90,11 @@ if (isDevelopment) { }) } } + +ipc.on('open-file-dialog', function (event) { + dialog.showOpenDialog({ + properties: ['openFile', 'openDirectory'] + }, function (files) { + if (files) event.sender.send('selected-directory', files) + }) +}) \ No newline at end of file diff --git a/src/components/elements/AppMenuElement.vue b/src/components/elements/AppMenuElement.vue index c5db6b7..29a7a1a 100644 --- a/src/components/elements/AppMenuElement.vue +++ b/src/components/elements/AppMenuElement.vue @@ -1,34 +1,50 @@ diff --git a/src/components/pages/MainAppPage.vue b/src/components/pages/MainAppPage.vue index 69daa91..e9ca283 100644 --- a/src/components/pages/MainAppPage.vue +++ b/src/components/pages/MainAppPage.vue @@ -85,6 +85,8 @@ import page from '../elements/PageElement'; import property from '../elements/PropertyElement'; import compo from '../elements/ComponentElement'; import appMenu from '../elements/AppMenuElement'; +// const {remote} = require("electron"); + export default { name: "MainAppPage", @@ -111,12 +113,10 @@ export default { /*eslint-enable */ } catch (e) { // - console.log(e.message); + // window.ipcRenderer.send('open-save-chart-dialog'); + } },methods:{ - getcomponent (x) { - return () => import(`../flutter/${component}`); - } } } diff --git a/src/main.js b/src/main.js index 121ed2d..972fc2a 100644 --- a/src/main.js +++ b/src/main.js @@ -10,6 +10,7 @@ Vue.config.productionTip = false; require('@/assets/js/winVars.js'); + new Vue({ router, render: h => h(App), diff --git a/src/preload.js b/src/preload.js new file mode 100644 index 0000000..a5ce089 --- /dev/null +++ b/src/preload.js @@ -0,0 +1,35 @@ +// const { remote } = require('electron'); +// console.log(remote); +// let currWindow = remote.BrowserWindow.getFocusedWindow(); +// +// console.log(remote); +// window.closeCurrentWindow = function(){ +// currWindow.close(); +// } + +const { + contextBridge, + ipcRenderer +} = require("electron"); +// Expose protected methods that allow the renderer process to use +// the ipcRenderer without exposing the entire object +contextBridge.exposeInMainWorld( + "api", { + send: (channel, data) => { + console.log(channel,data); + // whitelist channels + console.log(ipcRenderer); + let validChannels = ["toMain",'open-file-dialog']; + if (validChannels.includes(channel)) { + ipcRenderer.send(channel, data); + } + }, + receive: (channel, func) => { + let validChannels = ["fromMain"]; + if (validChannels.includes(channel)) { + // Deliberately strip event as it includes `sender` + ipcRenderer.on(channel, (event, ...args) => func(...args)); + } + } + } +); \ No newline at end of file diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 0000000..e45d541 --- /dev/null +++ b/vue.config.js @@ -0,0 +1,9 @@ +module.exports = { + pluginOptions: { + electronBuilder: { + preload: './src/preload.js', + // Or, for multiple preload files: + // preload: { preload: 'src/preload.js', otherPreload: 'src/preload2.js' } + } + } +}; \ No newline at end of file