Added Wifi signal strength to printer card

This commit is contained in:
maziggy
2025-12-07 11:30:19 +00:00
parent 0c452a12e9
commit cef6cd593b
10 changed files with 469 additions and 394 deletions
+11 -3
View File
@@ -155,9 +155,17 @@ export function FileManagerModal({ printerId, printerName, onClose }: FileManage
</div>
<div className="flex items-center gap-4">
{/* Storage info */}
{storageData?.used_bytes != null && storageData.used_bytes > 0 && (
<div className="text-sm text-bambu-gray">
Used: {formatStorageSize(storageData.used_bytes)}
{storageData && (storageData.used_bytes != null || storageData.free_bytes != null) && (
<div className="text-sm text-bambu-gray flex items-center gap-2">
{storageData.used_bytes != null && (
<span>Used: {formatStorageSize(storageData.used_bytes)}</span>
)}
{storageData.used_bytes != null && storageData.free_bytes != null && (
<span className="text-bambu-dark-tertiary">|</span>
)}
{storageData.free_bytes != null && (
<span>Free: {formatStorageSize(storageData.free_bytes)}</span>
)}
</div>
)}
<button
+11 -4
View File
@@ -75,10 +75,17 @@ export function useWebSocket() {
if (message.printer_id !== undefined) {
queryClient.setQueryData(
['printerStatus', message.printer_id],
(old: Record<string, unknown> | undefined) => ({
...old,
...message.data,
})
(old: Record<string, unknown> | undefined) => {
const merged = {
...old,
...message.data,
};
// Preserve last known wifi_signal if new value is null
if (merged.wifi_signal == null && old?.wifi_signal != null) {
merged.wifi_signal = old.wifi_signal;
}
return merged;
}
);
}
break;
+40
View File
@@ -4,6 +4,7 @@ import {
Plus,
Wifi,
WifiOff,
Signal,
Thermometer,
Clock,
MoreVertical,
@@ -37,6 +38,15 @@ function formatTime(seconds: number): string {
return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;
}
function getWifiStrength(rssi: number | null | undefined): { label: string; color: string; bars: number } {
if (rssi == null) return { label: '', color: 'text-bambu-gray', bars: 0 };
if (rssi >= -50) return { label: 'Excellent', color: 'text-bambu-green', bars: 4 };
if (rssi >= -60) return { label: 'Good', color: 'text-bambu-green', bars: 3 };
if (rssi >= -70) return { label: 'Fair', color: 'text-yellow-400', bars: 2 };
if (rssi >= -80) return { label: 'Weak', color: 'text-orange-400', bars: 1 };
return { label: 'Very weak', color: 'text-red-400', bars: 1 };
}
function CoverImage({ url, printName }: { url: string | null; printName?: string }) {
const [loaded, setLoaded] = useState(false);
const [error, setError] = useState(false);
@@ -118,6 +128,15 @@ function PrinterCard({
refetchInterval: 30000, // Fallback polling, WebSocket handles real-time
});
// Cache WiFi signal to prevent it disappearing on updates
const [cachedWifiSignal, setCachedWifiSignal] = useState<number | null>(null);
useEffect(() => {
if (status?.wifi_signal != null) {
setCachedWifiSignal(status.wifi_signal);
}
}, [status?.wifi_signal]);
const wifiSignal = status?.wifi_signal ?? cachedWifiSignal;
// Fetch smart plug for this printer
const { data: smartPlug } = useQuery({
queryKey: ['smartPlugByPrinter', printer.id],
@@ -190,6 +209,7 @@ function PrinterCard({
</p>
</div>
<div className="flex items-center gap-2">
{/* Connection status badge */}
<span
className={`flex items-center gap-1.5 px-2 py-1 rounded-full text-xs ${
status?.connected
@@ -204,6 +224,26 @@ function PrinterCard({
)}
{status?.connected ? 'Connected' : 'Offline'}
</span>
{/* WiFi signal strength indicator */}
{status?.connected && wifiSignal != null && (
<span
className={`flex items-center gap-1 px-2 py-1 rounded-full text-xs ${
wifiSignal >= -50
? 'bg-bambu-green/20 text-bambu-green'
: wifiSignal >= -60
? 'bg-bambu-green/20 text-bambu-green'
: wifiSignal >= -70
? 'bg-amber-500/20 text-amber-600'
: wifiSignal >= -80
? 'bg-orange-500/20 text-orange-600'
: 'bg-red-500/20 text-red-600'
}`}
title={`WiFi: ${wifiSignal} dBm - ${getWifiStrength(wifiSignal).label}`}
>
<Signal className="w-3 h-3" />
{wifiSignal}dBm
</span>
)}
{/* HMS Status Indicator */}
{status?.connected && (
<button