import { BsTrash3, BsArrowRepeat } from "react-icons/bs"; import { Chart, Repository } from "../../data/types"; import ChartViewer from "./ChartViewer"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import apiService from "../../API/apiService"; import Spinner from "../Spinner"; import { useUpdateRepo } from "../../API/repositories"; import { useEffect, useMemo, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useAppContext } from "../../context/AppContext"; type RepositoryViewerProps = { repository: Repository | undefined; }; function RepositoryViewer({ repository }: RepositoryViewerProps) { const [searchValue, setSearchValue] = useState(""); const [isRemoveLoading, setIsRemove] = useState(false); const { context } = useParams(); const { setSelectedRepo, selectedRepo } = useAppContext(); const queryClient = useQueryClient(); const navigate = useNavigate(); const { data: charts, isLoading } = useQuery({ //@ts-ignore 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 () => { //this is expected //eslint-disable-next-line no-alert if (confirm("Confirm removing repository?")) { try { setIsRemove(true); const repo = repository?.name || ""; await apiService.fetchWithDefaults( `/api/helm/repositories/${repo}`, { method: "DELETE", } ); navigate(`/${context}/repository`, { replace: true }); setSelectedRepo(""); 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="mt-2 h-8 p-2 text-sm w-full border border-gray-300 focus:outline-none focus:border-sky-500 input-box-shadow rounded" />
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;