fix(phase9): 修复eslint错误与unit test时序问题

- 删除未使用的CheckCircleOutlined import
- 将SMART_MATCH_REASONS和AI_TITLE_TEMPLATES移到组件外,消除react-hooks/exhaustive-deps警告
- presetVoices使用useMemo包裹,避免引用不稳定导致的依赖警告
- 将handleRetryGenerate移到handleGenerate定义之后,修复TDZ初始化时序错误
This commit is contained in:
2026-07-20 08:23:56 +08:00
parent df47a9fc69
commit 31bc1d1996
+35 -32
View File
@@ -4,14 +4,13 @@
* 左右布局:左侧 generate-form + 右侧 generate-preview
* 保留所有现有业务逻辑(API 调用、URL 参数、CloneModal、TTS 等)
*/
import React, { useState, useRef, useCallback, useEffect } from "react"
import React, { useState, useRef, useCallback, useEffect, useMemo } from "react"
import { useQuery, useMutation } from "@tanstack/react-query"
import { Typography, message, Select, Modal } from "antd"
import {
AudioOutlined,
ThunderboltOutlined,
CheckCircleFilled,
CheckCircleOutlined,
CloseCircleOutlined,
LoadingOutlined,
PlayCircleOutlined,
@@ -253,6 +252,30 @@ const SMART_MATCH_REASONS = [
"人物表情生动",
]
const AI_TITLE_TEMPLATES: Record<string, string[]> = {
catchy: [
"震惊!{topic}居然还能这样操作",
"99%的人都不知道的{topic}秘诀",
"{topic}的终极指南,看完直接封神",
"别再走弯路了!{topic}看这一篇就够",
"一个视频讲透{topic},建议收藏",
],
emotional: [
"致每一个在{topic}路上坚持的人",
"关于{topic},我想说句真心话",
"{topic}背后的故事,看完沉默了",
"为什么我劝你一定要了解{topic}",
"这才是{topic}最动人的样子",
],
informative: [
"{topic}完整科普:从入门到精通",
"深度解析{topic}的核心原理",
"{topic}行业趋势报告|2026最新版",
"三分钟带你全面了解{topic}",
"{topic}常见问题与解决方案汇总",
],
}
/* ================================================================
组件
================================================================ */
@@ -466,7 +489,10 @@ const GeneratePage: React.FC = () => {
queryKey: ["preset-voices"],
queryFn: fetchPresetVoices,
})
const presetVoices: PresetVoiceItem[] = presetVoicesData?.items ?? []
const presetVoices: PresetVoiceItem[] = useMemo(
() => presetVoicesData?.items ?? [],
[presetVoicesData],
)
/* ── TTS 自定义合成状态 ── */
const [customAudioUrl, setCustomAudioUrl] = useState<string | null>(null)
@@ -598,29 +624,6 @@ const GeneratePage: React.FC = () => {
}, [])
/* ── 智能标题生成 ── */
const AI_TITLE_TEMPLATES: Record<string, string[]> = {
catchy: [
"震惊!{topic}居然还能这样操作",
"99%的人都不知道的{topic}秘诀",
"{topic}的终极指南,看完直接封神",
"别再走弯路了!{topic}看这一篇就够",
"一个视频讲透{topic},建议收藏",
],
emotional: [
"致每一个在{topic}路上坚持的人",
"关于{topic},我想说句真心话",
"{topic}背后的故事,看完沉默了",
"为什么我劝你一定要了解{topic}",
"这才是{topic}最动人的样子",
],
informative: [
"{topic}完整科普:从入门到精通",
"深度解析{topic}的核心原理",
"{topic}行业趋势报告|2026最新版",
"三分钟带你全面了解{topic}",
"{topic}常见问题与解决方案汇总",
],
}
const extractTopic = (text: string): string => {
const keywords = text
@@ -766,12 +769,6 @@ const GeneratePage: React.FC = () => {
return { label: "即将完成", icon: "✨" }
}
/* 重新生成(失败后重试) */
const handleRetryGenerate = useCallback(() => {
setGenerateError(null)
handleGenerate()
}, [handleGenerate])
const handleCloneSuccess = useCallback(
(voice: VoiceClone) => {
addClone(voice)
@@ -1209,6 +1206,12 @@ const GeneratePage: React.FC = () => {
smartSelectedIds,
])
/* 重新生成(失败后重试) */
const handleRetryGenerate = useCallback(() => {
setGenerateError(null)
handleGenerate()
}, [handleGenerate])
/* ── 下载视频 ── */
const handleDownload = useCallback(async () => {
if (!generatedVideos.length) return