fix: 修复自由创作首尾帧上传人脸图不通过问题

This commit is contained in:
hh
2026-07-09 11:39:54 +08:00
parent 5c9e62a165
commit a82f90d0e0
11 changed files with 357 additions and 100 deletions
+40 -6
View File
@@ -91,6 +91,7 @@ export function FreeCreatePage({ modelConfigs, onNotify }: {
// —— 弹窗 ——
const [detailId, setDetailId] = useState<string | null>(null);
const [libraryOpen, setLibraryOpen] = useState(false);
const [libraryTargetRole, setLibraryTargetRole] = useState<"first_frame" | "last_frame" | null>(null);
const [deleteTarget, setDeleteTarget] = useState<FreeVideoTask | null>(null);
// —— 轮询/进度 ——
@@ -441,15 +442,48 @@ export function FreeCreatePage({ modelConfigs, onNotify }: {
}
}, [deleteTarget, detailId, stopPolling, notify]);
// 素材库选中 → 注入输入条 + 插 mention chip
const openLibrary = useCallback((role?: "first_frame" | "last_frame") => {
if (mode === "keyframe" && !role) {
notify("info", "请点击首帧或尾帧槽位上的人物素材库入口");
return;
}
setLibraryTargetRole(role || null);
setLibraryOpen(true);
}, [mode, notify]);
const closeLibrary = useCallback(() => {
setLibraryOpen(false);
setLibraryTargetRole(null);
}, []);
// 素材库选中 → 全能参考插 mention;首尾帧写入对应槽位
const handleLibraryPick = useCallback((ref: FreeVideoRef) => {
if (mode === "keyframe") { notify("info", "首尾帧模式请直接上传图片"); return; }
if (mode === "keyframe") {
if (!libraryTargetRole) {
notify("info", "请先指定首帧或尾帧槽位");
return;
}
if (ref.type !== "image") {
notify("error", "首尾帧仅支持图片素材");
return;
}
const local: LocalRef = {
...ref,
key: nextRefKey(),
role: libraryTargetRole,
label: undefined,
source: "library"
};
setRefs((prev) => [...prev.filter((r) => r.role !== libraryTargetRole), local]);
setLibraryTargetRole(null);
return;
}
let label = ref.label || "素材";
let n = 2;
while (refs.some((r) => r.label === label)) label = `${ref.label}${n++}`;
setRefs((prev) => [...prev, { ...ref, label, key: nextRefKey() }]);
window.setTimeout(() => promptRef.current?.insertMention({ label, thumb: ref.thumb_url || (ref.type === "image" ? ref.url : "") }), 0);
}, [mode, refs, notify]);
}, [mode, refs, libraryTargetRole, notify]);
const clearInput = useCallback(() => {
promptRef.current?.clear();
@@ -471,7 +505,7 @@ export function FreeCreatePage({ modelConfigs, onNotify }: {
</div>
</div>
<div className="actions">
<button type="button" className="btn" onClick={() => setLibraryOpen(true)}>
<button type="button" className="btn" onClick={() => openLibrary()}>
<Users size={14} /> 人物素材库
</button>
</div>
@@ -525,7 +559,7 @@ export function FreeCreatePage({ modelConfigs, onNotify }: {
onResolutionChange={setResolution}
onDurationChange={setDuration}
onSeedChange={setSeed}
onOpenLibrary={() => setLibraryOpen(true)}
onOpenLibrary={openLibrary}
onClear={clearInput}
onSend={() => void handleSend()}
/>
@@ -545,7 +579,7 @@ export function FreeCreatePage({ modelConfigs, onNotify }: {
/>
)}
<AssetLibraryModal open={libraryOpen} onClose={() => setLibraryOpen(false)} onPick={handleLibraryPick} notify={notify} />
<AssetLibraryModal open={libraryOpen} onClose={closeLibrary} onPick={handleLibraryPick} notify={notify} />
<ConfirmModal
open={deleteTarget !== null}