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