пинг при загрузке и disable конфига

This commit is contained in:
Илья Братских 2026-06-24 08:59:55 +03:00 committed by KBAHTNET
parent e4d289b9a3
commit 846df4fd0b

View File

@ -20,6 +20,7 @@
--shadow: 0 20px 60px rgba(0, 0, 0, 0.36); --shadow: 0 20px 60px rgba(0, 0, 0, 0.36);
--upload: #a78bfa; --upload: #a78bfa;
--warning: #f59e0b; --warning: #f59e0b;
--danger: #ef4444;
} }
[data-theme="light"] { [data-theme="light"] {
@ -194,6 +195,17 @@
box-shadow: 0 14px 34px var(--accent-soft); box-shadow: 0 14px 34px var(--accent-soft);
} }
.server-card:disabled {
cursor: not-allowed;
opacity: 0.62;
transform: none;
box-shadow: var(--shadow);
}
.server-card:disabled:hover {
border-color: var(--border);
}
.flag { .flag {
display: grid; display: grid;
place-items: center; place-items: center;
@ -245,6 +257,11 @@
white-space: nowrap; white-space: nowrap;
} }
.ping.is-offline {
color: var(--danger);
font-weight: 800;
}
.pill { .pill {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
@ -729,13 +746,20 @@
elements.serverGrid.innerHTML = ""; elements.serverGrid.innerHTML = "";
servers.forEach((server) => { servers.forEach((server) => {
const ping = pingResults.get(server.id);
const isCheckingPing = !pingResults.has(server.id);
const isOffline = ping === null;
const button = document.createElement("button"); const button = document.createElement("button");
button.type = "button"; button.type = "button";
button.disabled = isOffline;
button.className = `server-card${server.id === selectedServerId ? " is-selected" : ""}`; button.className = `server-card${server.id === selectedServerId ? " is-selected" : ""}`;
button.addEventListener("click", () => selectServer(server.id)); button.addEventListener("click", () => selectServer(server.id));
const ping = pingResults.get(server.id); const pingText = isCheckingPing
const pingText = ping == null ? "пинг: --" : `пинг: ${Math.round(ping)} мс`; ? "проверка..."
: isOffline
? "нет ответа"
: `пинг: ${Math.round(ping)} мс`;
const flagContent = server.flagUrl const flagContent = server.flagUrl
? `<img src="${server.flagUrl}" alt="Флаг ${server.country}" loading="lazy" onerror="this.remove()" />` ? `<img src="${server.flagUrl}" alt="Флаг ${server.country}" loading="lazy" onerror="this.remove()" />`
: (server.countryCode || "--").toUpperCase(); : (server.countryCode || "--").toUpperCase();
@ -746,7 +770,7 @@
<span class="server-name">${escapeHtml(server.name)}</span> <span class="server-name">${escapeHtml(server.name)}</span>
<span class="server-meta">${escapeHtml(server.country)} · ${escapeHtml(server.address)}</span> <span class="server-meta">${escapeHtml(server.country)} · ${escapeHtml(server.address)}</span>
</span> </span>
<span class="ping">${pingText}</span> <span class="ping${isOffline ? " is-offline" : ""}">${pingText}</span>
`; `;
elements.serverGrid.appendChild(button); elements.serverGrid.appendChild(button);
@ -766,6 +790,8 @@
} }
function selectServer(serverId) { function selectServer(serverId) {
if (pingResults.get(serverId) === null) return;
selectedServerId = serverId; selectedServerId = serverId;
localStorage.setItem("selected-server-id", serverId); localStorage.setItem("selected-server-id", serverId);
renderServers(); renderServers();
@ -778,9 +804,19 @@
function updateSelectedServerText() { function updateSelectedServerText() {
const server = getSelectedServer(); const server = getSelectedServer();
elements.targetServerText.textContent = server if (!server) {
? `Тест будет запущен через ${server.name} (${server.country}).` elements.targetServerText.textContent = "Выберите сервер для теста.";
: "Выберите сервер для теста."; return;
}
if (pingResults.get(server.id) === null) {
elements.targetServerText.textContent =
`${server.name} не отвечает. Выберите другой сервер.`;
return;
}
elements.targetServerText.textContent =
`Тест будет запущен через ${server.name} (${server.country}).`;
} }
async function refreshAllPings() { async function refreshAllPings() {
@ -794,9 +830,27 @@
renderServers(); renderServers();
}), }),
); );
ensureSelectableServer();
renderServers();
updateSelectedServerText();
elements.refreshPingBtn.disabled = false; elements.refreshPingBtn.disabled = false;
} }
function ensureSelectableServer() {
if (selectedServerId && pingResults.get(selectedServerId) !== null) {
return;
}
const firstOnlineServer = servers.find((server) => pingResults.get(server.id) !== null);
selectedServerId = firstOnlineServer?.id || null;
if (selectedServerId) {
localStorage.setItem("selected-server-id", selectedServerId);
} else {
localStorage.removeItem("selected-server-id");
}
}
async function measurePing(server) { async function measurePing(server) {
const attempts = 3; const attempts = 3;
const values = []; const values = [];
@ -1153,6 +1207,12 @@
return; return;
} }
if (pingResults.get(server.id) === null) {
elements.serverStatus.textContent =
"Выбранный сервер не отвечает. Запуск теста отключен.";
return;
}
elements.startBtn.disabled = true; elements.startBtn.disabled = true;
resetMetrics(); resetMetrics();