ConflictButtons

tcmts.studio.ConflictButtons · #bmxwef3a · term · runs in the browser

uses useState

What settles a conflicted name: Edit, its definitions merged into a file (conflict markers where they overlap), or keep one: ours or theirs, where a merge made it, or each by its hash (tcm resolve).

import { EditButton, resolveConflict, toldOf } from "#codebase/tcmts/studio";
import { useState } from "react";
import { Button } from "react-aria-components";

export function ConflictButtons({
  name,
  sides,
}: {
  name: string;
  sides: { hash: string; side?: "ours" | "theirs"; label?: string }[];
}) {
  const [busy, setBusy] = useState("");
  const keep = async (k: string) => {
    setBusy(k);
    await toldOf(resolveConflict(name, k), `Kept one for ${name}`, `Couldn't resolve ${name}`);
    setBusy("");
  };
  return (
    <span className="actions">
      <EditButton name={name} />
      {sides.map((s) => {
        const k = s.side ?? s.hash;
        return (
          <Button key={s.hash} className="btn" isPending={busy === k} onPress={() => void keep(k)}>
            {s.side ? `Keep ${s.side}` : `Keep #${s.hash.slice(0, 8)}`}
          </Button>
        );
      })}
    </span>
  );
}

uses

used by