ragflow / web /src /pages /flow /list /agent-template-modal.tsx
balibabu
feat: Make agent template support HTML #1842 (#2259)
7ae407c
raw
history blame
3.87 kB
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;