import { useRef, useState, useCallback, type DragEvent } from 'react'; import { useInputBarStore } from '../store/inputBar'; import { UniversalUpload } from './UniversalUpload'; import { KeyframeUpload } from './KeyframeUpload'; import { PromptInput } from './PromptInput'; import { Toolbar } from './Toolbar'; import { AssetLibraryModal } from './AssetLibraryModal'; import { showToast } from './Toast'; import styles from './InputBar.module.css'; export function InputBar() { const mode = useInputBarStore((s) => s.mode); const addReferences = useInputBarStore((s) => s.addReferences); const setFirstFrame = useInputBarStore((s) => s.setFirstFrame); const barRef = useRef(null); const handleDragOver = useCallback((e: DragEvent) => { e.preventDefault(); // 只有外部文件拖入时才显示蓝色边框(内部 mention 标签拖拽不触发) if (e.dataTransfer.types.includes('Files') && barRef.current) { barRef.current.style.borderColor = '#00b8e6'; } }, []); const handleDragLeave = useCallback(() => { if (barRef.current) { barRef.current.style.borderColor = '#2a2a38'; } }, []); const handleDrop = useCallback((e: DragEvent) => { e.preventDefault(); if (barRef.current) { barRef.current.style.borderColor = '#2a2a38'; } const IMAGE_MAX = 30 * 1024 * 1024; const VIDEO_MAX = 50 * 1024 * 1024; const AUDIO_MAX = 15 * 1024 * 1024; const files = Array.from(e.dataTransfer.files).filter( (f) => f.type.startsWith('image/') || f.type.startsWith('video/') || f.type.startsWith('audio/') ); if (!files.length) return; const valid: File[] = []; for (const f of files) { let limit: number; let limitLabel: string; if (f.type.startsWith('video/')) { limit = VIDEO_MAX; limitLabel = '视频文件不能超过50MB'; } else if (f.type.startsWith('audio/')) { limit = AUDIO_MAX; limitLabel = '音频文件不能超过15MB'; } else { limit = IMAGE_MAX; limitLabel = '图片文件不能超过30MB'; } if (f.size > limit) { showToast(limitLabel); } else { valid.push(f); } } if (!valid.length) return; if (mode === 'universal') { addReferences(valid); } else { const imageFiles = valid.filter((f) => f.type.startsWith('image/')); if (imageFiles.length > 0) { setFirstFrame(imageFiles[0]); } } }, [mode, addReferences, setFirstFrame]); const [assetModalOpen, setAssetModalOpen] = useState(false); const searchMode = useInputBarStore((s) => s.searchMode); const setSearchMode = useInputBarStore((s) => s.setSearchMode); const seed = useInputBarStore((s) => s.seed); const seedEnabled = useInputBarStore((s) => s.seedEnabled); const setSeed = useInputBarStore((s) => s.setSeed); const setSeedEnabled = useInputBarStore((s) => s.setSeedEnabled); const references = useInputBarStore((s) => s.references); const editorHtml = useInputBarStore((s) => s.editorHtml); const firstFrame = useInputBarStore((s) => s.firstFrame); const lastFrame = useInputBarStore((s) => s.lastFrame); // 联网搜索暂未开放 const searchDisabled = true; return (
{/* 素材库 + 联网搜索按钮 — 输入框上方 */}
{/* Upper area: Upload + Prompt */}
{mode === 'universal' ? : }
{/* Divider */}
{/* Toolbar */}
setAssetModalOpen(false)} />
); }