"use client" import { useCallback, useState } from "react" import { UploadIcon } from "lucide-react" import { toast } from "sonner" import { useFileUpload } from "@/hooks/use-file-upload" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { cn } from "@/lib/utils" interface FileImportDialogProps { open: boolean onOpenChange: (open: boolean) => void title: string description?: string accept?: string multiple?: boolean onImport: (files: File[]) => void | Promise } function FileImportDialog({ open, onOpenChange, title, description, accept = "*", multiple = false, onImport, }: FileImportDialogProps) { const [importing, setImporting] = useState(false) const [{ files, isDragging, errors }, actions] = useFileUpload({ accept, multiple, maxFiles: multiple ? 10 : 1, onError: (errs) => { errs.forEach((e) => toast.error(e)) }, }) const handleImport = useCallback(async () => { const rawFiles = files .map((f) => (f.file instanceof File ? f.file : null)) .filter((f): f is File => f != null) if (rawFiles.length === 0) { toast.error("Выберите файл для импорта") return } setImporting(true) try { await onImport(rawFiles) actions.clearFiles() onOpenChange(false) toast.success("Импорт выполнен") } catch (err) { toast.error(err instanceof Error ? err.message : "Ошибка импорта") } finally { setImporting(false) } }, [actions, files, onImport, onOpenChange]) return ( {title} {description && {description}}

Перетащите файл сюда или выберите на диске

{files.length > 0 && (
    {files.map((f) => (
  • {f.file instanceof File ? f.file.name : f.file.name}
  • ))}
)} {errors.map((e) => (

{e}

))}
) } export { FileImportDialog, type FileImportDialogProps }