Files
writer-work-flow/apps/web/components/generation/ConflictAdjudication.tsx
Yaojia Wang c6651b74b9 fix(web): stale-closure + focus trap + 去边界强转 + a11y/性能打磨 + 类型化客户端
P1-6 useStyleLearn/useKimiOauth 修 stale-closure 依赖。
P1-7 CommandPalette/Drawer 加 focus trap(新 lib/a11y/focusTrap)。
P1-8 SSE 解析与 server.ts 去 as 强转改类型守卫/运行时校验。
P2 删冗余强转、开 noUncheckedIndexedAccess、Toast 清理+稳定 key、列表 key 稳定化、
  rel=noopener、useMemo 大文本、ConflictCard role=group、useInjection 加锁、
  client.test 真断言。
codegen 重生成 schema.d.ts + 消费 DimensionEntry/ReviewConflictView 强类型。
2026-06-21 19:32:49 +02:00

79 lines
2.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client";
import type { IngestConflicts } from "@/lib/generation/cards";
interface ConflictAdjudicationProps {
conflicts: IngestConflicts;
busy: boolean;
// 作者已查看冲突,确认带 acknowledge 重发入库。
onAcknowledge: () => void;
onCancel: () => void;
}
// 入库 409 CONFLICT_UNRESOLVED 裁决面板UX §7 / 不变量#3
// 展示 continuity 预检冲突 → 作者裁决(确认入库 = acknowledge 重发 / 取消回去改卡)。
export function ConflictAdjudication({
conflicts,
busy,
onAcknowledge,
onCancel,
}: ConflictAdjudicationProps) {
return (
<div
role="alertdialog"
aria-label="continuity 冲突裁决"
className="rounded border border-conflict bg-panel p-4"
>
<h3 className="mb-1 font-serif text-base text-conflict">
{conflicts.conflictCount}
</h3>
<p className="mb-3 text-xs text-ink-soft">
</p>
<ul className="mb-3 flex flex-col gap-2">
{conflicts.conflicts.map((c, i) => (
<li
key={`${c.type}-${c.where}-${i}`}
className="rounded border border-line bg-bg p-2 text-sm"
>
<div className="mb-1 flex items-center gap-2">
<span className="rounded bg-conflict/10 px-2 py-0.5 text-xs text-conflict">
{c.type}
</span>
{c.where ? (
<span className="text-xs text-ink-soft">{c.where}</span>
) : null}
</div>
{c.refs.length > 0 ? (
<p className="mb-1 text-xs text-ink-soft">
{c.refs.join("、")}
</p>
) : null}
{c.suggestion ? (
<p className="text-ink">{c.suggestion}</p>
) : null}
</li>
))}
</ul>
<div className="flex gap-2">
<button
type="button"
onClick={onAcknowledge}
disabled={busy}
className="rounded bg-conflict px-3 py-1.5 text-sm text-white disabled:opacity-50"
>
</button>
<button
type="button"
onClick={onCancel}
disabled={busy}
className="rounded border border-line px-3 py-1.5 text-sm text-ink disabled:opacity-50"
>
</button>
</div>
</div>
);
}