dify/web/app/components/workflow/header/run-and-history.tsx

124 lines
3.5 KiB
TypeScript
Raw Normal View History

2024-05-09 17:18:51 +08:00
import { memo } from 'react'
import { useTranslation } from 'react-i18next'
2024-06-20 11:05:08 +08:00
import {
RiLoader2Line,
RiPlayLargeLine,
2024-06-20 11:05:08 +08:00
} from '@remixicon/react'
2024-05-09 17:18:51 +08:00
import { useStore } from '../store'
import {
useNodesReadOnly,
useWorkflowRun,
2024-05-09 17:18:51 +08:00
useWorkflowStartRun,
} from '../hooks'
2024-05-09 17:18:51 +08:00
import { WorkflowRunningStatus } from '../types'
2025-05-08 15:31:37 +08:00
import type { ViewHistoryProps } from './view-history'
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'
2025-05-08 15:31:37 +08:00
type RunModeProps = {
text?: string
}
const RunMode = memo(({
text,
}: RunModeProps) => {
const { t } = useTranslation()
2024-05-09 17:18:51 +08:00
const { handleWorkflowStartRunInWorkflow } = useWorkflowStartRun()
const { handleStopRun } = useWorkflowRun()
const workflowRunningData = useStore(s => s.workflowRunningData)
const isRunning = workflowRunningData?.result.status === WorkflowRunningStatus.Running
return (
<>
<div
className={cn(
'flex h-7 items-center rounded-md px-2.5 text-[13px] font-medium text-components-button-secondary-accent-text',
'cursor-pointer hover:bg-state-accent-hover',
isRunning && '!cursor-not-allowed bg-state-accent-hover',
)}
2024-08-19 18:11:11 +08:00
onClick={() => {
handleWorkflowStartRunInWorkflow()
}}
>
{
isRunning
? (
<>
<RiLoader2Line className='mr-1 h-4 w-4 animate-spin' />
{t('workflow.common.running')}
</>
)
: (
<>
<RiPlayLargeLine className='mr-1 h-4 w-4' />
2025-05-08 15:31:37 +08:00
{text ?? t('workflow.common.run')}
</>
)
}
</div>
{
isRunning && (
<div
className='ml-0.5 flex h-7 w-7 cursor-pointer items-center justify-center rounded-md hover:bg-black/5'
onClick={() => handleStopRun(workflowRunningData?.task_id || '')}
>
<StopCircle className='h-4 w-4 text-components-button-ghost-text' />
</div>
)
}
</>
)
})
const PreviewMode = memo(() => {
const { t } = useTranslation()
2024-05-09 17:18:51 +08:00
const { handleWorkflowStartRunInChatflow } = useWorkflowStartRun()
return (
<div
className={cn(
'flex h-7 items-center rounded-md px-2.5 text-[13px] font-medium text-components-button-secondary-accent-text',
'cursor-pointer hover:bg-state-accent-hover',
)}
2024-05-09 17:18:51 +08:00
onClick={() => handleWorkflowStartRunInChatflow()}
>
<RiPlayLargeLine className='mr-1 h-4 w-4' />
{t('workflow.common.debugAndPreview')}
</div>
)
})
2025-05-08 15:31:37 +08:00
export type RunAndHistoryProps = {
showRunButton?: boolean
runButtonText?: string
showPreviewButton?: boolean
viewHistoryProps?: ViewHistoryProps
}
const RunAndHistory = ({
showRunButton,
runButtonText,
showPreviewButton,
viewHistoryProps,
}: RunAndHistoryProps) => {
const { nodesReadOnly } = useNodesReadOnly()
return (
<div className='flex h-8 items-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-0.5 shadow-xs'>
{
2025-05-08 15:31:37 +08:00
showRunButton && <RunMode text={runButtonText} />
}
{
2025-05-08 15:31:37 +08:00
showPreviewButton && <PreviewMode />
}
<div className='mx-0.5 h-3.5 w-[1px] bg-divider-regular'></div>
2025-05-08 15:31:37 +08:00
<ViewHistory {...viewHistoryProps} />
<Checklist disabled={nodesReadOnly} />
</div>
)
}
export default memo(RunAndHistory)