TheBird

Automator.jsx

2.4 kB · jsx · 49 lines

1import { Code, Rows, Waiting, ago, useMirror, when } from "../components/Mirror.jsx";2import { ProductGrid } from "../components/ProductGrid.jsx";34function Tick({ data }) {5  const task = data.task;6  const waiting = task?.metadata?.waiting_since;7  return (8    <Rows9      list={[10        ["Last tick", `${ago(data.at)} (${when(data.at)}), ${data.seconds} s${data.error ? `, ${data.error}` : ""}`],11        ["Design", data.design ? `${data.design.key}, ${data.design.group} ${data.design.edition} ${data.design.scheme}, with ${data.design.secondary.join(", ")}, ${ago(data.design.created_at)}` : "none"],12        ["Task", task ? `${task.key} at ${task.step}, ${task.mockups} mockups, ${task.variants} variants, started ${ago(task.created_at)}${waiting ? `, waiting ${ago(waiting).replace(" ago", "")}` : ""}` : "idle"],13        ["Counters", task ? JSON.stringify(task.metadata) : ""],14        ["Batch", data.batch ? `${data.batch.open} open, ${data.batch.used} used, ${data.batch.dropped} dropped, tiles ${Object.keys(data.batch.tiles ?? {}).join(" ") || "none"}${Object.keys(data.batch.strikes ?? {}).length ? `, strikes ${Object.entries(data.batch.strikes ?? {}).map(([id, n]) => `${id}x${n}`).join(" ")}` : ""}` : "no batch"],15        ["Live", `${data.live.products} products in ${data.live.batches} batches, ${data.live.expiring} expiring within a day, newest ${ago(data.live.newest)}, oldest ${ago(data.live.oldest)}`],16      ]}17    />18  );19}2021export function Automator({ pending = [], now }) {22  const seen = useMirror("/automator/automator.json");23  const data = seen?.data ?? null;2425  return (26    <div className="wrap">27      {pending.length ? (28        <section className="batch">29          <h2>{`Batch ${pending[0].design}: ${pending.length} of the pairs so far`}</h2>30          <ProductGrid products={pending} now={now} />31        </section>32      ) : null}33      <article className="doc status narrow">34        <h1>Automator</h1>35        <p className="lead">36          The automator, read from the bucket every minute. Raw: <a href="/automator/automator.json">automator.json</a>. The cloud numbers live on <a href="/stats/">stats</a>.37        </p>38        <section>39          <h2>Tick</h2>40          {data ? <Tick data={data} /> : <Waiting seen={seen} />}41        </section>42        <section>43          <h2>Log</h2>44          {data?.log?.length ? <Code lines={data.log.slice(-120)} /> : <Waiting seen={seen} />}45        </section>46      </article>47    </div>48  );49}