import { ReactComponent as ChatAppCube } from '@/assets/svg/chat-app-cube.svg'; import RenameModal from '@/components/rename-modal'; import { DeleteOutlined, EditOutlined, KeyOutlined } from '@ant-design/icons'; import { Avatar, Button, Card, Divider, Dropdown, Flex, MenuProps, Space, Spin, Tag, Tooltip, Typography, } from 'antd'; import { MenuItemProps } from 'antd/lib/menu/MenuItem'; import classNames from 'classnames'; import { useCallback, useState } from 'react'; import ChatConfigurationModal from './chat-configuration-modal'; import ChatContainer from './chat-container'; import { useDeleteConversation, useDeleteDialog, useEditDialog, useHandleItemHover, useRenameConversation, useSelectDerivedConversationList, } from './hooks'; import SvgIcon from '@/components/svg-icon'; import { useClickConversationCard, useClickDialogCard, useFetchNextDialogList, useGetChatSearchParams, } from '@/hooks/chat-hooks'; import { useSetModalState, useTranslate } from '@/hooks/common-hooks'; import { useSetSelectedRecord } from '@/hooks/logic-hooks'; import { IDialog } from '@/interfaces/database/chat'; import ChatIdModal from './chat-id-modal'; import styles from './index.less'; const { Text } = Typography; const Chat = () => { const { data: dialogList, loading: dialogLoading } = useFetchNextDialogList(); const { onRemoveDialog } = useDeleteDialog(); const { onRemoveConversation } = useDeleteConversation(); const { handleClickDialog } = useClickDialogCard(); const { handleClickConversation } = useClickConversationCard(); const { dialogId, conversationId } = useGetChatSearchParams(); const { list: conversationList, addTemporaryConversation, loading: conversationLoading, } = 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 { t } = useTranslate('chat'); const { visible: overviewVisible, hideModal: hideOverviewModal, showModal: showOverviewModal, } = useSetModalState(); const { currentRecord, setRecord } = useSetSelectedRecord(); const [controller, setController] = useState(new AbortController()); 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 = useCallback( (dialogId: string) => () => { handleClickDialog(dialogId); }, [handleClickDialog], ); const handleConversationCardClick = useCallback( (conversationId: string, isNew: boolean) => () => { handleClickConversation(conversationId, isNew ? 'true' : ''); setController((pre) => { pre.abort(); return new AbortController(); }); }, [handleClickConversation], ); const handleCreateTemporaryConversation = useCallback(() => { addTemporaryConversation(); }, [addTemporaryConversation]); 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; }; 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;