tahamajs/IE / Projects /front /src /components /ConnectionStatus.tsx
tahamajs's picture
download
raw
2.26 kB
// src/components/ConnectionStatus.tsx
"use client";
import { useEffect, useState } from "react";
import { useAuth } from "@/context/AuthContext";
interface ConnectionStatusProps {
checkBackend?: boolean;
}
export function ConnectionStatus({ checkBackend = false }: ConnectionStatusProps) {
const [online, setOnline] = useState<boolean | null>(null);
const [backendOnline, setBackendOnline] = useState<boolean | null>(null);
const { user } = useAuth();
// Check browser online status
useEffect(() => {
const updateOnlineStatus = () => setOnline(navigator.onLine);
updateOnlineStatus();
window.addEventListener("online", updateOnlineStatus);
window.addEventListener("offline", updateOnlineStatus);
return () => {
window.removeEventListener("online", updateOnlineStatus);
window.removeEventListener("offline", updateOnlineStatus);
};
}, []);
// Optional backend health check (only when authenticated)
useEffect(() => {
if (!checkBackend || !user) return;
const checkBackendHealth = async () => {
try {
const res = await fetch("/api/health");
setBackendOnline(res.ok);
} catch {
setBackendOnline(false);
}
};
checkBackendHealth();
const interval = setInterval(checkBackendHealth, 30000);
return () => clearInterval(interval);
}, [checkBackend, user]);
const isOnline = checkBackend ? (online && backendOnline === true) : online;
const statusText = online === false ? "Offline" : checkBackend && backendOnline === false ? "Connecting" : "Online";
const statusColor = online === false || backendOnline === false ? "text-amber-600" : "text-green-600";
const dotColor = online === false || backendOnline === false ? "bg-amber-500" : "bg-green-500";
if (online === null) {
return <span className="ml-2 hidden text-xs text-gray-400 animate-pulse md:inline">Checking…</span>;
}
return (
<span
className={`ml-2 flex items-center gap-1 text-xs font-semibold ${statusColor}`}
title={statusText === "Online" ? "Connected" : "Waiting for connection"}
>
<span className={`inline-block h-2 w-2 rounded-full ${dotColor}`} />
<span className="hidden md:inline">{statusText}</span>
</span>
);
}

Xet Storage Details

Size:
2.26 kB
·
Xet hash:
da7380e2c379b2bb94dcfcfc5355e6c26aa513e3b2526842174f14620c1cd9a4

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.