From 9dc91f2d69eabf26448e504e23094b25b94eb9cc Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 20 Apr 2024 20:46:01 +0200 Subject: [PATCH] new linting, make sure code is type safe --- .gitignore | 1 + .prettierrc | 9 +- .vscode/settings.json | 7 +- interface/.eslintignore | 12 - interface/.eslintrc.json | 108 -- interface/eslint.config.js | 33 + interface/package.json | 23 +- interface/progmem-generator.js | 8 +- interface/src/App.tsx | 8 +- interface/src/AppRouting.tsx | 7 +- interface/src/AuthenticatedRouting.tsx | 7 +- interface/src/CustomTheme.tsx | 5 +- interface/src/SignIn.tsx | 24 +- interface/src/api/ap.ts | 10 +- interface/src/api/authentication.ts | 7 +- interface/src/api/endpoints.ts | 8 +- interface/src/api/mqtt.ts | 3 +- interface/src/api/network.ts | 12 +- interface/src/api/ntp.ts | 12 +- interface/src/api/security.ts | 8 +- interface/src/api/system.ts | 17 +- interface/src/components/ButtonRow.tsx | 3 +- interface/src/components/MessageBox.tsx | 3 +- interface/src/components/SectionContent.tsx | 3 +- .../inputs/BlockFormControlLabel.tsx | 3 +- .../inputs/ValidatedPasswordField.tsx | 5 +- .../components/inputs/ValidatedTextField.tsx | 4 +- interface/src/components/layout/Layout.tsx | 15 +- .../src/components/layout/LayoutAppBar.tsx | 3 +- .../src/components/layout/LayoutDrawer.tsx | 10 +- .../src/components/layout/LayoutMenu.tsx | 26 +- .../src/components/layout/LayoutMenuItem.tsx | 7 +- .../src/components/layout/ListMenuItem.tsx | 5 +- interface/src/components/layout/context.ts | 2 +- .../components/loading/ApplicationError.tsx | 3 +- .../src/components/loading/FormLoader.tsx | 6 +- .../src/components/loading/LoadingSpinner.tsx | 5 +- .../components/routing/BlockNavigation.tsx | 4 +- .../src/components/routing/RequireAdmin.tsx | 4 +- .../routing/RequireAuthenticated.tsx | 8 +- .../routing/RequireUnauthenticated.tsx | 5 +- .../src/components/routing/RouterTabs.tsx | 7 +- .../src/components/upload/SingleUpload.tsx | 11 +- .../authentication/Authentication.tsx | 13 +- .../src/contexts/authentication/context.ts | 1 + interface/src/framework/Settings.tsx | 27 +- interface/src/framework/ap/APSettings.tsx | 22 +- interface/src/framework/ap/APStatus.tsx | 9 +- interface/src/framework/ap/AccessPoint.tsx | 11 +- interface/src/framework/mqtt/Mqtt.tsx | 11 +- interface/src/framework/mqtt/MqttSettings.tsx | 21 +- interface/src/framework/mqtt/MqttStatus.tsx | 8 +- interface/src/framework/network/Network.tsx | 16 +- .../src/framework/network/NetworkSettings.tsx | 62 +- .../src/framework/network/NetworkStatus.tsx | 9 +- .../network/WiFiConnectionContext.tsx | 1 + .../framework/network/WiFiNetworkScanner.tsx | 15 +- .../framework/network/WiFiNetworkSelector.tsx | 19 +- interface/src/framework/ntp/NTPSettings.tsx | 26 +- interface/src/framework/ntp/NTPStatus.tsx | 21 +- interface/src/framework/ntp/NetworkTime.tsx | 11 +- interface/src/framework/ntp/TZ.tsx | 4 +- interface/src/framework/ota/OTASettings.tsx | 18 +- .../src/framework/security/GenerateToken.tsx | 24 +- .../src/framework/security/ManageUsers.tsx | 38 +- interface/src/framework/security/Security.tsx | 13 +- .../framework/security/SecuritySettings.tsx | 15 +- interface/src/framework/security/User.tsx | 16 +- .../src/framework/system/ESPSystemStatus.tsx | 7 +- .../src/framework/system/RestartMonitor.tsx | 6 +- interface/src/framework/system/System.tsx | 13 +- interface/src/framework/system/SystemLog.tsx | 72 +- .../src/framework/system/SystemStatus.tsx | 18 +- .../src/framework/system/UploadDownload.tsx | 47 +- interface/src/i18n/de/index.ts | 2 +- interface/src/i18n/en/index.ts | 2 +- interface/src/i18n/formatters.ts | 3 +- interface/src/i18n/fr/index.ts | 2 +- interface/src/i18n/it/index.ts | 2 +- interface/src/i18n/nl/index.ts | 4 +- interface/src/i18n/no/index.ts | 9 +- interface/src/i18n/pl/index.ts | 6 +- interface/src/i18n/sk/index.ts | 2 +- interface/src/i18n/sv/index.ts | 2 +- interface/src/i18n/tr/index.ts | 2 +- interface/src/index.tsx | 2 +- interface/src/project/ApplicationSettings.tsx | 44 +- interface/src/project/CustomEntities.tsx | 50 +- .../src/project/CustomEntitiesDialog.tsx | 23 +- interface/src/project/Customization.tsx | 86 +- interface/src/project/CustomizationDialog.tsx | 17 +- interface/src/project/DeviceIcon.tsx | 13 +- interface/src/project/Devices.tsx | 88 +- interface/src/project/DevicesDialog.tsx | 47 +- interface/src/project/EntityMaskToggle.tsx | 7 +- interface/src/project/Help.tsx | 25 +- interface/src/project/OptionIcon.tsx | 6 +- interface/src/project/Scheduler.tsx | 43 +- interface/src/project/SchedulerDialog.tsx | 26 +- interface/src/project/Sensors.tsx | 61 +- interface/src/project/SensorsAnalogDialog.tsx | 41 +- .../src/project/SensorsTemperatureDialog.tsx | 31 +- interface/src/project/SystemActivity.tsx | 18 +- interface/src/project/api.ts | 51 +- interface/src/project/deviceValue.ts | 7 +- interface/src/project/types.ts | 20 +- interface/src/project/validators.ts | 5 +- interface/src/types/system.ts | 6 + interface/src/utils/binding.ts | 13 +- interface/src/utils/useRest.ts | 24 +- interface/src/validators/ap.ts | 5 +- interface/src/validators/mqtt.ts | 3 +- interface/src/validators/network.ts | 3 +- interface/src/validators/ntp.ts | 1 + interface/src/validators/shared.ts | 1 - interface/vite.config.ts | 6 +- interface/yarn.lock | 1697 +++-------------- mock-api/es_server.ts | 2 +- mock-api/package.json | 2 +- mock-api/rest_server.ts | 19 +- mock-api/yarn.lock | 10 +- src/version.h | 2 +- 122 files changed, 1194 insertions(+), 2412 deletions(-) delete mode 100644 interface/.eslintignore delete mode 100644 interface/.eslintrc.json create mode 100644 interface/eslint.config.js diff --git a/.gitignore b/.gitignore index fb5e5348d..6ace7c70c 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ bw-output/ # standalone executable for testing emsesp +interface/tsconfig.tsbuildinfo diff --git a/.prettierrc b/.prettierrc index 4197de585..7bed89b7c 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,8 +1,13 @@ { + "plugins": ["@trivago/prettier-plugin-sort-imports"], "trailingComma": "none", "tabWidth": 2, "semi": true, "singleQuote": true, "printWidth": 120, - "bracketSpacing": true -} \ No newline at end of file + "bracketSpacing": true, + "importOrder": ["^react", "^@mui/(.*)$", "^api*/(.*)$", "", "^[./]"], + "importOrderSeparation": true, + "importOrderSortSpecifiers": true, + "importOrderGroupNamespaceSpecifiers": true +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 493bf41fe..373f1a25e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,10 @@ "editor.codeActionsOnSave": { "source.fixAll": "explicit" }, + "eslint.validate": [ + "typescript" + ], + "eslint.codeActionsOnSave.rules": null, "eslint.nodePath": "interface/.yarn/sdks", "eslint.workingDirectories": ["interface"], "prettier.prettierPath": "", @@ -87,5 +91,6 @@ "cSpell.enableFiletypes": [ "!cpp", "!typescript" - ] + ], + "typescript.preferences.preferTypeOnlyAutoImports": true } \ No newline at end of file diff --git a/interface/.eslintignore b/interface/.eslintignore deleted file mode 100644 index c04eade2b..000000000 --- a/interface/.eslintignore +++ /dev/null @@ -1,12 +0,0 @@ -node_modules/ -build/ -dist/ -.yarn/ - -.prettierrc -.eslintrc* -env.d.ts -progmem-generator.js -unpack.ts -vite.config.ts -package.json \ No newline at end of file diff --git a/interface/.eslintrc.json b/interface/.eslintrc.json deleted file mode 100644 index 781a0705b..000000000 --- a/interface/.eslintrc.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "env": { - "browser": true, - "es6": true - }, - "extends": [ - "eslint:recommended", - // "airbnb/hooks", - // "airbnb-typescript", - "plugin:react/recommended", - "plugin:react/jsx-runtime", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:prettier/recommended", - "plugin:import/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": "latest", - "sourceType": "module", - "tsconfigRootDir": ".", - "project": ["tsconfig.json"] - }, - "plugins": ["react", "@typescript-eslint", "autofix", "react-hooks"], - "settings": { - "import/resolver": { - "typescript": { - "project": "./tsconfig.json" - } - }, - "react": { - "version": "18.x" - } - }, - "rules": { - "object-shorthand": "error", - "no-console": "warn", - "@typescript-eslint/consistent-type-definitions": ["off", "type"], - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-enum-comparison": "off", - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-unsafe-member-access": "off", - "@typescript-eslint/naming-convention": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/restrict-plus-operands": "off", - "@typescript-eslint/no-unused-expressions": "off", - "@typescript-eslint/no-implied-eval": "off", - "@typescript-eslint/no-misused-promises": "off", - "arrow-body-style": ["error", "as-needed"], - "react-hooks/exhaustive-deps": "warn", - "@typescript-eslint/consistent-type-imports": [ - "error", - { - "prefer": "type-imports" - } - ], - "import/order": [ - "warn", - { - "groups": ["builtin", "external", "parent", "sibling", "index", "object", "type"], - "pathGroups": [ - { - "pattern": "@/**/**", - "group": "parent", - "position": "before" - } - ], - "alphabetize": { "order": "asc" } - } - ], - // "autofix/no-unused-vars": [ - // "error", - // { - // "argsIgnorePattern": "^_", - // "ignoreRestSiblings": true, - // "destructuredArrayIgnorePattern": "^_" - // } - // ], - "react/self-closing-comp": [ - "error", - { - "component": true, - "html": true - } - ], - "@typescript-eslint/ban-types": [ - "error", - { - "extendDefaults": true, - "types": { - "{}": false - } - } - ], - "prettier/prettier": [ - "error", - { - "endOfLine": "auto" - } - ] - } -} diff --git a/interface/eslint.config.js b/interface/eslint.config.js new file mode 100644 index 000000000..bae746842 --- /dev/null +++ b/interface/eslint.config.js @@ -0,0 +1,33 @@ +// @ts-check +import eslint from '@eslint/js'; +import prettierConfig from 'eslint-config-prettier'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.recommendedTypeChecked, + prettierConfig, + { + languageOptions: { + parserOptions: { + project: true, + tsconfigRootDir: import.meta.dirname + } + } + }, + { + ignores: ['dist/*', '*.js', '**/*.cjs', '**/unpack.ts'] + }, + { + rules: { + '@typescript-eslint/no-unsafe-enum-comparison': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-misused-promises': [ + 'error', + { + checksVoidReturn: false + } + ] + } + } +); diff --git a/interface/package.json b/interface/package.json index ba9227b8b..c19e4b9e0 100644 --- a/interface/package.json +++ b/interface/package.json @@ -19,25 +19,24 @@ "typesafe-i18n": "typesafe-i18n --no-watch", "webUI": "node progmem-generator.js", "format": "prettier --write '**/*.{ts,tsx,js,css,json,md}'", - "lint": "eslint . --cache --fix" + "lint": "eslint . --fix" }, "dependencies": { "@alova/adapter-xhr": "^1.0.3", + "@alova/scene-react": "^1.5.0", "@babel/core": "^7.24.4", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@mui/icons-material": "^5.15.15", "@mui/material": "^5.15.15", "@table-library/react-table-library": "4.1.7", - "@types/imagemin": "^8.0.5", "@types/lodash-es": "^4.17.12", "@types/node": "^20.12.7", - "@types/react": "^18.2.78", + "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@types/react-router-dom": "^5.3.3", - "alova": "^2.19.1", + "alova": "^2.20.0", "async-validator": "^4.2.5", - "eslint-plugin-prettier": "^5.1.3", "history": "^5.3.0", "jwt-decode": "^4.0.0", "lodash-es": "^4.17.21", @@ -52,23 +51,19 @@ "typescript": "^5.4.5" }, "devDependencies": { + "@eslint/js": "^9.1.1", "@preact/compat": "^17.1.2", "@preact/preset-vite": "^2.8.2", - "@typescript-eslint/eslint-plugin": "^7.7.0", - "@typescript-eslint/parser": "^7.7.0", + "@trivago/prettier-plugin-sort-imports": "^4.3.0", "concurrently": "^8.2.2", - "eslint": "8.57.0", + "eslint": "^9.1.0", "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-autofix": "^1.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", "preact": "^10.20.2", "prettier": "^3.2.5", "rollup-plugin-visualizer": "^5.12.0", "terser": "^5.30.3", - "vite": "^5.2.8", + "typescript-eslint": "^7.7.0", + "vite": "^5.2.10", "vite-plugin-imagemin": "^0.6.1", "vite-tsconfig-paths": "^4.3.2" }, diff --git a/interface/progmem-generator.js b/interface/progmem-generator.js index b8935e04b..f8661706d 100644 --- a/interface/progmem-generator.js +++ b/interface/progmem-generator.js @@ -1,8 +1,8 @@ -import { readdirSync, existsSync, unlinkSync, readFileSync, createWriteStream } from 'fs'; -import { resolve, relative, sep } from 'path'; -import zlib from 'zlib'; -import mime from 'mime-types'; import crypto from 'crypto'; +import { createWriteStream, existsSync, readFileSync, readdirSync, unlinkSync } from 'fs'; +import mime from 'mime-types'; +import { relative, resolve, sep } from 'path'; +import zlib from 'zlib'; const ARDUINO_INCLUDES = '#include \n\n'; const INDENT = ' '; diff --git a/interface/src/App.tsx b/interface/src/App.tsx index 18398cf4e..b5ac62222 100644 --- a/interface/src/App.tsx +++ b/interface/src/App.tsx @@ -1,16 +1,14 @@ import { useEffect, useState } from 'react'; -import { ToastContainer, Slide } from 'react-toastify'; - +import type { FC } from 'react'; +import { Slide, ToastContainer } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.min.css'; -import { localStorageDetector } from 'typesafe-i18n/detectors'; -import type { FC } from 'react'; import AppRouting from 'AppRouting'; import CustomTheme from 'CustomTheme'; - import TypesafeI18n from 'i18n/i18n-react'; import { detectLocale } from 'i18n/i18n-util'; import { loadLocaleAsync } from 'i18n/i18n-util.async'; +import { localStorageDetector } from 'typesafe-i18n/detectors'; const detectedLocale = detectLocale(localStorageDetector); diff --git a/interface/src/AppRouting.tsx b/interface/src/AppRouting.tsx index 7e6507621..6f917408d 100644 --- a/interface/src/AppRouting.tsx +++ b/interface/src/AppRouting.tsx @@ -1,14 +1,11 @@ import { useContext, useEffect } from 'react'; - -import { Route, Routes, Navigate, useLocation } from 'react-router-dom'; - -import { toast } from 'react-toastify'; import type { FC } from 'react'; +import { Navigate, Route, Routes, useLocation } from 'react-router-dom'; +import { toast } from 'react-toastify'; import AuthenticatedRouting from 'AuthenticatedRouting'; import SignIn from 'SignIn'; import { RequireAuthenticated, RequireUnauthenticated } from 'components'; - import { Authentication, AuthenticationContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; diff --git a/interface/src/AuthenticatedRouting.tsx b/interface/src/AuthenticatedRouting.tsx index af3ed76d8..98462e53c 100644 --- a/interface/src/AuthenticatedRouting.tsx +++ b/interface/src/AuthenticatedRouting.tsx @@ -1,7 +1,6 @@ -import { useContext, type FC } from 'react'; -import { Navigate, Routes, Route } from 'react-router-dom'; +import { type FC, useContext } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; -import Help from './project/Help'; import { Layout } from 'components'; import { AuthenticatedContext } from 'contexts/authentication'; import Settings from 'framework/Settings'; @@ -21,6 +20,8 @@ import Devices from 'project/Devices'; import Scheduler from 'project/Scheduler'; import Sensors from 'project/Sensors'; +import Help from './project/Help'; + const AuthenticatedRouting: FC = () => { const { me } = useContext(AuthenticatedContext); return ( diff --git a/interface/src/CustomTheme.tsx b/interface/src/CustomTheme.tsx index c00321984..743935f3d 100644 --- a/interface/src/CustomTheme.tsx +++ b/interface/src/CustomTheme.tsx @@ -1,7 +1,8 @@ -import { CssBaseline } from '@mui/material'; -import { createTheme, responsiveFontSizes, ThemeProvider } from '@mui/material/styles'; import type { FC } from 'react'; +import { CssBaseline } from '@mui/material'; +import { ThemeProvider, createTheme, responsiveFontSizes } from '@mui/material/styles'; + import type { RequiredChildrenProps } from 'utils'; export const dialogStyle = { diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx index de3838a00..c95b444f7 100644 --- a/interface/src/SignIn.tsx +++ b/interface/src/SignIn.tsx @@ -1,19 +1,17 @@ -import ForwardIcon from '@mui/icons-material/Forward'; -import { Box, Paper, Typography, MenuItem, TextField, Button } from '@mui/material'; -import { useRequest } from 'alova'; import { useContext, useState } from 'react'; -import { toast } from 'react-toastify'; -import type { ValidateFieldsError } from 'async-validator'; - -import type { Locales } from 'i18n/i18n-types'; import type { ChangeEventHandler, FC } from 'react'; -import type { SignInRequest } from 'types'; +import { toast } from 'react-toastify'; + +import ForwardIcon from '@mui/icons-material/Forward'; +import { Box, Button, MenuItem, Paper, TextField, Typography } from '@mui/material'; + import * as AuthenticationApi from 'api/authentication'; import { PROJECT_NAME } from 'api/env'; +import { useRequest } from 'alova'; +import type { ValidateFieldsError } from 'async-validator'; import { ValidatedPasswordField, ValidatedTextField } from 'components'; import { AuthenticationContext } from 'contexts/authentication'; - import DEflag from 'i18n/DE.svg'; import FRflag from 'i18n/FR.svg'; import GBflag from 'i18n/GB.svg'; @@ -25,7 +23,9 @@ import SKflag from 'i18n/SK.svg'; import SVflag from 'i18n/SV.svg'; import TRflag from 'i18n/TR.svg'; import { I18nContext } from 'i18n/i18n-react'; +import type { Locales } from 'i18n/i18n-types'; import { loadLocaleAsync } from 'i18n/i18n-util.async'; +import type { SignInRequest } from 'types'; import { onEnterCallback, updateValue } from 'utils'; import { SIGN_IN_REQUEST_VALIDATOR, validate } from 'validators'; @@ -54,7 +54,7 @@ const SignIn: FC = () => { const updateLoginRequestValue = updateValue(setSignInRequest); const signIn = async () => { - await callSignIn(signInRequest).catch((event) => { + await callSignIn(signInRequest).catch((event: Error) => { if (event.message === 'Unauthorized') { toast.warning(LL.INVALID_LOGIN()); } else { @@ -72,8 +72,8 @@ const SignIn: FC = () => { try { await validate(SIGN_IN_REQUEST_VALIDATOR, signInRequest); await signIn(); - } catch (errors: any) { - setFieldErrors(errors); + } catch (error) { + setFieldErrors(error as ValidateFieldsError); setProcessing(false); } }; diff --git a/interface/src/api/ap.ts b/interface/src/api/ap.ts index 7ffda7668..8545dc3f0 100644 --- a/interface/src/api/ap.ts +++ b/interface/src/api/ap.ts @@ -1,7 +1,7 @@ +import type { APSettingsType, APStatusType } from 'types'; + import { alovaInstance } from './endpoints'; -import type { APSettings, APStatus } from 'types'; - -export const readAPStatus = () => alovaInstance.Get('/rest/apStatus'); -export const readAPSettings = () => alovaInstance.Get('/rest/apSettings'); -export const updateAPSettings = (data: APSettings) => alovaInstance.Post('/rest/apSettings', data); +export const readAPStatus = () => alovaInstance.Get('/rest/apStatus'); +export const readAPSettings = () => alovaInstance.Get('/rest/apSettings'); +export const updateAPSettings = (data: APSettingsType) => alovaInstance.Post('/rest/apSettings', data); diff --git a/interface/src/api/authentication.ts b/interface/src/api/authentication.ts index c54ed2c64..41b7579f8 100644 --- a/interface/src/api/authentication.ts +++ b/interface/src/api/authentication.ts @@ -1,10 +1,11 @@ -import { jwtDecode } from 'jwt-decode'; -import { ACCESS_TOKEN, alovaInstance } from './endpoints'; -import type * as H from 'history'; import type { Path } from 'react-router-dom'; +import type * as H from 'history'; +import { jwtDecode } from 'jwt-decode'; import type { Me, SignInRequest, SignInResponse } from 'types'; +import { ACCESS_TOKEN, alovaInstance } from './endpoints'; + export const SIGN_IN_PATHNAME = 'loginPathname'; export const SIGN_IN_SEARCH = 'loginSearch'; diff --git a/interface/src/api/endpoints.ts b/interface/src/api/endpoints.ts index 1b5413dee..5d6974da8 100644 --- a/interface/src/api/endpoints.ts +++ b/interface/src/api/endpoints.ts @@ -1,13 +1,11 @@ import { xhrRequestAdapter } from '@alova/adapter-xhr'; import { createAlova } from 'alova'; import ReactHook from 'alova/react'; + import { unpack } from '../api/unpack'; export const ACCESS_TOKEN = 'access_token'; -const host = window.location.host; -export const EVENT_SOURCE_ROOT = 'http://' + host + '/es/'; - export const alovaInstance = createAlova({ statesHook: ReactHook, timeout: 3000, // 3 seconds but throwing a timeout error @@ -37,9 +35,9 @@ export const alovaInstance = createAlova({ } else if (response.status >= 400) { throw new Error(response.statusText); } - const data = await response.data; + const data: ArrayBuffer = (await response.data) as ArrayBuffer; if (response.data instanceof ArrayBuffer) { - return unpack(data); + return unpack(data) as ArrayBuffer; } return data; } diff --git a/interface/src/api/mqtt.ts b/interface/src/api/mqtt.ts index 9605d843d..dd9d03842 100644 --- a/interface/src/api/mqtt.ts +++ b/interface/src/api/mqtt.ts @@ -1,6 +1,7 @@ -import { alovaInstance } from './endpoints'; import type { MqttSettingsType, MqttStatusType } from 'types'; +import { alovaInstance } from './endpoints'; + export const readMqttStatus = () => alovaInstance.Get('/rest/mqttStatus'); export const readMqttSettings = () => alovaInstance.Get('/rest/mqttSettings'); export const updateMqttSettings = (data: MqttSettingsType) => diff --git a/interface/src/api/network.ts b/interface/src/api/network.ts index c5b36dd45..3337f36e9 100644 --- a/interface/src/api/network.ts +++ b/interface/src/api/network.ts @@ -1,8 +1,8 @@ +import type { NetworkSettingsType, NetworkStatusType, WiFiNetworkList } from 'types'; + import { alovaInstance } from './endpoints'; -import type { WiFiNetworkList, NetworkSettings, NetworkStatus } from 'types'; - -export const readNetworkStatus = () => alovaInstance.Get('/rest/networkStatus'); +export const readNetworkStatus = () => alovaInstance.Get('/rest/networkStatus'); export const scanNetworks = () => alovaInstance.Get('/rest/scanNetworks'); export const listNetworks = () => alovaInstance.Get('/rest/listNetworks', { @@ -10,6 +10,6 @@ export const listNetworks = () => timeout: 20000 // timeout 20 seconds }); export const readNetworkSettings = () => - alovaInstance.Get('/rest/networkSettings', { name: 'networkSettings' }); -export const updateNetworkSettings = (wifiSettings: NetworkSettings) => - alovaInstance.Post('/rest/networkSettings', wifiSettings); + alovaInstance.Get('/rest/networkSettings', { name: 'networkSettings' }); +export const updateNetworkSettings = (wifiSettings: NetworkSettingsType) => + alovaInstance.Post('/rest/networkSettings', wifiSettings); diff --git a/interface/src/api/ntp.ts b/interface/src/api/ntp.ts index 74da189d1..6400b5f23 100644 --- a/interface/src/api/ntp.ts +++ b/interface/src/api/ntp.ts @@ -1,11 +1,13 @@ -import { alovaInstance } from './endpoints'; -import type { NTPSettings, NTPStatus, Time } from 'types'; +import type { NTPSettingsType, NTPStatusType, Time } from 'types'; -export const readNTPStatus = () => alovaInstance.Get('/rest/ntpStatus'); +import { alovaInstance } from './endpoints'; + +export const readNTPStatus = () => alovaInstance.Get('/rest/ntpStatus'); export const readNTPSettings = () => - alovaInstance.Get('/rest/ntpSettings', { + alovaInstance.Get('/rest/ntpSettings', { name: 'ntpSettings' }); -export const updateNTPSettings = (data: NTPSettings) => alovaInstance.Post('/rest/ntpSettings', data); +export const updateNTPSettings = (data: NTPSettingsType) => + alovaInstance.Post('/rest/ntpSettings', data); export const updateTime = (data: Time) => alovaInstance.Post