|
import { useState } from 'react' |
|
import PropTypes from 'prop-types' |
|
import { useTheme } from '@mui/material/styles' |
|
import { FormControl, Button } from '@mui/material' |
|
import { IconUpload } from '@tabler/icons' |
|
import { getFileName } from 'utils/genericHelper' |
|
|
|
export const File = ({ value, fileType, onChange, disabled = false }) => { |
|
const theme = useTheme() |
|
|
|
const [myValue, setMyValue] = useState(value ?? '') |
|
|
|
const handleFileUpload = async (e) => { |
|
if (!e.target.files) return |
|
|
|
if (e.target.files.length === 1) { |
|
const file = e.target.files[0] |
|
const { name } = file |
|
|
|
const reader = new FileReader() |
|
reader.onload = (evt) => { |
|
if (!evt?.target?.result) { |
|
return |
|
} |
|
const { result } = evt.target |
|
|
|
const value = result + `,filename:${name}` |
|
|
|
setMyValue(value) |
|
onChange(value) |
|
} |
|
reader.readAsDataURL(file) |
|
} else if (e.target.files.length > 0) { |
|
let files = Array.from(e.target.files).map((file) => { |
|
const reader = new FileReader() |
|
const { name } = file |
|
|
|
return new Promise((resolve) => { |
|
reader.onload = (evt) => { |
|
if (!evt?.target?.result) { |
|
return |
|
} |
|
const { result } = evt.target |
|
const value = result + `,filename:${name}` |
|
resolve(value) |
|
} |
|
reader.readAsDataURL(file) |
|
}) |
|
}) |
|
|
|
const res = await Promise.all(files) |
|
setMyValue(JSON.stringify(res)) |
|
onChange(JSON.stringify(res)) |
|
} |
|
} |
|
|
|
return ( |
|
<FormControl sx={{ mt: 1, width: '100%' }} size='small'> |
|
<span |
|
style={{ |
|
fontStyle: 'italic', |
|
color: theme.palette.grey['800'], |
|
marginBottom: '1rem' |
|
}} |
|
> |
|
{myValue ? getFileName(myValue) : 'Choose a file to upload'} |
|
</span> |
|
<Button |
|
disabled={disabled} |
|
variant='outlined' |
|
component='label' |
|
fullWidth |
|
startIcon={<IconUpload />} |
|
sx={{ marginRight: '1rem' }} |
|
> |
|
{'Upload File'} |
|
<input type='file' multiple accept={fileType} hidden onChange={(e) => handleFileUpload(e)} /> |
|
</Button> |
|
</FormControl> |
|
) |
|
} |
|
|
|
File.propTypes = { |
|
value: PropTypes.string, |
|
fileType: PropTypes.string, |
|
onChange: PropTypes.func, |
|
disabled: PropTypes.bool |
|
} |
|
|