import { Link } from "@tanstack/react-router"; import { deleteRelease, deleteReleaseAsset, updateRelease } from "~/fns/releases"; import { useAction } from "~/hooks/use-action"; import { useReleaseAssetUpload } from "~/hooks/use-release-asset-upload"; import { Badge } from "~/ui/Badge"; import { formatBytes } from "~/lib/format"; import { Markdown } from "~/ui/Markdown"; import { Panel } from "~/ui/Panel"; import { RelativeTime } from "~/ui/RelativeTime"; import { Button } from "~/ui/Button"; import { ErrorBanner } from "~/ui/Callout"; import type { listReleases } from "~/fns/releases"; import { ExternalLink } from "~/ui/TextLink"; type Release = Awaited>["releases"][number]; function AssetUpload({ owner, repo, releaseId }: { owner: string; repo: string; releaseId: string }) { const { upload, pending, error } = useReleaseAssetUpload(owner, repo, releaseId); return ( ); } export function ReleaseCard({ owner, repo, release, canWrite, }: { owner: string; repo: string; release: Release; canWrite: boolean; }) { const publish = useAction(updateRelease); const remove = useAction(deleteRelease); const removeAsset = useAction(deleteReleaseAsset); return ( {release.name} {release.draft && Draft} {release.prerelease && Pre-release} {release.tag} } actions={ canWrite && ( <> {release.draft && ( )} ) } >

{release.author.name} released ·{" "} {release.targetSha.slice(0, 7)}

{release.body.trim() && }

Assets

    {release.assets.map((asset) => (
  • {asset.name} {formatBytes(asset.size)} · {asset.download_count} downloads {canWrite && ( )}
  • ))}
  • Source code (tar.gz) {canWrite && ( )}
); }