From 5d2c63ced15af179571d82f574d50fd74cc8c5f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E4=BD=B3=E8=89=BA?= <13935794190@163.com> Date: Mon, 3 Aug 2026 13:47:39 +0800 Subject: [PATCH] =?UTF-8?q?ai=E5=88=9B=E5=BB=BA=E6=9B=BF=E6=8D=A2=E7=BC=A9?= =?UTF-8?q?=E7=95=A5=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- video-gen-app/src/pages/GenerateConver.tsx | 185 ++++++++------------- 1 file changed, 69 insertions(+), 116 deletions(-) diff --git a/video-gen-app/src/pages/GenerateConver.tsx b/video-gen-app/src/pages/GenerateConver.tsx index 12fb5305..4fe580bb 100644 --- a/video-gen-app/src/pages/GenerateConver.tsx +++ b/video-gen-app/src/pages/GenerateConver.tsx @@ -18,10 +18,6 @@ import { App, } from 'antd'; -import bg1 from '../assets/bg1.png'; -import bg2 from '../assets/bg2.png'; -import bg3 from '../assets/bg3.png'; -import text from '../assets/testb.png'; import UploadSelector from '../components/UploadSelector'; import GenerationTaskResourceGrid from '../components/generation/GenerationTaskResourceGrid'; @@ -313,8 +309,7 @@ const AIChatPage: React.FC = () => { } }, [previewVisible, previewType]); - // 提示词展开状态 - const [expandedPrompts, setExpandedPrompts] = useState>(new Set()); + // 从URL中提取exp时间戳(支持相对路径和完整URL) const extractExpTimestamp = (url: string): number | null => { @@ -947,56 +942,6 @@ const AIChatPage: React.FC = () => { setLastFrame(null); }; - // ==================== 事处理函数 ==================== - - const handleNewChat = () => { - // 生成唯一ID(使用时间戳) - const newId = Date.now().toString(); - const newConversation: Conversation = { - id: newId, - title: '新对话', - lastMessage: '', - timestamp: new Date().toLocaleString('zh-CN'), - messages: [], - }; - - // 将新对话插入到列表顶部 - setConversations((prev) => [newConversation, ...prev]); - // 切换到新对话 - setCurrentConversationId(newId); - // 清空输入框和已上传媒体 - setInputValue(''); - setCurrentMedia([]); - setFirstFrame(null); - setLastFrame(null); - // 显示提示消息 - antdMessage.info('已开启新对话'); - - }; - - - const handleDeleteChat = (conversationId: string) => { - // 过滤掉要删除的对话 - setConversations((prev) => prev.filter((c) => c.id !== conversationId)); - // 如果删除的是当前选中的对话,切换到其他对话 - if (currentConversationId === conversationId) { - setCurrentConversationId( - conversations[0]?.id === conversationId - ? conversations[1]?.id || null - : conversations[0]?.id || null - ); - } - // 显示成功提示 - antdMessage.success('对话已删除'); - }; - - - const handleSelectChat = (conversationId: string) => { - setCurrentConversationId(conversationId); - setCurrentMedia([]); - setFirstFrame(null); - setLastFrame(null); - }; const handleSend = async () => { @@ -1873,12 +1818,60 @@ const AIChatPage: React.FC = () => { return false; }; + // 检测文本是否包含中文字符 + const isChineseText = (text: string): boolean => { + return /[\u4e00-\u9fa5]/.test(text); + }; + + // 统计字数:中文按字符计数,英文按单词计数 + const countInput = (text: string): number => { + if (!text.trim()) return 0; + if (isChineseText(text)) { + // 中文:按字符数(不含空白) + return text.replace(/\s/g, '').length; + } else { + // 英文:按单词数 + const words = text.trim().split(/\s+/); + return words[0] === '' ? 0 : words.length; + } + }; + + // 获取最大限制,默认显示500 + const getMaxLimit = (text: string): number => { + if (!text.trim()) return 500; + return isChineseText(text) ? 500 : 1000; + }; + // 输入框变化处理 const handleInputChange = (e: React.ChangeEvent) => { const value = e.target.value; - setInputValue(value); - const textarea = e.target; - checkMention(textarea, value); + const maxLimit = getMaxLimit(value); + const count = countInput(value); + if (count <= maxLimit) { + setInputValue(value); + checkMention(e.target, value); + } else { + // 截断到限制内 + if (isChineseText(value)) { + let trimmed = value; + let cjkCount = 0; + for (let i = 0; i < value.length; i++) { + if (/\s/.test(value[i])) continue; + cjkCount++; + if (cjkCount > maxLimit) { + trimmed = value.slice(0, i); + break; + } + } + setInputValue(trimmed); + checkMention(e.target, trimmed); + } else { + const words = value.trim().split(/\s+/); + const limited = words.slice(0, maxLimit).join(' '); + setInputValue(limited); + checkMention(e.target, limited); + } + } }; // 键盘事件处理(ESC 关闭提及、Tab/Enter 选择) @@ -2414,60 +2407,7 @@ const AIChatPage: React.FC = () => { - {/* 文本内容 */} - {/*
{ - setExpandedPrompts(prev => { - const newSet = new Set(prev); - newSet.add(msg.id); - return newSet; - }); - }} - onMouseLeave={() => { - setExpandedPrompts(prev => { - const newSet = new Set(prev); - newSet.delete(msg.id); - return newSet; - }); - }} - > - 默认显示:一行省略 -
- {msg.originalPrompt} -
- - 鼠标移入显示:完整内容 -
- {msg.originalPrompt} -
-
*/} + {/* 根据 status 显示不同内容 */} {(msg.status === 'generating' || msg.status === 'failed' || msg.status === 'completed') && ( @@ -3304,6 +3244,19 @@ const AIChatPage: React.FC = () => { disabled={loading} /> + {/* 字数统计 */} +
+ getMaxLimit(inputValue) ? '#ef4444' : '#9ca3af', + }}> + {countInput(inputValue)} / {getMaxLimit(inputValue)} + +
+ {/* @ 提及下拉列表 */} {mentionVisible && currentMedia.length > 0 && referenceMode === 'universal' && (
{ width={800} footer={
- + */}
} centered @@ -4769,7 +4722,7 @@ const AIChatPage: React.FC = () => {
{attachmentPreviewType === 'image' ? ( 预览