| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- import { ReactComponent as ChatAppCube } from '@/assets/svg/chat-app-cube.svg';
- import { useSetModalState } from '@/hooks/commonHooks';
- import { DeleteOutlined, EditOutlined, FormOutlined } from '@ant-design/icons';
- import {
- Avatar,
- Button,
- Card,
- Divider,
- Dropdown,
- Flex,
- MenuProps,
- Space,
- Tag,
- } 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,
- useFetchConversationList,
- useFetchDialog,
- useGetChatSearchParams,
- useHandleItemHover,
- useRemoveConversation,
- useRemoveDialog,
- useRenameConversation,
- useSelectConversationList,
- useSelectFirstDialogOnMount,
- useSetCurrentDialog,
- } from './hooks';
-
- import RenameModal from '@/components/rename-modal';
- import styles from './index.less';
-
- const Chat = () => {
- const dialogList = useSelectFirstDialogOnMount();
- const { visible, hideModal, showModal } = useSetModalState();
- const { setCurrentDialog, currentDialog } = useSetCurrentDialog();
- const { onRemoveDialog } = useRemoveDialog();
- const { onRemoveConversation } = useRemoveConversation();
- const { handleClickDialog } = useClickDialogCard();
- const { handleClickConversation } = useClickConversationCard();
- const { dialogId, conversationId } = useGetChatSearchParams();
- const { list: conversationList, addTemporaryConversation } =
- useSelectConversationList();
- const { activated, handleItemEnter, handleItemLeave } = useHandleItemHover();
- const {
- activated: conversationActivated,
- handleItemEnter: handleConversationItemEnter,
- handleItemLeave: handleConversationItemLeave,
- } = useHandleItemHover();
- const {
- conversationRenameLoading,
- initialConversationName,
- onConversationRenameOk,
- conversationRenameVisible,
- hideConversationRenameModal,
- showConversationRenameModal,
- } = useRenameConversation();
-
- useFetchDialog(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();
- // if (dialogId) {
- setCurrentDialog(dialogId ?? '');
- // }
- showModal();
- };
-
- const handleRemoveDialog =
- (dialogId: string): MenuItemProps['onClick'] =>
- ({ domEvent }) => {
- domEvent.preventDefault();
- domEvent.stopPropagation();
- onRemoveDialog([dialogId]);
- };
-
- 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: (
- <Space>
- <EditOutlined /> New chat
- </Space>
- ),
- },
- ];
-
- const buildAppItems = (dialogId: string) => {
- const appItems: MenuProps['items'] = [
- {
- key: '1',
- onClick: handleShowChatConfigurationModal(dialogId),
- label: (
- <Space>
- <EditOutlined />
- Edit
- </Space>
- ),
- },
- { type: 'divider' },
- {
- key: '2',
- onClick: handleRemoveDialog(dialogId),
- label: (
- <Space>
- <DeleteOutlined />
- Delete chat
- </Space>
- ),
- },
- ];
-
- return appItems;
- };
-
- const buildConversationItems = (conversationId: string) => {
- const appItems: MenuProps['items'] = [
- {
- key: '1',
- onClick: handleShowConversationRenameModal(conversationId),
- label: (
- <Space>
- <EditOutlined />
- Edit
- </Space>
- ),
- },
- { type: 'divider' },
- {
- key: '2',
- onClick: handleRemoveConversation(conversationId),
- label: (
- <Space>
- <DeleteOutlined />
- Delete chat
- </Space>
- ),
- },
- ];
-
- return appItems;
- };
-
- useFetchConversationList();
-
- return (
- <Flex className={styles.chatWrapper}>
- <Flex className={styles.chatAppWrapper}>
- <Flex flex={1} vertical>
- <Button type="primary" onClick={handleShowChatConfigurationModal()}>
- Create an Assistant
- </Button>
- <Divider></Divider>
- <Flex className={styles.chatAppContent} vertical gap={10}>
- {dialogList.map((x) => (
- <Card
- key={x.id}
- hoverable
- className={classNames(styles.chatAppCard, {
- [styles.chatAppCardSelected]: dialogId === x.id,
- })}
- onMouseEnter={handleAppCardEnter(x.id)}
- onMouseLeave={handleItemLeave}
- onClick={handleDialogCardClick(x.id)}
- >
- <Flex justify="space-between" align="center">
- <Space size={15}>
- <Avatar src={x.icon} shape={'square'} />
- <section>
- <b>{x.name}</b>
- <div>{x.description}</div>
- </section>
- </Space>
- {activated === x.id && (
- <section>
- <Dropdown menu={{ items: buildAppItems(x.id) }}>
- <ChatAppCube className={styles.cubeIcon}></ChatAppCube>
- </Dropdown>
- </section>
- )}
- </Flex>
- </Card>
- ))}
- </Flex>
- </Flex>
- </Flex>
- <Divider type={'vertical'} className={styles.divider}></Divider>
- <Flex className={styles.chatTitleWrapper}>
- <Flex flex={1} vertical>
- <Flex
- justify={'space-between'}
- align="center"
- className={styles.chatTitle}
- >
- <Space>
- <b>Chat</b>
- <Tag>25</Tag>
- </Space>
- <Dropdown menu={{ items }}>
- <FormOutlined />
- </Dropdown>
- </Flex>
- <Divider></Divider>
- <Flex vertical gap={10} className={styles.chatTitleContent}>
- {conversationList.map((x) => (
- <Card
- key={x.id}
- hoverable
- onClick={handleConversationCardClick(x.id)}
- onMouseEnter={handleConversationCardEnter(x.id)}
- onMouseLeave={handleConversationItemLeave}
- className={classNames(styles.chatTitleCard, {
- [styles.chatTitleCardSelected]: x.id === conversationId,
- })}
- >
- <Flex justify="space-between" align="center">
- <div>{x.name}</div>
- {conversationActivated === x.id && x.id !== '' && (
- <section>
- <Dropdown menu={{ items: buildConversationItems(x.id) }}>
- <ChatAppCube className={styles.cubeIcon}></ChatAppCube>
- </Dropdown>
- </section>
- )}
- </Flex>
- </Card>
- ))}
- </Flex>
- </Flex>
- </Flex>
- <Divider type={'vertical'} className={styles.divider}></Divider>
- <ChatContainer></ChatContainer>
- <ChatConfigurationModal
- visible={visible}
- showModal={showModal}
- hideModal={hideModal}
- id={currentDialog.id}
- ></ChatConfigurationModal>
- <RenameModal
- visible={conversationRenameVisible}
- hideModal={hideConversationRenameModal}
- onOk={onConversationRenameOk}
- initialName={initialConversationName}
- loading={conversationRenameLoading}
- ></RenameModal>
- </Flex>
- );
- };
-
- export default Chat;
|