'use client' import { cn } from '@langgenius/dify-ui/cn' import { useId, useState } from 'react' import { useTranslation } from 'react-i18next' import { DOCUMENT_UPLOAD_ACCEPT, documentUploadFileExtension, documentUploadIssue, } from './document-upload-policy' import { createRequestId } from './request-id' const PREVIEWABLE_EXTENSIONS = new Set(['doc', 'docx', 'html', 'markdown', 'md', 'pdf', 'txt']) export type QueuedUpload = { file: File id: string issue?: 'fileSize' | 'fileType' } function createQueuedUpload(file: File): QueuedUpload { return { file, id: `${file.name}:${file.size}:${file.lastModified}:${createRequestId()}`, issue: documentUploadIssue(file), } } function formatFileSize(bytes: number) { if (bytes < 1024) return `${bytes} B` if (bytes < 1024 * 1024) return `${Math.ceil(bytes / 1024)} KB` return `${(bytes / (1024 * 1024)).toFixed(1)} MB` } function fileBadge(file: File) { return documentUploadFileExtension(file.name).toLocaleUpperCase() || 'FILE' } function mergeFiles(current: QueuedUpload[], files: File[]) { const fingerprints = new Set( current.map(({ file }) => `${file.name}:${file.size}:${file.lastModified}`), ) return [ ...current, ...files.flatMap((file) => { const fingerprint = `${file.name}:${file.size}:${file.lastModified}` if (fingerprints.has(fingerprint)) return [] fingerprints.add(fingerprint) return [createQueuedUpload(file)] }), ] } export function CreateUploadQueue({ disabled, uploading, uploads, onChange, }: { disabled: boolean uploading: boolean uploads: QueuedUpload[] onChange: (uploads: QueuedUpload[]) => void }) { const { t } = useTranslation('dataset') const { t: tCommon } = useTranslation('common') const inputId = useId() const [dragging, setDragging] = useState(false) const previewUnavailable = uploads.some( (upload) => !upload.issue && !uploading && PREVIEWABLE_EXTENSIONS.has(documentUploadFileExtension(upload.file.name)), ) const addFiles = (files: File[]) => { if (!disabled && files.length) onChange(mergeFiles(uploads, files)) } return (
$['newKnowledge.uploadFiles'])} disabled={disabled} onChange={(event) => { addFiles([...(event.currentTarget.files ?? [])]) event.currentTarget.value = '' }} /> {!!uploads.length && ( )} {previewUnavailable && (

{t(($) => $['newKnowledge.previewUnavailable'])}

)}
) }