diff --git a/ostp-control/src/App.tsx b/ostp-control/src/App.tsx index eaa3746..e606f8b 100644 --- a/ostp-control/src/App.tsx +++ b/ostp-control/src/App.tsx @@ -1,6 +1,7 @@ import { HashRouter as Router, Routes, Route, Link, Navigate, useLocation } from 'react-router-dom'; import { Activity, Users, Settings, Shield, MoreVertical, RefreshCw, BookOpen, Wrench, History, Globe, LogOut } from 'lucide-react'; -import { useState, useEffect, ReactNode } from 'react'; +import { useState, useEffect } from 'react'; +import type { ReactNode } from 'react'; // Components import Dashboard from './pages/Dashboard'; diff --git a/ostp-control/src/lib/api.ts b/ostp-control/src/lib/api.ts index bc4160f..9c1d10b 100644 --- a/ostp-control/src/lib/api.ts +++ b/ostp-control/src/lib/api.ts @@ -21,8 +21,6 @@ export interface ApiResponse { error?: string; } -// Helpers for localStorage state -const API_URL_KEY = 'ostp_api_url'; const API_TOKEN_KEY = 'ostp_api_token'; export function getApiSettings() { diff --git a/ostp-control/src/pages/ConnectionSetup.tsx b/ostp-control/src/pages/ConnectionSetup.tsx deleted file mode 100644 index c6c277d..0000000 --- a/ostp-control/src/pages/ConnectionSetup.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import React, { useState } from 'react'; -import { Shield, Globe, Key, CheckCircle, XCircle, RefreshCw, ChevronRight } from 'lucide-react'; -import { saveApiSettings, api } from '../lib/api'; -import { useLanguage } from '../lib/LanguageContext'; -import { addAuditLog } from '../lib/audit'; - -interface ConnectionSetupProps { - onSetupComplete: () => void; -} - -export default function ConnectionSetup({ onSetupComplete }: ConnectionSetupProps) { - const { t, language } = useLanguage(); - - const [apiUrl, setApiUrl] = useState('http://localhost:9090'); - const [apiToken, setApiToken] = useState(''); - const [isTesting, setIsTesting] = useState(false); - const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null); - - const handleTestAndSave = async (e: React.FormEvent) => { - e.preventDefault(); - if (!apiUrl) return; - - setIsTesting(true); - setTestResult(null); - - const formattedUrl = apiUrl.trim().replace(/\/$/, ''); - const formattedToken = apiToken.trim(); - - const oldUrl = localStorage.getItem('ostp_api_url'); - const oldToken = localStorage.getItem('ostp_api_token'); - - try { - saveApiSettings(formattedUrl, formattedToken); - const status = await api.getServerStatus(); - - setTestResult({ - success: true, - message: language === 'ru' - ? `Успешно подключено! Версия сервера: v${status.version}, активных сессий: ${status.active_users}` - : `Successfully connected! Server version: v${status.version}, active sessions: ${status.active_users}`, - }); - - addAuditLog( - `Initial setup connected to API at ${formattedUrl} (Version: v${status.version})`, - `Первоначальная настройка успешно подключена к API по адресу ${formattedUrl} (Версия: v${status.version})`, - true - ); - - setTimeout(() => { - onSetupComplete(); - }, 1000); - } catch (err: any) { - if (oldUrl) localStorage.setItem('ostp_api_url', oldUrl); - else localStorage.removeItem('ostp_api_url'); - if (oldToken !== null) localStorage.setItem('ostp_api_token', oldToken); - else localStorage.removeItem('ostp_api_token'); - - const errorMsgStr = err.message || err; - setTestResult({ - success: false, - message: `${t('conn_setup_error')}${errorMsgStr}`, - }); - - addAuditLog( - `Initial setup failed to connect to ${formattedUrl}: ${errorMsgStr}`, - `Первоначальная настройка не смогла подключиться к ${formattedUrl}: ${errorMsgStr}`, - false - ); - } finally { - setIsTesting(false); - } - }; - - return ( -
- {/* Background blobs */} -
-
- -
-
-
- -
-

OSTPCORE

-

{t('conn_setup_sub')}

-
- -
-

{t('conn_setup_header')}

-

- {t('conn_setup_desc')} -

-
- -
-
- - setApiUrl(e.target.value)} - /> -
- -
- - setApiToken(e.target.value)} - /> -
- - -
- - {testResult && ( -
- {testResult.success ? ( - - ) : ( - - )} -
-

{testResult.success ? t('conn_setup_success') : 'Connection Error'}

-

{testResult.message}

-
-
- )} -
-
- ); -} diff --git a/ostp-control/src/pages/Settings.tsx b/ostp-control/src/pages/Settings.tsx index 7c44747..bd5ce90 100644 --- a/ostp-control/src/pages/Settings.tsx +++ b/ostp-control/src/pages/Settings.tsx @@ -1,23 +1,17 @@ import { useState, useEffect } from 'react'; import { - Settings as SettingsIcon, Globe, Key, CheckCircle, XCircle, + Settings as SettingsIcon, Globe, CheckCircle, XCircle, RefreshCw, Save, Sliders, Code2, AlertTriangle } from 'lucide-react'; -import { getApiSettings, saveApiSettings, api } from '../lib/api'; +import { api } from '../lib/api'; import { useLanguage } from '../lib/LanguageContext'; import { addAuditLog } from '../lib/audit'; export default function Settings() { const { t, language } = useLanguage(); - // Tabs: 'connection' | 'interactive' | 'raw' - const [activeTab, setActiveTab] = useState<'connection' | 'interactive' | 'raw'>('interactive'); - - // Connection settings state - const [panelApiUrl, setPanelApiUrl] = useState(''); - const [panelApiToken, setPanelApiToken] = useState(''); - const [isTestingConnection, setIsTestingConnection] = useState(false); - const [connectionTestResult, setConnectionTestResult] = useState<{ success: boolean; message: string } | null>(null); + // Tabs: 'interactive' | 'raw' + const [activeTab, setActiveTab] = useState<'interactive' | 'raw'>('interactive'); // Full Server Config JSON state const [config, setConfig] = useState(null); @@ -28,9 +22,6 @@ export default function Settings() { // Initial load useEffect(() => { - const { url, token } = getApiSettings(); - setPanelApiUrl(url); - setPanelApiToken(token); fetchServerConfig(); }, []); @@ -50,53 +41,7 @@ export default function Settings() { } }; - const handleTestConnection = async () => { - setIsTestingConnection(true); - setConnectionTestResult(null); - const oldUrl = localStorage.getItem('ostp_api_url'); - const oldToken = localStorage.getItem('ostp_api_token'); - - try { - saveApiSettings(panelApiUrl, panelApiToken); - const status = await api.getServerStatus(); - setConnectionTestResult({ - success: true, - message: t('st_conn_success', { version: status.version, users: status.active_users }), - }); - addAuditLog( - `Tested connection to Management API at ${panelApiUrl} (Success)`, - `Успешно протестировано подключение к API по адресу ${panelApiUrl}`, - true - ); - } catch (err: any) { - if (oldUrl) localStorage.setItem('ostp_api_url', oldUrl); - if (oldToken !== null) localStorage.setItem('ostp_api_token', oldToken); - - const errorMsgStr = err.message || err; - setConnectionTestResult({ - success: false, - message: t('st_conn_error', { error: errorMsgStr }), - }); - addAuditLog( - `Tested connection to Management API at ${panelApiUrl} (Failed: ${errorMsgStr})`, - `Ошибка при тесте подключения к API по адресу ${panelApiUrl} (${errorMsgStr})`, - false - ); - } finally { - setIsTestingConnection(false); - } - }; - const handleSaveConnection = () => { - saveApiSettings(panelApiUrl, panelApiToken); - alert(language === 'ru' ? 'Настройки подключения сохранены!' : 'Connection settings saved!'); - addAuditLog( - `Saved API connection settings: ${panelApiUrl}`, - `Сохранены настройки подключения к API: ${panelApiUrl}`, - true - ); - window.location.reload(); - }; // Save Config to Server const handleSaveConfig = async (configToSave: any) => { @@ -205,14 +150,6 @@ export default function Settings() { > {t('st_tab_json')} - {/* Global save notifications */} @@ -235,75 +172,7 @@ export default function Settings() { )} - {/* ── TAB: CONNECTION SETTINGS ── */} - {activeTab === 'connection' && ( -
-
-

{t('st_conn_title')}

-

- {t('st_conn_desc')} -

-
-
-
- - setPanelApiUrl(e.target.value)} - /> -
- -
- - setPanelApiToken(e.target.value)} - /> -
-
- -
- - - -
- - {connectionTestResult && ( -
- {connectionTestResult.success ? : } -
-

{connectionTestResult.success ? 'Success' : 'Failed'}

-

{connectionTestResult.message}

-
-
- )} -
- )} {/* ── TAB: RAW JSON EDITOR ── */} {activeTab === 'raw' && config && (