+ login + Добро пожаловать! +
+Войдите в свой аккаунт
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..85cc82d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,47 @@ +name: Build Electron Apps + +on: + workflow_dispatch: + push: + branches: ["main", "electron"] + paths: + - 'frontend/**' + - 'package.json' + - 'package-lock.json' + - 'frontend/electron/**' + +jobs: + build: + name: Build (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + + - name: Install root deps (no scripts) + run: npm install --ignore-scripts --no-audit --no-fund + + - name: Install Electron Forge deps + run: npm run frontend:electron:dependencies + + - name: Build Electron app + run: npm run build:electron + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: fromchat-${{ runner.os }} + path: | + frontend/electron/forge/out/** + if-no-files-found: error + diff --git a/.gitignore b/.gitignore index a7c6771..ea1679e 100644 --- a/.gitignore +++ b/.gitignore @@ -379,4 +379,5 @@ pyrightconfig.json data .vite *.db -package-lock.json \ No newline at end of file +package-lock.json +dist-electron \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index ad432ea..44ac70d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -15,8 +15,24 @@ "panel": "shared" }, "group": { - "kind": "build", - "isDefault": true + "kind": "build" + } + }, + { + "label": "Run (Electron)", + "type": "shell", + "command": "npm run dev:electron", + "options": { + "cwd": "${workspaceFolder}" + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared" + }, + "group": { + "kind": "build" } } ] diff --git a/frontend/electron.d.ts b/frontend/electron.d.ts new file mode 100644 index 0000000..ae8b74e --- /dev/null +++ b/frontend/electron.d.ts @@ -0,0 +1,12 @@ +export type Platform = "win32" | "darwin" | "linux" + +export interface ElectronInterface { + desktop: true, + platform: Platform +} + +declare global { + interface Window { + electronInterface: ElectronInterface + } +} \ No newline at end of file diff --git a/frontend/electron/forge/forge.config.ts b/frontend/electron/forge/forge.config.ts new file mode 100644 index 0000000..ab5fefd --- /dev/null +++ b/frontend/electron/forge/forge.config.ts @@ -0,0 +1,48 @@ +import { FusesPlugin } from '@electron-forge/plugin-fuses'; +import { FuseV1Options, FuseVersion } from '@electron/fuses'; +import type { ForgeConfig } from "@electron-forge/shared-types"; + +const config: ForgeConfig = { + packagerConfig: { + asar: true + }, + rebuildConfig: {}, + makers: [ + { + name: '@electron-forge/maker-squirrel', + config: {}, + }, + { + name: '@electron-forge/maker-zip', + config: {}, + platforms: ['darwin'], + }, + { + name: '@electron-forge/maker-deb', + config: {}, + }, + { + name: '@electron-forge/maker-rpm', + config: {}, + }, + ], + plugins: [ + { + name: '@electron-forge/plugin-auto-unpack-natives', + config: {}, + }, + // Fuses are used to enable/disable various Electron functionality + // at package time, before code signing the application + new FusesPlugin({ + version: FuseVersion.V1, + [FuseV1Options.RunAsNode]: false, + [FuseV1Options.EnableCookieEncryption]: true, + [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, + [FuseV1Options.EnableNodeCliInspectArguments]: false, + [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true, + [FuseV1Options.OnlyLoadAppFromAsar]: true, + }), + ], +}; + +export default config; \ No newline at end of file diff --git a/frontend/electron/forge/index.html b/frontend/electron/forge/index.html new file mode 100644 index 0000000..83e1446 --- /dev/null +++ b/frontend/electron/forge/index.html @@ -0,0 +1,13 @@ + + +
+ +Welcome to your Electron application.
+ + + diff --git a/frontend/electron/forge/package.json b/frontend/electron/forge/package.json new file mode 100644 index 0000000..9ca842d --- /dev/null +++ b/frontend/electron/forge/package.json @@ -0,0 +1,33 @@ +{ + "name": "FromChat", + "productName": "FromChat", + "version": "1.0.0", + "description": "A 100% Open Source Messenger", + "main": "dist-electron/main.js", + "scripts": { + "package": "electron-forge package", + "make": "electron-forge make", + "publish": "electron-forge publish" + }, + "keywords": [], + "author": { + "name": "denis0001-dev", + "email": "denis0001.dev@ya.ru" + }, + "license": "GPL-2.0", + "devDependencies": { + "@electron-forge/cli": "^7.8.3", + "@electron-forge/maker-deb": "^7.8.3", + "@electron-forge/maker-rpm": "^7.8.3", + "@electron-forge/maker-squirrel": "^7.8.3", + "@electron-forge/maker-zip": "^7.8.3", + "@electron-forge/plugin-auto-unpack-natives": "^7.8.3", + "@electron-forge/plugin-fuses": "^7.8.3", + "@electron/fuses": "^1.8.0", + "electron": "37.3.1", + "vite": "^5.4.19" + }, + "dependencies": { + "electron-squirrel-startup": "^1.0.1" + } +} diff --git a/frontend/electron/main.ts b/frontend/electron/main.ts new file mode 100644 index 0000000..55fbeb7 --- /dev/null +++ b/frontend/electron/main.ts @@ -0,0 +1,28 @@ +import { app, BrowserWindow } from 'electron'; +import path from "node:path"; + +app.whenReady().then(() => { + const win = new BrowserWindow({ + title: 'Main window', + minWidth: 650, + minHeight: 420, + webPreferences: { + preload: path.join(import.meta.dirname, "preload.mjs") + }, + titleBarStyle: "hidden", + ...(process.platform !== 'darwin' ? { titleBarOverlay: true } : {}), + trafficLightPosition: { + x: 16 - 4, + y: 16 - 4 + }, + titleBarOverlay: process.platform !== "darwin" + }) + + // You can use `process.env.VITE_DEV_SERVER_URL` when the vite command is called `serve` + if (process.env.VITE_DEV_SERVER_URL) { + win.loadURL(process.env.VITE_DEV_SERVER_URL) + } else { + // Load your file + win.loadFile('dist/index.html'); + } +}); \ No newline at end of file diff --git a/frontend/electron/preload.ts b/frontend/electron/preload.ts new file mode 100644 index 0000000..4d99711 --- /dev/null +++ b/frontend/electron/preload.ts @@ -0,0 +1,9 @@ +import { contextBridge } from "electron"; +import type { ElectronInterface, Platform } from "../electron"; + +const electronInterface: ElectronInterface = { + desktop: true, + platform: process.platform as Platform +} + +contextBridge.exposeInMainWorld("electronInterface", electronInterface); \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html index 5a1549b..96eb4a7 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -7,185 +7,197 @@ - -Войдите в свой аккаунт
-Ещё нет аккаунта? Зарегистрируйтесь
-