2022-06-29 16:45:38 +05:00
|
|
|
|
import { Link, useNavigate, useParams } from 'react-router-dom'
|
|
|
|
|
import { memo, useCallback, useEffect, useState } from 'react'
|
|
|
|
|
import { InfoCircleFilled, CloseCircleOutlined } from '@ant-design/icons'
|
|
|
|
|
import { Button, Result, Typography } from 'antd'
|
|
|
|
|
|
|
|
|
|
import { downloadFile, invokeWebApiWrapperAsync } from '@components/factory'
|
|
|
|
|
import { wrapPrivateComponent } from '@utils'
|
|
|
|
|
import { FileService, WellService } from '@api'
|
|
|
|
|
|
|
|
|
|
import AccessDenied from './AccessDenied'
|
|
|
|
|
|
|
|
|
|
const { Paragraph, Text } = Typography
|
|
|
|
|
|
|
|
|
|
export const getLinkToFile = (fileInfo) => `/file_download/${fileInfo.idWell}/${fileInfo.id}`
|
|
|
|
|
|
|
|
|
|
const FileDownload = memo(function FileDownload() {
|
|
|
|
|
const { idWell, idFile } = useParams()
|
|
|
|
|
const [well, setWell] = useState({})
|
|
|
|
|
const [file, setFile] = useState({})
|
|
|
|
|
const [isError, setIsError] = useState(false)
|
|
|
|
|
|
|
|
|
|
const navigate = useNavigate()
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
invokeWebApiWrapperAsync(
|
|
|
|
|
async () => setWell(await WellService.get(idWell)),
|
|
|
|
|
null,
|
|
|
|
|
'Не удалось получить информацию о скважине',
|
|
|
|
|
'Получение данных о скважине',
|
|
|
|
|
)
|
|
|
|
|
}, [idWell])
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
invokeWebApiWrapperAsync(
|
|
|
|
|
async () => {
|
|
|
|
|
const files = await FileService.getFilesInfo(idWell)
|
|
|
|
|
// TODO Получается только одна категория файлов.
|
|
|
|
|
// Поменять при появлении метода получения инфы о конкретном файле
|
|
|
|
|
setFile(files.items.find((file) => file.id === idFile) ?? { id: idFile, idWell, name: `File_${idWell}_${idFile}` })
|
|
|
|
|
},
|
|
|
|
|
null,
|
|
|
|
|
() => {
|
|
|
|
|
setIsError(true)
|
|
|
|
|
return 'Не удалось получить информацию о файле'
|
|
|
|
|
},
|
|
|
|
|
'Получение информации о файле'
|
|
|
|
|
)
|
|
|
|
|
}, [idWell, idFile])
|
|
|
|
|
|
|
|
|
|
const download = useCallback(async () => {
|
|
|
|
|
if (!await downloadFile(file))
|
|
|
|
|
setIsError(true)
|
|
|
|
|
}, [file])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Result
|
|
|
|
|
icon={<InfoCircleFilled style={{ color: '#1890ff' }} />}
|
|
|
|
|
title={(
|
|
|
|
|
<>
|
|
|
|
|
Вы перешли к странице загрузки файла!
|
|
|
|
|
<br />
|
|
|
|
|
Файл "{file.name ?? ('№' + idFile)}", скважина "{well.caption ?? ('№' + idWell)}".
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
// subTitle={}
|
|
|
|
|
extra={(
|
|
|
|
|
<>
|
|
|
|
|
<Button type={'ghost'} onClick={() => navigate('/')}>Вернуться на главную</Button>
|
|
|
|
|
<Button type={'primary'} onClick={download}>Загрузить</Button>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
>
|
|
|
|
|
{isError && (
|
|
|
|
|
<div className={'desc'}>
|
|
|
|
|
<Paragraph>
|
|
|
|
|
<Text strong style={{ fontSize: 16 }}>Возможные причины ошибки при попытке скачивания файла:</Text>
|
|
|
|
|
</Paragraph>
|
|
|
|
|
<Paragraph>
|
|
|
|
|
<CloseCircleOutlined style={{ color: 'red' }} />
|
|
|
|
|
У вас отсутствует доступ к файлу.
|
|
|
|
|
<Typography.Link href={'mailto://support@digitaldrilling.ru'} target={'_blank'}>
|
|
|
|
|
Обратиться в поддержку >
|
|
|
|
|
</Typography.Link>
|
|
|
|
|
</Paragraph>
|
|
|
|
|
<Paragraph>
|
|
|
|
|
<CloseCircleOutlined style={{ color: 'red' }} />
|
|
|
|
|
Файла не существует.
|
|
|
|
|
<Link to={'#'} onClick={() => navigate(-1)}>Вернуться назад ></Link>
|
|
|
|
|
</Paragraph>
|
|
|
|
|
<Paragraph>
|
|
|
|
|
<CloseCircleOutlined style={{ color: 'red' }} />
|
|
|
|
|
Разрешения не обновились.
|
|
|
|
|
<Link to={'/login'}>Перезайти в аккаунт ></Link>
|
|
|
|
|
</Paragraph>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</Result>
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
FileDownload.displayName = 'FileDownloadMemo'
|
|
|
|
|
|
|
|
|
|
export default wrapPrivateComponent(FileDownload, {
|
|
|
|
|
requirements: ['File.get'],
|
2022-06-29 18:08:57 +05:00
|
|
|
|
route: 'file_download/:idWell/:idFile/*',
|
2022-06-29 16:45:38 +05:00
|
|
|
|
}, <AccessDenied />)
|