import { useContext, useEffect, useState } from 'react'; import type { FC } from 'react'; import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; import DeleteIcon from '@mui/icons-material/Delete'; import LockIcon from '@mui/icons-material/Lock'; import LockOpenIcon from '@mui/icons-material/LockOpen'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; import WarningIcon from '@mui/icons-material/Warning'; import { Avatar, Button, Checkbox, IconButton, List, ListItem, ListItemAvatar, ListItemSecondaryAction, ListItemText, MenuItem, TextField, Typography } from '@mui/material'; import * as NetworkApi from 'api/network'; import * as SystemApi from 'api/system'; import { updateState, useRequest } from 'alova'; import type { ValidateFieldsError } from 'async-validator'; import { BlockFormControlLabel, BlockNavigation, ButtonRow, FormLoader, MessageBox, SectionContent, ValidatedPasswordField, ValidatedTextField } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { NetworkSettingsType } from 'types'; import { updateValueDirty, useRest } from 'utils'; import { validate } from 'validators'; import { createNetworkSettingsValidator } from 'validators/network'; import RestartMonitor from '../system/RestartMonitor'; import { WiFiConnectionContext } from './WiFiConnectionContext'; import { isNetworkOpen, networkSecurityMode } from './WiFiNetworkSelector'; const NetworkSettings: FC = () => { const { LL } = useI18nContext(); const { selectedNetwork, deselectNetwork } = useContext(WiFiConnectionContext); const [initialized, setInitialized] = useState(false); const [restarting, setRestarting] = useState(false); const { loadData, saving, data, updateDataValue, origData, dirtyFlags, setDirtyFlags, blocker, saveData, errorMessage, restartNeeded } = useRest({ read: NetworkApi.readNetworkSettings, update: NetworkApi.updateNetworkSettings }); const { send: restartCommand } = useRequest(SystemApi.restart(), { immediate: false }); useEffect(() => { if (!initialized && data) { if (selectedNetwork) { updateState('networkSettings', (current_data: NetworkSettingsType) => ({ ssid: selectedNetwork.ssid, bssid: selectedNetwork.bssid, password: current_data ? current_data.password : '', hostname: current_data?.hostname, static_ip_config: false, bandwidth20: false, tx_power: 0, nosleep: false, enableMDNS: true, enableCORS: false, CORSOrigin: '*' })); } setInitialized(true); } }, [initialized, setInitialized, data, selectedNetwork]); const updateFormValue = updateValueDirty( origData, dirtyFlags, setDirtyFlags, updateDataValue ); const [fieldErrors, setFieldErrors] = useState(); useEffect(() => deselectNetwork, [deselectNetwork]); const content = () => { if (!data) { return ; } const validateAndSubmit = async () => { try { setFieldErrors(undefined); await validate(createNetworkSettingsValidator(data), data); await saveData(); } catch (error) { setFieldErrors(error as ValidateFieldsError); } deselectNetwork(); }; const setCancel = async () => { deselectNetwork(); await loadData(); }; const restart = async () => { await restartCommand().catch((error: Error) => { toast.error(error.message); }); setRestarting(true); }; return ( <> WiFi {selectedNetwork ? ( {isNetworkOpen(selectedNetwork) ? : } ) : ( )} {(!selectedNetwork || !isNetworkOpen(selectedNetwork)) && ( )} Auto 19.5 dBm 19 dBm 18.5 dBm 17 dBm 15 dBm 13 dBm 11 dBm 8.5 dBm 7 dBm 5 dBm 2 dBm } label={LL.NETWORK_DISABLE_SLEEP()} /> } label={LL.NETWORK_LOW_BAND()} /> {LL.GENERAL_OPTIONS()} } label={LL.NETWORK_USE_DNS()} /> } label={LL.NETWORK_ENABLE_CORS()} /> {data.enableCORS && ( )} } label={LL.NETWORK_FIXED_IP()} /> {data.static_ip_config && ( <> )} {restartNeeded && ( )} {!restartNeeded && (selectedNetwork || (dirtyFlags && dirtyFlags.length !== 0)) && ( )} ); }; return ( {blocker ? : null} {restarting ? : content()} ); }; export default NetworkSettings;