|
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 DOMPurify from 'dompurify'; |
|
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 }}> |
|
<div |
|
dangerouslySetInnerHTML={{ |
|
__html: DOMPurify.sanitize(x.description), |
|
}} |
|
></div> |
|
</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; |
|
|