/
sigma
/
Acloud
Обзор
Документация
Войти
/
sigma
/
Acloud
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/modules/Files.tsx
63 строки
2 KB
Александр Пимкин
first_commit
17 апр 2025, 11:39
17 апр 2025, 11:39
e24d434
Код
Авторство
О чём код?
import { FileItem } from '@/api/dto/files.dto' import { FileActions } from '@/components/FileActions' import { FileList, FileSelectType } from '@/components/FileList' import { Empty } from 'antd' import React from 'react' import * as Api from '@/api' import { toast, Toaster } from 'sonner' interface FilesProps { items: FileItem[] withActions?: boolean } export const Files: React.FC<FilesProps> = ({ items, withActions }) => { const [files, setFiles] = React.useState(items || []) const [selectedIds, setSelectedIds] = React.useState<number[]>([]) const onFileSelect = (id: number, type: FileSelectType) => { if (type === 'select') { setSelectedIds(prev => [...prev, id]) } else { setSelectedIds(prev => prev.filter(_id => _id !== id)) } } const onClickRemove = () => { setSelectedIds([]) setFiles(prev => prev.filter(file => !selectedIds.includes(file.id))) Api.files.remove(selectedIds) } const onClickDownload = () => { console.log(selectedIds) if (selectedIds.length === 1) { console.log(selectedIds[0]) const myFile = files.find(file => file.id === selectedIds[0]) Api.files.downloadFile(myFile!.id, myFile!.filename, myFile!.mimetype) } else { toast.error('Выберите только один файл!') } } return ( <div> {files.length ? ( <> {withActions && ( <FileActions onClickRemove={onClickRemove} onClickDownload={onClickDownload} isActive={selectedIds.length > 0} /> )} <FileList items={files} onFileSelect={onFileSelect} /> </> ) : ( <Empty className='empty-block' description='Список файлов пуст' /> )} <Toaster position='top-center' /> </div> ) }