diff --git a/interface/package.json b/interface/package.json index d1c034dba..d6bf4d620 100644 --- a/interface/package.json +++ b/interface/package.json @@ -32,7 +32,7 @@ "@types/imagemin": "^8.0.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.11.30", - "@types/react": "^18.2.67", + "@types/react": "^18.2.69", "@types/react-dom": "^18.2.22", "@types/react-router-dom": "^5.3.3", "alova": "^2.18.0", @@ -66,11 +66,11 @@ "eslint-plugin-prettier": "alpha", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", - "preact": "^10.20.0", + "preact": "^10.20.1", "prettier": "^3.2.5", "rollup-plugin-visualizer": "^5.12.0", "terser": "^5.29.2", - "vite": "^5.2.3", + "vite": "^5.2.4", "vite-plugin-imagemin": "^0.6.1", "vite-tsconfig-paths": "^4.3.2" }, diff --git a/interface/src/framework/Settings.tsx b/interface/src/framework/Settings.tsx index eddda14a1..1ae6d301e 100644 --- a/interface/src/framework/Settings.tsx +++ b/interface/src/framework/Settings.tsx @@ -8,6 +8,7 @@ import MemoryIcon from '@mui/icons-material/Memory'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; import SettingsEthernetIcon from '@mui/icons-material/SettingsEthernet'; +import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; import TuneIcon from '@mui/icons-material/Tune'; import { List, Button, Dialog, DialogActions, DialogContent, DialogTitle, Box } from '@mui/material'; @@ -171,7 +172,7 @@ const Settings: FC = () => { /> { } /> - - - - } - /> + } /> } /> diff --git a/interface/src/framework/mqtt/Mqtt.tsx b/interface/src/framework/mqtt/Mqtt.tsx index aa89fea32..5e3ae2020 100644 --- a/interface/src/framework/mqtt/Mqtt.tsx +++ b/interface/src/framework/mqtt/Mqtt.tsx @@ -4,7 +4,7 @@ import MqttSettings from './MqttSettings'; import MqttStatus from './MqttStatus'; import type { FC } from 'react'; -import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from 'components'; +import { RouterTabs, useLayoutTitle, useRouterTab } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; @@ -23,14 +23,7 @@ const Mqtt: FC = () => { } /> - - - - } - /> + } /> } /> diff --git a/interface/src/framework/network/Network.tsx b/interface/src/framework/network/Network.tsx index 7dd90a2d7..66dc255b5 100644 --- a/interface/src/framework/network/Network.tsx +++ b/interface/src/framework/network/Network.tsx @@ -8,7 +8,7 @@ import WiFiNetworkScanner from './WiFiNetworkScanner'; import type { FC } from 'react'; import type { WiFiNetwork } from 'types'; -import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from 'components'; +import { RouterTabs, useLayoutTitle, useRouterTab } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; const Network: FC = () => { @@ -48,22 +48,8 @@ const Network: FC = () => { } /> - - - - } - /> - - - - } - /> + } /> + } /> } /> diff --git a/interface/src/framework/ntp/NetworkTime.tsx b/interface/src/framework/ntp/NetworkTime.tsx index b3e0d9db6..193940b9a 100644 --- a/interface/src/framework/ntp/NetworkTime.tsx +++ b/interface/src/framework/ntp/NetworkTime.tsx @@ -4,7 +4,7 @@ import NTPSettings from './NTPSettings'; import NTPStatus from './NTPStatus'; import type { FC } from 'react'; -import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from 'components'; +import { RouterTabs, useLayoutTitle, useRouterTab } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; @@ -22,14 +22,7 @@ const NetworkTime: FC = () => { } /> - - - - } - /> + } /> } /> diff --git a/interface/src/framework/system/System.tsx b/interface/src/framework/system/System.tsx index 32d929475..d734068f4 100644 --- a/interface/src/framework/system/System.tsx +++ b/interface/src/framework/system/System.tsx @@ -1,11 +1,12 @@ import { Tab } from '@mui/material'; +import { useContext, type FC } from 'react'; import { Navigate, Routes, Route } from 'react-router-dom'; import SystemLog from './SystemLog'; import SystemStatus from './SystemStatus'; -import type { FC } from 'react'; -import { useRouterTab, RouterTabs, useLayoutTitle } from 'components'; +import { useRouterTab, RouterTabs, useLayoutTitle, RequireAdmin } from 'components'; +import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; import SystemActivity from 'project/SystemActivity'; @@ -15,18 +16,26 @@ const System: FC = () => { useLayoutTitle(LL.SYSTEM(0)); const { routerTab } = useRouterTab(); + const { me } = useContext(AuthenticatedContext); return ( <> - + } /> } /> - } /> + + + + } + /> } /> diff --git a/interface/src/framework/system/SystemStatus.tsx b/interface/src/framework/system/SystemStatus.tsx index 151963cfd..2f4881e81 100644 --- a/interface/src/framework/system/SystemStatus.tsx +++ b/interface/src/framework/system/SystemStatus.tsx @@ -1,3 +1,4 @@ +import AccessTimeIcon from '@mui/icons-material/AccessTime'; import BuildIcon from '@mui/icons-material/Build'; import CancelIcon from '@mui/icons-material/Cancel'; import CastIcon from '@mui/icons-material/Cast'; @@ -6,6 +7,7 @@ import DirectionsBusIcon from '@mui/icons-material/DirectionsBus'; import MemoryIcon from '@mui/icons-material/Memory'; import PermScanWifiIcon from '@mui/icons-material/PermScanWifi'; import RefreshIcon from '@mui/icons-material/Refresh'; +import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; import TimerIcon from '@mui/icons-material/Timer'; import { @@ -249,7 +251,7 @@ const SystemStatus: FC = () => { { to="/settings/ota" /> + + + {renderScanDialog()} diff --git a/interface/src/types/system.ts b/interface/src/types/system.ts index ae7e9fa32..a95723388 100644 --- a/interface/src/types/system.ts +++ b/interface/src/types/system.ts @@ -37,6 +37,7 @@ export interface SystemStatus { ntp_status: number; ota_status: boolean; mqtt_status: boolean; + ap_status: boolean; } export interface OTASettingsType { diff --git a/interface/yarn.lock b/interface/yarn.lock index a93c9b8fd..267cbecf8 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -1595,14 +1595,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.2.67": - version: 18.2.67 - resolution: "@types/react@npm:18.2.67" +"@types/react@npm:^18.2.69": + version: 18.2.69 + resolution: "@types/react@npm:18.2.69" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/d7e248dbe8d9d3b05f0d8e128d615fc9c85aa2c5d15634271d20cb9b343dbeffb0875f31a44e7ac63b42afc25949bd4c3633b7ebee45ee4666591ca934a8dffb + checksum: 10/5cc185f00ad5a4c2261e127ad25241448492f391e2206738b0477cbdba6aa75692e18ece5e75854ed513342d95c9ee83315744cb6b1470d488772cef1f8b40c8 languageName: node linkType: hard @@ -1784,7 +1784,7 @@ __metadata: "@types/imagemin": "npm:^8.0.5" "@types/lodash-es": "npm:^4.17.12" "@types/node": "npm:^20.11.30" - "@types/react": "npm:^18.2.67" + "@types/react": "npm:^18.2.69" "@types/react-dom": "npm:^18.2.22" "@types/react-router-dom": "npm:^5.3.3" "@typescript-eslint/eslint-plugin": "npm:^7.3.1" @@ -1805,7 +1805,7 @@ __metadata: jwt-decode: "npm:^4.0.0" lodash-es: "npm:^4.17.21" mime-types: "npm:^2.1.35" - preact: "npm:^10.20.0" + preact: "npm:^10.20.1" prettier: "npm:^3.2.5" react: "npm:latest" react-dom: "npm:latest" @@ -1818,7 +1818,7 @@ __metadata: terser: "npm:^5.29.2" typesafe-i18n: "npm:^5.26.2" typescript: "npm:^5.4.3" - vite: "npm:^5.2.3" + vite: "npm:^5.2.4" vite-plugin-imagemin: "npm:^0.6.1" vite-tsconfig-paths: "npm:^4.3.2" languageName: unknown @@ -6795,10 +6795,10 @@ __metadata: languageName: node linkType: hard -"preact@npm:^10.20.0": - version: 10.20.0 - resolution: "preact@npm:10.20.0" - checksum: 10/fb8cfc1ab1b4b8f2bd483b9fdd2f8614cc7e099d741ec33f41d95d9056aefbe3fe5897201ef0f37c76238e7657ecd38afdef377e171cb1477068aae1dcf020d6 +"preact@npm:^10.20.1": + version: 10.20.1 + resolution: "preact@npm:10.20.1" + checksum: 10/894ac14b3ec6f8ca308b53fb14e12e57678248fd1faa24ae857f5e37d9c11b34833e6dd1ba8210a34de4d6d523462923b1f9c93d35ce433874affd056f2d0998 languageName: node linkType: hard @@ -8491,9 +8491,9 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.2.3": - version: 5.2.3 - resolution: "vite@npm:5.2.3" +"vite@npm:^5.2.4": + version: 5.2.4 + resolution: "vite@npm:5.2.4" dependencies: esbuild: "npm:^0.20.1" fsevents: "npm:~2.3.3" @@ -8527,7 +8527,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/5033a989462bc3127cb937ae5138024af68ec1b67accad07e07e116254b84fc6888a18d7a0358e3d3ce19fe160d72b6622259edc93e7fba47b84d042dcbe1e4e + checksum: 10/ed3d4fa2023642dd578e90eb02876e01729fda0af196304bb1c3a7f037b457f1a505bfa36c10f28d0466945b9da7d7972219716554d43ff3c025f26ed3d89e11 languageName: node linkType: hard diff --git a/lib/framework/ESP8266React.h b/lib/framework/ESP8266React.h index 733547b4d..3ec012f10 100644 --- a/lib/framework/ESP8266React.h +++ b/lib/framework/ESP8266React.h @@ -60,10 +60,19 @@ class ESP8266React { return _mqttSettingsService.getMqttClient(); } + // + // special functions needed outside scope + // + void setWill(const char * will_topic) { _mqttSettingsService.setWill(will_topic); } + // true if AP is active + bool apStatus() { + return _apSettingsService.getAPNetworkStatus() == APNetworkStatus::ACTIVE; + } + #ifndef EMSESP_STANDALONE void factoryReset() { _factoryResetService.factoryReset(); diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index 896092c31..ed283a629 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -119,6 +119,10 @@ class ESP8266React { return _mqttClient; } + bool apStatus() { + return false; + } + void setWill(const char * will_topic) { } void onMessage(espMqttClientTypes::OnMessageCallback callback) { diff --git a/mock-api/handler.ts b/mock-api/handler.ts index 41b1e1900..cb47dced7 100644 --- a/mock-api/handler.ts +++ b/mock-api/handler.ts @@ -400,7 +400,6 @@ const ESPsystem_status = { arduino_version: 'ESP32 Arduino v2.0.14' }; -// TODO fix this const system_status = { emsesp_version: '3.6-demo', esp_platform: 'ESP32', @@ -414,7 +413,8 @@ const system_status = { free_heap: 143, ntp_status: 2, ota_status: false, - mqtt_status: true + mqtt_status: true, + ap_status: false }; let security_settings = { diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 5fb68ca3c..7916b2470 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -69,6 +69,8 @@ void WebStatusService::systemStatus(AsyncWebServerRequest * request) { }(); #endif + root["ap_status"] = EMSESP::esp8266React.apStatus(); + response->setLength(); request->send(response); }