From 31a26dc1cecb02ff4b46922cd946f7d88455e5f4 Mon Sep 17 00:00:00 2001 From: DIKER0K Date: Tue, 8 Jul 2025 02:30:35 +0500 Subject: [PATCH] add: auto update launcher --- .cursorignore | 1 + .erb/configs/webpack.config.main.prod.ts | 6 +++ .gitignore | 1 + package.json | 18 ++++--- release/app/package-lock.json | 8 +-- release/app/package.json | 12 ++--- src/main/main.ts | 33 +++++++++++++ src/main/preload.ts | 6 ++- src/renderer/App.tsx | 2 + src/renderer/components/Notifier.tsx | 63 ++++++++++++++++++++++++ src/renderer/index.ejs | 2 +- 11 files changed, 132 insertions(+), 20 deletions(-) create mode 100644 .cursorignore create mode 100644 src/renderer/components/Notifier.tsx diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 0000000..6f9f00f --- /dev/null +++ b/.cursorignore @@ -0,0 +1 @@ +# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv) diff --git a/.erb/configs/webpack.config.main.prod.ts b/.erb/configs/webpack.config.main.prod.ts index 4727482..d1d1179 100644 --- a/.erb/configs/webpack.config.main.prod.ts +++ b/.erb/configs/webpack.config.main.prod.ts @@ -36,9 +36,15 @@ const configuration: webpack.Configuration = { }, optimization: { + minimize: false, minimizer: [ new TerserPlugin({ parallel: true, + terserOptions: { + ecma: 2020, + keep_classnames: true, + keep_fnames: true, + }, }), ], }, diff --git a/.gitignore b/.gitignore index da13430..55608b2 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ npm-debug.log.* *.css.d.ts *.sass.d.ts *.scss.d.ts +.env diff --git a/package.json b/package.json index d339171..b7d5feb 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/electron-react-boilerplate/electron-react-boilerplate.git" + "url": "git+https://git.popa-popa.ru/DIKER/popa-launcher.git" }, "license": "MIT", "author": { @@ -42,14 +42,15 @@ "postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && npm run build:dll", "lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx", "lint:fix": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx --fix", - "package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never && npm run build:dll", + "package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish always && npm run build:dll", "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app", "prestart": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true NODE_OPTIONS=\"-r ts-node/register --no-warnings\" webpack --config ./.erb/configs/webpack.config.main.dev.ts", "start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run prestart && npm run start:renderer", "start:main": "concurrently -k -P \"cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --watch --config ./.erb/configs/webpack.config.main.dev.ts\" \"electronmon . -- {@}\" --", "start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true NODE_OPTIONS=\"-r ts-node/register --no-warnings\" webpack --config ./.erb/configs/webpack.config.preload.dev.ts", "start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true NODE_OPTIONS=\"-r ts-node/register --no-warnings\" webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts", - "test": "jest" + "test": "jest", + "publish-debug": "electron-builder build --publish always" }, "browserslist": [ "extends browserslist-config-erb" @@ -190,7 +191,7 @@ "webpack-merge": "^6.0.1" }, "build": { - "productName": "ElectronReact", + "productName": "popa-launcher", "appId": "org.erb.ElectronReact", "asar": true, "afterSign": ".erb/scripts/notarize.js", @@ -249,9 +250,12 @@ "./assets/**" ], "publish": { - "provider": "github", - "owner": "electron-react-boilerplate", - "repo": "electron-react-boilerplate" + "provider": "generic", + "url": "https://git.popa-popa.ru/DIKER/popa-launcher/releases/download/v${version}", + "channel": "latest", + "requestHeaders": { + "Authorization": "token ${env.GH_TOKEN}" + } } }, "collective": { diff --git a/release/app/package-lock.json b/release/app/package-lock.json index 351a9da..417fda3 100644 --- a/release/app/package-lock.json +++ b/release/app/package-lock.json @@ -1,12 +1,12 @@ { - "name": "electron-react-boilerplate", - "version": "4.6.0", + "name": "popa-launcher", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "electron-react-boilerplate", - "version": "4.6.0", + "name": "popa-launcher", + "version": "1.0.0", "hasInstallScript": true, "license": "MIT" } diff --git a/release/app/package.json b/release/app/package.json index de2f9ac..11892fe 100644 --- a/release/app/package.json +++ b/release/app/package.json @@ -1,12 +1,12 @@ { - "name": "electron-react-boilerplate", - "version": "4.6.0", - "description": "A foundation for scalable desktop apps", + "name": "popa-launcher", + "version": "1.0.0", + "description": "Popa Launcher", "license": "MIT", "author": { - "name": "Electron React Boilerplate Maintainers", - "email": "electronreactboilerplate@gmail.com", - "url": "https://github.com/electron-react-boilerplate" + "name": "DIKER", + "email": "diker0k@gmail.com", + "url": "https://github.com/DIKER0K" }, "main": "./dist/main/main.js", "scripts": { diff --git a/src/main/main.ts b/src/main/main.ts index 684a432..5b23377 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -25,7 +25,36 @@ class AppUpdater { constructor() { log.transports.file.level = 'info'; autoUpdater.logger = log; + + const server = 'https://git.popa-popa.ru/DIKER/popa-launcher'; + + // Для Gitea нужно указать конкретную структуру URL + // Обратите внимание на использование пути /download/ + autoUpdater.setFeedURL({ + provider: 'generic', + url: `${server}/releases/download/latest`, // Укажите конкретную версию + channel: 'latest', + }); + + // Проверка обновлений autoUpdater.checkForUpdatesAndNotify(); + + // Периодическая проверка обновлений (каждый час) + setInterval( + () => { + autoUpdater.checkForUpdatesAndNotify(); + }, + 60 * 60 * 1000, + ); + + // Обработчики событий обновления + autoUpdater.on('update-downloaded', () => { + log.info('Обновление загружено. Будет установлено при перезапуске.'); + // Можно отправить событие в renderer для уведомления пользователя + if (mainWindow) { + mainWindow.webContents.send('update-available'); + } + }); } } @@ -160,3 +189,7 @@ app }); }) .catch(console.log); + +ipcMain.handle('install-update', () => { + autoUpdater.quitAndInstall(); +}); diff --git a/src/main/preload.ts b/src/main/preload.ts index 6d94468..db18036 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -9,7 +9,9 @@ export type Channels = | 'close-app' | 'minimize-app' | 'save-pack-config' - | 'load-pack-config'; + | 'load-pack-config' + | 'update-available' + | 'install-update'; const electronHandler = { ipcRenderer: { @@ -28,7 +30,7 @@ const electronHandler = { once(channel: Channels, func: (...args: unknown[]) => void) { ipcRenderer.once(channel, (_event, ...args) => func(...args)); }, - invoke(channel: string, ...args: unknown[]) { + invoke(channel: Channels, ...args: unknown[]): Promise { return ipcRenderer.invoke(channel, ...args); }, }, diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 4228549..0b5eefc 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -11,6 +11,7 @@ import './App.css'; import TopBar from './components/TopBar'; import { Box } from '@mui/material'; import MinecraftBackround from './components/MinecraftBackround'; +import { Notifier } from './components/Notifier'; // Переместите launchOptions сюда, вне компонентов const launchOptions = { @@ -94,6 +95,7 @@ const App = () => { > + } /> { + const [open, setOpen] = useState(false); + const [message, setMessage] = useState(''); + const [severity, setSeverity] = useState< + 'error' | 'warning' | 'info' | 'success' + >('info'); + const [hasUpdateAvailable, setHasUpdateAvailable] = useState(false); + + useEffect(() => { + // Слушаем событие о наличии обновления + window.electron.ipcRenderer.on('update-available', () => { + setMessage('Доступно новое обновление'); + setSeverity('info'); + setHasUpdateAvailable(true); + setOpen(true); + }); + + return () => { + // Отписываемся от события при размонтировании + window.electron.ipcRenderer.removeAllListeners('update-available'); + }; + }, []); + + const handleClose = () => { + setOpen(false); + }; + + const handleUpdate = () => { + window.electron.ipcRenderer.invoke('install-update'); + setOpen(false); + }; + + return ( + + + + + + + ) + } + > + {message} + + + + ); +}; diff --git a/src/renderer/index.ejs b/src/renderer/index.ejs index 167cf37..e8b8874 100644 --- a/src/renderer/index.ejs +++ b/src/renderer/index.ejs @@ -6,7 +6,7 @@ http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'" /> - Hello Electron React! + popa-launcher