feat: add mobile viewport detection with friendly unavailable message
Some checks failed
check / check (push) Failing after 3m26s
Some checks failed
check / check (push) Failing after 3m26s
Detect mobile viewport (window.innerWidth < 768) at startup and show a centered 'Not yet available on mobile' message instead of the full monitoring UI. All polling, gateway detection, and network requests are skipped entirely on mobile viewports. Desktop behavior is completely unchanged — the mobile check is the very first thing in init() and returns early before any other setup runs.
This commit is contained in:
@@ -102,6 +102,9 @@ dist/
|
||||
false outage)
|
||||
- Clickable service URLs
|
||||
- Canvas-based sparkline rendering with devicePixelRatio scaling
|
||||
- Mobile detection: viewports narrower than 768px show a friendly "not yet
|
||||
available on mobile" message instead of the monitoring UI (no polling or
|
||||
network requests on mobile)
|
||||
- Zero runtime dependencies: all resources bundled into build artifacts
|
||||
|
||||
## Deployment
|
||||
@@ -125,6 +128,8 @@ properties.
|
||||
|
||||
## Limitations
|
||||
|
||||
- **Mobile**: Viewports below 768px wide show a static "not yet available"
|
||||
message. The full monitoring UI requires a desktop-width browser.
|
||||
- **CORS**: Some hosts may block cross-origin HEAD requests. The app uses
|
||||
`no-cors` mode which allows the request but provides opaque responses. Latency
|
||||
is still measurable based on request timing.
|
||||
|
||||
35
src/main.js
35
src/main.js
@@ -1126,11 +1126,46 @@ function handleResize(state) {
|
||||
});
|
||||
}
|
||||
|
||||
// --- Mobile Detection --------------------------------------------------------
|
||||
|
||||
const MOBILE_BREAKPOINT = 768;
|
||||
|
||||
function isMobileViewport() {
|
||||
return window.innerWidth < MOBILE_BREAKPOINT;
|
||||
}
|
||||
|
||||
function buildMobileUI() {
|
||||
const app = document.getElementById("app");
|
||||
app.innerHTML = `
|
||||
<div class="mx-auto px-[5%] py-8">
|
||||
<header class="mb-8">
|
||||
<h1 class="text-3xl font-bold text-white"><a href="https://git.eeqj.de/sneak/netwatch" target="_blank" rel="noopener" class="underline decoration-dashed decoration-gray-500 underline-offset-4">NetWatch</a> by <a href="https://sneak.berlin" target="_blank" rel="noopener" class="text-blue-400 underline hover:text-blue-300">@sneak</a></h1>
|
||||
<p class="text-gray-400 text-sm mt-2">Real-time network latency monitor</p>
|
||||
</header>
|
||||
<div class="flex items-center justify-center min-h-[60vh]">
|
||||
<div class="bg-gray-800/70 border border-gray-700/50 rounded-lg p-8 max-w-md text-center">
|
||||
<p class="text-4xl mb-4">📡</p>
|
||||
<p class="text-xl font-semibold text-white mb-2">Not yet available on mobile</p>
|
||||
<p class="text-gray-400 text-sm">NetWatch requires a wider viewport to display latency charts and monitoring data. Please visit on a desktop browser.</p>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="mt-8 text-center text-gray-600 text-xs">
|
||||
<p><a href="https://git.eeqj.de/sneak/netwatch/commit/${__COMMIT_FULL__}" target="_blank" rel="noopener" class="text-gray-600 hover:text-gray-400">${__COMMIT_HASH__}</a></p>
|
||||
</footer>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
// --- Bootstrap ---------------------------------------------------------------
|
||||
|
||||
async function init() {
|
||||
log.info("NetWatch starting");
|
||||
|
||||
if (isMobileViewport()) {
|
||||
log.info("Mobile viewport detected — skipping monitoring");
|
||||
buildMobileUI();
|
||||
return;
|
||||
}
|
||||
|
||||
// Probe common gateway IPs to find the local router
|
||||
const gateway = await detectGateway();
|
||||
const localHosts = [LOCAL_CPE];
|
||||
|
||||
Reference in New Issue
Block a user