'use client' import type { Hotkey } from '@tanstack/react-hotkeys' import type { SnippetCanvasData, SnippetInputField } from '@/models/snippet' import { Button } from '@langgenius/dify-ui/button' import { Dialog, DialogBackdrop, DialogCloseButton, DialogPopup, DialogPortal, DialogTitle, } from '@langgenius/dify-ui/dialog' import { Input } from '@langgenius/dify-ui/input' import { Textarea } from '@langgenius/dify-ui/textarea' import { useHotkey } from '@tanstack/react-hotkeys' import { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' const CREATE_SNIPPET_HOTKEY = 'Mod+Enter' satisfies Hotkey 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 }, } export function CreateSnippetDialog({ isOpen, selectedGraph, inputFields, onClose, onConfirm, isSubmitting = false, title, confirmText, initialValue, }: CreateSnippetDialogProps) { const { t } = useTranslation() const popupRef = useRef(null) const [name, setName] = useState(initialValue?.name ?? '') const [description, setDescription] = useState(initialValue?.description ?? '') function resetForm() { setName('') setDescription('') } function handleClose() { resetForm() onClose() } function handleConfirm() { 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) } useHotkey(CREATE_SNIPPET_HOTKEY, handleConfirm, { enabled: isOpen && !isSubmitting, ignoreInputs: false, preventDefault: false, stopPropagation: false, target: popupRef, }) 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' })}