mirror of
https://github.com/arkorty/Osborne.git
synced 2026-03-18 00:57:14 +00:00
fix multiple file uploads
This commit is contained in:
@@ -228,6 +228,8 @@ const saveUser = (user: User) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let filesCopy: Array<File>;
|
||||||
|
|
||||||
const Room = () => {
|
const Room = () => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const searchParams = useSearchParams();
|
const searchParams = useSearchParams();
|
||||||
@@ -257,7 +259,7 @@ const Room = () => {
|
|||||||
const [isMobile, setIsMobile] = useState(false);
|
const [isMobile, setIsMobile] = useState(false);
|
||||||
const [fileSizeError, setFileSizeError] = useState<string | null>(null);
|
const [fileSizeError, setFileSizeError] = useState<string | null>(null);
|
||||||
const [purgeError, setPurgeError] = useState<string | null>(null);
|
const [purgeError, setPurgeError] = useState<string | null>(null);
|
||||||
const [uploadProgress, setUploadProgress] = useState<Array<{fileName: string; progress: number; status: 'uploading' | 'completed' | 'error'}>>([]);
|
const [uploadProgress, setUploadProgress] = useState<Array<{id: string; fileName: string; progress: number; status: 'uploading' | 'completed' | 'error'}>>([]);
|
||||||
const [isRecordingOpen, setIsRecordingOpen] = useState(false);
|
const [isRecordingOpen, setIsRecordingOpen] = useState(false);
|
||||||
const [reconnectAttempts, setReconnectAttempts] = useState(0);
|
const [reconnectAttempts, setReconnectAttempts] = useState(0);
|
||||||
const [isReconnecting, setIsReconnecting] = useState(false);
|
const [isReconnecting, setIsReconnecting] = useState(false);
|
||||||
@@ -798,21 +800,23 @@ const Room = () => {
|
|||||||
|
|
||||||
// Initialize progress for all files
|
// Initialize progress for all files
|
||||||
const initialProgress = Array.from(files).map(file => ({
|
const initialProgress = Array.from(files).map(file => ({
|
||||||
|
id: `${file.name}-${Date.now()}-${Math.random()}`,
|
||||||
fileName: file.name,
|
fileName: file.name,
|
||||||
progress: 0,
|
progress: 0,
|
||||||
status: 'uploading' as const
|
status: 'uploading' as const
|
||||||
}));
|
}));
|
||||||
setUploadProgress(initialProgress);
|
setUploadProgress(prev => [...prev, ...initialProgress]);
|
||||||
|
|
||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
const file = files[i];
|
const file = files[i];
|
||||||
|
const uploadId = initialProgress[i].id;
|
||||||
|
|
||||||
// Check file size limit
|
// Check file size limit
|
||||||
if (file.size > maxFileSize) {
|
if (file.size > maxFileSize) {
|
||||||
const fileSizeInMB = (file.size / (1024 * 1024)).toFixed(2);
|
const fileSizeInMB = (file.size / (1024 * 1024)).toFixed(2);
|
||||||
setFileSizeError(`File "${file.name}" (${fileSizeInMB}MB) exceeds 10MB limit`);
|
setFileSizeError(`File "${file.name}" (${fileSizeInMB}MB) exceeds 10MB limit`);
|
||||||
setUploadProgress(prev => prev.map(p =>
|
setUploadProgress(prev => prev.map(p =>
|
||||||
p.fileName === file.name ? { ...p, status: 'error' as const } : p
|
p.id === uploadId ? { ...p, status: 'error' as const } : p
|
||||||
));
|
));
|
||||||
continue; // Skip this file and continue with others
|
continue; // Skip this file and continue with others
|
||||||
}
|
}
|
||||||
@@ -832,7 +836,7 @@ const Room = () => {
|
|||||||
if (e.lengthComputable) {
|
if (e.lengthComputable) {
|
||||||
const progress = Math.round((e.loaded / e.total) * 100);
|
const progress = Math.round((e.loaded / e.total) * 100);
|
||||||
setUploadProgress(prev => prev.map(p =>
|
setUploadProgress(prev => prev.map(p =>
|
||||||
p.fileName === file.name ? { ...p, progress } : p
|
p.id === uploadId ? { ...p, progress } : p
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -840,7 +844,7 @@ const Room = () => {
|
|||||||
xhr.addEventListener('load', () => {
|
xhr.addEventListener('load', () => {
|
||||||
if (xhr.status >= 200 && xhr.status < 300) {
|
if (xhr.status >= 200 && xhr.status < 300) {
|
||||||
setUploadProgress(prev => prev.map(p =>
|
setUploadProgress(prev => prev.map(p =>
|
||||||
p.fileName === file.name ? { ...p, progress: 100, status: 'completed' as const } : p
|
p.id === uploadId ? { ...p, progress: 100, status: 'completed' as const } : p
|
||||||
));
|
));
|
||||||
resolve();
|
resolve();
|
||||||
} else {
|
} else {
|
||||||
@@ -860,15 +864,16 @@ const Room = () => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error uploading file:", error);
|
console.error("Error uploading file:", error);
|
||||||
setUploadProgress(prev => prev.map(p =>
|
setUploadProgress(prev => prev.map(p =>
|
||||||
p.fileName === file.name ? { ...p, status: 'error' as const } : p
|
p.id === uploadId ? { ...p, status: 'error' as const } : p
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear progress after a delay
|
// Remove completed files from this batch after a delay
|
||||||
|
const uploadIds = initialProgress.map(p => p.id);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setUploadProgress([]);
|
setUploadProgress(prev => prev.filter(p => !uploadIds.includes(p.id)));
|
||||||
}, 3000);
|
}, 2000);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleFileDelete = async (fileId: string) => {
|
const handleFileDelete = async (fileId: string) => {
|
||||||
@@ -1089,7 +1094,12 @@ const Room = () => {
|
|||||||
accept="image/*,video/*,audio/*,.pdf,.txt,.json,.xml,.csv"
|
accept="image/*,video/*,audio/*,.pdf,.txt,.json,.xml,.csv"
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
if (e.target.files) {
|
if (e.target.files) {
|
||||||
handleFileUpload(e.target.files);
|
// Copy the FileList to prevent it from being cleared when input is reset
|
||||||
|
filesCopy = Array.from(e.target.files);
|
||||||
|
const dataTransfer = new DataTransfer();
|
||||||
|
filesCopy.forEach(file => dataTransfer.items.add(file));
|
||||||
|
|
||||||
|
handleFileUpload(dataTransfer.files);
|
||||||
// Reset the input so the same file can be selected again
|
// Reset the input so the same file can be selected again
|
||||||
e.target.value = "";
|
e.target.value = "";
|
||||||
}
|
}
|
||||||
@@ -1165,7 +1175,9 @@ const Room = () => {
|
|||||||
<Card className="max-w-md animate-in fade-in slide-in-from-bottom-4 duration-300">
|
<Card className="max-w-md animate-in fade-in slide-in-from-bottom-4 duration-300">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-lg text-center">
|
<CardTitle className="text-lg text-center">
|
||||||
Uploading Files
|
{filesCopy && filesCopy.length > 1
|
||||||
|
? 'Uploading Files'
|
||||||
|
: 'Uploading File'}
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className="space-y-4">
|
<CardContent className="space-y-4">
|
||||||
|
|||||||
Reference in New Issue
Block a user