import React from "react"; import clsx from "clsx"; import { PackageLatestVersionType, PackageType, } from "@refinedev/devtools-shared"; import semverDiff from "semver-diff"; import { UpdateIcon } from "./icons/update"; import { CheckIcon } from "./icons/check"; import { InfoIcon } from "./icons/info"; import { getLatestInfo } from "src/utils/packages"; type Props = { item: PackageType; blocked?: boolean; onUpdate: (packageName: string) => Promise; onOutdated: (packageName: string) => void; }; export const PackageItem = ({ item, blocked, onUpdate, onOutdated }: Props) => { const [latestLoading, setLatestLoading] = React.useState(true); const [latestData, setLatestData] = React.useState(null); React.useEffect(() => { setLatestLoading(true); getLatestInfo(item.name) .then((data) => { setLatestData(data); }) .catch(() => 0) .finally(() => { setLatestLoading(false); }); }, []); const updateKind = latestData && item.currentVersion && latestData.latestVersion ? semverDiff(item.currentVersion, latestData.latestVersion) : undefined; const hasUpdate = typeof updateKind !== "undefined"; const [status, setStatus] = React.useState< "idle" | "updating" | "done" | "error" >("idle"); const icon = React.useMemo(() => { switch (status) { case "updating": return ; case "done": return ; case "error": return ; case "idle": default: return ; } }, [status]); const statusText = React.useMemo(() => { switch (status) { case "updating": return "Updating"; case "done": return "Updated"; case "error": return "Error"; case "idle": default: return "Update"; } }, [status]); const updatePackage = React.useCallback(async () => { if (status !== "idle") return; try { setStatus("updating"); const response = await onUpdate?.(item.name); if (response) { setStatus("done"); } else { setStatus("error"); } } catch (err) { setStatus("error"); // } }, [item.name, status]); React.useEffect(() => { if (hasUpdate) { onOutdated(item.name); } }, [hasUpdate]); return (
{item.name}
{hasUpdate && ( )} {!hasUpdate && (
{latestLoading ? ( ) : ( <> Up to date )}
)}
{item.description ?? ""}
{hasUpdate && (
{"There's a "} {updateKind} {" release "} {latestData && latestData.latestVersion ? `v${latestData.latestVersion}` : ""}
)}
{item.documentation && ( <> documentation · )} {item.changelog && ( <> changelog · )} v{item.currentVersion}
); };