优化脚本
This commit is contained in:
@@ -462,28 +462,6 @@ export function App() {
|
||||
}
|
||||
}, [activeProjectId, refreshBilling]);
|
||||
|
||||
// 静默轮询故事板分镜生成(对标 pollVideosQuiet):有 queued/running 的场就驱动后端出图并刷新,不占全局 loading、不弹 toast。
|
||||
// 这样单场重跑不会把别的场按钮也锁住——生成在后台跑,UI 只按每场自身状态转圈。
|
||||
const pollStoryboardQuiet = useCallback(async () => {
|
||||
if (!activeProjectId) return;
|
||||
let detail = projectDetailRef.current;
|
||||
if (!detail || detail.id !== activeProjectId) {
|
||||
detail = await api.project(activeProjectId).catch(() => null);
|
||||
if (!detail) return;
|
||||
setProjectDetail(detail);
|
||||
}
|
||||
const active = (detail.storyboard_shots ?? []).filter((s) => ["queued", "running"].includes(s.status));
|
||||
if (active.length === 0) return;
|
||||
await api.pollStoryboard(activeProjectId).catch(() => undefined);
|
||||
const next = await api.project(activeProjectId).catch(() => null);
|
||||
if (next && next.id === activeProjectIdRef.current) {
|
||||
setProjectDetail((prev) => (prev && JSON.stringify(prev) === JSON.stringify(next) ? prev : next));
|
||||
// 分镜图成功落库时后端同时结算积分;只在成功终态刷新顶栏余额。
|
||||
const charged = active.some((shot) => next.storyboard_shots?.find((item) => item.id === shot.id)?.status === "succeeded");
|
||||
if (charged) void refreshBilling();
|
||||
}
|
||||
}, [activeProjectId, refreshBilling]);
|
||||
|
||||
// 静默刷新导出任务状态(进入拼接页 / 导出后回填成片),不弹 toast。
|
||||
const refreshExport = useCallback(async () => {
|
||||
if (!activeProjectId) return;
|
||||
@@ -1210,16 +1188,6 @@ export function App() {
|
||||
if (!assetId) return null;
|
||||
return { adopted_asset: assetId };
|
||||
}}
|
||||
onGenerateStoryboard={(prompt) =>
|
||||
// 只「提交」(秒回);出图由后台 pollStoryboardQuiet 驱动 —— 不占全局 loading,不锁其它场按钮(对标视频「开始生成」)
|
||||
action(() => api.generateStoryboard(pipelineProject.id, { prompt }), "故事板已开始生成")
|
||||
}
|
||||
onRerunStoryboardShot={(shotId, prompt) =>
|
||||
// 单场重跑也只「提交」(秒回);后台轮询出图。不阻塞 → 可同时重跑别的场
|
||||
action(() => api.rerunStoryboardShot(pipelineProject.id, shotId, prompt), "本场已开始重跑")
|
||||
}
|
||||
onAdoptStoryboardShotVersion={(shotId, versionId) => action(() => api.adoptStoryboardShotVersion(pipelineProject.id, shotId, versionId), "已采用该版本")}
|
||||
onPollStoryboardQuiet={pollStoryboardQuiet}
|
||||
onAdoptBaseAsset={(groupId, assetId) => action(() => api.adoptBaseAsset(pipelineProject.id, { group_id: groupId, asset_id: assetId }), "已采用该候选")}
|
||||
onSetAdoptState={(groupId, state) => action(() => api.setBaseAssetAdopt(pipelineProject.id, { group_id: groupId, state }), state === "adopted" ? "已采用" : "已标为未采用")}
|
||||
onDeleteBaseAsset={(groupId) => action(() => api.deleteBaseAsset(pipelineProject.id, groupId), "已删除")}
|
||||
@@ -1241,7 +1209,6 @@ export function App() {
|
||||
}}
|
||||
// 流程步骤4 · 添加模特工作台命名:同步写回形象资产名称。
|
||||
onRenameModel={(assetId, name) => action(() => api.updateAsset(assetId, { name }), "")}
|
||||
onSkipStoryboard={() => action(() => api.skipStoryboard(pipelineProject.id), "已跳过故事板")}
|
||||
onSubmitVideo={(segmentId, prompt) => action(() => api.submitVideo(pipelineProject.id, { video_segment_id: segmentId, prompt }), "视频片段已提交,生成中…")}
|
||||
onSubmitAllVideos={(prompt) =>
|
||||
action(async () => {
|
||||
|
||||
Reference in New Issue
Block a user