import { useState } from "react"; import Logo from "./components/Logo"; import Statistic from "./components/Statistic"; import Image from "./components/Image"; import { LastChecked } from "./components/LastChecked"; import Loading from "./components/Loading"; import { Filters as FiltersType } from "./types"; import { theme } from "./theme"; import RefreshButton from "./components/RefreshButton"; import Search from "./components/Search"; import { Server } from "./components/Server"; import { useData } from "./hooks/use-data"; import DataLoadingError from "./components/DataLoadingError"; import Filters from "./components/Filters"; import { Filter, FilterX } from "lucide-react"; import { WithTooltip } from "./components/ui/Tooltip"; import { getDescription } from "./utils"; const SORT_ORDER = [ "monitored_images", "updates_available", "major_updates", "minor_updates", "patch_updates", "other_updates", "up_to_date", "unknown", ]; function App() { const { data, isLoading, isError } = useData(); const [showFilters, setShowFilters] = useState(false); const [filters, setFilters] = useState({ onlyInUse: false, registries: [], statuses: [], }); const [searchQuery, setSearchQuery] = useState(""); if (isLoading) return ; if (isError || !data) return ; const toggleShowFilters = () => { if (showFilters) { setFilters({ onlyInUse: false, registries: [], statuses: [] }); } setShowFilters(!showFilters); }; return (

Cup

{Object.entries(data.metrics) .sort((a, b) => { return SORT_ORDER.indexOf(a[0]) - SORT_ORDER.indexOf(b[0]); }) .map(([name]) => ( ))}
{showFilters && ( image.parts.registry)), ]} /> )}
    {Object.entries( data.images.reduce>( (acc, image) => { const server = image.server ?? ""; if (!Object.hasOwn(acc, server)) acc[server] = []; acc[server].push(image); return acc; }, {}, ), ) .sort() .map(([server, images]) => ( {images .filter((image) => filters.onlyInUse ? !!image.in_use : true, ) .filter((image) => filters.registries.length == 0 ? true : filters.registries.includes(image.parts.registry), ) .filter((image) => filters.statuses.length == 0 ? true : filters.statuses.includes(getDescription(image)), ) .filter((image) => image.reference.includes(searchQuery)) .map((image) => ( ))} ))}
); } export default App;