mirror of
				https://github.com/csunny/DB-GPT.git
				synced 2025-10-31 06:39:43 +00:00 
			
		
		
		
	Co-authored-by: Fangyin Cheng <staneyffer@gmail.com> Co-authored-by: 谨欣 <echo.cmy@antgroup.com> Co-authored-by: 严志勇 <yanzhiyong@tiansuixiansheng.com> Co-authored-by: yanzhiyong <932374019@qq.com>
		
			
				
	
	
		
			131 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { ChatContext } from '@/app/chat-context';
 | |
| import { apiInterceptors, deleteFlowById, newDialogue } from '@/client/api';
 | |
| import { IFlow } from '@/types/flow';
 | |
| import {
 | |
|   CopyFilled,
 | |
|   DeleteFilled,
 | |
|   EditFilled,
 | |
|   ExclamationCircleOutlined,
 | |
|   MessageFilled,
 | |
|   WarningOutlined,
 | |
| } from '@ant-design/icons';
 | |
| import { Modal, Tooltip } from 'antd';
 | |
| import { useRouter } from 'next/router';
 | |
| import qs from 'querystring';
 | |
| import React, { useContext } from 'react';
 | |
| import { useTranslation } from 'react-i18next';
 | |
| import GptCard from '../common/gpt-card';
 | |
| import FlowPreview from './preview-flow';
 | |
| 
 | |
| interface FlowCardProps {
 | |
|   flow: IFlow;
 | |
|   deleteCallback: (uid: string) => void;
 | |
|   onCopy: (flow: IFlow) => void;
 | |
| }
 | |
| 
 | |
| const FlowCard: React.FC<FlowCardProps> = ({ flow, onCopy, deleteCallback }) => {
 | |
|   const { model } = useContext(ChatContext);
 | |
|   const { t } = useTranslation();
 | |
|   const [modal, contextHolder] = Modal.useModal();
 | |
|   const router = useRouter();
 | |
| 
 | |
|   async function deleteFlow() {
 | |
|     const [, , res] = await apiInterceptors(deleteFlowById(flow.uid));
 | |
|     if (res?.success) {
 | |
|       deleteCallback && deleteCallback(flow.uid);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function cardClick() {
 | |
|     router.push('/flow/canvas?id=' + flow.uid);
 | |
|   }
 | |
| 
 | |
|   const handleChat = async () => {
 | |
|     const [, res] = await apiInterceptors(newDialogue({ chat_mode: 'chat_agent' }));
 | |
|     if (res) {
 | |
|       const queryStr = qs.stringify({
 | |
|         scene: 'chat_flow',
 | |
|         id: res.conv_uid,
 | |
|         model: model,
 | |
|         select_param: flow.uid,
 | |
|       });
 | |
|       router.push(`/chat?${queryStr}`);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   const handleDel = () => {
 | |
|     modal.confirm({
 | |
|       title: t('Tips'),
 | |
|       icon: <WarningOutlined />,
 | |
|       content: t('delete_flow_confirm'),
 | |
|       okText: 'Yes',
 | |
|       okType: 'danger',
 | |
|       cancelText: 'No',
 | |
|       async onOk() {
 | |
|         deleteFlow();
 | |
|       },
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   return (
 | |
|     <>
 | |
|       {contextHolder}
 | |
|       <GptCard
 | |
|         className='w-[26rem] max-w-full'
 | |
|         title={flow.name}
 | |
|         desc={flow.description}
 | |
|         tags={[
 | |
|           { text: flow.source, border: true, color: flow.source === 'DBGPT-WEB' ? 'green' : 'blue' },
 | |
|           { text: flow.editable ? 'Editable' : 'Can not Edit', color: flow.editable ? 'green' : 'gray' },
 | |
|           {
 | |
|             text: (
 | |
|               <>
 | |
|                 {flow.error_message ? (
 | |
|                   <Tooltip placement='bottom' title={flow.error_message}>
 | |
|                     {flow.state}
 | |
|                     <ExclamationCircleOutlined className='ml-1' />
 | |
|                   </Tooltip>
 | |
|                 ) : (
 | |
|                   flow.state
 | |
|                 )}
 | |
|               </>
 | |
|             ),
 | |
|             color: flow.state === 'load_failed' ? 'red' : flow.state === 'running' ? 'green' : 'blue',
 | |
|             border: true,
 | |
|           },
 | |
|         ]}
 | |
|         operations={[
 | |
|           {
 | |
|             label: t('Chat'),
 | |
|             children: <MessageFilled />,
 | |
|             onClick: handleChat,
 | |
|           },
 | |
|           {
 | |
|             label: t('Edit'),
 | |
|             children: <EditFilled />,
 | |
|             onClick: cardClick,
 | |
|           },
 | |
|           {
 | |
|             label: t('Copy'),
 | |
|             children: <CopyFilled />,
 | |
|             onClick: () => {
 | |
|               onCopy(flow);
 | |
|             },
 | |
|           },
 | |
|           {
 | |
|             label: t('Delete'),
 | |
|             children: <DeleteFilled />,
 | |
|             onClick: handleDel,
 | |
|           },
 | |
|         ]}
 | |
|       >
 | |
|         <div className='w-full h-[150px] shadow-[inset_0_0_16px_rgba(50,50,50,.05)]'>
 | |
|           <FlowPreview flowData={flow.flow_data} />
 | |
|         </div>
 | |
|       </GptCard>
 | |
|     </>
 | |
|   );
 | |
| };
 | |
| 
 | |
| export default FlowCard;
 |