Files
bytegeist-toolbox/public/app.js
T
2026-07-23 00:54:01 -04:00

76 lines
2.6 KiB
JavaScript

// Get references to the page elements we need to update.
const form = document.getElementById("uptime-form");
const urlInput = document.getElementById("url-input");
const checkButton = document.getElementById("check-button");
const statusMessage = document.getElementById("status-message");
const resultPanel = document.getElementById("result-panel");
const onlineBadge = document.getElementById("online-badge");
const statusCode = document.getElementById("status-code");
const responseTime = document.getElementById("response-time");
const redirectCount = document.getElementById("redirect-count");
const checkedAt = document.getElementById("checked-at");
const finalUrl = document.getElementById("final-url");
// Listen for the form submission.
form.addEventListener("submit", async (event) => {
// Prevent the browser from reloading the page.
event.preventDefault();
const url = urlInput.value.trim();
// Reset the interface before starting a new check.
statusMessage.textContent = "Checking website...";
statusMessage.className = "status-message";
resultPanel.hidden = true;
checkButton.disabled = true;
checkButton.textContent = "Checking...";
try {
const response = await fetch("/api/uptime", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ url }),
});
const result = await response.json();
// Handle API-level errors.
if (!response.ok) {
throw new Error(result.error || "The request failed.");
}
// Handle unreachable or blocked destinations.
if (!result.online) {
throw new Error(result.error || "The website could not be reached.");
}
// Fill in the successful result.
onlineBadge.textContent = "Online";
onlineBadge.className = "status-badge online";
statusCode.textContent = result.statusCode;
responseTime.textContent = `${result.responseTimeMs} ms`;
redirectCount.textContent = result.redirectCount;
checkedAt.textContent = new Date(result.checkedAt).toLocaleString();
finalUrl.textContent = result.finalUrl;
finalUrl.href = result.finalUrl;
statusMessage.textContent = "Website check completed.";
resultPanel.hidden = false;
} catch (error) {
// Show a safe, readable message to the user.
statusMessage.textContent = error.message;
statusMessage.className = "status-message error";
onlineBadge.textContent = "Offline";
onlineBadge.className = "status-badge offline";
} finally {
// Restore the button whether the request succeeded or failed.
checkButton.disabled = false;
checkButton.textContent = "Check Website";
}
});