diff --git a/apps/web/src/pages/generate/GeneratePage.tsx b/apps/web/src/pages/generate/GeneratePage.tsx index 61a47477e..ffe3431d4 100644 --- a/apps/web/src/pages/generate/GeneratePage.tsx +++ b/apps/web/src/pages/generate/GeneratePage.tsx @@ -21,6 +21,7 @@ import { getAssets, getAssetLibraries } from "@/api/assets"; import { createEditPlan, generateEditPlan } from "@/api/editPlans"; import { getEditingTemplates } from "@/api/editingPlanner"; import { MODE_LABELS, type TemplateMode } from "@/api/editingPlanner"; +import { getTitles } from "@/api/titles"; import apiClient from "@/api/client"; import { fetchPresetVoices } from "@/api/voices"; import type { PresetVoiceItem } from "@/api/voices"; @@ -95,14 +96,7 @@ const STEPS = [ { key: 5, label: "确认生成" }, ]; -/* ── 标题选项 Mock ── */ -const TITLE_OPTIONS = [ - "3秒抓住注意力,30秒讲清卖点", - "产品种草 | 一分钟了解核心优势", - "客户真实反馈,看完你就懂了", - "行业干货分享,建议收藏", - "新品首发,限时优惠不容错过", -]; +/* ── 标题选项从 API 加载,不再硬编码 ── */ /* ================================================================ 组件 @@ -131,6 +125,18 @@ const GeneratePage: React.FC = () => { /* ── 标题 ── */ const [title, setTitle] = useState(""); + const { data: userTitles = [] } = useQuery({ + queryKey: ["generate-titles"], + queryFn: () => getTitles(), + staleTime: 60_000, + }); + /* 当选中模板开启了「AI自动匹配标题」,自动填入模板预设标题 */ + useEffect(() => { + const tpl = userTemplates.find((t) => t.id === selectedTemplate); + if (tpl?.title_config?.ai_auto_select && tpl.title_config.content) { + setTitle(tpl.title_config.content); + } + }, [selectedTemplate, userTemplates]); /* ── 配音 ── */ const [selectedVoice, setSelectedVoice] = useState(""); @@ -698,12 +704,12 @@ const GeneratePage: React.FC = () => {

📝 选择标题

- + @@ -717,6 +723,11 @@ const GeneratePage: React.FC = () => { maxLength={50} />
+ {userTitles.length === 0 && ( +

+ 标题库为空,请前往「标题管理」添加标题,或手动输入 +

+ )}
);