80 строки
3.0 KiB
JavaScript
80 строки
3.0 KiB
JavaScript
const form = document.querySelector('#registerForm');
|
|
const result = document.querySelector('#registerResult');
|
|
const statsGrid = document.querySelector('#statsGrid');
|
|
const eventList = document.querySelector('#eventList');
|
|
const refreshStats = document.querySelector('#refreshStats');
|
|
|
|
function renderStats(data) {
|
|
const counters = data.counters || {};
|
|
const service = data.service || {};
|
|
statsGrid.innerHTML = `
|
|
<div class="stat-card"><span>Сервис</span><strong>${service.active || 'unknown'}</strong></div>
|
|
<div class="stat-card"><span>Активные</span><strong>${counters.users_active ?? 0}</strong></div>
|
|
<div class="stat-card"><span>Пользователи</span><strong>${counters.users_total ?? 0}</strong></div>
|
|
<div class="stat-card"><span>Ожидают оплату</span><strong>${counters.payments_pending ?? 0}</strong></div>
|
|
`;
|
|
|
|
const events = data.latest_events || [];
|
|
if (events.length === 0) {
|
|
eventList.innerHTML = '<div class="event-row muted-text">Пока нет событий в логе или лог недоступен.</div>';
|
|
return;
|
|
}
|
|
|
|
eventList.innerHTML = events.map((event) => `
|
|
<div class="event-row">
|
|
<span>${event.time || 'без времени'}</span>
|
|
<strong>${event.callsign || 'XLX'}</strong>
|
|
<p>${event.message}</p>
|
|
</div>
|
|
`).join('');
|
|
}
|
|
|
|
async function loadStats() {
|
|
try {
|
|
const response = await fetch('/api/dashboard/stats');
|
|
const payload = await response.json();
|
|
if (!payload.ok) {
|
|
throw new Error(payload.error || 'Ошибка загрузки статистики');
|
|
}
|
|
renderStats(payload.data);
|
|
} catch (error) {
|
|
eventList.innerHTML = `<div class="event-row muted-text">${error.message}</div>`;
|
|
}
|
|
}
|
|
|
|
refreshStats?.addEventListener('click', loadStats);
|
|
loadStats();
|
|
|
|
form?.addEventListener('submit', async (event) => {
|
|
event.preventDefault();
|
|
result.textContent = 'Отправляем заявку...';
|
|
|
|
const data = Object.fromEntries(new FormData(form).entries());
|
|
const response = await fetch('/api/register', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(data),
|
|
});
|
|
const payload = await response.json();
|
|
|
|
if (!payload.ok) {
|
|
result.textContent = payload.error || 'Ошибка регистрации';
|
|
return;
|
|
}
|
|
|
|
const payment = payload.data.payment || {};
|
|
const lines = [
|
|
`Заявка создана: ${payload.data.callsign}`,
|
|
`Статус: ${payload.data.status}`,
|
|
];
|
|
if (payment.confirmation_url) {
|
|
lines.push(`YooKassa: ${payment.confirmation_url}`);
|
|
}
|
|
if (payment.manual_transfer?.instructions) {
|
|
lines.push(`Перевод по чеку: ${payment.manual_transfer.instructions}`);
|
|
lines.push(`ID платежа для чека: ${payment.id}`);
|
|
}
|
|
|
|
result.textContent = lines.join('\n');
|
|
});
|