diff --git a/interface/package.json b/interface/package.json index 74b9140f9..5776d6d2d 100644 --- a/interface/package.json +++ b/interface/package.json @@ -1,6 +1,6 @@ { "name": "EMS-ESP", - "version": "3.8.0", + "version": "3.8.2", "description": "EMS-ESP WebUI", "homepage": "https://emsesp.org", "author": "proddy, emsesp.org", @@ -59,7 +59,7 @@ "concurrently": "^9.2.1", "eslint": "^10.2.0", "eslint-config-prettier": "^10.1.8", - "prettier": "^3.8.2", + "prettier": "^3.8.3", "rollup-plugin-visualizer": "^7.0.1", "terser": "^5.46.1", "typescript-eslint": "^8.58.2", diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index bbee8b712..81cbc74c8 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -86,7 +86,7 @@ importers: version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.4)(terser@5.46.1)) '@trivago/prettier-plugin-sort-imports': specifier: ^6.0.2 - version: 6.0.2(prettier@3.8.2) + version: 6.0.2(prettier@3.8.3) '@types/node': specifier: ^25.6.0 version: 25.6.0 @@ -109,8 +109,8 @@ importers: specifier: ^10.1.8 version: 10.1.8(eslint@10.2.0) prettier: - specifier: ^3.8.2 - version: 3.8.2 + specifier: ^3.8.3 + version: 3.8.3 rollup-plugin-visualizer: specifier: ^7.0.1 version: 7.0.1(rolldown@1.0.0-rc.15)(rollup@4.59.0) @@ -627,8 +627,8 @@ packages: '@types/react': optional: true - '@napi-rs/wasm-runtime@1.1.3': - resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -1184,8 +1184,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.18: - resolution: {integrity: sha512-VSnGQAOLtP5mib/DPyg2/t+Tlv65NTBz83BJBJvmLVHHuKJVaDOBvJJykiT5TR++em5nfAySPccDZDa4oSrn8A==} + baseline-browser-mapping@2.10.19: + resolution: {integrity: sha512-qCkNLi2sfBOn8XhZQ0FXsT1Ki/Yo5P90hrkRamVFRS7/KV9hpfA4HkoWNU152+8w0zPjnxo5psx5NL3PSGgv5g==} engines: {node: '>=6.0.0'} hasBin: true @@ -1519,8 +1519,8 @@ packages: duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - electron-to-chromium@1.5.336: - resolution: {integrity: sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==} + electron-to-chromium@1.5.338: + resolution: {integrity: sha512-KVQQ3xko9/coDX3qXLUEEbqkKT8L+1DyAovrtu0Khtrt9wjSZ+7CZV4GVzxFy9Oe1NbrIU1oVXCwHJruIA1PNg==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2717,8 +2717,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.9: - resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} powershell-utils@0.1.0: @@ -2740,8 +2740,8 @@ packages: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} - prettier@3.8.2: - resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -3870,7 +3870,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 @@ -3982,7 +3982,7 @@ snapshots: dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15': @@ -4092,7 +4092,7 @@ snapshots: react-virtualized-auto-sizer: 1.0.26(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react-window: 1.8.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.2)': + '@trivago/prettier-plugin-sort-imports@6.0.2(prettier@3.8.3)': dependencies: '@babel/generator': 7.29.1 '@babel/parser': 7.29.2 @@ -4102,7 +4102,7 @@ snapshots: lodash-es: 4.18.1 minimatch: 9.0.9 parse-imports-exports: 0.2.4 - prettier: 3.8.2 + prettier: 3.8.3 transitivePeerDependencies: - supports-color @@ -4346,7 +4346,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.18: {} + baseline-browser-mapping@2.10.19: {} bin-build@3.0.0: dependencies: @@ -4407,9 +4407,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.18 + baseline-browser-mapping: 2.10.19 caniuse-lite: 1.0.30001788 - electron-to-chromium: 1.5.336 + electron-to-chromium: 1.5.338 node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -4773,7 +4773,7 @@ snapshots: duplexer3@0.1.5: {} - electron-to-chromium@1.5.336: {} + electron-to-chromium@1.5.338: {} emoji-regex@10.6.0: {} @@ -5931,7 +5931,7 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.9: + postcss@8.5.10: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -5947,7 +5947,7 @@ snapshots: prepend-http@2.0.0: {} - prettier@3.8.2: {} + prettier@3.8.3: {} process-nextick-args@2.0.1: {} @@ -6521,7 +6521,7 @@ snapshots: dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.9 + postcss: 8.5.10 rolldown: 1.0.0-rc.15 tinyglobby: 0.2.16 optionalDependencies: diff --git a/interface/src/app/main/Help.tsx b/interface/src/app/main/Help.tsx index 16cb09c21..d68ffa591 100644 --- a/interface/src/app/main/Help.tsx +++ b/interface/src/app/main/Help.tsx @@ -11,6 +11,7 @@ import { Box, Button, Divider, + Grid, Link, List, ListItem, @@ -42,7 +43,7 @@ interface CustomSupport { html: string | null; } -const DEFAULT_IMAGE_URL = 'https://emsesp.org/_media/images/installer.jpeg'; +const DEFAULT_IMAGE_URL = 'https://emsesp.org/media/images/installer.jpeg'; const SUPPORT_BOX_STYLES: SxProps = { borderRadius: 3, @@ -182,17 +183,19 @@ const HelpComponent = () => { )} - - {LL.HELP_INFORMATION_4()}. - - + + + {LL.HELP_INFORMATION_4()}: + + + diff --git a/interface/src/app/status/Version.tsx b/interface/src/app/status/Version.tsx index 72b39cc0d..a3326856b 100644 --- a/interface/src/app/status/Version.tsx +++ b/interface/src/app/status/Version.tsx @@ -7,6 +7,7 @@ import { useRef, useState } from 'react'; +import { Link } from 'react-router'; import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -24,7 +25,6 @@ import { DialogTitle, Grid, IconButton, - Link, Table, TableBody, TableCell, @@ -274,6 +274,7 @@ const InstallDialog = memo( fetchDevVersion, latestVersion, latestDevVersion, + upgradeImportantMessageType, downloadOnly, platform, LL, @@ -284,6 +285,7 @@ const InstallDialog = memo( fetchDevVersion: boolean; latestVersion?: VersionInfo; latestDevVersion?: VersionInfo; + upgradeImportantMessageType: number; downloadOnly: boolean; platform: string; LL: TranslationFunctions; @@ -313,6 +315,27 @@ const InstallDialog = memo( fetchDevVersion ? latestDevVersion?.name : latestVersion?.name )} + {upgradeImportantMessageType === 2 && LL.UPGRADE_IMPORTANT_MESSAGES_2()} + {upgradeImportantMessageType === 1 && ( + <> + {LL.UPGRADE_IMPORTANT_MESSAGES_1()} + + + {LL.DOWNLOAD_SYSTEM_BACKUP()} + + + + )} + + + {LL.ONLINE_HELP()} + + @@ -469,6 +497,26 @@ const Version = () => { immediate: false }); + const [upgradeImportantMessageType, setUpgradeImportantMessageType] = + useState(0); + + const { send: checkUpgradeImportantMessages } = useRequest( + (version: string) => + callAction({ action: 'upgradeImportantMessages', param: version }), + { + immediate: false + } + ) + .onSuccess((event) => { + const upgradeImportantMessageType_n = ( + event.data as { upgradeImportantMessageType: number } + ).upgradeImportantMessageType; + setUpgradeImportantMessageType(upgradeImportantMessageType_n); + }) + .onError((error) => { + toast.error(String(error.error?.message || 'An error occurred')); + }); + // Memoized values const platform = useMemo(() => (data ? getPlatform(data) : ''), [data]); @@ -534,10 +582,16 @@ const Version = () => { [] ); - const showFirmwareDialog = useCallback((useDevVersion: boolean) => { - setFetchDevVersion(useDevVersion); - setOpenInstallDialog(true); - }, []); + const showFirmwareDialog = useCallback( + (useDevVersion: boolean) => { + setFetchDevVersion(useDevVersion); + void checkUpgradeImportantMessages( + useDevVersion ? latestDevVersion?.name : latestVersion?.name + ); + setOpenInstallDialog(true); + }, + [latestDevVersion, latestVersion, fetchDevVersion] + ); const closeInstallDialog = useCallback(() => { setOpenInstallDialog(false); @@ -817,6 +871,7 @@ const Version = () => { fetchDevVersion={fetchDevVersion} latestVersion={latestVersion} latestDevVersion={latestDevVersion} + upgradeImportantMessageType={upgradeImportantMessageType} downloadOnly={downloadOnly} platform={platform} LL={LL} diff --git a/interface/src/components/upload/DragNdrop.tsx b/interface/src/components/upload/DragNdrop.tsx index e0214b1bf..fdcc0cc9d 100644 --- a/interface/src/components/upload/DragNdrop.tsx +++ b/interface/src/components/upload/DragNdrop.tsx @@ -6,6 +6,7 @@ import { useRef, useState } from 'react'; +import { Link } from 'react-router'; import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -78,16 +79,22 @@ const DragNdrop = ({ text, onFileSelected }: DragNdropProps) => { useState(0); const { send: checkUpgradeImportantMessages } = useRequest( - (type: string) => - callAction({ action: 'upgradeImportantMessages', param: type }), + (version: string) => + callAction({ action: 'upgradeImportantMessages', param: version }), { immediate: false } ) - .onSuccess((event: { data: number }) => { - setUpgradeImportantMessageType(event.data); + .onSuccess((event) => { + const upgradeImportantMessageType_n = ( + event.data as { upgradeImportantMessageType: number } + ).upgradeImportantMessageType; + setUpgradeImportantMessageType(upgradeImportantMessageType_n); + if (upgradeImportantMessageType_n === 0) { + onFileSelected(file); + } }) - .onError((error: { error?: { message?: string } }) => { + .onError((error) => { toast.error(String(error.error?.message || 'An error occurred')); }); @@ -189,7 +196,7 @@ const DragNdrop = ({ text, onFileSelected }: DragNdropProps) => { {LL.UPLOAD()} - {showUpgradeDialog && ( + {showUpgradeDialog && upgradeImportantMessageType > 0 && ( { {LL.UPGRADE_IMPORTANT_MESSAGES()} - {upgradeImportantMessageType === 1 && - LL.UPGRADE_IMPORTANT_MESSAGES_1()} {upgradeImportantMessageType === 2 && LL.UPGRADE_IMPORTANT_MESSAGES_2()} + {upgradeImportantMessageType === 1 && ( + <> + {LL.UPGRADE_IMPORTANT_MESSAGES_1()} + + + {LL.DOWNLOAD_SYSTEM_BACKUP()} + + + + )}{' '} + + + {LL.ONLINE_HELP()} + +