import { useCallback, useMemo, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import WarningIcon from '@mui/icons-material/Warning'; import { Button, Checkbox, MenuItem } from '@mui/material'; import * as APApi from 'api/ap'; import type { ValidateFieldsError } from 'async-validator'; import { BlockFormControlLabel, BlockNavigation, ButtonRow, FormLoader, SectionContent, ValidatedPasswordField, ValidatedTextField, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { APSettingsType } from 'types'; import { APProvisionMode } from 'types'; import { numberValue, updateValueDirty, useRest } from 'utils'; import { createAPSettingsValidator, validate } from 'validators'; export const isAPEnabled = ({ provision_mode }: APSettingsType) => provision_mode === APProvisionMode.AP_MODE_ALWAYS || provision_mode === APProvisionMode.AP_MODE_DISCONNECTED; // Efficient range function without recursion const createRange = (start: number, end: number): number[] => { const result: number[] = []; for (let i = start; i <= end; i++) { result.push(i); } return result; }; // Pre-computed ranges for better performance const CHANNEL_RANGE = createRange(1, 14); const MAX_CLIENTS_RANGE = createRange(1, 9); const APSettings = () => { const { loadData, saving, data, updateDataValue, origData, dirtyFlags, setDirtyFlags, blocker, saveData, errorMessage } = useRest({ read: APApi.readAPSettings, update: APApi.updateAPSettings }); const { LL } = useI18nContext(); useLayoutTitle(LL.ACCESS_POINT(0)); const [fieldErrors, setFieldErrors] = useState(); const updateFormValue = useMemo( () => updateValueDirty( origData as unknown as Record, dirtyFlags, setDirtyFlags, updateDataValue as (value: unknown) => void ), [origData, dirtyFlags, setDirtyFlags, updateDataValue] ); // Memoize AP enabled state const apEnabled = useMemo(() => (data ? isAPEnabled(data) : false), [data]); // Memoize validation and submit handler const validateAndSubmit = useCallback(async () => { if (!data) return; try { setFieldErrors(undefined); await validate(createAPSettingsValidator(data), data); await saveData(); } catch (error) { setFieldErrors(error as ValidateFieldsError); } }, [data, saveData]); const content = () => { if (!data) { return ; } return ( <> {LL.AP_PROVIDE_TEXT_1()} {LL.AP_PROVIDE_TEXT_2()} {LL.AP_PROVIDE_TEXT_3()} {apEnabled && ( <> {CHANNEL_RANGE.map((i) => ( {i} ))} } label={LL.AP_HIDE_SSID()} /> {MAX_CLIENTS_RANGE.map((i) => ( {i} ))} )} {dirtyFlags && dirtyFlags.length !== 0 && ( )} ); }; return ( {blocker ? : null} {content()} ); }; export default APSettings;