85 lines · 3.3 KB
import { TONE_SURFACE } from "~/ui/tones";
import { useDemoTimeline } from "~/hooks/use-demo-timeline";
import { Avatar } from "~/ui/Avatar";
import { Badge } from "~/ui/Badge";
import { StatusDot } from "~/ui/StatusDot";
import { cn } from "~/utils/cn";
import { DemoWindow } from "../DemoWindow";

const STEPS = 6;
const INTERVAL_MS = 1100;
const APPROVED_AT = 4;
const QUEUED_AT = 5;

const CHECKS = [
  { name: "ci / lint", done: 1, time: "9s" },
  { name: "ci / test (node 22)", done: 2, time: "38s" },
  { name: "ci / test (node 24)", done: 3, time: "41s" },
] as const;

function queuePhase(step: number): { state: string; text: string } {
  if (step >= STEPS) return { state: "success", text: "Merged by the queue into main" };
  if (step >= QUEUED_AT) return { state: "in_progress", text: "Testing against latest main…" };
  return { state: "queued", text: "Auto-merge when ready" };
}

function checkState(step: number, done: number): string {
  if (step >= done) return "success";
  return step >= done - 1 ? "in_progress" : "queued";
}

export function PullRequestDemo({ className }: { className?: string }) {
  const step = useDemoTimeline(STEPS, INTERVAL_MS);
  const approved = step >= APPROVED_AT;
  const merged = step >= STEPS;
  const queue = queuePhase(step);
  return (
    <DemoWindow
      title="acme/web · pull request #128"
      label="A pull request whose checks pass, gets approved and merges itself"
      className={className}