Skip to content

Commit 3098622

Browse files
committed
Merge branch 'pr/1082'
2 parents 3646495 + 0e33641 commit 3098622

2 files changed

Lines changed: 94 additions & 36 deletions

File tree

src/components/MessageInputActions/Attach.tsx

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Fragment, useRef, useState } from 'react';
1818
import { useChat } from '@/lib/hooks/useChat';
1919
import { AnimatePresence } from 'motion/react';
2020
import { motion } from 'framer-motion';
21+
import { toast } from 'sonner';
2122

2223
const Attach = () => {
2324
const { files, setFiles, setFileIds, fileIds } = useChat();
@@ -26,31 +27,59 @@ const Attach = () => {
2627
const fileInputRef = useRef<any>();
2728

2829
const handleChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
29-
setLoading(true);
30-
const data = new FormData();
30+
const selectedFiles = e.target.files;
3131

32-
for (let i = 0; i < e.target.files!.length; i++) {
33-
data.append('files', e.target.files![i]);
32+
if (!selectedFiles?.length) {
33+
return;
3434
}
3535

36-
const embeddingModelProvider = localStorage.getItem(
37-
'embeddingModelProviderId',
38-
);
39-
const embeddingModel = localStorage.getItem('embeddingModelKey');
36+
setLoading(true);
37+
38+
try {
39+
const data = new FormData();
40+
41+
for (let i = 0; i < selectedFiles.length; i++) {
42+
data.append('files', selectedFiles[i]);
43+
}
44+
45+
const embeddingModelProvider = localStorage.getItem(
46+
'embeddingModelProviderId',
47+
);
48+
const embeddingModel = localStorage.getItem('embeddingModelKey');
4049

41-
data.append('embedding_model_provider_id', embeddingModelProvider!);
42-
data.append('embedding_model_key', embeddingModel!);
50+
if (!embeddingModelProvider || !embeddingModel) {
51+
throw new Error('Please select an embedding model before uploading.');
52+
}
4353

44-
const res = await fetch(`/api/uploads`, {
45-
method: 'POST',
46-
body: data,
47-
});
54+
data.append('embedding_model_provider_id', embeddingModelProvider);
55+
data.append('embedding_model_key', embeddingModel);
4856

49-
const resData = await res.json();
57+
const res = await fetch(`/api/uploads`, {
58+
method: 'POST',
59+
body: data,
60+
});
5061

51-
setFiles([...files, ...resData.files]);
52-
setFileIds([...fileIds, ...resData.files.map((file: any) => file.fileId)]);
53-
setLoading(false);
62+
const resData = await res.json().catch(() => ({}));
63+
64+
if (!res.ok) {
65+
throw new Error(resData.message || 'Failed to upload file(s).');
66+
}
67+
68+
if (!Array.isArray(resData.files)) {
69+
throw new Error('Invalid upload response from server.');
70+
}
71+
72+
setFiles([...files, ...resData.files]);
73+
setFileIds([
74+
...fileIds,
75+
...resData.files.map((file: any) => file.fileId),
76+
]);
77+
} catch (err: any) {
78+
toast(err?.message || 'Failed to upload file(s).');
79+
} finally {
80+
setLoading(false);
81+
e.target.value = '';
82+
}
5483
};
5584

5685
return loading ? (

src/components/MessageInputActions/AttachSmall.tsx

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Fragment, useRef, useState } from 'react';
99
import { useChat } from '@/lib/hooks/useChat';
1010
import { AnimatePresence } from 'motion/react';
1111
import { motion } from 'framer-motion';
12+
import { toast } from 'sonner';
1213

1314
const 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

Comments
 (0)