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 (
<>