Spaces:
Configuration error
Configuration error
| import { useEffect, useState } from 'react' | |
| import { useNavigate } from 'react-router-dom' | |
| import { useSelector } from 'react-redux' | |
| // material-ui | |
| import { Grid, Box, Stack } from '@mui/material' | |
| import { useTheme } from '@mui/material/styles' | |
| // project imports | |
| import MainCard from 'ui-component/cards/MainCard' | |
| import ItemCard from 'ui-component/cards/ItemCard' | |
| import { gridSpacing } from 'store/constant' | |
| import WorkflowEmptySVG from 'assets/images/workflow_empty.svg' | |
| import { StyledButton } from 'ui-component/button/StyledButton' | |
| import LoginDialog from 'ui-component/dialog/LoginDialog' | |
| // API | |
| import chatflowsApi from 'api/chatflows' | |
| // Hooks | |
| import useApi from 'hooks/useApi' | |
| // const | |
| import { baseURL } from 'store/constant' | |
| // icons | |
| import { IconPlus } from '@tabler/icons' | |
| // ==============================|| CHATFLOWS ||============================== // | |
| const Chatflows = () => { | |
| const navigate = useNavigate() | |
| const theme = useTheme() | |
| const customization = useSelector((state) => state.customization) | |
| const [isLoading, setLoading] = useState(true) | |
| const [images, setImages] = useState({}) | |
| const [loginDialogOpen, setLoginDialogOpen] = useState(false) | |
| const [loginDialogProps, setLoginDialogProps] = useState({}) | |
| const getAllChatflowsApi = useApi(chatflowsApi.getAllChatflows) | |
| const onLoginClick = (username, password) => { | |
| localStorage.setItem('username', username) | |
| localStorage.setItem('password', password) | |
| navigate(0) | |
| } | |
| const addNew = () => { | |
| navigate('/canvas') | |
| } | |
| const goToCanvas = (selectedChatflow) => { | |
| navigate(`/canvas/${selectedChatflow.id}`) | |
| } | |
| useEffect(() => { | |
| getAllChatflowsApi.request() | |
| // eslint-disable-next-line react-hooks/exhaustive-deps | |
| }, []) | |
| useEffect(() => { | |
| if (getAllChatflowsApi.error) { | |
| if (getAllChatflowsApi.error?.response?.status === 401) { | |
| setLoginDialogProps({ | |
| title: 'Login', | |
| confirmButtonName: 'Login' | |
| }) | |
| setLoginDialogOpen(true) | |
| } | |
| } | |
| }, [getAllChatflowsApi.error]) | |
| useEffect(() => { | |
| setLoading(getAllChatflowsApi.loading) | |
| }, [getAllChatflowsApi.loading]) | |
| useEffect(() => { | |
| if (getAllChatflowsApi.data) { | |
| try { | |
| const chatflows = getAllChatflowsApi.data | |
| const images = {} | |
| for (let i = 0; i < chatflows.length; i += 1) { | |
| const flowDataStr = chatflows[i].flowData | |
| const flowData = JSON.parse(flowDataStr) | |
| const nodes = flowData.nodes || [] | |
| images[chatflows[i].id] = [] | |
| for (let j = 0; j < nodes.length; j += 1) { | |
| const imageSrc = `${baseURL}/api/v1/node-icon/${nodes[j].data.name}` | |
| if (!images[chatflows[i].id].includes(imageSrc)) { | |
| images[chatflows[i].id].push(imageSrc) | |
| } | |
| } | |
| } | |
| setImages(images) | |
| } catch (e) { | |
| console.error(e) | |
| } | |
| } | |
| }, [getAllChatflowsApi.data]) | |
| return ( | |
| <MainCard sx={{ background: customization.isDarkMode ? theme.palette.common.black : '' }}> | |
| <Stack flexDirection='row'> | |
| <h1>Chatflows</h1> | |
| <Grid sx={{ mb: 1.25 }} container direction='row'> | |
| <Box sx={{ flexGrow: 1 }} /> | |
| <Grid item> | |
| <StyledButton variant='contained' sx={{ color: 'white' }} onClick={addNew} startIcon={<IconPlus />}> | |
| Add New | |
| </StyledButton> | |
| </Grid> | |
| </Grid> | |
| </Stack> | |
| <Grid container spacing={gridSpacing}> | |
| {!isLoading && | |
| getAllChatflowsApi.data && | |
| getAllChatflowsApi.data.map((data, index) => ( | |
| <Grid key={index} item lg={3} md={4} sm={6} xs={12}> | |
| <ItemCard onClick={() => goToCanvas(data)} data={data} images={images[data.id]} /> | |
| </Grid> | |
| ))} | |
| </Grid> | |
| {!isLoading && (!getAllChatflowsApi.data || getAllChatflowsApi.data.length === 0) && ( | |
| <Stack sx={{ alignItems: 'center', justifyContent: 'center' }} flexDirection='column'> | |
| <Box sx={{ p: 2, height: 'auto' }}> | |
| <img style={{ objectFit: 'cover', height: '30vh', width: 'auto' }} src={WorkflowEmptySVG} alt='WorkflowEmptySVG' /> | |
| </Box> | |
| <div>No Chatflows Yet</div> | |
| </Stack> | |
| )} | |
| <LoginDialog show={loginDialogOpen} dialogProps={loginDialogProps} onConfirm={onLoginClick} /> | |
| </MainCard> | |
| ) | |
| } | |
| export default Chatflows | |