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