| import type { FC } from 'react' |
| import { memo } from 'react' |
| import { useTranslation } from 'react-i18next' |
| import { |
| RiLoader2Line, |
| RiPlayLargeLine, |
| } from '@remixicon/react' |
| import { useStore } from '../store' |
| import { |
| useIsChatMode, |
| useNodesReadOnly, |
| useWorkflowRun, |
| useWorkflowStartRun, |
| } from '../hooks' |
| import { WorkflowRunningStatus } from '../types' |
| import ViewHistory from './view-history' |
| import Checklist from './checklist' |
| import cn from '@/utils/classnames' |
| import { |
| StopCircle, |
| } from '@/app/components/base/icons/src/vender/line/mediaAndDevices' |
|
|
| const RunMode = memo(() => { |
| const { t } = useTranslation() |
| const { handleWorkflowStartRunInWorkflow } = useWorkflowStartRun() |
| const { handleStopRun } = useWorkflowRun() |
| const workflowRunningData = useStore(s => s.workflowRunningData) |
| const isRunning = workflowRunningData?.result.status === WorkflowRunningStatus.Running |
|
|
| return ( |
| <> |
| <div |
| className={cn( |
| 'flex items-center px-2.5 h-7 rounded-md text-[13px] font-medium text-components-button-secondary-accent-text', |
| 'hover:bg-state-accent-hover cursor-pointer', |
| isRunning && 'bg-state-accent-hover !cursor-not-allowed', |
| )} |
| onClick={() => { |
| handleWorkflowStartRunInWorkflow() |
| }} |
| > |
| { |
| isRunning |
| ? ( |
| <> |
| <RiLoader2Line className='mr-1 w-4 h-4 animate-spin' /> |
| {t('workflow.common.running')} |
| </> |
| ) |
| : ( |
| <> |
| <RiPlayLargeLine className='mr-1 w-4 h-4' /> |
| {t('workflow.common.run')} |
| </> |
| ) |
| } |
| </div> |
| { |
| isRunning && ( |
| <div |
| className='flex items-center justify-center ml-0.5 w-7 h-7 cursor-pointer hover:bg-black/5 rounded-md' |
| onClick={() => handleStopRun(workflowRunningData?.task_id || '')} |
| > |
| <StopCircle className='w-4 h-4 text-components-button-ghost-text' /> |
| </div> |
| ) |
| } |
| </> |
| ) |
| }) |
| RunMode.displayName = 'RunMode' |
|
|
| const PreviewMode = memo(() => { |
| const { t } = useTranslation() |
| const { handleWorkflowStartRunInChatflow } = useWorkflowStartRun() |
|
|
| return ( |
| <div |
| className={cn( |
| 'flex items-center px-2.5 h-7 rounded-md text-[13px] font-medium text-components-button-secondary-accent-text', |
| 'hover:bg-state-accent-hover cursor-pointer', |
| )} |
| onClick={() => handleWorkflowStartRunInChatflow()} |
| > |
| <RiPlayLargeLine className='mr-1 w-4 h-4' /> |
| {t('workflow.common.debugAndPreview')} |
| </div> |
| ) |
| }) |
| PreviewMode.displayName = 'PreviewMode' |
|
|
| const RunAndHistory: FC = () => { |
| const isChatMode = useIsChatMode() |
| const { nodesReadOnly } = useNodesReadOnly() |
|
|
| return ( |
| <div className='flex items-center px-0.5 h-8 rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg shadow-xs'> |
| { |
| !isChatMode && <RunMode /> |
| } |
| { |
| isChatMode && <PreviewMode /> |
| } |
| <div className='mx-0.5 w-[1px] h-3.5 bg-divider-regular'></div> |
| <ViewHistory /> |
| <Checklist disabled={nodesReadOnly} /> |
| </div> |
| ) |
| } |
|
|
| export default memo(RunAndHistory) |
|
|