ConflictButtons
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> ); }