import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useEffect, useMemo, useState } from "react"; import { BsTrash3, BsArrowRepeat } from "react-icons/bs"; import { useNavigate } from "react-router"; import apiService from "../../API/apiService"; import { useUpdateRepo } from "../../API/repositories"; import { useAppContext } from "../../context/AppContext"; import type { Chart, Repository } from "../../data/types"; import Spinner from "../Spinner"; import ChartViewer from "./ChartViewer"; type RepositoryViewerProps = { repository: Repository | undefined; }; function RepositoryViewer({ repository }: RepositoryViewerProps) { const [searchValue, setSearchValue] = useState(""); const [isRemoveLoading, setIsRemove] = useState(false); const { setSelectedRepo, selectedRepo } = useAppContext(); const queryClient = useQueryClient(); const navigate = useNavigate(); const { data: charts, isLoading } = useQuery({ queryKey: ["charts", repository?.name || ""], queryFn: apiService.getRepositoryCharts, refetchOnWindowFocus: false, enabled: !!repository?.name, }); useEffect(() => { setSearchValue(""); }, [repository, selectedRepo]); const update = useUpdateRepo(repository?.name || "", { retry: false, onSuccess: () => { window.location.reload(); }, }); const removeRepository = async () => { if (confirm("Confirm removing repository?")) { try { setIsRemove(true); const repo = repository?.name || ""; await apiService.fetchWithDefaults( `/api/helm/repositories/${repo}`, { method: "DELETE", } ); await navigate("/repository", { replace: true }); setSelectedRepo(""); await queryClient.invalidateQueries({ queryKey: ["helm", "repositories"], }); } catch (error) { console.error(error); } finally { setIsRemove(false); } } }; const numOfCharts = (charts as Chart[])?.length; const showNoChartsAlert = Boolean(!numOfCharts && numOfCharts === 0); const filteredCharts = useMemo(() => { return (charts as Chart[])?.filter((ch: Chart) => ch.name.toLowerCase().includes(searchValue.toLowerCase()) ); }, [charts, searchValue]); if (repository === undefined) { return (
Looks like you don't have any repositories installed. You can add one with the "Add Repository" button on the left side bar.
); } return (
REPOSITORY
{repository?.name}
setSearchValue(e.target.value)} value={searchValue} type="text" placeholder="Filter..." className="input-box-shadow mt-2 h-8 w-full rounded-sm border border-gray-300 p-2 text-sm focus:border-sky-500 focus:outline-hidden" />
URL: {repository?.url}
CHART NAME DESCRIPTION VERSION
{isLoading ? ( ) : ( (filteredCharts || charts)?.map((chart: Chart) => ( )) )} {showNoChartsAlert && (
Looks like you don't have any repositories installed. You can add one with the "Add Repository" button on the left side bar.
)}
); } export default RepositoryViewer;