@@ -50,9 +50,6 @@ const TEXT_EXTENSIONS = new Set([
"yml" , "toml" , "ini" , "sh" , "ps1" , "bat" , "sql" , "env" , "gitignore" ,
] ) ;
const MAX_IMAGE_SIZE = 3 * 1024 * 1024 ;
const MAX_TEXT_SIZE = 100 * 1024 ;
export default function ChatPage() {
const models = useStore ( ( s ) = > s . models ) ;
const conversations = useStore ( ( s ) = > s . conversations ) ;
@@ -75,6 +72,7 @@ export default function ChatPage() {
const [ editingDraft , setEditingDraft ] = useState ( "" ) ;
const [ versionsFor , setVersionsFor ] = useState < Record < string , MessageVersion [ ] > > ( { } ) ;
const [ attachments , setAttachments ] = useState < Attachment [ ] > ( [ ] ) ;
const [ uploadLimitMb , setUploadLimitMb ] = useState ( 10 ) ;
const bottomRef = useRef < HTMLDivElement > ( null ) ;
const fileInputRef = useRef < HTMLInputElement > ( null ) ;
@@ -104,6 +102,13 @@ export default function ChatPage() {
}
} , [ models , selectedModelId ] ) ;
useEffect ( ( ) = > {
api . settingsGet ( ) . then ( ( s ) = > {
const v = Number ( s . upload_max_mb ) ;
if ( v > 0 ) setUploadLimitMb ( v ) ;
} ) ;
} , [ ] ) ;
useEffect ( ( ) = > {
bottomRef . current ? . scrollIntoView ( { behavior : "smooth" } ) ;
} , [ messages ] ) ;
@@ -302,11 +307,12 @@ export default function ChatPage() {
}
async function handleFiles ( files : FileList | File [ ] ) {
const maxBytes = uploadLimitMb * 1024 * 1024 ;
for ( const file of Array . from ( files ) ) {
const ext = file . name . split ( "." ) . pop ( ) ? . toLowerCase ( ) ? ? "" ;
if ( file . type . startsWith ( "image/" ) || [ "png" , "jpg" , "jpeg" , "webp" , "gif" , "bmp" ] . includes ( ext ) ) {
if ( file . size > MAX_IMAGE_SIZE ) {
setError ( ` 图片 ${ file . name } 超过 3 MB,已跳过 ` ) ;
if ( file . size > maxBytes ) {
setError ( ` 图片 ${ file . name } 超过上限 ${ uploadLimitMb } MB,已跳过 ` ) ;
continue ;
}
const dataUrl = await readAsDataUrl ( file ) ;
@@ -315,8 +321,8 @@ export default function ChatPage() {
{ id : crypto.randomUUID ( ) , kind : "image" , name : file.name , size : file.size , dataUrl } ,
] ) ;
} else if ( file . type . startsWith ( "text/" ) || TEXT_EXTENSIONS . has ( ext ) ) {
if ( file . size > MAX_TEXT_SIZE ) {
setError ( ` 文件 ${ file . name } 超过 100K B,已跳过 ` ) ;
if ( file . size > maxBytes ) {
setError ( ` 文件 ${ file . name } 超过上限 ${ uploadLimitMb } M B,已跳过` ) ;
continue ;
}
const text = await file . text ( ) ;
@@ -468,7 +474,7 @@ export default function ChatPage() {
< button
className = "mb-1 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-panel-2 text-slate-400 hover:bg-panel-2/60 hover:text-slate-200"
onClick = { ( ) = > fileInputRef . current ? . click ( ) }
title = " 上传图片或文本文件"
title = { ` 上传图片或文本文件(上限 ${ uploadLimitMb } MB) ` }
>
< Icon name = "paperclip" className = "h-4 w-4" / >
< / button >