mirror of https://github.com/FlowiseAI/Flowise.git
89 lines
2.8 KiB
JavaScript
89 lines
2.8 KiB
JavaScript
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
|
|
}
|