import { useCallback, useState, } from 'react' import { useTranslation } from 'react-i18next' import { DSL_EXPORT_CHECK, } from '@/app/components/workflow/constants' import { useNodesSyncDraft } from './use-nodes-sync-draft' import { useEventEmitterContextContext } from '@/context/event-emitter' import { fetchWorkflowDraft } from '@/service/workflow' import { useToastContext } from '@/app/components/base/toast' import { useWorkflowStore } from '@/app/components/workflow/store' import { useExportPipelineDSL } from '@/service/use-pipeline' export const useDSL = () => { const { t } = useTranslation() const { notify } = useToastContext() const { eventEmitter } = useEventEmitterContextContext() const [exporting, setExporting] = useState(false) const { doSyncWorkflowDraft } = useNodesSyncDraft() const workflowStore = useWorkflowStore() const { mutateAsync: exportPipelineConfig } = useExportPipelineDSL() const handleExportDSL = useCallback(async (include = false) => { const { pipelineId, knowledgeName } = workflowStore.getState() if (!pipelineId) return if (exporting) return try { setExporting(true) await doSyncWorkflowDraft() const { data } = await exportPipelineConfig({ pipelineId, include, }) const a = document.createElement('a') const file = new Blob([data], { type: 'application/yaml' }) a.href = URL.createObjectURL(file) a.download = `${knowledgeName}.yml` a.click() } catch { notify({ type: 'error', message: t('app.exportFailed') }) } finally { setExporting(false) } }, [notify, t, doSyncWorkflowDraft, exporting, exportPipelineConfig, workflowStore]) const exportCheck = useCallback(async () => { const { pipelineId } = workflowStore.getState() if (!pipelineId) return try { const workflowDraft = await fetchWorkflowDraft(`/rag/pipelines/${pipelineId}/workflows/draft`) const list = (workflowDraft.environment_variables || []).filter(env => env.value_type === 'secret') if (list.length === 0) { handleExportDSL() return } eventEmitter?.emit({ type: DSL_EXPORT_CHECK, payload: { data: list, }, } as any) } catch { notify({ type: 'error', message: t('app.exportFailed') }) } }, [eventEmitter, handleExportDSL, notify, t, workflowStore]) return { exportCheck, handleExportDSL, } }