import classNames from '~/lib/classNames' import { formatBytes } from '~/lib/util' import { IconAlertTriangle, IconServer } from '@tabler/icons-react' interface StorageProjectionBarProps { totalSize: number // Total disk size in bytes currentUsed: number // Currently used space in bytes projectedAddition: number // Additional space that will be used in bytes } export default function StorageProjectionBar({ totalSize, currentUsed, projectedAddition, }: StorageProjectionBarProps) { const projectedTotal = currentUsed + projectedAddition const currentPercent = (currentUsed / totalSize) * 100 const projectedPercent = (projectedAddition / totalSize) * 100 const projectedTotalPercent = (projectedTotal / totalSize) * 100 const remainingAfter = totalSize - projectedTotal const willExceed = projectedTotal > totalSize // Determine warning level based on projected total const getProjectedColor = () => { if (willExceed) return 'bg-desert-red' if (projectedTotalPercent >= 90) return 'bg-desert-orange' if (projectedTotalPercent >= 75) return 'bg-desert-tan' return 'bg-desert-olive' } const getProjectedGlow = () => { if (willExceed) return 'shadow-desert-red/50' if (projectedTotalPercent >= 90) return 'shadow-desert-orange/50' if (projectedTotalPercent >= 75) return 'shadow-desert-tan/50' return 'shadow-desert-olive/50' } return (
Storage
{formatBytes(projectedTotal, 1)} / {formatBytes(totalSize, 1)} {projectedAddition > 0 && ( (+{formatBytes(projectedAddition, 1)} selected) )}
{/* Progress bar */}
{/* Current usage - darker/subdued */}
{/* Projected addition - highlighted */} {projectedAddition > 0 && (
)}
{/* Percentage label */}
15 ? 'left-3 text-white drop-shadow-md' : 'right-3 text-desert-green' )} > {Math.round(projectedTotalPercent)}%
{/* Legend and warnings */}
Current ({formatBytes(currentUsed, 1)})
{projectedAddition > 0 && (
Selected (+{formatBytes(projectedAddition, 1)})
)}
{willExceed ? (
Exceeds available space by {formatBytes(projectedTotal - totalSize, 1)}
) : (
{formatBytes(remainingAfter, 1)} will remain free
)}
) }