| import type { FC } from 'react' | |
| import { useTranslation } from 'react-i18next' | |
| import { useEffect, useRef, useState } from 'react' | |
| import { useClickAway } from 'ahooks' | |
| import { RiCloseLine } from '@remixicon/react' | |
| import cn from '@/utils/classnames' | |
| import type { IChatItem } from '@/app/components/base/chat/chat/type' | |
| import Run from '@/app/components/workflow/run' | |
| type MessageLogModalProps = { | |
| currentLogItem?: IChatItem | |
| defaultTab?: string | |
| width: number | |
| fixedWidth?: boolean | |
| onCancel: () => void | |
| } | |
| const MessageLogModal: FC<MessageLogModalProps> = ({ | |
| currentLogItem, | |
| defaultTab = 'DETAIL', | |
| width, | |
| fixedWidth, | |
| onCancel, | |
| }) => { | |
| const { t } = useTranslation() | |
| const ref = useRef(null) | |
| const [mounted, setMounted] = useState(false) | |
| useClickAway(() => { | |
| if (mounted) | |
| onCancel() | |
| }, ref) | |
| useEffect(() => { | |
| setMounted(true) | |
| }, []) | |
| if (!currentLogItem || !currentLogItem.workflow_run_id) | |
| return null | |
| return ( | |
| <div | |
| className={cn('relative flex flex-col pt-3 bg-components-panel-bg border-[0.5px] border-components-panel-border rounded-xl shadow-xl z-10')} | |
| style={{ | |
| width: fixedWidth ? width : 480, | |
| ...(!fixedWidth | |
| ? { | |
| position: 'fixed', | |
| top: 56 + 8, | |
| left: 8 + (width - 480), | |
| bottom: 16, | |
| } | |
| : { | |
| marginRight: 8, | |
| }), | |
| }} | |
| ref={ref} | |
| > | |
| <h1 className='shrink-0 px-4 py-1 text-text-primary system-xl-semibold'>{t('appLog.runDetail.title')}</h1> | |
| <span className='absolute right-3 top-4 p-1 cursor-pointer z-20' onClick={onCancel}> | |
| <RiCloseLine className='w-4 h-4 text-text-tertiary' /> | |
| </span> | |
| <Run | |
| hideResult | |
| activeTab={defaultTab as any} | |
| runID={currentLogItem.workflow_run_id} | |
| /> | |
| </div> | |
| ) | |
| } | |
| export default MessageLogModal | |