feat(review): 故事板分镜图挂火山人像审核盾 + 红盾可重新送审
- 后端 StoryboardFrameSerializer 暴露 review_status + 驳回原因(之前没给,前端画不出盾) - 前端故事板趴:每张分镜图(缩略图角上只留盾 / 大图左上完整徽章)挂 ReviewBadge, 与人物/场景卡同款(审核中橙光 / 已过审绿 / 未过审红);故事板趴每 8s 轮询刷新审核态 - ReviewBadge:红盾(未过审)也可点「重新送审」——「审核超时」是误判(分镜图在 processing 卡太久被本地超时兜底标失败,非火山真违规),重提即可再审;灰盾/红盾两处(分镜图+人物卡)行为一致 - compact 模式:嵌在 overflow:hidden 容器里的盾(分镜图)改用原生 title 提示,避免 CSS 气泡被裁看不见 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
4074c13733
commit
c2c2dfdc77
@@ -11,18 +11,20 @@ const META: Record<string, { label: string; cls: string }> = {
|
||||
"": { label: "待审核", cls: "rv-idle" }
|
||||
};
|
||||
|
||||
export function ReviewBadge({ status, onSubmit, error, busy }: {
|
||||
export function ReviewBadge({ status, onSubmit, error, busy, compact }: {
|
||||
status: ReviewStatus;
|
||||
onSubmit?: () => void; // 仅灰盾(待审核)时点击触发提交
|
||||
onSubmit?: () => void; // 灰盾(待审核)/红盾(未过审)时点击触发(重新)送审
|
||||
error?: string; // 未过审原因(气泡里显)
|
||||
busy?: boolean; // 提交中
|
||||
compact?: boolean; // 用在 overflow:hidden 容器里(如故事板分镜图):改用原生 title 提示,避免 CSS 气泡被裁掉看不见
|
||||
}) {
|
||||
const key = status || "";
|
||||
const meta = META[key] || META[""];
|
||||
const clickable = key === "" && !!onSubmit && !busy;
|
||||
// 灰盾(待审核)和红盾(未过审/常见是审核超时)都可点重新送审 —— 超时是误判,重提即可再审一遍
|
||||
const clickable = (key === "" || key === "failed") && !!onSubmit && !busy;
|
||||
const hint =
|
||||
key === "active" ? "火山人像合规审核 · 已通过,可安全用于视频生成"
|
||||
: key === "failed" ? `火山人像合规审核 · 未通过${error ? " · " + error : ",建议改提示词重新生成"}`
|
||||
: key === "failed" ? `火山人像合规审核 · 未通过${error ? " · " + error : ""}${clickable ? " · 点击重新送审" : ",建议改提示词重新生成"}`
|
||||
: key === "processing" ? "火山人像合规审核 · 审核中,通常很快"
|
||||
: clickable ? "尚未送审 · 点击立即提交火山人像审核"
|
||||
: "尚未送审 · 含人脸的视频素材需过火山人像审核";
|
||||
@@ -31,12 +33,13 @@ export function ReviewBadge({ status, onSubmit, error, busy }: {
|
||||
className={`review-badge ${meta.cls}${clickable ? " clickable" : ""}`}
|
||||
role={clickable ? "button" : undefined}
|
||||
tabIndex={clickable ? 0 : undefined}
|
||||
title={compact ? hint : undefined}
|
||||
onClick={clickable ? (e) => { e.stopPropagation(); onSubmit!(); } : undefined}
|
||||
onKeyDown={clickable ? (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); e.stopPropagation(); onSubmit!(); } } : undefined}
|
||||
>
|
||||
<span className="rv-shield" aria-hidden="true" />
|
||||
<span className="rv-label">{busy ? "提交中…" : meta.label}</span>
|
||||
<span className="review-pop" role="tooltip">{hint}</span>
|
||||
{!compact && <span className="review-pop" role="tooltip">{hint}</span>}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user