import { useDispatch, useSelector } from 'react-redux' import { useState, useEffect } from 'react' import PropTypes from 'prop-types' import { enqueueSnackbar as enqueueSnackbarAction, closeSnackbar as closeSnackbarAction, SET_CHATFLOW } from '@/store/actions' import parser from 'html-react-parser' // material-ui import { Button, Box, Typography, FormControl, RadioGroup, FormControlLabel, Radio } from '@mui/material' import { IconX, IconBulb } from '@tabler/icons-react' // Project import import { StyledButton } from '@/ui-component/button/StyledButton' import { SwitchInput } from '@/ui-component/switch/Switch' // store import useNotifier from '@/utils/useNotifier' // API import chatflowsApi from '@/api/chatflows' const message = `Uploaded files will be parsed as strings and sent to the LLM. If file upload is enabled on the Vector Store as well, this will override and take precedence.
Refer docs for more details.` const availableFileTypes = [ { name: 'CSS', ext: 'text/css', extension: '.css' }, { name: 'CSV', ext: 'text/csv', extension: '.csv' }, { name: 'HTML', ext: 'text/html', extension: '.html' }, { name: 'JSON', ext: 'application/json', extension: '.json' }, { name: 'Markdown', ext: 'text/markdown', extension: '.md' }, { name: 'YAML', ext: 'application/x-yaml', extension: '.yaml' }, { name: 'PDF', ext: 'application/pdf', extension: '.pdf' }, { name: 'SQL', ext: 'application/sql', extension: '.sql' }, { name: 'Text File', ext: 'text/plain', extension: '.txt' }, { name: 'XML', ext: 'application/xml', extension: '.xml' }, { name: 'DOC', ext: 'application/msword', extension: '.doc' }, { name: 'DOCX', ext: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', extension: '.docx' }, { name: 'XLSX', ext: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', extension: '.xlsx' }, { name: 'PPTX', ext: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', extension: '.pptx' } ] const FileUpload = ({ dialogProps }) => { const dispatch = useDispatch() const customization = useSelector((state) => state.customization) useNotifier() const enqueueSnackbar = (...args) => dispatch(enqueueSnackbarAction(...args)) const closeSnackbar = (...args) => dispatch(closeSnackbarAction(...args)) const [fullFileUpload, setFullFileUpload] = useState(false) const [allowedFileTypes, setAllowedFileTypes] = useState([]) const [chatbotConfig, setChatbotConfig] = useState({}) const [pdfUsage, setPdfUsage] = useState('perPage') const [pdfLegacyBuild, setPdfLegacyBuild] = useState(false) const handleChange = (value) => { setFullFileUpload(value) } const handleAllowedFileTypesChange = (event) => { const { checked, value } = event.target if (checked) { setAllowedFileTypes((prev) => [...prev, value]) } else { setAllowedFileTypes((prev) => prev.filter((item) => item !== value)) } } const handlePdfUsageChange = (event) => { setPdfUsage(event.target.value) } const handleLegacyBuildChange = (value) => { setPdfLegacyBuild(value) } const onSave = async () => { try { const value = { status: fullFileUpload, allowedUploadFileTypes: allowedFileTypes.join(','), pdfFile: { usage: pdfUsage, legacyBuild: pdfLegacyBuild } } chatbotConfig.fullFileUpload = value const saveResp = await chatflowsApi.updateChatflow(dialogProps.chatflow.id, { chatbotConfig: JSON.stringify(chatbotConfig) }) if (saveResp.data) { enqueueSnackbar({ message: 'File Upload Configuration Saved', options: { key: new Date().getTime() + Math.random(), variant: 'success', action: (key) => ( ) } }) dispatch({ type: SET_CHATFLOW, chatflow: saveResp.data }) } } catch (error) { enqueueSnackbar({ message: `Failed to save File Upload Configuration: ${ typeof error.response.data === 'object' ? error.response.data.message : error.response.data }`, options: { key: new Date().getTime() + Math.random(), variant: 'error', persist: true, action: (key) => ( ) } }) } } useEffect(() => { /* backward compatibility - by default, allow all */ const allowedFileTypes = availableFileTypes.map((fileType) => fileType.ext) setAllowedFileTypes(allowedFileTypes) if (dialogProps.chatflow) { if (dialogProps.chatflow.chatbotConfig) { try { let chatbotConfig = JSON.parse(dialogProps.chatflow.chatbotConfig) setChatbotConfig(chatbotConfig || {}) if (chatbotConfig.fullFileUpload) { setFullFileUpload(chatbotConfig.fullFileUpload.status) } if (chatbotConfig.fullFileUpload?.allowedUploadFileTypes) { const allowedFileTypes = chatbotConfig.fullFileUpload.allowedUploadFileTypes.split(',') setAllowedFileTypes(allowedFileTypes) } if (chatbotConfig.fullFileUpload?.pdfFile) { if (chatbotConfig.fullFileUpload.pdfFile.usage) { setPdfUsage(chatbotConfig.fullFileUpload.pdfFile.usage) } if (chatbotConfig.fullFileUpload.pdfFile.legacyBuild !== undefined) { setPdfLegacyBuild(chatbotConfig.fullFileUpload.pdfFile.legacyBuild) } } } catch (e) { setChatbotConfig({}) } } } return () => {} }, [dialogProps]) return ( <>
{parser(message)}
Allow Uploads of Type
{availableFileTypes.map((fileType) => (
))}
{allowedFileTypes.includes('application/pdf') && fullFileUpload && ( PDF Configuration PDF Usage } label='One document per page' /> } label='One document per file' /> )} Save ) } FileUpload.propTypes = { dialogProps: PropTypes.object } export default FileUpload