153 lines · 5.2 KB
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<ReturnType<typeof listReleases>>["releases"][number];

function AssetUpload({ owner, repo, releaseId }: { owner: string; repo: string; releaseId: string }) {
  const { upload, pending, error } = useReleaseAssetUpload(owner, repo, releaseId);
  return (
    <label className="inline-flex cursor-pointer items-center gap-2 text-xs text-accent-400 hover:underline">
      {pending ? "Uploading…" : "Upload asset"}
      <input
        type="file"
        className="sr-only"
        onChange={(event) => {
          const file = event.target.files?.[0];
          if (file) void upload(file);
        }}
      />
      {error && <span className="text-kumo-danger">{error}</span>}
    </label>
  );
}

export function ReleaseCard({
  owner,
  repo,
  release,
  canWrite,
}: {