fix(clip): a clip refusal speaks the user's language, and a choice in the clip form no longer sends it

The backend refuses a clip with a structured reason, but the client showed every one as the generic
"couldn't make the clip": each reason now has its own message in both languages, held to the
backend's reasons in both directions by the contract test. A segmented toggle's and the priority
stepper's buttons had no type, so inside a form one of them submitted it.
This commit is contained in:
2026-10-10 12:52:12 +02:00
parent 50157cc2fd
commit e301632765
7 changed files with 59 additions and 2 deletions
@@ -36,6 +36,7 @@ function PriorityStepButton({
}) {
return (
<button
type="button"
onPointerDown={(e) => {
// Keep receiving pointer events even if the pointer drifts off the small button mid-hold.
try {
@@ -162,6 +163,7 @@ export function PriorityStepper({
} ${cls.value}`}
>
<button
type="button"
ref={editTarget}
onClick={beginEdit}
aria-label={t("common.priority.edit")}
@@ -62,6 +62,8 @@ export default function SegmentedToggle<T extends string>({
{options.map((o) => (
<button
key={o.value}
// A choice, never a submit: inside a form (the clip panel) a bare button would send it.
type="button"
onClick={() => onChange(o.value)}
title={o.title}
aria-pressed={value === o.value}