"use client" import { useState, useEffect } from "react" import { Card, CardContent, CardHeader, CardTitle } from "./ui/card" import { Progress } from "./ui/progress" import { Badge } from "./ui/badge" import { HardDrive, Database, Archive, AlertTriangle, CheckCircle, Activity, AlertCircle } from "lucide-react" interface StorageData { total: number used: number available: number disks: DiskInfo[] } interface DiskInfo { name: string mountpoint: string fstype: string total: number used: number available: number usage_percent: number health: string temperature: number } const fetchStorageData = async (): Promise => { try { console.log("[v0] Fetching storage data from Flask server...") const response = await fetch("/api/storage", { method: "GET", headers: { "Content-Type": "application/json", }, signal: AbortSignal.timeout(5000), }) if (!response.ok) { throw new Error(`Flask server responded with status: ${response.status}`) } const data = await response.json() console.log("[v0] Successfully fetched storage data from Flask:", data) return data } catch (error) { console.error("[v0] Failed to fetch storage data from Flask server:", error) return null } } export function StorageMetrics() { const [storageData, setStorageData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { const fetchData = async () => { setLoading(true) setError(null) const result = await fetchStorageData() if (!result) { setError("Flask server not available. Please ensure the server is running.") } else { setStorageData(result) } setLoading(false) } fetchData() const interval = setInterval(fetchData, 30000) return () => clearInterval(interval) }, []) if (loading) { return (
Loading storage data...
) } if (error || !storageData) { return (
Flask Server Not Available
{error || "Unable to connect to the Flask server. Please ensure the server is running and try again."}
) } const usagePercent = storageData.total > 0 ? (storageData.used / storageData.total) * 100 : 0 return (
{/* Storage Overview Cards */}
Total Storage
{storageData.total.toFixed(1)} GB

{storageData.used.toFixed(1)} GB used • {storageData.available.toFixed(1)} GB available

Used Storage
{storageData.used.toFixed(1)} GB

{usagePercent.toFixed(1)}% of total space

Available
{storageData.available.toFixed(1)} GB
{((storageData.available / storageData.total) * 100).toFixed(1)}% Free

Available space

Disks
{storageData.disks.length}
{storageData.disks.filter((d) => d.health === "healthy").length} Healthy

Storage devices

{/* Disk Details */} Storage Devices
{storageData.disks.map((disk, index) => (
{disk.name}
{disk.fstype} • {disk.mountpoint}
{disk.used.toFixed(1)} GB / {disk.total.toFixed(1)} GB
Temp
{disk.temperature}°C
{disk.health === "healthy" ? ( ) : ( )} {disk.health}
))}
) }