import { useEffect, useState } from 'react'; import { ConfirmDialog } from '../shared/ui/ConfirmDialog.jsx'; import { createTenant, deleteTenant, fetchDatabaseStatus, fetchTenants, normalizeDomain, testTenantConnection, validateTenantFields } from './settings-service.js'; export function DatabaseTab() { const [status, setStatus] = useState(null); const [statusError, setStatusError] = useState(false); const [tenants, setTenants] = useState(null); const [tenantsError, setTenantsError] = useState(false); const [form, setForm] = useState({ domain: '', name: '', password: '', url: '', username: '' }); const [alert, setAlert] = useState({ text: '', isError: false }); const [testing, setTesting] = useState(false); const [deleting, setDeleting] = useState(null); useEffect(() => { let active = true; (async () => { const [statusResult, tenantsResult] = await Promise.allSettled([ fetchDatabaseStatus(), fetchTenants() ]); if (!active) return; if (statusResult.status === 'fulfilled') { setStatus(statusResult.value); } else { setStatusError(true); } if (tenantsResult.status === 'fulfilled') { setTenants(tenantsResult.value); } else { setTenantsError(true); } })(); return () => { active = false; }; }, []); async function reload() { const [statusResult, tenantsResult] = await Promise.allSettled([ fetchDatabaseStatus(), fetchTenants() ]); if (statusResult.status === 'fulfilled') { setStatus(statusResult.value); setStatusError(false); } else { setStatusError(true); } if (tenantsResult.status === 'fulfilled') { setTenants(tenantsResult.value); setTenantsError(false); } else { setTenantsError(true); } } function updateField(field, value) { setForm(current => ({ ...current, [field]: value })); } async function testConnection() { setAlert({ text: '', isError: false }); if (!form.url.trim()) { setAlert({ text: 'Введите JDBC URL', isError: true }); return; } setTesting(true); try { const result = await testTenantConnection({ password: form.password, url: form.url.trim(), username: form.username.trim() }); if (result && result.success) { setAlert({ text: '✓ Подключение успешно!', isError: false }); } else { setAlert({ text: `✗ ${(result && result.message) || 'Подключение не выполнено'}`, isError: true }); } } catch { setAlert({ text: 'Не удалось проверить подключение', isError: true }); } finally { setTesting(false); } } async function submit(event) { event.preventDefault(); setAlert({ text: '', isError: false }); const payload = { domain: normalizeDomain(form.domain), name: form.name.trim(), url: form.url.trim(), username: form.username.trim(), password: form.password }; const validation = validateTenantFields(payload); if (validation) { setAlert({ text: validation, isError: true }); return; } try { const result = await createTenant(payload); if (result && result.success) { setAlert({ text: `Тенант «${payload.domain}» добавлен`, isError: false }); setForm({ domain: '', name: '', password: '', url: '', username: '' }); await reload(); } else { setAlert({ text: (result && result.message) || 'Не удалось добавить тенант', isError: true }); } } catch { setAlert({ text: 'Не удалось добавить тенант', isError: true }); } } async function confirmDelete() { const tenant = deleting; setDeleting(null); try { await deleteTenant(tenant.domain); await reload(); } catch (error) { setAlert({ text: error.message || 'Не удалось удалить тенант', isError: true }); } } return ( <>

Текущее подключение

{statusError ? (
Не удалось загрузить статус подключения
) : status === null ? (
Загрузка...
) : (
Тенант: {status.tenant || '—'}
Название: {status.name || '—'}
Статус: {status.connected ? 'Доступно' : 'Недоступно'}
{status.url && (
URL: {status.url}
)}
)}

Подключённые университеты

{tenantsError ? ( ) : tenants === null ? ( ) : tenants.length === 0 ? ( ) : tenants.map(tenant => ( ))}
Название Домен JDBC URL Пользователь Статус Действия
Не удалось загрузить список тенантов
Загрузка...
Нет подключённых тенантов
{tenant.name || '—'} {tenant.domain} {tenant.url} {tenant.username || '—'} {tenant.connected ? 'Доступно' : 'Недоступно'}

Добавить подключение

updateField('name', event.target.value)} />
updateField('domain', event.target.value)} />
updateField('url', event.target.value)} />
updateField('username', event.target.value)} />
updateField('password', event.target.value)} />
{alert.text}
{deleting && ( setDeleting(null)} onConfirm={() => void confirmDelete()} /> )} ); }