{/* hint when live but backend unreachable */}
{mode === "live" && backendStatus === false && (
Сервер недоступен. Последние полученные данные сохраняются; новые запросы могут завершаться ошибкой.
)}
Русский
{([["light","Светлая"],["dark","Тёмная"],["system","Авто"]] as const).map(([value,label]) => )}
Периоды сбора данных и параметры диагностики настраиваются в соответствующих разделах.
Сбор данныхДиагностика
Открыть оптимизатор
)
if (section === "EvoBGP") return
if (section === "Уведомления") return Открыть оповещения
if (section === "API-ключи") return
Создание и управление отдельными API-ключами в приложении пока недоступны.
return
Состояние MFA, ограничений IP и настроек аудита в этом разделе не получено. Изменение этих параметров здесь недоступно.
Управление пользователями
}
return (
{/* nav */}
{/* content */}
{renderContent()}
)
}
function BackendUrlField(){
const {backendUrl,setBackendUrl,backendUrlLocked}=useDataSource()
const [draft,setDraft]=useState(backendUrl),[error,setError]=useState(null)
function commit(){
if(backendUrlLocked||draft===backendUrl)return
try{const url=new URL(draft.trim());if(!["http:","https:"].includes(url.protocol)||url.username||url.password||url.search||url.hash)throw Error();setBackendUrl(url.toString().replace(/\/$/,""));setError(null)}
catch{setError("Укажите HTTP(S) адрес без учётных данных и параметров")}
}
return