From 21690676e1d77823acd3809c5770495e39afa364 Mon Sep 17 00:00:00 2001 From: srgooglo Date: Thu, 29 Sep 2022 16:59:56 +0200 Subject: [PATCH] implement desktop versions --- packages/app/.gitignore | 3 +- packages/app/config/index.js | 6 + packages/app/electron/main/configs/config.js | 3 + packages/app/electron/main/icon.png | Bin 0 -> 44571 bytes packages/app/electron/main/index.js | 254 ++++++++++++++++++ .../app/electron/main/statics/loading.css | 112 ++++++++ .../app/electron/main/statics/loading.html | 23 ++ .../electron/main/statics/loading_dev.html | 24 ++ packages/app/electron/preload/index.js | 8 + packages/app/package.json | 60 ++++- packages/app/src/App.jsx | 34 ++- .../src/components/layout/sidebar/index.less | 90 +++---- .../src/components/layout/systemBar/index.jsx | 25 ++ .../components/layout/systemBar/index.less | 58 ++++ packages/app/src/pages/home/index.less | 2 +- .../app/src/pages/notifications/index.jsx | 2 +- packages/app/src/theme/index.less | 14 + packages/app/vite.config.js | 7 +- 18 files changed, 665 insertions(+), 60 deletions(-) create mode 100644 packages/app/electron/main/configs/config.js create mode 100644 packages/app/electron/main/icon.png create mode 100644 packages/app/electron/main/index.js create mode 100644 packages/app/electron/main/statics/loading.css create mode 100644 packages/app/electron/main/statics/loading.html create mode 100644 packages/app/electron/main/statics/loading_dev.html create mode 100644 packages/app/electron/preload/index.js create mode 100644 packages/app/src/components/layout/systemBar/index.jsx create mode 100644 packages/app/src/components/layout/systemBar/index.less diff --git a/packages/app/.gitignore b/packages/app/.gitignore index d54f00b3..8521d6b7 100644 --- a/packages/app/.gitignore +++ b/packages/app/.gitignore @@ -5,4 +5,5 @@ dist-ssr *.local .vscode yarn-error.log -ios/**/** \ No newline at end of file +ios/**/** +out/ \ No newline at end of file diff --git a/packages/app/config/index.js b/packages/app/config/index.js index 997ea298..22e20acc 100644 --- a/packages/app/config/index.js +++ b/packages/app/config/index.js @@ -10,6 +10,12 @@ const envOrigins = { contentApi: `http://${window.location.hostname}:3050`, streamingApi: `http://${window.location.hostname}:3002`, }, + "production": { + mainApi: "http://api.comty.pw", + authApi: "http://auth.comty.pw", + contentApi: "http://content.comty.pw", + streamingApi: "http://streaming.comty.pw", + }, "indev": { mainApi: "https://indev_api.comty.pw", authApi: `http://indev_auth.comty.pw`, diff --git a/packages/app/electron/main/configs/config.js b/packages/app/electron/main/configs/config.js new file mode 100644 index 00000000..2dbfdd50 --- /dev/null +++ b/packages/app/electron/main/configs/config.js @@ -0,0 +1,3 @@ +const Config = require('electron-config') + +module.exports = new Config({ name: 'config' }); \ No newline at end of file diff --git a/packages/app/electron/main/icon.png b/packages/app/electron/main/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3d53b5d29f83304e842853730af9a3f4753982 GIT binary patch literal 44571 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 { + mainWindow.reload() + }) + + globalShortcut.register("F5", () => { + mainWindow.reload() + }) + + globalShortcut.register("CommandOrControl+Shift+I", () => { + mainWindow.webContents.toggleDevTools() + }) + + devtools = new BrowserWindow() + + mainWindow.webContents.setDevToolsWebContents(devtools.webContents) + + mainWindow.webContents.openDevTools({ + mode: "detach" + }) + } + + mainWindow.webContents.session.webRequest.onHeadersReceived( + { + urls: ["http://*/*", "https://*/*"] + }, + (details, callback) => { + delete details.responseHeaders["Access-Control-Allow-Origin"] + delete details.responseHeaders["access-control-allow-origin"] + if (details.url.includes("www.google-analytics.com")) { + details.responseHeaders["Access-Control-Allow-Origin"] = [app_path] + } else { + details.responseHeaders["Access-Control-Allow-Origin"] = ["*"] + } + callback({ + cancel: false, + responseHeaders: details.responseHeaders + }) + } + ) + + // load the app + mainWindow.loadURL(app_path) + mainWindow.focus() + + // const handleRedirect = (e, url) => { + // if (url !== mainWindow.webContents.getURL()) { + // e.preventDefault() + // shell.openExternal(url) + // } + // } + + // mainWindow.webContents.on("will-navigate", handleRedirect) + // mainWindow.webContents.on("new-window", handleRedirect) +} + +app.on("ready", async () => { + if (!devMode) { + return createWindow() + } + + loadWindow = new BrowserWindow({ + width: 700, + height: 500, + frame: false, + resizable: false, + center: true, + transparent: true, + backgroundColor: "#00000000", + }) + + console.log("Starting on dev mode....") + notify({ title: "Starting development server..." }) + + loadWindow.loadURL(`file://${__dirname}/statics/loading_dev.html`) + loadWindow.focus() + + await waitOn({ resources: [app_path] }, (err) => { + if (err) { + return console.error(err) + } + }) + + loadWindow.close() + + createWindow() +}) + +app.on("window-all-closed", () => { + mainWindow = null +}) + +app.on("before-quit", async () => { + mainWindow.removeAllListeners("close") + mainWindow = null +}) + +ipcMain.handle("update-progress-bar", (event, p) => { + mainWindow.setProgressBar(p) +}) + +ipcMain.handle("hide-window", () => { + if (mainWindow) { + mainWindow.hide() + } +}) + +ipcMain.handle("show-window", () => { + if (mainWindow) { + mainWindow.show() + mainWindow.focus() + } +}) + +ipcMain.handle("min-max-window", () => { + if (mainWindow.isMaximized()) { + mainWindow.unmaximize() + } else if (mainWindow.maximizable) { + mainWindow.maximize() + } +}) + +ipcMain.handle("getSystemPreferences", () => { + return systemPreferences +}) + +ipcMain.handle("app.minimize", () => { + mainWindow.minimize() +}) + +ipcMain.handle("app.close", () => { + app.quit() +}) + +ipcMain.handle("open-devtools", () => { + mainWindow.webContents.openDevTools({ mode: "undocked" }) +}) + +ipcMain.handle("appRelaunch", () => { + relaunchApp() +}) + +ipcMain.handle("inspectElement", (event, payload) => { + mainWindow.inspectElement(payload.x, payload.y) +}) \ No newline at end of file diff --git a/packages/app/electron/main/statics/loading.css b/packages/app/electron/main/statics/loading.css new file mode 100644 index 00000000..8b3d3063 --- /dev/null +++ b/packages/app/electron/main/statics/loading.css @@ -0,0 +1,112 @@ + body { + background-color: transparent; + border-radius: 12px; + font-family: 'Alata', sans-serif; + width: 100vw; + height: 100vh; + overflow: hidden; + user-select: none; + -webkit-app-region: drag; + } + + .wrapper { + position: absolute; + top: 0; + right: 0; + + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + background-color: #efefef; + color: #2d2d2d; + border-radius: 12px; + text-align: center; + + width: 100%; + height: 100%; + } + + .bouncy-logo{ + width: 100%; + height: auto; + margin: auto; + } + + .bouncy-logo .ball { + height: auto; + width: 100%; + transform: translate(-10px, 0); + } + + .bouncy-logo .ball svg { + width: 200px; + height: 200px; + margin: auto; + + -webkit-animation-direction: alternate; + -webkit-animation-duration: 1s; + -webkit-animation-name: my-bounce; + -webkit-animation-iteration-count: infinite; + animation-direction: alternate; + animation-duration: 1s; + animation-name: my-bounce; + animation-iteration-count: infinite; + } + + .shadow{ + width: 100%; + height: auto; + } + + .bouncy-logo .ball-shadow { + margin: auto; + background: radial-gradient(50% 50%, rgba(204, 204, 204, 0.45) 0%, transparent 100%); + height: 50px; + width: 200px; + -webkit-animation-direction: alternate; + -webkit-animation-duration: 1s; + -webkit-animation-name: my-grow; + -webkit-animation-iteration-count: infinite; + animation-direction: alternate; + animation-duration: 1s; + animation-name: my-grow; + animation-iteration-count: infinite; + } + + @-webkit-keyframes my-grow { + from { + width: 200px; + height: 50px; + } + to { + width: 150px; + height: 10px; + } + } + @keyframes my-grow { + from { + width: 200px; + height: 50px; + } + to { + width: 150px; + height: 10px; + } + } + @-webkit-keyframes my-bounce { + from { + top: 0; + } + to { + top: 10%; + } + } + @keyframes my-bounce { + from { + top: 0; + } + to { + top: 10%; + } + } \ No newline at end of file diff --git a/packages/app/electron/main/statics/loading.html b/packages/app/electron/main/statics/loading.html new file mode 100644 index 00000000..039634a8 --- /dev/null +++ b/packages/app/electron/main/statics/loading.html @@ -0,0 +1,23 @@ + + + + +
+ +
+ + \ No newline at end of file diff --git a/packages/app/electron/main/statics/loading_dev.html b/packages/app/electron/main/statics/loading_dev.html new file mode 100644 index 00000000..d45f8e69 --- /dev/null +++ b/packages/app/electron/main/statics/loading_dev.html @@ -0,0 +1,24 @@ + + + + +
+ +

Starting the development server...

+
+ + \ No newline at end of file diff --git a/packages/app/electron/preload/index.js b/packages/app/electron/preload/index.js new file mode 100644 index 00000000..1d2584c1 --- /dev/null +++ b/packages/app/electron/preload/index.js @@ -0,0 +1,8 @@ +const { contextBridge, ipcRenderer } = require("electron") + +contextBridge.exposeInMainWorld("electron", { + ipcRenderer, + isDev: () => { + return process.env.NODE_ENV === "development" + } +}) \ No newline at end of file diff --git a/packages/app/package.json b/packages/app/package.json index bafb987a..de643354 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -2,15 +2,20 @@ "name": "comty", "version": "0.20.0", "license": "MIT", + "main": "electron/main", + "author": "RageStudio", "scripts": { + "start": "electron-forge start", + "build": "vite build", "dev": "vite", - "dev:ssr": "vite-ssr", - "build": "yarn build:dist", - "build:dist": "cross-env NODE_ENV=production vite build", - "build:preview": "cross-env NODE_ENV=preview vite build && yarn sync", - "build:ssr": "cross-env NODE_ENV=production vite-ssr build && ./scripts/move-dist.sh", + "dev:electron": "concurrently -k \"yarn dev\" \"yarn electron:dev\"", + "electron:dev": "cross-env IS_DEV=true electron-forge start", + "electron:build": "electron-forge make", + "electron:package": "electron-forge package", "docker-compose:update_run": "docker-compose down && git pull && yarn build && docker-compose up -d --build", - "preview": "vite preview" + "preview": "vite preview", + "package": "electron-forge package", + "make": "electron-forge make" }, "peerDependencies": { "react": "^16.8.6" @@ -27,10 +32,14 @@ "@emotion/css": "11.0.0", "@foxify/events": "2.0.1", "@loadable/component": "5.15.2", + "@vitejs/plugin-react": "^2.1.0", "antd": "4.23.2", "antd-mobile": "^5.0.0-rc.17", "chart.js": "3.7.0", "classnames": "2.3.1", + "electron-is": "^3.0.0", + "electron-log": "^4.4.8", + "electron-squirrel-startup": "^1.0.0", "evite": "0.12.3", "faye": "1.4.0", "feather-reactjs": "2.0.13", @@ -72,9 +81,14 @@ "rxjs": "^7.5.5", "store": "^2.0.12", "styled-components": "^5.3.3", - "vite-ssr": "0.15.0" + "wait-on": "^6.0.1" }, "devDependencies": { + "@electron-forge/cli": "^6.0.0-beta.66", + "@electron-forge/maker-deb": "^6.0.0-beta.66", + "@electron-forge/maker-rpm": "^6.0.0-beta.66", + "@electron-forge/maker-squirrel": "^6.0.0-beta.66", + "@electron-forge/maker-zip": "^6.0.0-beta.66", "@types/jest": "^26.0.24", "@types/node": "^16.4.10", "@types/react": "^17.0.15", @@ -82,12 +96,40 @@ "@types/react-router-config": "^5.0.3", "@types/react-router-dom": "^5.1.8", "@typescript-eslint/eslint-plugin": "^4.29.0", - "@vitejs/plugin-react-refresh": "^1.3.6", + "concurrently": "^7.4.0", "corenode": "0.28.26", "cors": "2.8.5", "cross-env": "^7.0.3", + "electron": "^21.0.1", "express": "^4.17.1", "typescript": "^4.3.5", - "vite": "2.9.9" + "vite": "3.1.4" + }, + "config": { + "forge": { + "packagerConfig": {}, + "makers": [ + { + "name": "@electron-forge/maker-squirrel", + "config": { + "name": "comty" + } + }, + { + "name": "@electron-forge/maker-zip", + "platforms": [ + "darwin" + ] + }, + { + "name": "@electron-forge/maker-deb", + "config": {} + }, + { + "name": "@electron-forge/maker-rpm", + "config": {} + } + ] + } } } diff --git a/packages/app/src/App.jsx b/packages/app/src/App.jsx index 985efe01..d6fdf517 100644 --- a/packages/app/src/App.jsx +++ b/packages/app/src/App.jsx @@ -43,6 +43,8 @@ Promise.tasked = function (promises) { } import React from "react" +import ReactDOM from "react-dom" + import { EviteRuntime } from "evite" import { Helmet } from "react-helmet" import * as antd from "antd" @@ -71,8 +73,28 @@ class App extends React.Component { user: null, } - static initialize() { + static async initialize() { window.app.version = config.package.version + + // check if electron library is available + if (typeof window.electron !== "undefined") { + window.isElectron = true + } + + // if is electron app, append frame to body as first child + if (window.isElectron) { + const frame = document.createElement("div") + const systemBarComponent = await import("components/layout/systemBar") + + frame.id = "systemBar" + + ReactDOM.render(, frame) + + document.body.insertBefore(frame, document.body.firstChild) + + // append var to #root + document.getElementById("root").classList.add("electron") + } } static publicEvents = { @@ -82,6 +104,16 @@ class App extends React.Component { } eventsHandlers = { + "app.close": () => { + if (window.isElectron) { + window.electron.ipcRenderer.invoke("app.close") + } + }, + "app.minimize": () => { + if (window.isElectron) { + window.electron.ipcRenderer.invoke("app.minimize") + } + }, "app.openCreator": (...args) => { return App.publicMethods.openCreator(...args) }, diff --git a/packages/app/src/components/layout/sidebar/index.less b/packages/app/src/components/layout/sidebar/index.less index 30cad8f1..f018af21 100644 --- a/packages/app/src/components/layout/sidebar/index.less +++ b/packages/app/src/components/layout/sidebar/index.less @@ -2,26 +2,26 @@ // SIDEBAR .ant-layout-sider { - z-index : 50; + z-index: 50; - background : var(--sidebar-background-color) !important; + background: var(--sidebar-background-color) !important; background-color: var(--sidebar-background-color) !important; border-radius: 0 @app_sidebar_borderRadius @app_sidebar_borderRadius 0; - overflow : hidden; - border : 1px solid var(--sidebar-background-color); + overflow: hidden; + border: 1px solid var(--sidebar-background-color); transition: all 150ms ease-in-out; &.hidden { - flex : 0 !important; - min-width : 0 !important; + flex: 0 !important; + min-width: 0 !important; background-color: transparent !important; - width : 0 !important; + width: 0 !important; } &.elevated { - box-shadow : 0 0 5px 4px rgba(0, 0, 0, 0.1) !important; + box-shadow: 0 0 5px 4px rgba(0, 0, 0, 0.1) !important; } } @@ -42,36 +42,36 @@ .ant-menu, .ant-menu ul { - background : transparent !important; + background: transparent !important; background-color: transparent !important; border-right: 0 !important; } .sidebar .ant-layout-sider-children { - margin-top : 15px !important; + margin-top: 15px !important; margin-bottom: 15px !important; - background : transparent !important; + background: transparent !important; background-color: transparent !important; - user-select : none; + user-select: none; --webkit-user-select: none; - transition : all 150ms ease-in-out; - height : 100%; - display : flex; + transition: all 150ms ease-in-out; + height: 100%; + display: flex; flex-direction: column; &.edit_mode .ant-layout-sider-children { - background : transparent !important; + background: transparent !important; background-color: transparent !important; margin-top: 15px !important; .app_sidebar_menu_wrapper { - opacity : 0; - height : 0; + opacity: 0; + height: 0; overflow: hidden; } } @@ -81,36 +81,36 @@ transition: all 450ms ease-in-out; height: 100%; - width : 100%; + width: 100%; } .app_sidebar_header { - background : transparent !important; + background: transparent !important; background-color: transparent !important; - user-select : none; + user-select: none; --webkit-user-select: none; - display : flex; + display: flex; flex-direction: column; - height : 15%; - margin-top : 5%; - margin-bottom : 5%; + height: 15%; + margin-top: 5%; + margin-bottom: 5%; } .app_sidebar_header_logo { - user-select : none; + user-select: none; --webkit-user-select: none; - display : flex; - align-items : center; + display: flex; + align-items: center; justify-content: center; img { - user-select : none; + user-select: none; --webkit-user-select: none; - width : 80%; + width: 80%; max-height: 80px; } @@ -122,39 +122,39 @@ } .app_sidebar_menu { - background : transparent !important; + background: transparent !important; background-color: transparent !important; - height : 65%; - overflow : overlay; + height: 65%; + overflow: overlay; overflow-x: hidden; } .app_sidebar_bottom { - position : absolute; - bottom : 0; + position: absolute; + bottom: 0; padding-bottom: 30px; - z-index : 50; - left : 0; + z-index: 50; + left: 0; - background : transparent !important; - background-color : transparent !important; - backdrop-filter : blur(10px); + background: transparent !important; + background-color: transparent !important; + backdrop-filter: blur(10px); --webkit-backdrop-filter: blur(10px); - width : 100%; + width: 100%; height: fit-content; .ant-menu, ul { - background : transparent !important; + background: transparent !important; background-color: transparent !important; } } .user_avatar { - display : flex; - align-items : center; + display: flex; + align-items: center; justify-content: center; - padding : 0 !important; + padding: 0 !important; } \ No newline at end of file diff --git a/packages/app/src/components/layout/systemBar/index.jsx b/packages/app/src/components/layout/systemBar/index.jsx new file mode 100644 index 00000000..e3e38a33 --- /dev/null +++ b/packages/app/src/components/layout/systemBar/index.jsx @@ -0,0 +1,25 @@ +import React from "react" +import { Icons } from "components/Icons" + +import "./index.less" + +export default (props) => { + const handleClose = () => { + app.eventBus.emit("app.close") + } + + const handleMinimize = () => { + app.eventBus.emit("app.minimize") + } + + return
+
+
+ +
+
+ +
+
+
+} \ No newline at end of file diff --git a/packages/app/src/components/layout/systemBar/index.less b/packages/app/src/components/layout/systemBar/index.less new file mode 100644 index 00000000..df7599af --- /dev/null +++ b/packages/app/src/components/layout/systemBar/index.less @@ -0,0 +1,58 @@ +.app_systemBar { + -webkit-app-region: drag; + + display: inline-flex; + flex-direction: row; + + align-items: center; + justify-content: flex-end; + + position: fixed; + z-index: 1000; + + background-color: transparent; + + top: 0; + left: 0; + right: 0; + + height: 30px; + width: 100%; + + //backdrop-filter: blur(5px); + + .icons { + display: inline-flex; + align-items: center; + + padding: 0 10px; + height: 100%; + + .icon { + -webkit-app-region: no-drag; + cursor: pointer; + + display: inline-flex; + align-items: center; + justify-content: center; + + + margin: 0 5px; + width: 20px; + height: 20px; + + color: #fff; + + border-radius: 10px; + + svg { + margin: 0 !important; + color: var(--text-color); + } + } + + :first-child { + margin-left: 5px; + } + } +} \ No newline at end of file diff --git a/packages/app/src/pages/home/index.less b/packages/app/src/pages/home/index.less index 83061f04..1234e453 100644 --- a/packages/app/src/pages/home/index.less +++ b/packages/app/src/pages/home/index.less @@ -1,6 +1,6 @@ .dashboard { display: grid; - grid-template-columns: 25% repeat(2, 1fr); + grid-template-columns: 10vw repeat(2, 1fr); grid-template-rows: 1fr; grid-column-gap: 20px; grid-row-gap: 0px; diff --git a/packages/app/src/pages/notifications/index.jsx b/packages/app/src/pages/notifications/index.jsx index d8551230..56b57f49 100644 --- a/packages/app/src/pages/notifications/index.jsx +++ b/packages/app/src/pages/notifications/index.jsx @@ -5,6 +5,6 @@ import "./index.less" // TODO: Implement this component export default (props) => { return
- +
} \ No newline at end of file diff --git a/packages/app/src/theme/index.less b/packages/app/src/theme/index.less index 01567292..ad8869b8 100644 --- a/packages/app/src/theme/index.less +++ b/packages/app/src/theme/index.less @@ -95,6 +95,16 @@ html { height: 100%; background-color: var(--layoutBackgroundColor) !important; + + &.electron { + .layout_page { + padding-top: 35px; + } + + .ant-layout-sider { + padding-top: 0px; + } + } } #nprogress { @@ -231,6 +241,10 @@ html { margin-bottom: 40px; } + svg { + color: var(--text-color) !important; + } + .splash_logo { width: 200px; height: 200px; diff --git a/packages/app/vite.config.js b/packages/app/vite.config.js index 8e82569d..176c6546 100644 --- a/packages/app/vite.config.js +++ b/packages/app/vite.config.js @@ -1,11 +1,14 @@ +import path from "path" import getConfig from "./.config.js" import { defineConfig } from "vite" -import reactRefresh from "@vitejs/plugin-react-refresh" +import react from "@vitejs/plugin-react" + +//import electron, { onstart } from "vite-plugin-electron" export default defineConfig({ plugins: [ - reactRefresh(), + react(), ], ...getConfig(), }) \ No newline at end of file