balibabu
feat: Modify the modal style of creating an agent so that there are more templates in the field of view #2122 (#2123)
c33b05f
import { IModalManagerChildrenProps } from '@/components/modal-manager'; | |
import { useSetModalState, useTranslate } from '@/hooks/common-hooks'; | |
import { useFetchFlowTemplates } from '@/hooks/flow-hooks'; | |
import { useSelectItem } from '@/hooks/logic-hooks'; | |
import { Button, Card, Flex, List, Modal, Typography } from 'antd'; | |
import { useCallback, useState } from 'react'; | |
import CreateAgentModal from './create-agent-modal'; | |
import GraphAvatar from './graph-avatar'; | |
import styles from './index.less'; | |
const { Title, Text, Paragraph } = Typography; | |
interface IProps extends Omit<IModalManagerChildrenProps, 'showModal'> { | |
loading: boolean; | |
onOk: (name: string, templateId: string) => void; | |
showModal?(): void; | |
} | |
const AgentTemplateModal = ({ visible, hideModal, loading, onOk }: IProps) => { | |
const { t } = useTranslate('common'); | |
const { data: list } = useFetchFlowTemplates(); | |
const { selectedId, handleItemClick } = useSelectItem(''); | |
const [checkedId, setCheckedId] = useState<string>(''); | |
const { | |
visible: creatingVisible, | |
hideModal: hideCreatingModal, | |
showModal: showCreatingModal, | |
} = useSetModalState(); | |
const handleOk = useCallback( | |
async (name: string) => { | |
return onOk(name, checkedId); | |
}, | |
[onOk, checkedId], | |
); | |
const onShowCreatingModal = useCallback( | |
(id: string) => () => { | |
showCreatingModal(); | |
setCheckedId(id); | |
}, | |
[showCreatingModal], | |
); | |
return ( | |
<Modal | |
title={t('createGraph', { keyPrefix: 'flow' })} | |
open={visible} | |
width={'100vw'} | |
onCancel={hideModal} | |
okButtonProps={{ loading }} | |
confirmLoading={loading} | |
className={styles.agentTemplateModal} | |
wrapClassName={styles.agentTemplateModalWrapper} | |
footer={null} | |
> | |
<section className={styles.createModalContent}> | |
<Title level={5}> | |
{t('createFromTemplates', { keyPrefix: 'flow' })} | |
</Title> | |
<List | |
grid={{ gutter: 16, column: 4 }} | |
dataSource={list} | |
renderItem={(x) => ( | |
<List.Item> | |
<Card | |
key={x.id} | |
onMouseEnter={handleItemClick(x.id)} | |
onMouseLeave={handleItemClick('')} | |
className={styles.flowTemplateCard} | |
> | |
<Flex gap={'middle'} align="center"> | |
<GraphAvatar avatar={x.avatar}></GraphAvatar> | |
<b className={styles.agentTitleWrapper}> | |
<Text | |
style={{ width: '96%' }} | |
ellipsis={{ tooltip: x.title }} | |
> | |
{x.title} | |
</Text> | |
</b> | |
</Flex> | |
<div className={styles.agentDescription}> | |
<Paragraph ellipsis={{ tooltip: x.description, rows: 5 }}> | |
{x.description} | |
</Paragraph> | |
</div> | |
{selectedId === x.id && ( | |
<Button | |
type={'primary'} | |
block | |
onClick={onShowCreatingModal(x.id)} | |
className={styles.useButton} | |
> | |
{t('useTemplate', { keyPrefix: 'flow' })} | |
</Button> | |
)} | |
</Card> | |
</List.Item> | |
)} | |
/> | |
</section> | |
{creatingVisible && ( | |
<CreateAgentModal | |
loading={loading} | |
visible={creatingVisible} | |
hideModal={hideCreatingModal} | |
onOk={handleOk} | |
></CreateAgentModal> | |
)} | |
</Modal> | |
); | |
}; | |
export default AgentTemplateModal; | |