'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, DialogClose, DialogPopup, DialogPortal, DialogTitle, } from '@langgenius/dify-ui/dialog' import { IconButton } from '@langgenius/dify-ui/icon-button' import { Input } from '@langgenius/dify-ui/input' import { Textarea } from '@langgenius/dify-ui/textarea' import { useHotkey } from '@tanstack/react-hotkeys' import { useId, 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 nameInputId = useId() const descriptionInputId = useId() const { t } = useTranslation() const popupRef = useRef(null) const nameInputRef = 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()}> $['operation.close'], { ns: 'common' })} size="lg" className="absolute inset-e-6 top-6" > } />
{title || t(($) => $['snippet.createDialogTitle'], { ns: 'workflow' })}
setName(e.target.value)} placeholder={t(($) => $['snippet.namePlaceholder'], { ns: 'workflow' }) || ''} disabled={isSubmitting} />