'use client' import type { SnippetCanvasData, SnippetInputField } from '@/models/snippet' import { Button } from '@langgenius/dify-ui/button' import { Dialog, DialogCloseButton, DialogContent, DialogTitle } from '@langgenius/dify-ui/dialog' import { Input } from '@langgenius/dify-ui/input' import { Textarea } from '@langgenius/dify-ui/textarea' import { useKeyPress } from 'ahooks' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' export type CreateSnippetDialogPayload = { name: string description: string graph: SnippetCanvasData input_fields?: SnippetInputField[] } type CreateSnippetDialogInitialValue = { name?: string description?: string } type CreateSnippetDialogProps = { isOpen: boolean selectedGraph?: SnippetCanvasData inputFields?: SnippetInputField[] onClose: () => void onConfirm: (payload: CreateSnippetDialogPayload) => void isSubmitting?: boolean title?: string confirmText?: string initialValue?: CreateSnippetDialogInitialValue } const defaultGraph: SnippetCanvasData = { nodes: [], edges: [], viewport: { x: 0, y: 0, zoom: 1 }, } function CreateSnippetDialog({ isOpen, selectedGraph, inputFields, onClose, onConfirm, isSubmitting = false, title, confirmText, initialValue, }: CreateSnippetDialogProps) { const { t } = useTranslation() const [name, setName] = useState(initialValue?.name ?? '') const [description, setDescription] = useState(initialValue?.description ?? '') const resetForm = useCallback(() => { setName('') setDescription('') }, []) 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, graph: selectedGraph ?? defaultGraph, input_fields: inputFields, } onConfirm(payload) }, [description, inputFields, 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 />
{t('snippet.descriptionLabel', { ns: 'workflow' })}