mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-04 12:53:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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,
 | 
						|
  }
 | 
						|
}
 |