'use client' import type { FC } from 'react' import type { AppIconSelection } from '@/app/components/base/app-icon-picker' import type { SnippetCanvasData } from '@/models/snippet' import { Button } from '@langgenius/dify-ui/button' import { Dialog, DialogCloseButton, DialogContent, DialogPortal, DialogTitle } from '@langgenius/dify-ui/dialog' import { useKeyPress } from 'ahooks' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import AppIcon from '@/app/components/base/app-icon' import AppIconPicker from '@/app/components/base/app-icon-picker' import Input from '@/app/components/base/input' import Textarea from '@/app/components/base/textarea' import ShortcutsName from './shortcuts-name' export type CreateSnippetDialogPayload = { name: string description: string icon: AppIconSelection graph: SnippetCanvasData } type CreateSnippetDialogInitialValue = { name?: string description?: string icon?: AppIconSelection } type CreateSnippetDialogProps = { isOpen: boolean selectedGraph?: SnippetCanvasData onClose: () => void onConfirm: (payload: CreateSnippetDialogPayload) => void isSubmitting?: boolean title?: string confirmText?: string initialValue?: CreateSnippetDialogInitialValue } const defaultIcon: AppIconSelection = { type: 'emoji', icon: '🤖', background: '#FFEAD5', } const defaultGraph: SnippetCanvasData = { nodes: [], edges: [], viewport: { x: 0, y: 0, zoom: 1 }, } const CreateSnippetDialog: FC = ({ isOpen, selectedGraph, onClose, onConfirm, isSubmitting = false, title, confirmText, initialValue, }) => { const { t } = useTranslation() const [name, setName] = useState(initialValue?.name ?? '') const [description, setDescription] = useState(initialValue?.description ?? '') const [icon, setIcon] = useState(initialValue?.icon ?? defaultIcon) const [showAppIconPicker, setShowAppIconPicker] = useState(false) const resetForm = useCallback(() => { setName('') setDescription('') setIcon(defaultIcon) setShowAppIconPicker(false) }, []) const handleClose = useCallback(() => { resetForm() onClose() }, [onClose, resetForm]) const handleConfirm = useCallback(() => { const trimmedName = name.trim() const trimmedDescription = description.trim() if (!trimmedName) return const payload = { name: trimmedName, description: trimmedDescription, icon, graph: selectedGraph ?? defaultGraph, } onConfirm(payload) }, [description, icon, name, onConfirm, selectedGraph]) useKeyPress(['meta.enter', 'ctrl.enter'], () => { if (!isOpen) return if (isSubmitting) return handleConfirm() }) return ( <> !open && handleClose()}>
{title || t('snippet.createDialogTitle', { ns: 'workflow' })}
{t('snippet.nameLabel', { ns: 'workflow' })}
setName(e.target.value)} placeholder={t('snippet.namePlaceholder', { ns: 'workflow' }) || ''} disabled={isSubmitting} autoFocus />
setShowAppIconPicker(true)} />
{t('snippet.descriptionLabel', { ns: 'workflow' })}