mirror of
https://github.com/langgenius/dify.git
synced 2026-05-04 17:38:04 +08:00
98 lines
3.1 KiB
TypeScript
98 lines
3.1 KiB
TypeScript
'use client'
|
|
import type { FC } from 'react'
|
|
import {
|
|
useCallback,
|
|
useEffect,
|
|
} from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { BlockEnum } from '@/app/components/workflow/types'
|
|
import type { ToolDefaultValue } from '@/app/components/workflow/block-selector/types'
|
|
import Modal from '@/app/components/base/modal'
|
|
import StartNodeSelectionPanel from './start-node-selection-panel'
|
|
|
|
type WorkflowOnboardingModalProps = {
|
|
isShow: boolean
|
|
onClose: () => void
|
|
onSelectStartNode: (nodeType: BlockEnum, toolConfig?: ToolDefaultValue) => void
|
|
}
|
|
|
|
const WorkflowOnboardingModal: FC<WorkflowOnboardingModalProps> = ({
|
|
isShow,
|
|
onClose,
|
|
onSelectStartNode,
|
|
}) => {
|
|
const { t } = useTranslation()
|
|
|
|
const handleSelectUserInput = useCallback(() => {
|
|
onSelectStartNode(BlockEnum.Start)
|
|
onClose() // Close modal after selection
|
|
}, [onSelectStartNode, onClose])
|
|
|
|
const handleTriggerSelect = useCallback((nodeType: BlockEnum, toolConfig?: ToolDefaultValue) => {
|
|
onSelectStartNode(nodeType, toolConfig)
|
|
onClose() // Close modal after selection
|
|
}, [onSelectStartNode, onClose])
|
|
|
|
useEffect(() => {
|
|
const handleEsc = (e: KeyboardEvent) => {
|
|
if (e.key === 'Escape' && isShow)
|
|
onClose()
|
|
}
|
|
document.addEventListener('keydown', handleEsc)
|
|
return () => document.removeEventListener('keydown', handleEsc)
|
|
}, [isShow, onClose])
|
|
|
|
return (
|
|
<>
|
|
<Modal
|
|
isShow={isShow}
|
|
onClose={onClose}
|
|
className="w-[618px] max-w-[618px] rounded-2xl border border-effects-highlight bg-background-default-subtle shadow-lg"
|
|
overlayOpacity
|
|
closable
|
|
clickOutsideNotClose
|
|
>
|
|
<div className="pb-4">
|
|
{/* Header */}
|
|
<div className="mb-6">
|
|
<h3 className="title-2xl-semi-bold mb-2 text-text-primary">
|
|
{t('workflow.onboarding.title')}
|
|
</h3>
|
|
<div className="body-xs-regular leading-4 text-text-tertiary">
|
|
{t('workflow.onboarding.description')}{' '}
|
|
<button
|
|
type="button"
|
|
className="hover:text-text-accent-hover cursor-pointer text-text-accent underline"
|
|
onClick={() => {
|
|
console.log('Navigate to start node documentation')
|
|
}}
|
|
>
|
|
Learn more
|
|
</button> about start node.
|
|
</div>
|
|
</div>
|
|
|
|
{/* Content */}
|
|
<StartNodeSelectionPanel
|
|
onSelectUserInput={handleSelectUserInput}
|
|
onSelectTrigger={handleTriggerSelect}
|
|
/>
|
|
</div>
|
|
</Modal>
|
|
|
|
{/* ESC tip below modal */}
|
|
{isShow && (
|
|
<div className="body-xs-regular pointer-events-none fixed left-1/2 top-1/2 z-[70] flex -translate-x-1/2 translate-y-[160px] items-center gap-1 text-text-quaternary">
|
|
<span>Press</span>
|
|
<kbd className="system-kbd inline-flex h-4 min-w-4 items-center justify-center rounded bg-components-kbd-bg-gray px-1 text-text-tertiary">
|
|
esc
|
|
</kbd>
|
|
<span>to dismiss</span>
|
|
</div>
|
|
)}
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default WorkflowOnboardingModal
|