import { useState, useRef, useEffect } from 'react' import PropTypes from 'prop-types' import { useSelector, useDispatch } from 'react-redux' import { useNavigate } from 'react-router-dom' // material-ui import { useTheme } from '@mui/material/styles' import { Box, ButtonBase, Avatar, ClickAwayListener, Divider, List, ListItemButton, ListItemIcon, ListItemText, Paper, Popper, Typography } from '@mui/material' // third-party import PerfectScrollbar from 'react-perfect-scrollbar' // project imports import MainCard from 'ui-component/cards/MainCard' import Transitions from 'ui-component/extended/Transitions' import { BackdropLoader } from 'ui-component/loading/BackdropLoader' import AboutDialog from 'ui-component/dialog/AboutDialog' // assets import { IconLogout, IconSettings, IconFileExport, IconFileDownload, IconInfoCircle } from '@tabler/icons' // API import databaseApi from 'api/database' import { SET_MENU } from 'store/actions' import './index.css' // ==============================|| PROFILE MENU ||============================== // const ProfileSection = ({ username, handleLogout }) => { const theme = useTheme() const dispatch = useDispatch() const navigate = useNavigate() const customization = useSelector((state) => state.customization) const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) const [aboutDialogOpen, setAboutDialogOpen] = useState(false) const anchorRef = useRef(null) const uploadRef = useRef(null) const handleClose = (event) => { if (anchorRef.current && anchorRef.current.contains(event.target)) { return } setOpen(false) } const handleToggle = () => { setOpen((prevOpen) => !prevOpen) } const handleExportDB = async () => { setOpen(false) try { const response = await databaseApi.getExportDatabase() const exportItems = response.data let dataStr = JSON.stringify(exportItems) let dataUri = 'data:application/json;charset=utf-8,' + encodeURIComponent(dataStr) let exportFileDefaultName = `DB.json` let linkElement = document.createElement('a') linkElement.setAttribute('href', dataUri) linkElement.setAttribute('download', exportFileDefaultName) linkElement.click() } catch (e) { console.error(e) } } const handleFileUpload = (e) => { if (!e.target.files) return const file = e.target.files[0] const reader = new FileReader() reader.onload = async (evt) => { if (!evt?.target?.result) { return } const { result } = evt.target if (result.includes(`"chatmessages":[`) && result.includes(`"chatflows":[`) && result.includes(`"apikeys":[`)) { dispatch({ type: SET_MENU, opened: false }) setLoading(true) try { await databaseApi.createLoadDatabase(JSON.parse(result)) setLoading(false) navigate('/', { replace: true }) navigate(0) } catch (e) { console.error(e) setLoading(false) } } else { alert('Incorrect Flowise Database Format') } } reader.readAsText(file) } const prevOpen = useRef(open) useEffect(() => { if (prevOpen.current === true && open === false) { anchorRef.current.focus() } prevOpen.current = open }, [open]) return ( <> {({ TransitionProps }) => ( {username && ( {username} )} { setOpen(false) uploadRef.current.click() }} > Load Database} /> Export Database} /> { setOpen(false) setAboutDialogOpen(true) }} > About Flowise} /> {localStorage.getItem('username') && localStorage.getItem('password') && ( Logout} /> )} )} handleFileUpload(e)} /> setAboutDialogOpen(false)} /> ) } ProfileSection.propTypes = { username: PropTypes.string, handleLogout: PropTypes.func } export default ProfileSection