ReleasesPage

tcmts.share.ReleasesPage · #u66266iq · term · runs on the server

is an async component

The releases, newest first: each package's version, when, and its notes (written from its API's changes).

import { shortHash } from "#codebase/tcmts/core/hash";
import { at, Frame, Html, markdownHtml, shareNow } from "#codebase/tcmts/share";

export async function ReleasesPage() {
  const s = shareNow();
  if (!s.signedIn) return <Frame tab="releases" title="Sign in" children={null} />;
  const all = s.cb.store.releases().sort((a, b) => b.ts - a.ts);
  return (
    <Frame tab="releases" title="Releases">
      <div className="narrow">
        <h2 className="title" style={{ marginBottom: 14 }}>
          Releases
        </h2>
        {all.length ? (
          all.map((r) => (
            <div className="box" id={`${r.package}@${r.version}`} key={`${r.package}@${r.version}`}>
              <div className="boxhead">
                <b>
                  {r.package} {r.version}
                </b>
                <span className="muted">
                  {new Date(r.ts).toISOString().slice(0, 10)} · by {r.author}
                </span>
                <a className="right hash" href={at(`/history/${r.causal}`)}>
                  {shortHash(r.causal)}
                </a>
              </div>
              <Html className="boxbody md" html={markdownHtml(s.cb, r.notes || "_No notes._")} />
            </div>
          ))
        ) : (
          <div className="empty">
            No releases yet: <code>tcm release &lt;package&gt;</code> makes one.
          </div>
        )}
      </div>
    </Frame>
  );
}

uses

used by