import { ReactComponent as ChatAppCube } from '@/assets/svg/chat-app-cube.svg'; import RenameModal from '@/components/rename-modal'; import { CloudOutlined, DeleteOutlined, EditOutlined, PlusOutlined, } from '@ant-design/icons'; import { Avatar, Button, Card, Divider, Dropdown, Flex, MenuProps, Space, Spin, Tag, Typography, } from 'antd'; import { MenuItemProps } from 'antd/lib/menu/MenuItem'; import classNames from 'classnames'; import { useCallback } from 'react'; import ChatConfigurationModal from './chat-configuration-modal'; import ChatContainer from './chat-container'; import { useClickConversationCard, useClickDialogCard, useDeleteConversation, useDeleteDialog, useEditDialog, useFetchConversationListOnMount, useFetchDialogOnMount, useGetChatSearchParams, useHandleItemHover, useRenameConversation, useSelectConversationListLoading, useSelectDerivedConversationList, useSelectDialogListLoading, useSelectFirstDialogOnMount, } from './hooks'; import ChatOverviewModal from '@/components/api-service/chat-overview-modal'; import { useSetModalState, useTranslate } from '@/hooks/common-hooks'; import { useSetSelectedRecord } from '@/hooks/logic-hooks'; import { IDialog } from '@/interfaces/database/chat'; import styles from './index.less'; const { Text } = Typography; const Chat = () => { const dialogList = useSelectFirstDialogOnMount(); const { onRemoveDialog } = useDeleteDialog(); const { onRemoveConversation } = useDeleteConversation(); const { handleClickDialog } = useClickDialogCard(); const { handleClickConversation } = useClickConversationCard(); const { dialogId, conversationId } = useGetChatSearchParams(); const { list: conversationList, addTemporaryConversation } = useSelectDerivedConversationList(); const { activated, handleItemEnter, handleItemLeave } = useHandleItemHover(); const { activated: conversationActivated, handleItemEnter: handleConversationItemEnter, handleItemLeave: handleConversationItemLeave, } = useHandleItemHover(); const { conversationRenameLoading, initialConversationName, onConversationRenameOk, conversationRenameVisible, hideConversationRenameModal, showConversationRenameModal, } = useRenameConversation(); const { dialogSettingLoading, initialDialog, onDialogEditOk, dialogEditVisible, clearDialog, hideDialogEditModal, showDialogEditModal, } = useEditDialog(); const dialogLoading = useSelectDialogListLoading(); const conversationLoading = useSelectConversationListLoading(); const { t } = useTranslate('chat'); const { visible: overviewVisible, hideModal: hideOverviewModal, showModal: showOverviewModal, } = useSetModalState(); const { currentRecord, setRecord } = useSetSelectedRecord(); useFetchDialogOnMount(dialogId, true); const handleAppCardEnter = (id: string) => () => { handleItemEnter(id); }; const handleConversationCardEnter = (id: string) => () => { handleConversationItemEnter(id); }; const handleShowChatConfigurationModal = (dialogId?: string): any => (info: any) => { info?.domEvent?.preventDefault(); info?.domEvent?.stopPropagation(); showDialogEditModal(dialogId); }; const handleRemoveDialog = (dialogId: string): MenuItemProps['onClick'] => ({ domEvent }) => { domEvent.preventDefault(); domEvent.stopPropagation(); onRemoveDialog([dialogId]); }; const handleShowOverviewModal = (dialog: IDialog): any => (info: any) => { info?.domEvent?.preventDefault(); info?.domEvent?.stopPropagation(); setRecord(dialog); showOverviewModal(); }; const handleRemoveConversation = (conversationId: string): MenuItemProps['onClick'] => ({ domEvent }) => { domEvent.preventDefault(); domEvent.stopPropagation(); onRemoveConversation([conversationId]); }; const handleShowConversationRenameModal = (conversationId: string): MenuItemProps['onClick'] => ({ domEvent }) => { domEvent.preventDefault(); domEvent.stopPropagation(); showConversationRenameModal(conversationId); }; const handleDialogCardClick = (dialogId: string) => () => { handleClickDialog(dialogId); }; const handleConversationCardClick = (dialogId: string) => () => { handleClickConversation(dialogId); }; const handleCreateTemporaryConversation = useCallback(() => { addTemporaryConversation(); }, [addTemporaryConversation]); const items: MenuProps['items'] = [ { key: '1', onClick: handleCreateTemporaryConversation, label: ( {t('newChat')} ), }, ]; const buildAppItems = (dialog: IDialog) => { const dialogId = dialog.id; const appItems: MenuProps['items'] = [ { key: '1', onClick: handleShowChatConfigurationModal(dialogId), label: ( {t('edit', { keyPrefix: 'common' })} ), }, { type: 'divider' }, { key: '2', onClick: handleRemoveDialog(dialogId), label: ( {t('delete', { keyPrefix: 'common' })} ), }, { type: 'divider' }, { key: '3', onClick: handleShowOverviewModal(dialog), label: ( {t('overview')} ), }, ]; return appItems; }; const buildConversationItems = (conversationId: string) => { const appItems: MenuProps['items'] = [ { key: '1', onClick: handleShowConversationRenameModal(conversationId), label: ( {t('rename', { keyPrefix: 'common' })} ), }, { type: 'divider' }, { key: '2', onClick: handleRemoveConversation(conversationId), label: ( {t('delete', { keyPrefix: 'common' })} ), }, ]; return appItems; }; useFetchConversationListOnMount(); return ( {dialogList.map((x) => (
{x.name}
{x.description}
{activated === x.id && (
)}
))}
{t('chat')} {conversationList.length} {/* */} {conversationList.map((x) => (
{x.name}
{conversationActivated === x.id && x.id !== '' && (
)}
))}
{dialogEditVisible && ( )} {overviewVisible && ( )}
); }; export default Chat;