import { Box, Text, useInput } from "ink"; import { useAtom } from "jotai"; import React, { useState } from "react"; import { cacheOpenAtom } from "./store"; import { BLUE, ERROR, TEAL, VIOLET } from "./theme"; import { cacheDir, cacheStats, clearCache } from "./trackCache"; function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; const units = ["KB", "MB", "GB", "TB"]; let value = bytes / 1024; let i = 0; while (value >= 1024 && i < units.length - 1) { value /= 1024; i++; } return `${value.toFixed(1)} ${units[i]}`; } export function CacheView() { const [, setOpen] = useAtom(cacheOpenAtom); const [stats, setStats] = useState(() => cacheStats()); const [confirming, setConfirming] = useState(false); const [cleared, setCleared] = useState(false); useInput((input, key) => { if (key.escape || input === "C") return setOpen(false); if (input === "r") { setStats(cacheStats()); return; } if (input === "c") { if (!confirming) { setConfirming(true); return; } clearCache(); setStats(cacheStats()); setConfirming(false); setCleared(true); } }); return ( {" Track Cache "} {"Cached tracks".padEnd(16)} {stats.files} {"Total size".padEnd(16)} {formatBytes(stats.bytes)} {`Location: ${cacheDir()}`} {confirming ? ( Press c again to delete all cached tracks · Esc to cancel ) : cleared ? ( Cache cleared. ) : ( c clear cache · r refresh · Esc close )} ); }