mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-07 00:09:51 +03:00
translate network
This commit is contained in:
@@ -95,7 +95,9 @@ const LayoutAuthMenu: FC = () => {
|
|||||||
</Avatar>
|
</Avatar>
|
||||||
<Box pl={2}>
|
<Box pl={2}>
|
||||||
<ItemTypography variant="h6">{me.username}</ItemTypography>
|
<ItemTypography variant="h6">{me.username}</ItemTypography>
|
||||||
<ItemTypography variant="body1">{me.admin ? 'Admin User' : 'Guest User'}</ItemTypography>
|
<ItemTypography variant="body1">
|
||||||
|
{me.admin ? LL.ADMIN() + ' ' + LL.USER() : LL.GUEST() + ' ' + LL.USER()}
|
||||||
|
</ItemTypography>
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
<Divider />
|
<Divider />
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ const LayoutMenu: FC = () => {
|
|||||||
</List>
|
</List>
|
||||||
)}
|
)}
|
||||||
<List disablePadding component="nav">
|
<List disablePadding component="nav">
|
||||||
<LayoutMenuItem icon={SettingsEthernetIcon} label={LL.NETWORK_CONNECTION()} to="/network" />
|
<LayoutMenuItem icon={SettingsEthernetIcon} label={LL.NETWORK()} to="/network" />
|
||||||
<LayoutMenuItem icon={SettingsInputAntennaIcon} label={LL.ACCESS_POINT()} to="/ap" />
|
<LayoutMenuItem icon={SettingsInputAntennaIcon} label={LL.ACCESS_POINT()} to="/ap" />
|
||||||
{features.ntp && <LayoutMenuItem icon={AccessTimeIcon} label="NTP" to="/ntp" />}
|
{features.ntp && <LayoutMenuItem icon={AccessTimeIcon} label="NTP" to="/ntp" />}
|
||||||
{features.mqtt && <LayoutMenuItem icon={DeviceHubIcon} label="MQTT" to="/mqtt" />}
|
{features.mqtt && <LayoutMenuItem icon={DeviceHubIcon} label="MQTT" to="/mqtt" />}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import RefreshIcon from '@mui/icons-material/Refresh';
|
|||||||
|
|
||||||
import { MessageBox } from '..';
|
import { MessageBox } from '..';
|
||||||
|
|
||||||
|
import { useI18nContext } from '../../i18n/i18n-react';
|
||||||
|
|
||||||
interface FormLoaderProps {
|
interface FormLoaderProps {
|
||||||
message?: string;
|
message?: string;
|
||||||
errorMessage?: string;
|
errorMessage?: string;
|
||||||
@@ -12,12 +14,14 @@ interface FormLoaderProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const FormLoader: FC<FormLoaderProps> = ({ errorMessage, onRetry, message = 'Loading…' }) => {
|
const FormLoader: FC<FormLoaderProps> = ({ errorMessage, onRetry, message = 'Loading…' }) => {
|
||||||
|
const { LL } = useI18nContext();
|
||||||
|
|
||||||
if (errorMessage) {
|
if (errorMessage) {
|
||||||
return (
|
return (
|
||||||
<MessageBox my={2} level="error" message={errorMessage}>
|
<MessageBox my={2} level="error" message={errorMessage}>
|
||||||
{onRetry && (
|
{onRetry && (
|
||||||
<Button startIcon={<RefreshIcon />} variant="contained" color="error" onClick={onRetry}>
|
<Button startIcon={<RefreshIcon />} variant="contained" color="error" onClick={onRetry}>
|
||||||
Retry
|
{LL.RETRY()}
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
</MessageBox>
|
</MessageBox>
|
||||||
|
|||||||
@@ -2,23 +2,29 @@ import { FC } from 'react';
|
|||||||
|
|
||||||
import { CircularProgress, Box, Typography, Theme } from '@mui/material';
|
import { CircularProgress, Box, Typography, Theme } from '@mui/material';
|
||||||
|
|
||||||
|
import { useI18nContext } from '../../i18n/i18n-react';
|
||||||
|
|
||||||
interface LoadingSpinnerProps {
|
interface LoadingSpinnerProps {
|
||||||
height?: number | string;
|
height?: number | string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const LoadingSpinner: FC<LoadingSpinnerProps> = ({ height = '100%' }) => (
|
const LoadingSpinner: FC<LoadingSpinnerProps> = ({ height = '100%' }) => {
|
||||||
<Box display="flex" alignItems="center" justifyContent="center" flexDirection="column" padding={2} height={height}>
|
const { LL } = useI18nContext();
|
||||||
<CircularProgress
|
|
||||||
sx={(theme: Theme) => ({
|
return (
|
||||||
margin: theme.spacing(4),
|
<Box display="flex" alignItems="center" justifyContent="center" flexDirection="column" padding={2} height={height}>
|
||||||
color: theme.palette.text.secondary
|
<CircularProgress
|
||||||
})}
|
sx={(theme: Theme) => ({
|
||||||
size={100}
|
margin: theme.spacing(4),
|
||||||
/>
|
color: theme.palette.text.secondary
|
||||||
<Typography variant="h4" color="textSecondary">
|
})}
|
||||||
Loading…
|
size={100}
|
||||||
</Typography>
|
/>
|
||||||
</Box>
|
<Typography variant="h4" color="textSecondary">
|
||||||
);
|
{LL.LOADING()}…
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default LoadingSpinner;
|
export default LoadingSpinner;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import { useI18nContext } from '../../i18n/i18n-react';
|
|||||||
|
|
||||||
const NetworkConnection: FC = () => {
|
const NetworkConnection: FC = () => {
|
||||||
const { LL } = useI18nContext();
|
const { LL } = useI18nContext();
|
||||||
useLayoutTitle(LL.NETWORK_CONNECTION());
|
useLayoutTitle(LL.NETWORK());
|
||||||
|
|
||||||
const { routerTab } = useRouterTab();
|
const { routerTab } = useRouterTab();
|
||||||
|
|
||||||
@@ -45,9 +45,9 @@ const NetworkConnection: FC = () => {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<RouterTabs value={routerTab}>
|
<RouterTabs value={routerTab}>
|
||||||
<Tab value="status" label="Network Status" />
|
<Tab value="status" label={LL.NETWORK() + ' ' + LL.STATUS()} />
|
||||||
<Tab value="scan" label="Scan WiFi Networks" disabled={!authenticatedContext.me.admin} />
|
<Tab value="scan" label={LL.NETWORK_SCAN()} disabled={!authenticatedContext.me.admin} />
|
||||||
<Tab value="settings" label="Network Settings" disabled={!authenticatedContext.me.admin} />
|
<Tab value="settings" label={LL.NETWORK() + ' ' + LL.SETTINGS()} disabled={!authenticatedContext.me.admin} />
|
||||||
</RouterTabs>
|
</RouterTabs>
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="status" element={<NetworkStatusForm />} />
|
<Route path="status" element={<NetworkStatusForm />} />
|
||||||
|
|||||||
@@ -37,7 +37,11 @@ import { ValidateFieldsError } from 'async-validator';
|
|||||||
import { validate } from '../../validators';
|
import { validate } from '../../validators';
|
||||||
import { createNetworkSettingsValidator } from '../../validators/network';
|
import { createNetworkSettingsValidator } from '../../validators/network';
|
||||||
|
|
||||||
|
import { useI18nContext } from '../../i18n/i18n-react';
|
||||||
|
|
||||||
const WiFiSettingsForm: FC = () => {
|
const WiFiSettingsForm: FC = () => {
|
||||||
|
const { LL } = useI18nContext();
|
||||||
|
|
||||||
const { selectedNetwork, deselectNetwork } = useContext(WiFiConnectionContext);
|
const { selectedNetwork, deselectNetwork } = useContext(WiFiConnectionContext);
|
||||||
|
|
||||||
const [initialized, setInitialized] = useState(false);
|
const [initialized, setInitialized] = useState(false);
|
||||||
@@ -112,7 +116,7 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
<ValidatedTextField
|
<ValidatedTextField
|
||||||
fieldErrors={fieldErrors}
|
fieldErrors={fieldErrors}
|
||||||
name="ssid"
|
name="ssid"
|
||||||
label="SSID (leave blank to disable WiFi)"
|
label={'SSID (' + LL.NETWORK_BLANK_SSID() + ')'}
|
||||||
fullWidth
|
fullWidth
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
value={data.ssid}
|
value={data.ssid}
|
||||||
@@ -124,7 +128,7 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
<ValidatedPasswordField
|
<ValidatedPasswordField
|
||||||
fieldErrors={fieldErrors}
|
fieldErrors={fieldErrors}
|
||||||
name="password"
|
name="password"
|
||||||
label="Password"
|
label={LL.PASSWORD()}
|
||||||
fullWidth
|
fullWidth
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
value={data.password}
|
value={data.password}
|
||||||
@@ -136,7 +140,7 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
<ValidatedTextField
|
<ValidatedTextField
|
||||||
fieldErrors={fieldErrors}
|
fieldErrors={fieldErrors}
|
||||||
name="tx_power"
|
name="tx_power"
|
||||||
label="WiFi Tx Power"
|
label={'WiFi Tx ' + LL.POWER()}
|
||||||
InputProps={{
|
InputProps={{
|
||||||
endAdornment: <InputAdornment position="end">dBm</InputAdornment>
|
endAdornment: <InputAdornment position="end">dBm</InputAdornment>
|
||||||
}}
|
}}
|
||||||
@@ -150,21 +154,21 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
|
|
||||||
<BlockFormControlLabel
|
<BlockFormControlLabel
|
||||||
control={<Checkbox name="nosleep" checked={data.nosleep} onChange={updateFormValue} />}
|
control={<Checkbox name="nosleep" checked={data.nosleep} onChange={updateFormValue} />}
|
||||||
label="Disable WiFi Sleep Mode"
|
label={LL.NETWORK_DISABLE_SLEEP()}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<BlockFormControlLabel
|
<BlockFormControlLabel
|
||||||
control={<Checkbox name="bandwidth20" checked={data.bandwidth20} onChange={updateFormValue} />}
|
control={<Checkbox name="bandwidth20" checked={data.bandwidth20} onChange={updateFormValue} />}
|
||||||
label="Use Lower WiFi Bandwidth"
|
label={LL.NETWORK_LOW_BAND()}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<BlockFormControlLabel
|
<BlockFormControlLabel
|
||||||
control={<Checkbox name="enableMDNS" checked={data.enableMDNS} onChange={updateFormValue} />}
|
control={<Checkbox name="enableMDNS" checked={data.enableMDNS} onChange={updateFormValue} />}
|
||||||
label="Enable mDNS Service"
|
label={LL.NETWORK_USE_DNS()}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
|
<Typography sx={{ pt: 2 }} variant="h6" color="primary">
|
||||||
General
|
{LL.GENERAL_OPTIONS()}
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|
||||||
<ValidatedTextField
|
<ValidatedTextField
|
||||||
@@ -180,12 +184,12 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
|
|
||||||
<BlockFormControlLabel
|
<BlockFormControlLabel
|
||||||
control={<Checkbox name="enableIPv6" checked={data.enableIPv6} onChange={updateFormValue} />}
|
control={<Checkbox name="enableIPv6" checked={data.enableIPv6} onChange={updateFormValue} />}
|
||||||
label="Enable IPv6 support"
|
label={LL.NETWORK_ENABLE_IPV6()}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<BlockFormControlLabel
|
<BlockFormControlLabel
|
||||||
control={<Checkbox name="static_ip_config" checked={data.static_ip_config} onChange={updateFormValue} />}
|
control={<Checkbox name="static_ip_config" checked={data.static_ip_config} onChange={updateFormValue} />}
|
||||||
label="Use Fixed IP address"
|
label={LL.NETWORK_FIXED_IP()}
|
||||||
/>
|
/>
|
||||||
{data.static_ip_config && (
|
{data.static_ip_config && (
|
||||||
<>
|
<>
|
||||||
@@ -250,7 +254,7 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
type="submit"
|
type="submit"
|
||||||
onClick={validateAndSubmit}
|
onClick={validateAndSubmit}
|
||||||
>
|
>
|
||||||
Save
|
{LL.SAVE()}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonRow>
|
</ButtonRow>
|
||||||
</>
|
</>
|
||||||
@@ -258,7 +262,7 @@ const WiFiSettingsForm: FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SectionContent title="Network Settings" titleGutter>
|
<SectionContent title={LL.NETWORK() + ' ' + LL.SETTINGS()} titleGutter>
|
||||||
{content()}
|
{content()}
|
||||||
</SectionContent>
|
</SectionContent>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import { NetworkConnectionStatus, NetworkStatus } from '../../types';
|
|||||||
import * as NetworkApi from '../../api/network';
|
import * as NetworkApi from '../../api/network';
|
||||||
import { useRest } from '../../utils';
|
import { useRest } from '../../utils';
|
||||||
|
|
||||||
|
import { useI18nContext } from '../../i18n/i18n-react';
|
||||||
|
|
||||||
const isConnected = ({ status }: NetworkStatus) =>
|
const isConnected = ({ status }: NetworkStatus) =>
|
||||||
status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED ||
|
status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED ||
|
||||||
status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED;
|
status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED;
|
||||||
@@ -35,29 +37,6 @@ const networkStatusHighlight = ({ status }: NetworkStatus, theme: Theme) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const networkStatus = ({ status }: NetworkStatus) => {
|
|
||||||
switch (status) {
|
|
||||||
case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD:
|
|
||||||
return 'Inactive';
|
|
||||||
case NetworkConnectionStatus.WIFI_STATUS_IDLE:
|
|
||||||
return 'Idle';
|
|
||||||
case NetworkConnectionStatus.WIFI_STATUS_NO_SSID_AVAIL:
|
|
||||||
return 'No SSID Available';
|
|
||||||
case NetworkConnectionStatus.WIFI_STATUS_CONNECTED:
|
|
||||||
return 'Connected (WiFi)';
|
|
||||||
case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED:
|
|
||||||
return 'Connected (Ethernet)';
|
|
||||||
case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED:
|
|
||||||
return 'Connection Failed';
|
|
||||||
case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST:
|
|
||||||
return 'Connection Lost';
|
|
||||||
case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED:
|
|
||||||
return 'Disconnected';
|
|
||||||
default:
|
|
||||||
return 'Unknown';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isWiFi = ({ status }: NetworkStatus) => status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED;
|
export const isWiFi = ({ status }: NetworkStatus) => status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED;
|
||||||
export const isEthernet = ({ status }: NetworkStatus) => status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED;
|
export const isEthernet = ({ status }: NetworkStatus) => status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED;
|
||||||
|
|
||||||
@@ -81,8 +60,33 @@ const IPs = (status: NetworkStatus) => {
|
|||||||
const NetworkStatusForm: FC = () => {
|
const NetworkStatusForm: FC = () => {
|
||||||
const { loadData, data, errorMessage } = useRest<NetworkStatus>({ read: NetworkApi.readNetworkStatus });
|
const { loadData, data, errorMessage } = useRest<NetworkStatus>({ read: NetworkApi.readNetworkStatus });
|
||||||
|
|
||||||
|
const { LL } = useI18nContext();
|
||||||
|
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
|
|
||||||
|
const networkStatus = ({ status }: NetworkStatus) => {
|
||||||
|
switch (status) {
|
||||||
|
case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD:
|
||||||
|
return LL.INACTIVE();
|
||||||
|
case NetworkConnectionStatus.WIFI_STATUS_IDLE:
|
||||||
|
return LL.IDLE();
|
||||||
|
case NetworkConnectionStatus.WIFI_STATUS_NO_SSID_AVAIL:
|
||||||
|
return 'No SSID Available';
|
||||||
|
case NetworkConnectionStatus.WIFI_STATUS_CONNECTED:
|
||||||
|
return LL.CONNECTED() + ' (WiFi)';
|
||||||
|
case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED:
|
||||||
|
return LL.CONNECTED() + ' (Ethernet)';
|
||||||
|
case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED:
|
||||||
|
return LL.CONNECTED() + ' ' + LL.FAILED();
|
||||||
|
case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST:
|
||||||
|
return LL.CONNECTED() + ' ' + LL.LOST();
|
||||||
|
case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED:
|
||||||
|
return LL.DISCONNECTED();
|
||||||
|
default:
|
||||||
|
return LL.UNKNOWN();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const content = () => {
|
const content = () => {
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return <FormLoader onRetry={loadData} errorMessage={errorMessage} />;
|
return <FormLoader onRetry={loadData} errorMessage={errorMessage} />;
|
||||||
@@ -162,7 +166,7 @@ const NetworkStatusForm: FC = () => {
|
|||||||
</List>
|
</List>
|
||||||
<ButtonRow>
|
<ButtonRow>
|
||||||
<Button startIcon={<RefreshIcon />} variant="outlined" color="secondary" onClick={loadData}>
|
<Button startIcon={<RefreshIcon />} variant="outlined" color="secondary" onClick={loadData}>
|
||||||
Refresh
|
{LL.REFRESH()}
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonRow>
|
</ButtonRow>
|
||||||
</>
|
</>
|
||||||
@@ -170,7 +174,7 @@ const NetworkStatusForm: FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SectionContent title="Network Status" titleGutter>
|
<SectionContent title={LL.NETWORK() + ' ' + LL.STATUS()} titleGutter>
|
||||||
{content()}
|
{content()}
|
||||||
</SectionContent>
|
</SectionContent>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import { ButtonRow, FormLoader, SectionContent } from '../../components';
|
|||||||
|
|
||||||
import WiFiNetworkSelector from './WiFiNetworkSelector';
|
import WiFiNetworkSelector from './WiFiNetworkSelector';
|
||||||
|
|
||||||
|
import { useI18nContext } from '../../i18n/i18n-react';
|
||||||
|
|
||||||
const NUM_POLLS = 10;
|
const NUM_POLLS = 10;
|
||||||
const POLLING_FREQUENCY = 500;
|
const POLLING_FREQUENCY = 500;
|
||||||
|
|
||||||
@@ -22,6 +24,8 @@ const compareNetworks = (network1: WiFiNetwork, network2: WiFiNetwork) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const WiFiNetworkScanner: FC = () => {
|
const WiFiNetworkScanner: FC = () => {
|
||||||
|
const { LL } = useI18nContext();
|
||||||
|
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const { enqueueSnackbar } = useSnackbar();
|
||||||
|
|
||||||
const pollCount = useRef(0);
|
const pollCount = useRef(0);
|
||||||
@@ -46,7 +50,7 @@ const WiFiNetworkScanner: FC = () => {
|
|||||||
pollCount.current = completedPollCount;
|
pollCount.current = completedPollCount;
|
||||||
setTimeout(pollNetworkList, POLLING_FREQUENCY);
|
setTimeout(pollNetworkList, POLLING_FREQUENCY);
|
||||||
} else {
|
} else {
|
||||||
finishedWithError('Device did not return network list in timely manner');
|
finishedWithError(LL.PROBLEM_LOADING());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const newNetworkList = response.data;
|
const newNetworkList = response.data;
|
||||||
@@ -55,12 +59,12 @@ const WiFiNetworkScanner: FC = () => {
|
|||||||
}
|
}
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
if (error instanceof AxiosError) {
|
if (error instanceof AxiosError) {
|
||||||
finishedWithError('Problem listing WiFi networks ' + error.response?.data.message);
|
finishedWithError(LL.PROBLEM_LOADING() + ' ' + error.response?.data.message);
|
||||||
} else {
|
} else {
|
||||||
finishedWithError('Problem listing WiFi networks');
|
finishedWithError(LL.PROBLEM_LOADING());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [finishedWithError]);
|
}, [finishedWithError, LL]);
|
||||||
|
|
||||||
const startNetworkScan = useCallback(async () => {
|
const startNetworkScan = useCallback(async () => {
|
||||||
pollCount.current = 0;
|
pollCount.current = 0;
|
||||||
@@ -71,12 +75,12 @@ const WiFiNetworkScanner: FC = () => {
|
|||||||
setTimeout(pollNetworkList, POLLING_FREQUENCY);
|
setTimeout(pollNetworkList, POLLING_FREQUENCY);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
if (error instanceof AxiosError) {
|
if (error instanceof AxiosError) {
|
||||||
finishedWithError('Problem scanning for WiFi networks ' + error.response?.data.message);
|
finishedWithError(LL.PROBLEM_LOADING() + ' ' + error.response?.data.message);
|
||||||
} else {
|
} else {
|
||||||
finishedWithError('Problem scanning for WiFi networks');
|
finishedWithError(LL.PROBLEM_LOADING());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [finishedWithError, pollNetworkList]);
|
}, [finishedWithError, pollNetworkList, LL]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
startNetworkScan();
|
startNetworkScan();
|
||||||
@@ -84,13 +88,13 @@ const WiFiNetworkScanner: FC = () => {
|
|||||||
|
|
||||||
const renderNetworkScanner = () => {
|
const renderNetworkScanner = () => {
|
||||||
if (!networkList) {
|
if (!networkList) {
|
||||||
return <FormLoader message="Scanning…" errorMessage={errorMessage} />;
|
return <FormLoader message={LL.SCANNING() + '...'} errorMessage={errorMessage} />;
|
||||||
}
|
}
|
||||||
return <WiFiNetworkSelector networkList={networkList} />;
|
return <WiFiNetworkSelector networkList={networkList} />;
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SectionContent title="Network Scanner">
|
<SectionContent title={LL.NETWORK_SCANNER()}>
|
||||||
{renderNetworkScanner()}
|
{renderNetworkScanner()}
|
||||||
<ButtonRow>
|
<ButtonRow>
|
||||||
<Button
|
<Button
|
||||||
@@ -100,7 +104,7 @@ const WiFiNetworkScanner: FC = () => {
|
|||||||
onClick={startNetworkScan}
|
onClick={startNetworkScan}
|
||||||
disabled={!errorMessage && !networkList}
|
disabled={!errorMessage && !networkList}
|
||||||
>
|
>
|
||||||
Scan again…
|
{LL.SCAN_AGAIN()}…
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonRow>
|
</ButtonRow>
|
||||||
</SectionContent>
|
</SectionContent>
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import { WiFiEncryptionType, WiFiNetwork, WiFiNetworkList } from '../../types';
|
|||||||
|
|
||||||
import { WiFiConnectionContext } from './WiFiConnectionContext';
|
import { WiFiConnectionContext } from './WiFiConnectionContext';
|
||||||
|
|
||||||
|
import { useI18nContext } from '../../i18n/i18n-react';
|
||||||
|
|
||||||
interface WiFiNetworkSelectorProps {
|
interface WiFiNetworkSelectorProps {
|
||||||
networkList: WiFiNetworkList;
|
networkList: WiFiNetworkList;
|
||||||
}
|
}
|
||||||
@@ -39,6 +41,8 @@ export const networkSecurityMode = ({ encryption_type }: WiFiNetwork) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const WiFiNetworkSelector: FC<WiFiNetworkSelectorProps> = ({ networkList }) => {
|
const WiFiNetworkSelector: FC<WiFiNetworkSelectorProps> = ({ networkList }) => {
|
||||||
|
const { LL } = useI18nContext();
|
||||||
|
|
||||||
const wifiConnectionContext = useContext(WiFiConnectionContext);
|
const wifiConnectionContext = useContext(WiFiConnectionContext);
|
||||||
|
|
||||||
const renderNetwork = (network: WiFiNetwork) => {
|
const renderNetwork = (network: WiFiNetwork) => {
|
||||||
@@ -61,7 +65,7 @@ const WiFiNetworkSelector: FC<WiFiNetworkSelectorProps> = ({ networkList }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (networkList.networks.length === 0) {
|
if (networkList.networks.length === 0) {
|
||||||
return <MessageBox mt={2} mb={1} message="No WiFi networks found" level="info" />;
|
return <MessageBox mt={2} mb={1} message={LL.NETWORK_NO_WIFI()} level="info" />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return <List>{networkList.networks.map(renderNetwork)}</List>;
|
return <List>{networkList.networks.map(renderNetwork)}</List>;
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import type { Translation } from '../i18n-types';
|
|||||||
|
|
||||||
const de: Translation = {
|
const de: Translation = {
|
||||||
LANGUAGE: 'Sprache',
|
LANGUAGE: 'Sprache',
|
||||||
|
RETRY: 'DE_Retry',
|
||||||
|
LOADING: 'DE_Loading',
|
||||||
IS_REQUIRED: 'ist nötig',
|
IS_REQUIRED: 'ist nötig',
|
||||||
SIGN_IN: 'Einloggen',
|
SIGN_IN: 'Einloggen',
|
||||||
SIGN_OUT: 'Ausloggen',
|
SIGN_OUT: 'Ausloggen',
|
||||||
@@ -16,7 +18,7 @@ const de: Translation = {
|
|||||||
UPLOAD_SUCCESSFUL: 'Hochladen erfolgreich',
|
UPLOAD_SUCCESSFUL: 'Hochladen erfolgreich',
|
||||||
DOWNLOAD_SUCCESSFUL: 'DE_Download successful',
|
DOWNLOAD_SUCCESSFUL: 'DE_Download successful',
|
||||||
INVALID_LOGIN: 'Ungültige Login Daten',
|
INVALID_LOGIN: 'Ungültige Login Daten',
|
||||||
NETWORK_CONNECTION: 'Netzwerkverbindung',
|
NETWORK: 'Netzwerk',
|
||||||
SECURITY: 'Sicherheit',
|
SECURITY: 'Sicherheit',
|
||||||
ONOFF_CAP: 'AN/AUS',
|
ONOFF_CAP: 'AN/AUS',
|
||||||
ONOFF: 'an/aus',
|
ONOFF: 'an/aus',
|
||||||
@@ -51,7 +53,6 @@ const de: Translation = {
|
|||||||
CONNECTED: 'in Verbindung gebracht',
|
CONNECTED: 'in Verbindung gebracht',
|
||||||
TX_ISSUES: 'Tx-Probleme - versuchen Sie einen anderen Tx-Modus',
|
TX_ISSUES: 'Tx-Probleme - versuchen Sie einen anderen Tx-Modus',
|
||||||
DISCONNECTED: 'Getrennt',
|
DISCONNECTED: 'Getrennt',
|
||||||
SCANNING: 'Suche nach Geräten...',
|
|
||||||
EMS_SCAN: 'Möchten Sie wirklich einen vollständigen Gerätescan des EMS-Busses starten?',
|
EMS_SCAN: 'Möchten Sie wirklich einen vollständigen Gerätescan des EMS-Busses starten?',
|
||||||
EMS_BUS_STATUS: 'EMS Bus Status',
|
EMS_BUS_STATUS: 'EMS Bus Status',
|
||||||
ACTIVE_DEVICES: 'Aktive Geräte und Sensoren',
|
ACTIVE_DEVICES: 'Aktive Geräte und Sensoren',
|
||||||
@@ -222,8 +223,23 @@ const de: Translation = {
|
|||||||
AP_PROVIDE_TEXT_2: 'DE_when WiFi is disconnected',
|
AP_PROVIDE_TEXT_2: 'DE_when WiFi is disconnected',
|
||||||
AP_PROVIDE_TEXT_3: 'DE_never',
|
AP_PROVIDE_TEXT_3: 'DE_never',
|
||||||
AP_PREFERRED_CHANNEL: 'DE_Preferred Channel',
|
AP_PREFERRED_CHANNEL: 'DE_Preferred Channel',
|
||||||
AP_HIDE_SSID: 'DE_Hide SSID'
|
AP_HIDE_SSID: 'DE_Hide SSID',
|
||||||
|
NETWORK_SCAN: 'DE_Scan WiFi Networks',
|
||||||
|
IDLE: 'DE_Idle',
|
||||||
|
LOST: 'DE_Lost',
|
||||||
|
SCANNING: 'DE_Scanning',
|
||||||
|
SCAN_AGAIN: 'DE_Scan again',
|
||||||
|
NETWORK_SCANNER: 'DE_Network Scanner',
|
||||||
|
NETWORK_NO_WIFI: 'DE_No WiFi networks found',
|
||||||
|
NETWORK_BLANK_SSID: 'DE_leave blank to disable WiFi',
|
||||||
|
POWER: 'DE_Power',
|
||||||
|
NETWORK_DISABLE_SLEEP: 'DE_Disable WiFi Sleep Mode',
|
||||||
|
NETWORK_LOW_BAND: 'DE_Use Lower WiFi Bandwidth',
|
||||||
|
NETWORK_USE_DNS: 'DE_Enable mDNS Service',
|
||||||
|
NETWORK_ENABLE_IPV6: 'DE_Enable IPv6 support',
|
||||||
|
NETWORK_FIXED_IP: 'DE_Use Fixed IP address',
|
||||||
|
ADMIN: 'DE_Admin',
|
||||||
|
GUEST: 'DE_Guest'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default de;
|
export default de;
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import type { BaseTranslation } from '../i18n-types';
|
|||||||
|
|
||||||
const en: BaseTranslation = {
|
const en: BaseTranslation = {
|
||||||
LANGUAGE: 'Language',
|
LANGUAGE: 'Language',
|
||||||
|
RETRY: 'Retry',
|
||||||
|
LOADING: 'Loading',
|
||||||
IS_REQUIRED: 'is required',
|
IS_REQUIRED: 'is required',
|
||||||
SIGN_IN: 'Sign In',
|
SIGN_IN: 'Sign In',
|
||||||
SIGN_OUT: 'Sign Out',
|
SIGN_OUT: 'Sign Out',
|
||||||
@@ -16,7 +18,7 @@ const en: BaseTranslation = {
|
|||||||
UPLOAD_SUCCESSFUL: 'Upload successful',
|
UPLOAD_SUCCESSFUL: 'Upload successful',
|
||||||
DOWNLOAD_SUCCESSFUL: 'Download successful',
|
DOWNLOAD_SUCCESSFUL: 'Download successful',
|
||||||
INVALID_LOGIN: 'Invalid login details',
|
INVALID_LOGIN: 'Invalid login details',
|
||||||
NETWORK_CONNECTION: 'Network Connection',
|
NETWORK: 'Network',
|
||||||
SECURITY: 'Security',
|
SECURITY: 'Security',
|
||||||
ONOFF_CAP: 'ON/OFF',
|
ONOFF_CAP: 'ON/OFF',
|
||||||
ONOFF: 'on/off',
|
ONOFF: 'on/off',
|
||||||
@@ -51,7 +53,6 @@ const en: BaseTranslation = {
|
|||||||
CONNECTED: 'Connected',
|
CONNECTED: 'Connected',
|
||||||
TX_ISSUES: 'Tx issues - try a different Tx Mode',
|
TX_ISSUES: 'Tx issues - try a different Tx Mode',
|
||||||
DISCONNECTED: 'Disconnected',
|
DISCONNECTED: 'Disconnected',
|
||||||
SCANNING: 'Scanning for devices...',
|
|
||||||
EMS_SCAN: 'Are you sure you want to initiate a full device scan of the EMS bus?',
|
EMS_SCAN: 'Are you sure you want to initiate a full device scan of the EMS bus?',
|
||||||
EMS_BUS_STATUS: 'EMS Bus Status',
|
EMS_BUS_STATUS: 'EMS Bus Status',
|
||||||
ACTIVE_DEVICES: 'Active Devices & Sensors',
|
ACTIVE_DEVICES: 'Active Devices & Sensors',
|
||||||
@@ -222,7 +223,23 @@ const en: BaseTranslation = {
|
|||||||
AP_PROVIDE_TEXT_2: 'when WiFi is disconnected',
|
AP_PROVIDE_TEXT_2: 'when WiFi is disconnected',
|
||||||
AP_PROVIDE_TEXT_3: 'never',
|
AP_PROVIDE_TEXT_3: 'never',
|
||||||
AP_PREFERRED_CHANNEL: 'Preferred Channel',
|
AP_PREFERRED_CHANNEL: 'Preferred Channel',
|
||||||
AP_HIDE_SSID: 'Hide SSID'
|
AP_HIDE_SSID: 'Hide SSID',
|
||||||
|
NETWORK_SCAN: 'Scan WiFi Networks',
|
||||||
|
IDLE: 'Idle',
|
||||||
|
LOST: 'Lost',
|
||||||
|
SCANNING: 'Scanning',
|
||||||
|
SCAN_AGAIN: 'Scan again',
|
||||||
|
NETWORK_SCANNER: 'Network Scanner',
|
||||||
|
NETWORK_NO_WIFI: 'No WiFi networks found',
|
||||||
|
NETWORK_BLANK_SSID: 'leave blank to disable WiFi',
|
||||||
|
POWER: 'Power',
|
||||||
|
NETWORK_DISABLE_SLEEP: 'Disable WiFi Sleep Mode',
|
||||||
|
NETWORK_LOW_BAND: 'Use Lower WiFi Bandwidth',
|
||||||
|
NETWORK_USE_DNS: 'Enable mDNS Service',
|
||||||
|
NETWORK_ENABLE_IPV6: 'Enable IPv6 support',
|
||||||
|
NETWORK_FIXED_IP: 'Use Fixed IP address',
|
||||||
|
ADMIN: 'Admin',
|
||||||
|
GUEST: 'Guest'
|
||||||
};
|
};
|
||||||
|
|
||||||
export default en;
|
export default en;
|
||||||
|
|||||||
@@ -18,6 +18,14 @@ type RootTranslation = {
|
|||||||
* Language
|
* Language
|
||||||
*/
|
*/
|
||||||
LANGUAGE: string
|
LANGUAGE: string
|
||||||
|
/**
|
||||||
|
* Retry
|
||||||
|
*/
|
||||||
|
RETRY: string
|
||||||
|
/**
|
||||||
|
* Loading
|
||||||
|
*/
|
||||||
|
LOADING: string
|
||||||
/**
|
/**
|
||||||
* is required
|
* is required
|
||||||
*/
|
*/
|
||||||
@@ -76,9 +84,9 @@ type RootTranslation = {
|
|||||||
*/
|
*/
|
||||||
INVALID_LOGIN: string
|
INVALID_LOGIN: string
|
||||||
/**
|
/**
|
||||||
* Network Connection
|
* Network
|
||||||
*/
|
*/
|
||||||
NETWORK_CONNECTION: string
|
NETWORK: string
|
||||||
/**
|
/**
|
||||||
* Security
|
* Security
|
||||||
*/
|
*/
|
||||||
@@ -214,10 +222,6 @@ type RootTranslation = {
|
|||||||
* Disconnected
|
* Disconnected
|
||||||
*/
|
*/
|
||||||
DISCONNECTED: string
|
DISCONNECTED: string
|
||||||
/**
|
|
||||||
* Scanning for devices...
|
|
||||||
*/
|
|
||||||
SCANNING: string
|
|
||||||
/**
|
/**
|
||||||
* Are you sure you want to initiate a full device scan of the EMS bus?
|
* Are you sure you want to initiate a full device scan of the EMS bus?
|
||||||
*/
|
*/
|
||||||
@@ -883,6 +887,70 @@ type RootTranslation = {
|
|||||||
* Hide SSID
|
* Hide SSID
|
||||||
*/
|
*/
|
||||||
AP_HIDE_SSID: string
|
AP_HIDE_SSID: string
|
||||||
|
/**
|
||||||
|
* Scan WiFi Networks
|
||||||
|
*/
|
||||||
|
NETWORK_SCAN: string
|
||||||
|
/**
|
||||||
|
* Idle
|
||||||
|
*/
|
||||||
|
IDLE: string
|
||||||
|
/**
|
||||||
|
* Lost
|
||||||
|
*/
|
||||||
|
LOST: string
|
||||||
|
/**
|
||||||
|
* Scanning
|
||||||
|
*/
|
||||||
|
SCANNING: string
|
||||||
|
/**
|
||||||
|
* Scan again
|
||||||
|
*/
|
||||||
|
SCAN_AGAIN: string
|
||||||
|
/**
|
||||||
|
* Network Scanner
|
||||||
|
*/
|
||||||
|
NETWORK_SCANNER: string
|
||||||
|
/**
|
||||||
|
* No WiFi networks found
|
||||||
|
*/
|
||||||
|
NETWORK_NO_WIFI: string
|
||||||
|
/**
|
||||||
|
* leave blank to disable WiFi
|
||||||
|
*/
|
||||||
|
NETWORK_BLANK_SSID: string
|
||||||
|
/**
|
||||||
|
* Power
|
||||||
|
*/
|
||||||
|
POWER: string
|
||||||
|
/**
|
||||||
|
* Disable WiFi Sleep Mode
|
||||||
|
*/
|
||||||
|
NETWORK_DISABLE_SLEEP: string
|
||||||
|
/**
|
||||||
|
* Use Lower WiFi Bandwidth
|
||||||
|
*/
|
||||||
|
NETWORK_LOW_BAND: string
|
||||||
|
/**
|
||||||
|
* Enable mDNS Service
|
||||||
|
*/
|
||||||
|
NETWORK_USE_DNS: string
|
||||||
|
/**
|
||||||
|
* Enable IPv6 support
|
||||||
|
*/
|
||||||
|
NETWORK_ENABLE_IPV6: string
|
||||||
|
/**
|
||||||
|
* Use Fixed IP address
|
||||||
|
*/
|
||||||
|
NETWORK_FIXED_IP: string
|
||||||
|
/**
|
||||||
|
* Admin
|
||||||
|
*/
|
||||||
|
ADMIN: string
|
||||||
|
/**
|
||||||
|
* Guest
|
||||||
|
*/
|
||||||
|
GUEST: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export type TranslationFunctions = {
|
export type TranslationFunctions = {
|
||||||
@@ -890,6 +958,14 @@ export type TranslationFunctions = {
|
|||||||
* Language
|
* Language
|
||||||
*/
|
*/
|
||||||
LANGUAGE: () => LocalizedString
|
LANGUAGE: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Retry
|
||||||
|
*/
|
||||||
|
RETRY: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Loading
|
||||||
|
*/
|
||||||
|
LOADING: () => LocalizedString
|
||||||
/**
|
/**
|
||||||
* is required
|
* is required
|
||||||
*/
|
*/
|
||||||
@@ -947,9 +1023,9 @@ export type TranslationFunctions = {
|
|||||||
*/
|
*/
|
||||||
INVALID_LOGIN: () => LocalizedString
|
INVALID_LOGIN: () => LocalizedString
|
||||||
/**
|
/**
|
||||||
* Network Connection
|
* Network
|
||||||
*/
|
*/
|
||||||
NETWORK_CONNECTION: () => LocalizedString
|
NETWORK: () => LocalizedString
|
||||||
/**
|
/**
|
||||||
* Security
|
* Security
|
||||||
*/
|
*/
|
||||||
@@ -1082,10 +1158,6 @@ export type TranslationFunctions = {
|
|||||||
* Disconnected
|
* Disconnected
|
||||||
*/
|
*/
|
||||||
DISCONNECTED: () => LocalizedString
|
DISCONNECTED: () => LocalizedString
|
||||||
/**
|
|
||||||
* Scanning for devices...
|
|
||||||
*/
|
|
||||||
SCANNING: () => LocalizedString
|
|
||||||
/**
|
/**
|
||||||
* Are you sure you want to initiate a full device scan of the EMS bus?
|
* Are you sure you want to initiate a full device scan of the EMS bus?
|
||||||
*/
|
*/
|
||||||
@@ -1744,6 +1816,70 @@ export type TranslationFunctions = {
|
|||||||
* Hide SSID
|
* Hide SSID
|
||||||
*/
|
*/
|
||||||
AP_HIDE_SSID: () => LocalizedString
|
AP_HIDE_SSID: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Scan WiFi Networks
|
||||||
|
*/
|
||||||
|
NETWORK_SCAN: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Idle
|
||||||
|
*/
|
||||||
|
IDLE: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Lost
|
||||||
|
*/
|
||||||
|
LOST: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Scanning
|
||||||
|
*/
|
||||||
|
SCANNING: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Scan again
|
||||||
|
*/
|
||||||
|
SCAN_AGAIN: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Network Scanner
|
||||||
|
*/
|
||||||
|
NETWORK_SCANNER: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* No WiFi networks found
|
||||||
|
*/
|
||||||
|
NETWORK_NO_WIFI: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* leave blank to disable WiFi
|
||||||
|
*/
|
||||||
|
NETWORK_BLANK_SSID: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Power
|
||||||
|
*/
|
||||||
|
POWER: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Disable WiFi Sleep Mode
|
||||||
|
*/
|
||||||
|
NETWORK_DISABLE_SLEEP: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Use Lower WiFi Bandwidth
|
||||||
|
*/
|
||||||
|
NETWORK_LOW_BAND: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Enable mDNS Service
|
||||||
|
*/
|
||||||
|
NETWORK_USE_DNS: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Enable IPv6 support
|
||||||
|
*/
|
||||||
|
NETWORK_ENABLE_IPV6: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Use Fixed IP address
|
||||||
|
*/
|
||||||
|
NETWORK_FIXED_IP: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Admin
|
||||||
|
*/
|
||||||
|
ADMIN: () => LocalizedString
|
||||||
|
/**
|
||||||
|
* Guest
|
||||||
|
*/
|
||||||
|
GUEST: () => LocalizedString
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Formatters = {}
|
export type Formatters = {}
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ const DashboardStatus: FC = () => {
|
|||||||
const scan = async () => {
|
const scan = async () => {
|
||||||
try {
|
try {
|
||||||
await EMSESP.scanDevices();
|
await EMSESP.scanDevices();
|
||||||
enqueueSnackbar(LL.SCANNING(), { variant: 'info' });
|
enqueueSnackbar(LL.SCANNING() + '...', { variant: 'info' });
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' });
|
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' });
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
Reference in New Issue
Block a user