@@ -9,6 +9,7 @@ import { Fragment, useRef, useState } from 'react';
99import { useChat } from '@/lib/hooks/useChat' ;
1010import { AnimatePresence } from 'motion/react' ;
1111import { motion } from 'framer-motion' ;
12+ import { toast } from 'sonner' ;
1213
1314const AttachSmall = ( ) => {
1415 const { files, setFiles, setFileIds, fileIds } = useChat ( ) ;
@@ -17,31 +18,59 @@ const AttachSmall = () => {
1718 const fileInputRef = useRef < any > ( ) ;
1819
1920 const handleChange = async ( e : React . ChangeEvent < HTMLInputElement > ) => {
20- setLoading ( true ) ;
21- const data = new FormData ( ) ;
21+ const selectedFiles = e . target . files ;
2222
23- for ( let i = 0 ; i < e . target . files ! . length ; i ++ ) {
24- data . append ( 'files' , e . target . files ! [ i ] ) ;
23+ if ( ! selectedFiles ? .length ) {
24+ return ;
2525 }
2626
27- const embeddingModelProvider = localStorage . getItem (
28- 'embeddingModelProviderId' ,
29- ) ;
30- const embeddingModel = localStorage . getItem ( 'embeddingModelKey' ) ;
27+ setLoading ( true ) ;
28+
29+ try {
30+ const data = new FormData ( ) ;
31+
32+ for ( let i = 0 ; i < selectedFiles . length ; i ++ ) {
33+ data . append ( 'files' , selectedFiles [ i ] ) ;
34+ }
35+
36+ const embeddingModelProvider = localStorage . getItem (
37+ 'embeddingModelProviderId' ,
38+ ) ;
39+ const embeddingModel = localStorage . getItem ( 'embeddingModelKey' ) ;
3140
32- data . append ( 'embedding_model_provider_id' , embeddingModelProvider ! ) ;
33- data . append ( 'embedding_model_key' , embeddingModel ! ) ;
41+ if ( ! embeddingModelProvider || ! embeddingModel ) {
42+ throw new Error ( 'Please select an embedding model before uploading.' ) ;
43+ }
3444
35- const res = await fetch ( `/api/uploads` , {
36- method : 'POST' ,
37- body : data ,
38- } ) ;
45+ data . append ( 'embedding_model_provider_id' , embeddingModelProvider ) ;
46+ data . append ( 'embedding_model_key' , embeddingModel ) ;
3947
40- const resData = await res . json ( ) ;
48+ const res = await fetch ( `/api/uploads` , {
49+ method : 'POST' ,
50+ body : data ,
51+ } ) ;
4152
42- setFiles ( [ ...files , ...resData . files ] ) ;
43- setFileIds ( [ ...fileIds , ...resData . files . map ( ( file : any ) => file . fileId ) ] ) ;
44- setLoading ( false ) ;
53+ const resData = await res . json ( ) . catch ( ( ) => ( { } ) ) ;
54+
55+ if ( ! res . ok ) {
56+ throw new Error ( resData . message || 'Failed to upload file(s).' ) ;
57+ }
58+
59+ if ( ! Array . isArray ( resData . files ) ) {
60+ throw new Error ( 'Invalid upload response from server.' ) ;
61+ }
62+
63+ setFiles ( [ ...files , ...resData . files ] ) ;
64+ setFileIds ( [
65+ ...fileIds ,
66+ ...resData . files . map ( ( file : any ) => file . fileId ) ,
67+ ] ) ;
68+ } catch ( err : any ) {
69+ toast ( err ?. message || 'Failed to upload file(s).' ) ;
70+ } finally {
71+ setLoading ( false ) ;
72+ e . target . value = '' ;
73+ }
4574 } ;
4675
4776 return loading ? (
0 commit comments