import { useState, useRef, useEffect } from 'react' import { useDispatch } from 'react-redux' import PropTypes from 'prop-types' import { ClickAwayListener, Paper, Popper, Button } from '@mui/material' import { useTheme } from '@mui/material/styles' import { IconMessage, IconX, IconEraser, IconArrowsMaximize } from '@tabler/icons' // project import import { StyledFab } from 'ui-component/button/StyledFab' import MainCard from 'ui-component/cards/MainCard' import Transitions from 'ui-component/extended/Transitions' import { ChatMessage } from './ChatMessage' import ChatExpandDialog from './ChatExpandDialog' // api import chatmessageApi from 'api/chatmessage' // Hooks import useConfirm from 'hooks/useConfirm' import useNotifier from 'utils/useNotifier' // Const import { enqueueSnackbar as enqueueSnackbarAction, closeSnackbar as closeSnackbarAction } from 'store/actions' export const ChatPopUp = ({ chatflowid }) => { const theme = useTheme() const { confirm } = useConfirm() const dispatch = useDispatch() useNotifier() const enqueueSnackbar = (...args) => dispatch(enqueueSnackbarAction(...args)) const closeSnackbar = (...args) => dispatch(closeSnackbarAction(...args)) const [open, setOpen] = useState(false) const [showExpandDialog, setShowExpandDialog] = useState(false) const [expandDialogProps, setExpandDialogProps] = useState({}) const anchorRef = useRef(null) const prevOpen = useRef(open) const handleClose = (event) => { if (anchorRef.current && anchorRef.current.contains(event.target)) { return } setOpen(false) } const handleToggle = () => { setOpen((prevOpen) => !prevOpen) } const expandChat = () => { const props = { open: true, chatflowid: chatflowid } setExpandDialogProps(props) setShowExpandDialog(true) } const resetChatDialog = () => { const props = { ...expandDialogProps, open: false } setExpandDialogProps(props) setTimeout(() => { const resetProps = { ...expandDialogProps, open: true } setExpandDialogProps(resetProps) }, 500) } const clearChat = async () => { const confirmPayload = { title: `Clear Chat History`, description: `Are you sure you want to clear all chat history?`, confirmButtonName: 'Clear', cancelButtonName: 'Cancel' } const isConfirmed = await confirm(confirmPayload) if (isConfirmed) { try { await chatmessageApi.deleteChatmessage(chatflowid) resetChatDialog() enqueueSnackbar({ message: 'Succesfully cleared all chat history', options: { key: new Date().getTime() + Math.random(), variant: 'success', action: (key) => ( ) } }) } catch (error) { const errorData = error.response.data || `${error.response.status}: ${error.response.statusText}` enqueueSnackbar({ message: errorData, options: { key: new Date().getTime() + Math.random(), variant: 'error', persist: true, action: (key) => ( ) } }) } } } useEffect(() => { if (prevOpen.current === true && open === false) { anchorRef.current.focus() } prevOpen.current = open // eslint-disable-next-line react-hooks/exhaustive-deps }, [open, chatflowid]) return ( <> {open ? : } {open && ( )} {open && ( )} {({ TransitionProps }) => ( )} setShowExpandDialog(false)} > ) } ChatPopUp.propTypes = { chatflowid: PropTypes.string }