diff --git a/build.js b/build.js new file mode 100644 index 0000000..2c05509 --- /dev/null +++ b/build.js @@ -0,0 +1,15 @@ +const fs = require('fs'); +const path = require('path'); + +const indexPath = path.resolve(__dirname, 'dist/index.html'); +let indexHtml = fs.readFileSync(indexPath, 'utf-8'); +const timestamp = new Date().getTime(); + +// 正则表达式匹配JS文件引用并添加时间戳 +indexHtml = indexHtml.replace(/`; + } + return match; +}); +fs.writeFileSync(indexPath, indexHtml); \ No newline at end of file diff --git a/build/start-my.ico b/build/start-my.ico new file mode 100644 index 0000000..5bf1ee2 Binary files /dev/null and b/build/start-my.ico differ diff --git a/build/start-xatyz.ico b/build/start-xatyz.ico new file mode 100644 index 0000000..bfc9474 Binary files /dev/null and b/build/start-xatyz.ico differ diff --git a/config/my.json b/config/my.json new file mode 100644 index 0000000..74be3b2 --- /dev/null +++ b/config/my.json @@ -0,0 +1,57 @@ +{ + "appId": "agora.io.ElectronApiExample", + "asar": true, + "asarUnpack": [ + "node_modules/agora-electron-sdk" + ], + "buildDependenciesFromSource": true, + "compression": "normal", + "productName": "绵阳中学人工智能教育发展共同体 · 教研平台", + "publish": [ + { + "provider": "generic", + "url": "https://meeting-api.23544.com/meeting/my" + } + ], + "files": [ + "!*.log" + ], + "win": { + "icon": "build/start-my.ico", + "requestedExecutionLevel": "highestAvailable", + "target": [ + { + "target": "nsis", + "arch": [ + "ia32" + ] + } + ] + }, + "directories": { + "output": "electron" + }, + "extraResources": [ + { + "from": "src/assets/virtualBackground", + "to": "images", + "filter": [ + "**/*" + ] + } + ], + "nsis": { + "oneClick": false, + "installerIcon": "build/start-my.ico", + "uninstallerIcon": "build/start-my.ico", + "installerHeaderIcon": "build/start-my.ico", + "allowToChangeInstallationDirectory": true, + "createDesktopShortcut": true, + "createStartMenuShortcut": true, + "deleteAppDataOnUninstall": true, + "shortcutName": "绵阳中学人工智能教育发展共同体 · 教研平台", + "allowElevation": true, + "perMachine": true, + "include": "build/install.nsh" + } +} \ No newline at end of file diff --git a/config/xatyz.json b/config/xatyz.json new file mode 100644 index 0000000..41b0bd5 --- /dev/null +++ b/config/xatyz.json @@ -0,0 +1,57 @@ +{ + "appId": "agora.io.ElectronApiExample", + "asar": true, + "asarUnpack": [ + "node_modules/agora-electron-sdk" + ], + "buildDependenciesFromSource": true, + "compression": "normal", + "productName": "西安铁一中教研平台", + "publish": [ + { + "provider": "generic", + "url": "https://meeting-api.23544.com/meeting/xatyz" + } + ], + "files": [ + "!*.log" + ], + "win": { + "icon": "build/start-xatyz.ico", + "requestedExecutionLevel": "highestAvailable", + "target": [ + { + "target": "nsis", + "arch": [ + "ia32" + ] + } + ] + }, + "directories": { + "output": "electron" + }, + "extraResources": [ + { + "from": "src/assets/virtualBackground", + "to": "images", + "filter": [ + "**/*" + ] + } + ], + "nsis": { + "oneClick": false, + "installerIcon": "build/start-xatyz.ico", + "uninstallerIcon": "build/start-xatyz.ico", + "installerHeaderIcon": "build/start-xatyz.ico", + "allowToChangeInstallationDirectory": true, + "createDesktopShortcut": true, + "createStartMenuShortcut": true, + "deleteAppDataOnUninstall": true, + "shortcutName": "西安铁一中教研平台", + "allowElevation": true, + "perMachine": true, + "include": "build/install.nsh" + } +} \ No newline at end of file diff --git a/index.html b/index.html index 1061ae2..5d1ed2c 100644 --- a/index.html +++ b/index.html @@ -6,6 +6,10 @@ + + + + diff --git a/main.js b/main.js index f5fecb8..f9128b0 100644 --- a/main.js +++ b/main.js @@ -25,14 +25,12 @@ app.allowRendererProcessReuse = false; let mainWindow = null; let childWindow = {} let isMaximized = false; -let env = 'development'; //development production xy let regKey; let connection = null; let startNumber = 0; -let buildStatus = false; //true 打包开发版本 false 本地开发 +let env = 'my'; //development production xy xatyz my +let buildStatus = true; //true 打包开发版本 false 本地开发 powerSaveBlocker.start('prevent-display-sleep') -const id = powerSaveBlocker.start('prevent-display-sleep') -powerSaveBlocker.stop(id) class AppWindow extends BrowserWindow { constructor(config) { @@ -74,7 +72,13 @@ let tray; // 检查网络状态 function checkNetworkStatus() { if (!net.isOnline()) { - dialog.showErrorBox(`${env === 'xy' ? '湖北襄阳四中教研平台' : '智汇享'}-网络连接错误', '当前无网络连接,请检查您的网络设置。`); + const titleMap = { + xy: '湖北襄阳四中教研平台', + xatyz: '西安铁一中教研平台', + my: '绵阳中学人工智能教育发展共同体 · 教研平台' + }; + const title = `${titleMap[env] || '智汇享'}-网络连接错误`; + dialog.showErrorBox(title, '当前无网络连接,请检查您的网络设置。'); app.quit(); return false; } @@ -705,9 +709,9 @@ app.on('ready', () => { childWindow[config.key].setBounds({ width: config.width, height: config.height }) break; default: - mainWindow.setMinimumSize(250, config.height); - mainWindow.setMaximumSize(250, config.height); - mainWindow.setSize(250, config.height) + mainWindow.setMinimumSize(config.width, config.height); + mainWindow.setMaximumSize(config.width, config.height); + mainWindow.setSize(config.width, config.height) break; } }); diff --git a/package-lock.json b/package-lock.json index ebeb9ba..93963e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "WGShare.Metting", - "version": "0.7.1", + "version": "0.8.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "WGShare.Metting", - "version": "0.7.1", + "version": "0.8.0", "dependencies": { "@ant-design/icons": "^5.3.7", "@microsoft/signalr": "^8.0.0", @@ -42,6 +42,7 @@ "electron-builder": "^23.1.0", "typescript": "^4.5.4", "vite": "^2.8.0", + "vite-plugin-html": "^3.2.2", "vite-plugin-resolve": "^2.5.1" } }, @@ -751,6 +752,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -809,6 +820,41 @@ "ws": "^7.4.5" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@radix-ui/number": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/@radix-ui/number/-/number-1.0.1.tgz", @@ -2626,6 +2672,18 @@ "node": ">=6.5" } }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", @@ -3545,6 +3603,12 @@ "bluebird": "^3.5.5" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", @@ -3793,6 +3857,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-3.0.0.tgz", @@ -3933,6 +4007,27 @@ "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", @@ -4146,6 +4241,12 @@ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/colors": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/colors/-/colors-1.0.3.tgz", @@ -4175,6 +4276,15 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/compare-version": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz", @@ -4258,6 +4368,21 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", @@ -4385,6 +4510,34 @@ "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", @@ -4776,6 +4929,71 @@ "node": ">=8" } }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dotenv": { "version": "9.0.2", "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-9.0.2.tgz", @@ -5301,6 +5519,15 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", @@ -6022,6 +6249,22 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -6033,6 +6276,15 @@ "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==" }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -7082,6 +7334,15 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -7106,6 +7367,27 @@ "url": "https://jaywcjlove.github.io/#/sponsor" } }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -7926,6 +8208,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -8151,6 +8442,73 @@ "node": ">=10" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/micromatch/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/micromatch/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/micromatch/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", @@ -8428,6 +8786,16 @@ "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -8454,6 +8822,16 @@ } } }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmmirror.com/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz", @@ -8510,6 +8888,18 @@ "node": ">= 0.10" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -8714,6 +9104,16 @@ "node": ">=4" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -8754,6 +9154,16 @@ "node": ">=0.10.0" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", @@ -8816,6 +9226,12 @@ "node": ">=0.10.0" } }, + "node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", @@ -9043,6 +9459,26 @@ "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz", @@ -9949,6 +10385,15 @@ "node": ">=0.10.0" } }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -10110,6 +10555,16 @@ "node": ">=0.12" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz", @@ -10157,6 +10612,29 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz", @@ -11077,6 +11555,30 @@ "fs-extra": "^10.0.0" } }, + "node_modules/terser": { + "version": "5.39.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/text-hex/-/text-hex-1.0.0.tgz", @@ -11909,6 +12411,50 @@ } } }, + "node_modules/vite-plugin-html": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz", + "integrity": "sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.2.0", + "colorette": "^2.0.16", + "connect-history-api-fallback": "^1.6.0", + "consola": "^2.15.3", + "dotenv": "^16.0.0", + "dotenv-expand": "^8.0.2", + "ejs": "^3.1.6", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", + "node-html-parser": "^5.3.3", + "pathe": "^0.2.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-html/node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/vite-plugin-html/node_modules/dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/vite-plugin-resolve": { "version": "2.5.1", "resolved": "https://registry.npmmirror.com/vite-plugin-resolve/-/vite-plugin-resolve-2.5.1.tgz", @@ -12734,6 +13280,16 @@ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -12788,6 +13344,32 @@ "ws": "^7.4.5" } }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@radix-ui/number": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/@radix-ui/number/-/number-1.0.1.tgz", @@ -13877,6 +14459,12 @@ "event-target-shim": "^5.0.0" } }, + "acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", @@ -14585,6 +15173,12 @@ "bluebird": "^3.5.5" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "boolean": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", @@ -14768,6 +15362,16 @@ "set-function-length": "^1.2.1" } }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-3.0.0.tgz", @@ -14868,6 +15472,23 @@ "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", @@ -15040,6 +15661,12 @@ "resolved": "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/colors/-/colors-1.0.3.tgz", @@ -15063,6 +15690,12 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, "compare-version": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz", @@ -15123,6 +15756,18 @@ } } }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", @@ -15215,6 +15860,25 @@ "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, "csstype": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", @@ -15501,6 +16165,53 @@ "verror": "^1.10.0" } }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "dotenv": { "version": "9.0.2", "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-9.0.2.tgz", @@ -15949,6 +16660,12 @@ "once": "^1.4.0" } }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", @@ -16408,6 +17125,19 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -16419,6 +17149,15 @@ "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==" }, + "fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -17225,6 +17964,12 @@ "function-bind": "^1.1.2" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -17243,6 +17988,21 @@ "resolved": "https://registry.npmmirror.com/hotkeys-js/-/hotkeys-js-3.13.7.tgz", "integrity": "sha512-ygFIdTqqwG4fFP7kkiYlvayZppeIQX2aPpirsngkv1xM1lP0piDY5QEh68nQnIKvz64hfocxhBaD/uK3sSK1yQ==" }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + } + }, "http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -17871,6 +18631,15 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -18045,6 +18814,57 @@ "escape-string-regexp": "^4.0.0" } }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "dependencies": { + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, "mime": { "version": "2.6.0", "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", @@ -18251,6 +19071,16 @@ "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -18266,6 +19096,16 @@ "whatwg-url": "^5.0.0" } }, + "node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmmirror.com/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "requires": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, "node-releases": { "version": "2.0.14", "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz", @@ -18309,6 +19149,15 @@ "once": "^1.3.2" } }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -18464,6 +19313,16 @@ "p-finally": "^1.0.0" } }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -18492,6 +19351,16 @@ "resolved": "https://registry.npmmirror.com/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", @@ -18539,6 +19408,12 @@ "resolved": "https://registry.npmmirror.com/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" }, + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", @@ -18702,6 +19577,12 @@ "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz", @@ -19324,6 +20205,12 @@ } } }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -19445,6 +20332,12 @@ "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true + }, "roarr": { "version": "2.15.4", "resolved": "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz", @@ -19478,6 +20371,15 @@ } } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rxjs": { "version": "7.8.1", "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz", @@ -20211,6 +21113,26 @@ "fs-extra": "^10.0.0" } }, + "terser": { + "version": "5.39.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/text-hex/-/text-hex-1.0.0.tgz", @@ -20844,6 +21766,40 @@ } } }, + "vite-plugin-html": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz", + "integrity": "sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.2.0", + "colorette": "^2.0.16", + "connect-history-api-fallback": "^1.6.0", + "consola": "^2.15.3", + "dotenv": "^16.0.0", + "dotenv-expand": "^8.0.2", + "ejs": "^3.1.6", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", + "node-html-parser": "^5.3.3", + "pathe": "^0.2.0" + }, + "dependencies": { + "dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true + }, + "dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "dev": true + } + } + }, "vite-plugin-resolve": { "version": "2.5.1", "resolved": "https://registry.npmmirror.com/vite-plugin-resolve/-/vite-plugin-resolve-2.5.1.tgz", diff --git a/package.json b/package.json index 44f05de..5e081e2 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,11 @@ "dev": "concurrently \"electron .\" \"cross-env BROWSER=none vite\"", "build": "vite build", "preview": "vite preview", - "build:dev": "vite build & electron-builder -w --config=./config/development.json", - "build:prod": "vite build & electron-builder -w --config=./config/production.json", - "build:xy": "vite build & electron-builder -w --config=./config/xy.json" + "build:dev": "vite build & node build.js & electron-builder -w --config=./config/development.json", + "build:prod": "vite build & node build.js & electron-builder -w --config=./config/production.json", + "build:xy": "vite build & node build.js & electron-builder -w --config=./config/xy.json", + "build:xatyz": "vite build & node build.js & electron-builder -w --config=./config/xatyz.json", + "build:my": "vite build & node build.js & electron-builder -w --config=./config/my.json" }, "agora_electron": { "platform": "win32", @@ -53,6 +55,7 @@ "electron-builder": "^23.1.0", "typescript": "^4.5.4", "vite": "^2.8.0", + "vite-plugin-html": "^3.2.2", "vite-plugin-resolve": "^2.5.1" } } \ No newline at end of file diff --git a/src/assets/icon57.png b/src/assets/icon57.png new file mode 100644 index 0000000..71452a1 Binary files /dev/null and b/src/assets/icon57.png differ diff --git a/src/assets/icon58.png b/src/assets/icon58.png new file mode 100644 index 0000000..4a80630 Binary files /dev/null and b/src/assets/icon58.png differ diff --git a/src/assets/icon59.png b/src/assets/icon59.png new file mode 100644 index 0000000..7fe953d Binary files /dev/null and b/src/assets/icon59.png differ diff --git a/src/assets/icon60-active.png b/src/assets/icon60-active.png new file mode 100644 index 0000000..0839e5d Binary files /dev/null and b/src/assets/icon60-active.png differ diff --git a/src/assets/icon60.png b/src/assets/icon60.png new file mode 100644 index 0000000..1df0dc8 Binary files /dev/null and b/src/assets/icon60.png differ diff --git a/src/assets/icon61-active.png b/src/assets/icon61-active.png new file mode 100644 index 0000000..0201ddf Binary files /dev/null and b/src/assets/icon61-active.png differ diff --git a/src/assets/icon61.png b/src/assets/icon61.png new file mode 100644 index 0000000..4ba4c6f Binary files /dev/null and b/src/assets/icon61.png differ diff --git a/src/assets/icon62.png b/src/assets/icon62.png new file mode 100644 index 0000000..e4bb07d Binary files /dev/null and b/src/assets/icon62.png differ diff --git a/src/assets/icon63.png b/src/assets/icon63.png new file mode 100644 index 0000000..6063e4a Binary files /dev/null and b/src/assets/icon63.png differ diff --git a/src/components/SpeakerModeModal/index.tsx b/src/components/SpeakerModeModal/index.tsx index 73e5351..848aad9 100644 --- a/src/components/SpeakerModeModal/index.tsx +++ b/src/components/SpeakerModeModal/index.tsx @@ -53,14 +53,14 @@ const SpeakerModeModal = forwardRef((props: any, ref: any) => { }) const FreedomMode: React.FC = ({ onClick, meetingMode }) => { - // 自由者模式 + // 宫格模式 return ( <>
{[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].map(item =>
)}
- 自由者模式 + 宫格模式
) diff --git a/src/page/Home/index.module.scss b/src/page/Home/index.module.scss index 394ef0d..ff50af0 100644 --- a/src/page/Home/index.module.scss +++ b/src/page/Home/index.module.scss @@ -123,7 +123,7 @@ >div:nth-child(1) { color: #ccc; - font-size: 16px; + font-size: 14px; display: flex; align-items: center; diff --git a/src/page/Home/index.tsx b/src/page/Home/index.tsx index eef3ff8..0381369 100644 --- a/src/page/Home/index.tsx +++ b/src/page/Home/index.tsx @@ -45,6 +45,7 @@ const Home: React.FC = () => { ]); const [userInfo, setUserInfo] = useState({}) const [version, setVersion] = useState('') + const [buildTime, setBuildTime] = useState('0') const [update, setUpdate] = useState(false) const [dateInfo, setDateInfo] = useState<{ work: string; @@ -60,6 +61,13 @@ const Home: React.FC = () => { window.electron.getVersion().then(res => { setVersion(res) }) + try { + const buildStr = document.getElementById('build-time')?.getAttribute('content'); + const formattedTime = dayjs(Number(buildStr)).format('YYYYMMDDHHmm'); + setBuildTime(formattedTime) + } catch { + + } const updateTime = () => { setDateInfo({ work: dayjs().format('ddd'), @@ -136,7 +144,9 @@ const Home: React.FC = () => {
- 版本号:{version} + V{version}- + {buildTime} + {update ? new : null}
{update ?
diff --git a/src/page/Login/index.module.scss b/src/page/Login/index.module.scss index df56c51..e6c1305 100644 --- a/src/page/Login/index.module.scss +++ b/src/page/Login/index.module.scss @@ -129,7 +129,7 @@ flex-shrink: 0; color: #ccc; text-align: right; - font-size: 16px; + font-size: 14px; } } } diff --git a/src/page/Login/index.tsx b/src/page/Login/index.tsx index 03d9011..11634ef 100644 --- a/src/page/Login/index.tsx +++ b/src/page/Login/index.tsx @@ -11,6 +11,7 @@ import { v4 as uuidv4 } from 'uuid'; import { GetCheckoutRoomNum, GetRoomInfo, GetRoomRtcToken } from '@/api/Home/Index'; import { ExclamationCircleFilled } from '@ant-design/icons'; import { isVersion } from '@/utils/package/public'; +import dayjs from 'dayjs'; const { confirm } = Modal; const Login: React.FC = () => { const navigate = useNavigate(); @@ -39,6 +40,7 @@ const Login: React.FC = () => { nickName: '', roomNum: '', }) + const [buildTime, setBuildTime] = useState('0') const [nameModal, setNameModal] = useState(false) const [env, setEnv] = useState('') useEffect(() => { @@ -50,6 +52,13 @@ const Login: React.FC = () => { window.electron.getEnv().then(res => { setEnv(res) }) + try { + const buildStr = document.getElementById('build-time')?.getAttribute('content'); + const formattedTime = dayjs(Number(buildStr)).format('YYYYMMDDHHmm'); + setBuildTime(formattedTime) + } catch { + + } if (storage.getItem('login')) { const login = JSON.parse(storage.getItem('login') as string); const data = { @@ -204,7 +213,23 @@ const Login: React.FC = () => { <>
- {env ? : null} + {env && ( + { + switch (env) { + case 'xy': + return ImageUrl.icon53 + case 'xatyz': + return ImageUrl.icon58 + case 'my': + return ImageUrl.icon63 + default: + return ImageUrl.icon1 + } + })()} + alt="" + /> + )}
@@ -319,7 +344,8 @@ const Login: React.FC = () => { >
- 版本号:{version} + V{version}- + {buildTime}
diff --git a/src/page/Meeting/UserListWindow/index.module.scss b/src/page/Meeting/UserListWindow/index.module.scss index 2cc7677..c8838c0 100644 --- a/src/page/Meeting/UserListWindow/index.module.scss +++ b/src/page/Meeting/UserListWindow/index.module.scss @@ -52,9 +52,15 @@ align-items: center; >span { - font-size: 14px; + display: flex; + flex-direction: column; color: #F3F3F5; margin-left: 4px; + font-size: 13px; + + >span { + font-size: 12px; + } } >div { diff --git a/src/page/Meeting/UserListWindow/index.tsx b/src/page/Meeting/UserListWindow/index.tsx index 1630667..b7aa4a7 100644 --- a/src/page/Meeting/UserListWindow/index.tsx +++ b/src/page/Meeting/UserListWindow/index.tsx @@ -83,10 +83,10 @@ const UserListWindow: React.FC = () => {
- {item.userName}{item.uid === user.uid ? '(我)' : ''} + {item.userName} {role.ID.includes(item.roleId) || item.isRoomManager ? - - {role.ID.includes(item.roleId) ? '管理员' : '发言人'} + + {role.ID.includes(item.roleId) ? item.uid === user.uid ? '(管理员,我)' : '(管理员)' : item.uid === user.uid ? '(发言人,我)' : '(发言人)'} : null} diff --git a/src/page/Meeting/index.module.scss b/src/page/Meeting/index.module.scss index 53680e0..080d1bc 100644 --- a/src/page/Meeting/index.module.scss +++ b/src/page/Meeting/index.module.scss @@ -10,7 +10,7 @@ .meetingContentUserName { display: flex; align-items: center; - background-color: #0000009E; + background-color: rgba(0, 0, 0, 0.62); border-radius: 6px; height: 24px; padding: 0 4px; @@ -103,19 +103,43 @@ background-color: #1F2022; left: 0; top: 0; - z-index: 3000; - .meetingAbsoluteLoading { - background: black; + .meetingAbsoluteHeader { position: absolute; - left: 0; - top: 0; width: 100%; - height: 100%; + left: 0; + z-index: 3; display: flex; - justify-content: center; - align-items: center; - z-index: 1; + flex-direction: column; + background-color: rgba(0, 0, 0, 0.5); + + >div { + width: 100%; + padding: 2px 10px; + box-sizing: border-box; + display: flex; + align-items: flex-start; + + >span { + display: flex; + align-items: center; + + >img { + height: 24px; + } + } + } + + >span { + font-size: 14px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + color: white; + width: 100%; + padding: 0 10px; + box-sizing: border-box; + } } .meetingAbsoluteText { @@ -124,7 +148,7 @@ left: 0; color: white; text-align: center; - z-index: 2; + z-index: 3; background-color: rgba(0, 0, 0, 0.5); cursor: pointer; font-size: 14px; @@ -234,7 +258,6 @@ #videoView { position: relative; - border: 1px red solid; } .standardModeIcon { @@ -285,14 +308,126 @@ } } + // 宫格模式 + // 1 + .meetingContentBodyLeftFreedomModeOne { + width: 100%; + height: 100%; - // 自由者模式 - .meetingContentBodyLeftFreedomMode { + .meetingContentSwiperCard { + width: 100%; + height: 100%; + } + } + + // 2 + .meetingContentBodyLeftFreedomModeTwo { + width: 100%; + height: 100%; + display: flex; + + .meetingContentSwiperCard { + width: 50%; + height: 100%; + } + } + + // 3 4 + .meetingContentBodyLeftFreedomModeThree { width: 100%; height: 100%; display: flex; flex-wrap: wrap; - overflow-y: auto; + justify-content: center; + + .meetingContentSwiperCard { + width: 50%; + height: 50%; + } + } + + //5 6 + .meetingContentBodyLeftFreedomModeFour { + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; + + .meetingContentSwiperCard { + width: calc(100% / 3); + height: 50%; + } + } + + // 7 + .meetingContentBodyLeftFreedomModeFive { + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; + + .meetingContentSwiperCard { + width: calc(100% / 4); + height: 50%; + } + } + + //8 9 + .meetingContentBodyLeftFreedomModeSix { + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; + + .meetingContentSwiperCard { + width: calc(100% / 3); + height: calc(100% / 3); + } + } + + // 10 11 12 + .meetingContentBodyLeftFreedomModeSeven { + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; + + .meetingContentSwiperCard { + width: calc(100% / 4); + height: calc(100% / 3); + } + } + + // 13 14 15 16 + .meetingContentBodyLeftFreedomModeEight { + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; + + .meetingContentSwiperCard { + width: calc(100% / 4); + height: calc(100% / 4); + } + } + + // 17 18 19 20 + .meetingContentBodyLeftFreedomModeNine { + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; + + .meetingContentSwiperCard { + width: calc(100% / 5); + height: calc(100% / 4); + } } // 标准模式 @@ -309,13 +444,18 @@ .meetingContentSwiperCard { width: 100%; - } - - .meetingContentSwiperCard { height: 160px; } } + .meetingContentBodyLeftSpeakerModeNoScrollbar { + width: 246px !important; + + &::-webkit-scrollbar { + display: none; + } + } + // 单画面模式 .meetingContentBodyLeftSingleScreenMode { width: 100%; @@ -920,40 +1060,72 @@ } .modePopover { + display: flex; + flex-direction: column; + align-items: center; + >div { - width: 140px; - height: 30px; - line-height: 30px; - border-radius: 5px; - margin-bottom: 8px; - cursor: pointer; display: flex; align-items: center; - justify-content: center; - >span { - color: #EEEEEE; + >div { + width: 100px; + padding: 10px 0; + line-height: 30px; + border-radius: 5px; + cursor: pointer; + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + margin-right: 20px; + + >span { + color: #EEEEEE; + } + + >img { + height: 30px; + margin-bottom: 4px; + } } - >img { - height: 16px; - margin-right: 10px; + >div { + background-color: #101418; + + &:hover { + background-color: lighten(#101418, 4%); + } + + &:active { + background-color: darken(#101418, 4%); + } } - &:last-child { - margin: 0; + .active { + background-color: lighten(#101418, 8%); + cursor: not-allowed; + + &:hover { + background-color: lighten(#101418, 8%); + } + + &:active { + background-color: lighten(#101418, 8%); + } + } + + :last-child { + margin-right: 0px; } } - >div { - background-color: #101418; + >span { + margin-top: 4px; + color: white; - &:hover { - background-color: lighten(#101418, 4%); - } - - &:active { - background-color: darken(#101418, 4%); + >span { + margin-left: 4px; } } } diff --git a/src/page/Meeting/index.tsx b/src/page/Meeting/index.tsx index 0a62747..f1f5aa0 100644 --- a/src/page/Meeting/index.tsx +++ b/src/page/Meeting/index.tsx @@ -184,7 +184,8 @@ const Meeting: React.FC = () => { const [isClickLock, setIsClickLock] = useState(false) const [open, setOpen] = useState(false) const [modeOpen, setModeOpen] = useState(false) - const [meetingMode, setMeetingMode] = useState('') + const [showCaret, setShowCaret] = useState(false) + const [meetingMode, setMeetingMode] = useState('FreedomMode') const [userSearchValue, setUserSearchValue] = useState('') const [noViewChatList, setNoViewChatList] = useState(0) const [currentLookUserAccount, setCurrentLookUserAccount] = useState('') @@ -217,6 +218,7 @@ const Meeting: React.FC = () => { } }); const [isVideoFullScreen, setIsVideoFullScreen] = useState(false) + const [_freedomModeStatus, setFreedomModeStatus] = useState(false) const [observer, setObserver] = useState() const [_activeSpeaker, setActiveSpeaker] = useState('') let userInfo = JSON.parse(storage.getItem('user') as string) @@ -235,7 +237,6 @@ const Meeting: React.FC = () => { } }) setKeyOpenChildWindow('shareScreenWindow', false) - setMeetingMode('StandardMode'); agoraInit() storage.setItem('noViewChatList', 0) window.addEventListener('customStorageChange', handleCustomStorageChange); @@ -489,7 +490,7 @@ const Meeting: React.FC = () => { title: '录制' }, 1, 3) } else { - message.error('当前不在会议室!') + handleMessage().error('当前不在会议室!') } showSingIn() }, @@ -639,18 +640,39 @@ const Meeting: React.FC = () => { if (isShare) { const item = roomUserList.find((item: any) => item.screenShareId === String(isShare)) setIsShareUser(item || null) + setIsScreenCapture(isScreenCaptureValue => { + setMeetingMode(isScreenCaptureValue ? 'SpeakerMode' : 'StandardMode') + return isScreenCaptureValue + }) } }, [isShare, roomUserList]); + useEffect(() => { + setFreedomModeStatus((res: boolean) => { + if (meetingMode === 'FreedomMode') { + return true + } else { + if (res) { + getShowUser(true) + } + return false + } + }) + }, [meetingMode]); + useEffect(() => { roomUserList.forEach(async (item: any) => { - if (item.uid === currentVideoId) { + if (meetingMode === "FreedomMode") { await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamHigh, true) } else { - await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamLow, true) + if (item.uid === currentVideoId) { + await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamHigh, true) + } else { + await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamLow, true) + } } }); - }, [currentVideoId, roomUserList]); + }, [currentVideoId, roomUserList, meetingMode]); useEffect(() => { let item = roomUserList.find((item: any) => currentVideoId == item.uid) @@ -723,32 +745,41 @@ const Meeting: React.FC = () => { break; // 扩展操作 case 'Operation': - switch (item.contentString) { + try { + const temp = JSON.parse(item.contentString) + if (temp.type === 'mode') { + temp.msg ? handleMessage().success(`管理员已将会议室显示模式更新为${getMeetingContentBodyLeftModeText(temp.mode)}`) : null; + setIsScreenCapture(isScreenCaptureValue => { + setMeetingMode(isScreenCaptureValue ? 'SpeakerMode' : temp.mode) + return isScreenCaptureValue + }) + } + } catch (error) { } break; // 全员离开房间 case 'AllLeave': - message.success('管理员已结束会议!') + handleMessage().success('管理员已结束会议!') leaveChannel(false) break; // 移出会议 case 'ForceExitRoom': - message.success('管理员已将你移出会议!') + handleMessage().success('管理员已将你移出会议!') leaveChannel() break; // 更新视图模式 case 'RefreshView': - setMeetingMode(item.type) + break; // 全员看他 case 'ShowUser': if (item.operUid && item.operUserName) { if (item.operUid !== userInfo.uid) { if (item.uid === userInfo.uid) { - message.success(`${item.operUserName}设置全员看你`) + handleMessage().success(`${item.operUserName}设置全员看你`) } else { - message.success(`${item.operUserName}设置全员看${item.uname}`) + handleMessage().success(`${item.operUserName}设置全员看${item.uname}`) } } } @@ -770,7 +801,7 @@ const Meeting: React.FC = () => { case 'OperMicr': if (item.operUid !== userInfo.uid) { if (item.user.uid === userInfo.uid) { - message.success(item.user.enableMicr ? '管理员已取消你的静音' : '你已被管理员静音') + handleMessage().success(item.user.enableMicr ? '管理员已取消你的静音' : '你已被管理员静音') } } setAllUserListData('OperMicr', item) @@ -779,7 +810,7 @@ const Meeting: React.FC = () => { case 'OperCamera': if (item.operUid !== userInfo.uid) { if (item.user.uid === userInfo.uid) { - message.success(item.user.enableCamera ? '管理员已开启你的摄像头' : '管理员已关闭你摄像头') + handleMessage().success(item.user.enableCamera ? '管理员已开启你的摄像头' : '管理员已关闭你摄像头') } } setAllUserListData('OperCamera', item) @@ -798,20 +829,20 @@ const Meeting: React.FC = () => { if (item.user.uid === item.uid) { if (item.user.uid === userInfo.uid) { await agora.allLeaveChannelEx() - message.success(`操作成功`) + handleMessage().success(`操作成功`) await agora.updateChannelMediaOptions(item.user.isRoomManager) await postOpenMicrApi(item.user.isRoomManager, userInfo.uid, false) await postOpenCameraApi(false, userInfo.uid) // 不管身份如何改变都关闭摄像头 await stopScreenCapture() } else { - message.success(`${item.user.userName}已结束发言`) + handleMessage().success(`${item.user.userName}已结束发言`) } } else { if (item.user.uid === userInfo.uid) { if (item.user.isRoomManager) { await agora.allLeaveChannelEx() } - message.success(`管理员${item.user.isRoomManager ? '设置' : '取消'}您为发言人`) + handleMessage().success(`管理员${item.user.isRoomManager ? '设置' : '取消'}您为发言人`) await agora.updateChannelMediaOptions(item.user.isRoomManager) setCurrentRequestSpeakType(res => { if (res === 'video') { @@ -826,7 +857,7 @@ const Meeting: React.FC = () => { }) await stopScreenCapture() } else { - message.success(`管理员${item.user.isRoomManager ? '设置' : '取消'}${item.user.userName}为发言人`) + handleMessage().success(`管理员${item.user.isRoomManager ? '设置' : '取消'}${item.user.userName}为发言人`) } } }) @@ -990,7 +1021,7 @@ const Meeting: React.FC = () => { uid: temp.uid, enableMicr: temp.enableMicr }) - } else { + } else if (temp.type === 'video') { await PostOpenCamera({ roomNum: temp.roomNum, uid: temp.uid, @@ -1016,7 +1047,7 @@ const Meeting: React.FC = () => { if (recorder) { recorder.start() recorder.onstart = async () => { - message.success('开始录制') + handleMessage().success('开始录制') } recorder.onerror = async () => { setRecorder('') @@ -1025,7 +1056,7 @@ const Meeting: React.FC = () => { changeStatusList({ title: '录制中' }, 1, 3) - message.error('录制失败,请重新录制!') + handleMessage().error('录制失败,请重新录制!') } recorder.onstop = async () => { @@ -1140,13 +1171,7 @@ const Meeting: React.FC = () => { useEffect(() => { if (isScreenCapture) { - agora.setupLocalVideo({ - uid: Number(user.uid), - view: document.getElementById(`meetingAbsoluteVideo`) as HTMLElement, - channelId: state.channelId, - sourceType: VideoSourceType.VideoSourceCameraPrimary, - type: true - }) + } }, [isScreenCapture]); @@ -1189,7 +1214,7 @@ const Meeting: React.FC = () => { // GetApplySpeak(state.channelId).then(res => { // if (res.code === 200) { // setIsClicked(true); - // message.success('申请发言成功') + // handleMessage().success('申请发言成功') // } // }) // }, @@ -1233,7 +1258,7 @@ const Meeting: React.FC = () => { } else { item.status-- if (item.status <= 0) { - message.error(`设置${user.userName}发言人失败!`) + handleMessage().error(`设置${user.userName}发言人失败!`) newApplyUserList.splice(index, 1) } } @@ -1265,18 +1290,11 @@ const Meeting: React.FC = () => { observer?.unobserve(element); }); const observerObject = new IntersectionObserver(async (entries: IntersectionObserverEntry[], _observer: IntersectionObserver) => { - setIsScreenCapture((bool: boolean) => { - entries.forEach(async (entry) => { - if (entry.target.id !== user.uid) { - await agora.muteRemoteVideoStreamEx(Number(entry.target.id), bool ? true : !entry.isIntersecting) - } - }); - return bool - }) - setIsScreenCapture((bool: boolean) => { - agora.muteRemoteVideoStreamEx(Number(currentVideoId), bool) - return bool - }) + entries.forEach(async (entry) => { + if (entry.target.id !== user.uid) { + await agora.muteRemoteVideoStreamEx(Number(entry.target.id), !entry.isIntersecting) + } + }); }, { threshold: 0, root: document.getElementById('videoView') }); setObserver(observerObject) elements.forEach(element => { @@ -1466,7 +1484,7 @@ const Meeting: React.FC = () => { return bool }) } else if (reason === 3 || reason === 4) { - message.error({ + handleMessage().error({ content:
检查摄像头是否正常、未被占用,或尝试重新加入频道。 { stupWizardRef.current.changeModal(1); }}>前往修改摄像头
, @@ -1480,7 +1498,7 @@ const Meeting: React.FC = () => { uid: userInfo.uid, enableCamera: false }) - message.error({ + handleMessage().error({ content:
检查摄像头是否正常、未被占用,或尝试重新加入频道。 { stupWizardRef.current.changeModal(1); }}>前往修改摄像头
, @@ -1581,7 +1599,14 @@ const Meeting: React.FC = () => { item.isShow = true; } }); - setIsAdmin(res.filter((item: any) => (role.ID.includes(item.roleId) || item.isRoomManager) && item.isRoom).length) + const peoPleLength = res.filter((item: any) => (role.ID.includes(item.roleId) || item.isRoomManager) && item.isRoom).length + setIsAdmin(peoPleLength) + if (peoPleLength > 6) { + setIsScreenCapture(isScreenCaptureValue => { + setMeetingMode(isScreenCaptureValue ? 'SpeakerMode' : 'StandardMode') + return isScreenCaptureValue + }) + } return res }) } @@ -1713,16 +1738,18 @@ const Meeting: React.FC = () => { }) } // 渲染视频 - const renderVideo = async (uid: string = ''): Promise => { - if (isClickLock) { - return - } - if (uid) { - if (currentVideoId === uid || currentVideoUid === uid) { + const renderVideo = async (uid: string = '', bool: boolean = false): Promise => { + if (!bool) { + if (isClickLock) { return } - } else { - uid = userInfo.uid + if (uid) { + if (currentVideoId === uid || currentVideoUid === uid) { + return + } + } else { + uid = userInfo.uid + } } await agora.destroyRendererByView(`video-source-camera-primary`) await agora.destroyRendererByView(`video-source-screen`) @@ -1760,11 +1787,11 @@ const Meeting: React.FC = () => { }, 500); } // 全员观看 - const getShowUser = async (): Promise => { + const getShowUser = async (bool: boolean = false): Promise => { if (location.href.indexOf('/meeting') !== -1) { await GetShowUser(state.channelId).then(async (res) => { if (res.code === 200 && res.data) { - renderVideo(res.data) + renderVideo(res.data, bool) } }) } @@ -1814,7 +1841,7 @@ const Meeting: React.FC = () => { GetApplySpeak(state.channelId).then(res => { if (res.code === 200) { setIsClicked(true); - message.success('申请发言成功') + handleMessage().success('申请发言成功') } }) }, @@ -1858,7 +1885,7 @@ const Meeting: React.FC = () => { } }) } else { - message.error(msgTips) + handleMessage().error(msgTips) } }) break; @@ -1868,7 +1895,7 @@ const Meeting: React.FC = () => { if (res) { await stopScreenCapture() } else { - message.error(msgTips) + handleMessage().error(msgTips) } }) if (row.title === '停止共享') { @@ -1887,7 +1914,7 @@ const Meeting: React.FC = () => { setCurrentRequestSpeakType('audio') requestSpeak() } else { - message.error('申请太频繁了,请稍后重试!'); + handleMessage().error('申请太频繁了,请稍后重试!'); } } }) @@ -1904,7 +1931,7 @@ const Meeting: React.FC = () => { setCurrentRequestSpeakType('video') requestSpeak() } else { - message.error('申请太频繁了,请稍后重试!'); + handleMessage().error('申请太频繁了,请稍后重试!'); } } }) @@ -1919,7 +1946,7 @@ const Meeting: React.FC = () => { if (res) { invitingPersonnelRef.current.changeInvitingPersonnelModal() } else { - message.error(msgTips) + handleMessage().error(msgTips) } }) break; @@ -1975,25 +2002,25 @@ const Meeting: React.FC = () => { setRecorder(mediaRecorder); }); } else { - message.error('录制太频繁了,请稍后重试!'); + handleMessage().error('录制太频繁了,请稍后重试!'); } } catch (error: any) { if (error.code === 'ENOENT') { - message.error({ + handleMessage().error({ content:
文件夹不存在 { stupWizardRef.current.changeModal(3); }}>前往设置
}); return; } else { - message.error(error); + handleMessage().error(error); } } break; case '录制中': if (isClickedMediaSteam) { - message.error('录制时长不足3秒,请稍后重试!'); + handleMessage().error('录制时长不足3秒,请稍后重试!'); } else { footerListTemplate[itemIndex][rowIndex].title = '录制' footerListTemplate[itemIndex][rowIndex].active = false @@ -2008,7 +2035,7 @@ const Meeting: React.FC = () => { if (!isClicked) { requestSpeak() } else { - message.error('申请太频繁了,请稍后重试!'); + handleMessage().error('申请太频繁了,请稍后重试!'); } break; case '会议监控': @@ -2114,7 +2141,7 @@ const Meeting: React.FC = () => { setKeyOpenChildWindow('shareScreenWindow', true) window.electron.setMainWindowSize({ width: 250, - height: 160, + height: 230, }) window.electron.setPosition('right') } @@ -2144,12 +2171,20 @@ const Meeting: React.FC = () => { await PostStopSharedScreen(state.channelId) } else { await PostShowUser(state.channelId, uid, name) + await window.electron.onInvoke('sendOper', { + roomNum: state.channelId, + contentString: JSON.stringify({ + mode: 'StandardMode', + type: 'mode', + msg: false + }) + }) } } // 设置发言人 const postRoomManager = async (data: any): Promise => { if (isAdmin >= 20) { - message.error('设置失败,已达最大发言人20个!') + handleMessage().error('设置失败,已达最大发言人20个!') } else { await PostRoomManager({ roomId: data.roomId, @@ -2167,7 +2202,7 @@ const Meeting: React.FC = () => { } // 停止共享 const stopScreenCapture = async (): Promise => { - await agora.destroyRendererByView(`meetingAbsoluteVideo`) + setMeetingMode('StandardMode') const footerListTemplate = [...footerList] await agora.leaveChannelEx(userInfo.screenShareId) agora.stopScreenCapture() @@ -2236,7 +2271,10 @@ const Meeting: React.FC = () => { const handleCustomStorageChange = async (e: any): Promise => { switch (e.key) { case 'meetingMode': - setMeetingMode(e.value) + setIsScreenCapture(isScreenCaptureValue => { + setMeetingMode(isScreenCaptureValue ? 'SpeakerMode' : e.value) + return isScreenCaptureValue + }) break; case 'quitMeeting': if (e.value) { @@ -2245,7 +2283,7 @@ const Meeting: React.FC = () => { break; case 'reconnect': if (e.value == true) { - message.success('网络已连接。') + handleMessage().success('网络已连接。') meetingDisconnectedRef.current.changeModal(false) setIsAgoraDisconnected(false) async function setUserStatus(res: any) { @@ -2311,7 +2349,7 @@ const Meeting: React.FC = () => { return res }) } else { - message.error('请输入内容!') + handleMessage().error('请输入内容!') } } // 聊天框滚动到底部 @@ -2341,19 +2379,20 @@ const Meeting: React.FC = () => { }) } if (msg) { - message.error(msg) + handleMessage().error(msg) return } } if (enableMicr) { const enableMicrLenght = roomUserList.filter((item: any) => item.enableMicr).length if (enableMicrLenght >= 20) { - return message.error('房间内最多20个开启麦克风') + handleMessage().error('房间内最多20个开启麦克风') + return } } await postOpenMicrApi(enableMicr, uid, isAll, true) } else { - message.error(msgTips) + handleMessage().error(msgTips) } }) } @@ -2381,7 +2420,7 @@ const Meeting: React.FC = () => { // }) } if (isMessage) { - // message.success('操作成功') + // handleMessage().success('操作成功') } } // 开关视频 @@ -2397,18 +2436,19 @@ const Meeting: React.FC = () => { }) } if (msg) { - message.error(msg) + handleMessage().error(msg) return } if (enableCamera) { const enableCameraLenght = roomUserList.filter((item: any) => item.enableCamera).length if (enableCameraLenght >= 20) { - return message.error('房间内最多20个开启摄像头') + handleMessage().error('房间内最多20个开启摄像头') + return } } await postOpenCameraApi(enableCamera, uid, true) } else { - message.error(msgTips) + handleMessage().error(msgTips) } }) } @@ -2434,7 +2474,7 @@ const Meeting: React.FC = () => { // enableCamera // }) if (isMessage) { - // message.success('操作成功') + // handleMessage().success('操作成功') } } // 演讲者模式 @@ -2456,14 +2496,41 @@ const Meeting: React.FC = () => { }) } // 获取当前模式样式 - const getMeetingContentBodyLeftModeClass = (): string => { + const getMeetingContentBodyLeftModeClass = (people: Number): string => { switch (meetingMode) { case 'FreedomMode': - return styles.meetingContentBodyLeftFreedomMode + switch (people) { + case 1: + return styles.meetingContentBodyLeftFreedomModeOne; + case 2: + return styles.meetingContentBodyLeftFreedomModeTwo; + case 3: + case 4: + return styles.meetingContentBodyLeftFreedomModeThree; + case 5: + case 6: + return styles.meetingContentBodyLeftFreedomModeFour; + case 7: + return styles.meetingContentBodyLeftFreedomModeFive; + case 8: + case 9: + return styles.meetingContentBodyLeftFreedomModeSix; + case 10: + case 11: + case 12: + return styles.meetingContentBodyLeftFreedomModeSeven; + case 13: + case 14: + case 15: + case 16: + return styles.meetingContentBodyLeftFreedomModeEight; + default: + return styles.meetingContentBodyLeftFreedomModeNine; + } case 'StandardMode': return styles.meetingContentBodyLeftStandardMode case 'SpeakerMode': - return styles.meetingContentBodyLeftSpeakerMode + return `${styles.meetingContentBodyLeftSpeakerMode} ${isScreenCapture ? styles.meetingContentBodyLeftSpeakerModeNoScrollbar : ''}` case 'SingleScreenMode': return styles.meetingContentBodyLeftSingleScreenMode case 'DualScreenMode': @@ -2474,10 +2541,10 @@ const Meeting: React.FC = () => { return '' } // 获取当前模式文字 - const getMeetingContentBodyLeftModeText = (): string => { - switch (meetingMode) { + const getMeetingContentBodyLeftModeText = (mode?: string): string => { + switch (mode || meetingMode) { case 'FreedomMode': - return '自由者模式' + return '宫格模式' case 'StandardMode': return '标准模式' case 'SpeakerMode': @@ -2573,7 +2640,35 @@ const Meeting: React.FC = () => { } else { await allUserLook(item.uid, item.userName) } - message.success('操作成功') + handleMessage().success('操作成功') + } + // 设置模式 + const setSyncView = (mode: string) => { + if (meetingMode === mode) { + setModeOpen(false) + handleMessage().error(`${getMeetingContentBodyLeftModeText(mode)}已开启,请勿重复操作!`) + return + } + if (isAdmin > 6 && mode === 'FreedomMode') { + setModeOpen(false) + handleMessage().error('发言人数超过6人,无法使用宫格模式!') + return + } + if (isShare && mode === 'FreedomMode') { + setModeOpen(false) + handleMessage().error('共享中,无法切换模式') + return + } + window.electron.onInvoke('sendOper', { + roomNum: state.channelId, + contentString: JSON.stringify({ + mode, + type: 'mode', + msg: true, + }) + }) + setModeOpen(false) + storage.setItem('meetingMode', mode) } // 判断是否出现滚动条 const hasScrollbar = () => { @@ -2594,30 +2689,64 @@ const Meeting: React.FC = () => { cancelText: '取消', async onOk() { await GetRoomKickout(channelId, uid) - message.success('操作成功') + handleMessage().success('操作成功') }, onCancel() { }, }); } + const handleMessage = () => { + const displayMessage = ( + fn: (msg: any) => void, + msg: any + ) => { + setIsScreenCapture(bool => { + if (!bool) { + fn(msg); + } + return bool; + }); + }; + + return { + error: (msg: any) => displayMessage(message.error, msg), + success: (msg: any) => displayMessage(message.success, msg) + }; + }; return ( <>
{ setContextMenu('') + if (modeOpen) { + setModeOpen(false) + } setIsNetworkQuality(false) }}> - {isScreenCapture ?
-
{currentSpeakUser.length ? '正在说话:' + currentSpeakUser.join(';') : '正在说话:'}
- {footerList[0][1].active ?
- -
: null} -
{ + {isScreenCapture ?
+
+
+ { + setIsExpand(!isExpand) + window.electron.setChildWindow({ + height: !isExpand ? 160 * 4 + 20 : 230, + width: 250, + key: 'main' + }) + }}> + + + +
+ {currentSpeakUser.length ? '正在说话:' + currentSpeakUser.join(';') : '正在说话:'} +
+
{ setIsExpand(!isExpand) window.electron.setChildWindow({ - height: isExpand ? 160 : 40, + height: !isExpand ? 160 * 4 + 20 : 230, + width: 250, key: 'main' }) - }}>{isExpand ? '展开' : '收起'}
+ }}>{isExpand ? '收起' : '查看参会者'}
: null} {contextMenu ?
{ >移出会议 : null}
: null} {contextHolder} -
+ {isScreenCapture ? null :
- {isScreenCapture ? null : setIsNetworkQuality(false)}> @@ -2766,35 +2895,40 @@ const Meeting: React.FC = () => { {networkIcon(currentEffective)} 详情
- } +
{changeCurrentSeconds()}
会议号:{state.channelId} 会议名称:{state.roomName}
- -
{ - setModeOpen(false) - storage.setItem('meetingMode', 'StandardMode') - }}> - - 标准模式 -
-
{ - setModeOpen(false) - storage.setItem('meetingMode', 'SpeakerMode') - }}> - - 演讲模式 -
-
{ - setModeOpen(false) - }}> - 取消 +
+
{ + setSyncView('FreedomMode') + }}> + + 宫格模式 +
+
{ + setSyncView('StandardMode') + }}> + + 标准模式 +
+
{ + setSyncView('SpeakerMode') + }}> + + 演讲模式 +
+ + + 改变布局将对所有成员生效 +
} title="" @@ -2803,24 +2937,35 @@ const Meeting: React.FC = () => { onOpenChange={() => setModeOpen(true)} >
- {meetingMode === 'StandardMode' ? : } + {meetingMode === 'StandardMode' ? + : + meetingMode === 'FreedomMode' ? + : + } {getMeetingContentBodyLeftModeText()}
-
+ : null}
-
+
}
-
- {isAdmin && currentLookUserAccount ? getSettingIcon() : null} -
+
setShowCaret(true)} + onMouseLeave={() => setShowCaret(false)}> + {isAdmin && currentLookUserAccount && !isScreenCapture ? getSettingIcon() : null} +
{roomUserList.map((item: any, index: number) => { return (item.isRoom && item.isAdmin ?
{ + if (isScreenCapture) { + return + } if (String(isShare) === item.screenShareId) { renderVideo(item.screenShareId) } else { @@ -2828,6 +2973,9 @@ const Meeting: React.FC = () => { } }} onContextMenu={(e: any) => { + if (isScreenCapture) { + return + } if (role.ID.includes(userInfo.roleId)) { setContextMenuStyle({ top: e.clientY, @@ -2842,12 +2990,12 @@ const Meeting: React.FC = () => {
- {meetingContentUser(item)} + {meetingContentUser(item, false, isScreenCapture)} {item.enableCamera ? null : meetingContentError(item)} - {String(isShare) === item.screenShareId ?
+ {String(isShare) === item.screenShareId && !isScreenCapture ?
屏幕分享中
: null} - {role.ID.includes(user.roleId) ? {item.isRoomManager || role.ID.includes(item.roleId) ?
: null) } )} - {hasScrollbar() ?
+ {/*
+
+
+
+
+
*/} + {meetingMode !== "FreedomMode" && hasScrollbar() && showCaret ?
{meetingMode === "StandardMode" ?
{ const container = document.getElementById('videoView') as HTMLElement; container.scrollLeft -= 100 @@ -2956,15 +3110,15 @@ const Meeting: React.FC = () => { container.scrollLeft += 100 }}> -
:
{ +
:
{ const container = document.getElementById('videoView') as HTMLElement; container.scrollTop += 100 }}>
}
: null} - {currentLookUserStatus === 0 ? -
+ {meetingMode !== "FreedomMode" && currentLookUserStatus === 0 ? +
{
@@ -2974,8 +3128,8 @@ const Meeting: React.FC = () => { setIsVideoFullScreen(true)} />} {meetingContentUser(currentLookUserAccount, true)}
: null} - {currentLookUserStatus === 1 ? -
+ {meetingMode !== "FreedomMode" && currentLookUserStatus === 1 ? +
{
@@ -2986,8 +3140,8 @@ const Meeting: React.FC = () => { {meetingContentUser(currentLookUserAccount, true)} {currentLookUserAccount.enableCamera ? null : meetingContentError(currentLookUserAccount)}
: null} - {currentLookUserStatus === 2 ? -
+ {meetingMode !== "FreedomMode" && currentLookUserStatus === 2 ? +
@@ -2997,8 +3151,8 @@ const Meeting: React.FC = () => { setIsVideoFullScreen(true)} />} {meetingContentUser(currentLookUserAccount, true)}
: null} - {currentLookUserStatus === 3 ? -
+ {meetingMode !== "FreedomMode" && currentLookUserStatus === 3 ? +
@@ -3008,8 +3162,8 @@ const Meeting: React.FC = () => { setIsVideoFullScreen(true)} />} {meetingContentUser(currentLookUserAccount, true)}
: null} - {currentLookUserStatus === 4 ? -
+ {meetingMode !== "FreedomMode" && currentLookUserStatus === 4 ? +
@@ -3026,7 +3180,7 @@ const Meeting: React.FC = () => {
{ - (statusList.userList || statusList.userChatList || statusList.userVideo) ? ( + (statusList.userList || statusList.userChatList || statusList.userVideo) && !isScreenCapture ? (
{statusList.userList ?
@@ -3070,10 +3224,10 @@ const Meeting: React.FC = () => {
- {item.userName}{item.uid === user.uid ? '(我)' : ''} + {item.userName} {role.ID.includes(item.roleId) || item.isRoomManager ? - - {role.ID.includes(item.roleId) ? '管理员' : '发言人'} + + {role.ID.includes(item.roleId) ? item.uid === user.uid ? '(管理员,我)' : '(管理员)' : item.uid === user.uid ? '(发言人,我)' : '(发言人)'} : null} @@ -3673,7 +3827,7 @@ const Meeting: React.FC = () => { ) } -const meetingContentUser = (item: any, bool?: boolean) => { +const meetingContentUser = (item: any, bool?: boolean, isScreenCapture?: boolean) => { return ( <>
@@ -3690,7 +3844,7 @@ const meetingContentUser = (item: any, bool?: boolean) => {
: ''} } - + {item.userName} {role.ID.includes(item.roleId) || item.isRoomManager ? role.ID.includes(item.roleId) ? '(管理员)' : '(发言人)' : ''} diff --git a/src/utils/package/imageUrl.ts b/src/utils/package/imageUrl.ts index 2c349a4..bd8a33d 100644 --- a/src/utils/package/imageUrl.ts +++ b/src/utils/package/imageUrl.ts @@ -86,6 +86,15 @@ import icon54 from '@/assets/icon54.png' import icon55 from '@/assets/icon55.png' import icon56 from '@/assets/icon56.png' import icon56Active from '@/assets/icon56-active.png' +import icon57 from '@/assets/icon57.png' +import icon58 from '@/assets/icon58.png' +import icon59 from '@/assets/icon59.png' +import icon60 from '@/assets/icon60.png' +import icon61 from '@/assets/icon61.png' +import icon60Active from '@/assets/icon60-active.png' +import icon61Active from '@/assets/icon61-active.png' +import icon62 from '@/assets/icon62.png' +import icon63 from '@/assets/icon63.png' export default { loading, icon, @@ -174,5 +183,14 @@ export default { icon54, icon55, icon56, - icon56Active + icon56Active, + icon57, + icon58, + icon59, + icon60, + icon61, + icon60Active, + icon61Active, + icon62, + icon63, } \ No newline at end of file diff --git a/src/utils/package/public.ts b/src/utils/package/public.ts index beac8d1..c2f44b4 100644 --- a/src/utils/package/public.ts +++ b/src/utils/package/public.ts @@ -62,6 +62,10 @@ export const getUpdateUrl = (env: string) => { switch (env) { case 'xy': return 'https://meeting-api.23544.com/meeting/xysz' + case 'xatyz': + return 'https://meeting-api.23544.com/meeting/xatyz' + case 'my': + return 'https://meeting-api.23544.com/meeting/my' case 'development': return 'http://192.168.2.9:8827' default: @@ -75,6 +79,12 @@ export const getTitle = async () => { case 'xy': str = '湖北襄阳四中教研平台' break; + case 'xatyz': + str = '西安铁一中教研平台' + break; + case 'my': + str = '绵阳中学人工智能教育发展共同体 · 教研平台' + break; case 'development': str = '智汇享' break; diff --git a/src/utils/package/update.js b/src/utils/package/update.js index 4e10c9a..634f26f 100644 --- a/src/utils/package/update.js +++ b/src/utils/package/update.js @@ -3,6 +3,10 @@ module.exports = { switch (env) { case 'xy': return 'https://meeting-api.23544.com/meeting/xysz' + case 'xatyz': + return 'https://meeting-api.23544.com/meeting/xatyz' + case 'my': + return 'https://meeting-api.23544.com/meeting/my' case 'development': return 'http://192.168.2.9:8827' default: @@ -13,6 +17,10 @@ module.exports = { switch (env) { case 'xy': return '湖北襄阳四中教研平台' + case 'xatyz': + return '西安铁一中教研平台' + case 'my': + return '绵阳中学人工智能教育发展共同体 · 教研平台' case 'development': return '智汇享' default: @@ -23,6 +31,10 @@ module.exports = { switch (env) { case 'xy': return 'icon54' + case 'xatyz': + return 'icon59' + case 'my': + return 'icon62' case 'development': return 'icon' default: diff --git a/vite.config.ts b/vite.config.ts index c700f85..3d499eb 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,6 +3,7 @@ import react from '@vitejs/plugin-react' import pxtovw from 'postcss-px-to-viewport-8-plugin' import { resolve as resolvePath } from 'path' import resolve from 'vite-plugin-resolve'; +import { createHtmlPlugin } from 'vite-plugin-html'; const loder_pxtovw = pxtovw({ viewportWidth: 1900, viewportUnit: 'vw', @@ -51,6 +52,20 @@ export default defineConfig({ base: './', // 这里更改打包相对绝对路径 plugins: [ react(), + createHtmlPlugin({ + minify: false, + pages: [ + { + template: 'index.html', + filename: 'index.html', + injectOptions: { + data: { + buildTime: +new Date() + } + } + } + ] + }), resolve({ 'agora-electron-sdk': ` const {