diff --git a/frontend/.gitignore b/frontend/.gitignore index 3fe0f60..acc3870 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -20,4 +20,6 @@ pnpm-debug.log* backend/node_modules backend/config/config.json -backend/.env \ No newline at end of file +backend/.env +#Electron-builder output +/dist_electron \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index fe09004..7f9f42f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,15 +1,18 @@ { "name": "colubrina-chat", - "version": "1.0.10", + "version": "1.0.11", "private": true, "author": "Troplo ", - "license": "GPL-3.0", "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint", - "postinstall": "patch-package" + "electron:build": "vue-cli-service electron:build", + "electron:serve": "vue-cli-service electron:serve", + "postinstall": "patch-package && electron-builder install-app-deps", + "postuninstall": "electron-builder install-app-deps" }, + "main": "background.js", "dependencies": { "@babel/preset-env": "^7.17.10", "@mdi/js": "^6.6.95", @@ -62,11 +65,14 @@ "@vue/cli-service": "~4.5.15", "babel-eslint": "^10.1.0", "dotenv-webpack": "^7.1.0", + "electron": "^13.0.0", + "electron-devtools-installer": "^3.1.0", "eslint": "^6.7.2", "eslint-plugin-vue": "^6.2.2", "material-design-icons-iconfont": "^6.5.0", "sass": "~1.32.0", "sass-loader": "^10.0.0", + "vue-cli-plugin-electron-builder": "~2.1.1", "vue-cli-plugin-vuetify": "~2.4.7", "vue-template-babel-compiler": "^1.1.3", "vue-template-compiler": "^2.6.11", @@ -74,6 +80,7 @@ "webpack-auto-inject-version-next": "1.2.4", "webpack-bundle-analyzer": "^4.5.0" }, + "license": "GPL-3.0", "resolutions": { "node-ipc": "git+https://git.troplo.com/Troplo/node-ipc", "selfsigned": "^2.0.1", diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 8fb5f45..ce1cf94 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -729,8 +729,22 @@ export default { } }, mounted() { + Vue.axios.defaults.headers.common["X-Colubrina"] = true Vue.axios.defaults.headers.common["Authorization"] = localStorage.getItem("session") + console.log(localStorage.getItem("instance")) + if (process.env.IS_ELECTRON) { + this.axios.defaults.baseURL = localStorage.getItem("instance") + this.$store.state.baseURL = localStorage.getItem("instance") + } + if (localStorage.getItem("customHeaders")) { + console.log(JSON.parse(localStorage.getItem("customHeaders"))) + for (let header in JSON.parse(localStorage.getItem("customHeaders"))) { + Vue.axios.defaults.headers[header] = JSON.parse( + localStorage.getItem("customHeaders") + )[header] + } + } if (this.$vuetify.breakpoint.mobile) { this.$store.state.drawer = false } diff --git a/frontend/src/background.js b/frontend/src/background.js new file mode 100644 index 0000000..8e9a7aa --- /dev/null +++ b/frontend/src/background.js @@ -0,0 +1,82 @@ +"use strict" + +import { app, protocol, BrowserWindow } from "electron" +import { createProtocol } from "vue-cli-plugin-electron-builder/lib" +import installExtension, { VUEJS_DEVTOOLS } from "electron-devtools-installer" +const isDevelopment = process.env.NODE_ENV !== "production" + +// Scheme must be registered before the app is ready +protocol.registerSchemesAsPrivileged([ + { scheme: "app", privileges: { secure: true, standard: true } } +]) + +async function createWindow() { + // Create the browser window. + const win = new BrowserWindow({ + width: 1400, + height: 1000, + webPreferences: { + // 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, + contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION, + preload: "window-preload.js", + webSecurity: false + } + }) + + if (process.env.WEBPACK_DEV_SERVER_URL) { + // Load the url of the dev server if in development mode + await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL) + if (!process.env.IS_TEST) win.webContents.openDevTools() + } else { + createProtocol("app") + // Load the index.html when not in development + win.loadURL("app://./index.html") + } +} + +// Quit when all windows are closed. +app.on("window-all-closed", () => { + // On macOS it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== "darwin") { + app.quit() + } +}) + +app.on("activate", () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) createWindow() +}) + +// 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. +app.on("ready", async () => { + if (isDevelopment && !process.env.IS_TEST) { + // Install Vue Devtools + try { + await installExtension(VUEJS_DEVTOOLS) + } catch (e) { + console.error("Vue Devtools failed to install:", e.toString()) + } + } + createWindow() +}) + +// Exit cleanly on request from parent process in development mode. +if (isDevelopment) { + if (process.platform === "win32") { + process.on("message", (data) => { + if (data === "graceful-exit") { + app.quit() + } + }) + } else { + process.on("SIGTERM", () => { + app.quit() + }) + } +} diff --git a/frontend/src/components/Header.vue b/frontend/src/components/Header.vue index 1e94f92..ff30f06 100644 --- a/frontend/src/components/Header.vue +++ b/frontend/src/components/Header.vue @@ -67,14 +67,22 @@ @click:close="remove(data.item)" > - + @{{ data.item.username }}