| | import { useEffect, useState } from 'react' |
| | import { useNavigate } from 'react-router-dom' |
| | import { useSelector } from 'react-redux' |
| |
|
| | |
| | import { Grid, Box, Stack } from '@mui/material' |
| | import { useTheme } from '@mui/material/styles' |
| |
|
| | |
| | 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' |
| |
|
| | |
| | import chatflowsApi from 'api/chatflows' |
| |
|
| | |
| | import useApi from 'hooks/useApi' |
| |
|
| | |
| | import { baseURL } from 'store/constant' |
| |
|
| | |
| | import { IconPlus } from '@tabler/icons' |
| |
|
| | |
| |
|
| | 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() |
| |
|
| | |
| | }, []) |
| |
|
| | 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 |
| |
|