mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 10:53:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			164 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {
 | |
|   useCallback,
 | |
|   useRef,
 | |
|   useState,
 | |
| } from 'react'
 | |
| import { useTranslation } from 'react-i18next'
 | |
| import { useRouter } from 'next/navigation'
 | |
| import type {
 | |
|   DSLImportMode,
 | |
|   DSLImportResponse,
 | |
| } from '@/models/app'
 | |
| import { DSLImportStatus } from '@/models/app'
 | |
| import {
 | |
|   importDSL,
 | |
|   importDSLConfirm,
 | |
| } from '@/service/apps'
 | |
| import type { AppIconType } from '@/types/app'
 | |
| import { useToastContext } from '@/app/components/base/toast'
 | |
| import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks'
 | |
| import { getRedirection } from '@/utils/app-redirection'
 | |
| import { useSelector } from '@/context/app-context'
 | |
| import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
 | |
| 
 | |
| type DSLPayload = {
 | |
|   mode: DSLImportMode
 | |
|   yaml_content?: string
 | |
|   yaml_url?: string
 | |
|   name?: string
 | |
|   icon_type?: AppIconType
 | |
|   icon?: string
 | |
|   icon_background?: string
 | |
|   description?: string
 | |
| }
 | |
| type ResponseCallback = {
 | |
|   onSuccess?: () => void
 | |
|   onPending?: (payload: DSLImportResponse) => void
 | |
|   onFailed?: () => void
 | |
| }
 | |
| export const useImportDSL = () => {
 | |
|   const { t } = useTranslation()
 | |
|   const { notify } = useToastContext()
 | |
|   const [isFetching, setIsFetching] = useState(false)
 | |
|   const { handleCheckPluginDependencies } = usePluginDependencies()
 | |
|   const isCurrentWorkspaceEditor = useSelector(s => s.isCurrentWorkspaceEditor)
 | |
|   const { push } = useRouter()
 | |
|   const [versions, setVersions] = useState<{ importedVersion: string; systemVersion: string }>()
 | |
|   const importIdRef = useRef<string>('')
 | |
| 
 | |
|   const handleImportDSL = useCallback(async (
 | |
|     payload: DSLPayload,
 | |
|     {
 | |
|       onSuccess,
 | |
|       onPending,
 | |
|       onFailed,
 | |
|     }: ResponseCallback,
 | |
|   ) => {
 | |
|     if (isFetching)
 | |
|       return
 | |
|     setIsFetching(true)
 | |
| 
 | |
|     try {
 | |
|       const response = await importDSL(payload)
 | |
| 
 | |
|       if (!response)
 | |
|         return
 | |
| 
 | |
|       const {
 | |
|         id,
 | |
|         status,
 | |
|         app_id,
 | |
|         app_mode,
 | |
|         imported_dsl_version,
 | |
|         current_dsl_version,
 | |
|       } = response
 | |
| 
 | |
|       if (status === DSLImportStatus.COMPLETED || status === DSLImportStatus.COMPLETED_WITH_WARNINGS) {
 | |
|         if (!app_id)
 | |
|           return
 | |
| 
 | |
|         notify({
 | |
|           type: status === DSLImportStatus.COMPLETED ? 'success' : 'warning',
 | |
|           message: t(status === DSLImportStatus.COMPLETED ? 'app.newApp.appCreated' : 'app.newApp.caution'),
 | |
|           children: status === DSLImportStatus.COMPLETED_WITH_WARNINGS && t('app.newApp.appCreateDSLWarning'),
 | |
|         })
 | |
|         onSuccess?.()
 | |
|         localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
 | |
|         await handleCheckPluginDependencies(app_id)
 | |
|         getRedirection(isCurrentWorkspaceEditor, { id: app_id, mode: app_mode }, push)
 | |
|       }
 | |
|       else if (status === DSLImportStatus.PENDING) {
 | |
|         setVersions({
 | |
|           importedVersion: imported_dsl_version ?? '',
 | |
|           systemVersion: current_dsl_version ?? '',
 | |
|         })
 | |
|         importIdRef.current = id
 | |
|         onPending?.(response)
 | |
|       }
 | |
|       else {
 | |
|         notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
 | |
|         onFailed?.()
 | |
|       }
 | |
|     }
 | |
|     catch {
 | |
|       notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
 | |
|       onFailed?.()
 | |
|     }
 | |
|     finally {
 | |
|       setIsFetching(false)
 | |
|     }
 | |
|   }, [t, notify, handleCheckPluginDependencies, isCurrentWorkspaceEditor, push, isFetching])
 | |
| 
 | |
|   const handleImportDSLConfirm = useCallback(async (
 | |
|     {
 | |
|       onSuccess,
 | |
|       onFailed,
 | |
|     }: Pick<ResponseCallback, 'onSuccess' | 'onFailed'>,
 | |
|   ) => {
 | |
|     if (isFetching)
 | |
|       return
 | |
|     setIsFetching(true)
 | |
|     if (!importIdRef.current)
 | |
|       return
 | |
| 
 | |
|     try {
 | |
|       const response = await importDSLConfirm({
 | |
|         import_id: importIdRef.current,
 | |
|       })
 | |
| 
 | |
|       const { status, app_id, app_mode } = response
 | |
|       if (!app_id)
 | |
|         return
 | |
| 
 | |
|       if (status === DSLImportStatus.COMPLETED) {
 | |
|         onSuccess?.()
 | |
|         notify({
 | |
|           type: 'success',
 | |
|           message: t('app.newApp.appCreated'),
 | |
|         })
 | |
|         await handleCheckPluginDependencies(app_id)
 | |
|         localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
 | |
|         getRedirection(isCurrentWorkspaceEditor, { id: app_id!, mode: app_mode }, push)
 | |
|       }
 | |
|       else if (status === DSLImportStatus.FAILED) {
 | |
|         notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
 | |
|         onFailed?.()
 | |
|       }
 | |
|     }
 | |
|     catch {
 | |
|       notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
 | |
|       onFailed?.()
 | |
|     }
 | |
|     finally {
 | |
|       setIsFetching(false)
 | |
|     }
 | |
|   }, [t, notify, handleCheckPluginDependencies, isCurrentWorkspaceEditor, push, isFetching])
 | |
| 
 | |
|   return {
 | |
|     handleImportDSL,
 | |
|     handleImportDSLConfirm,
 | |
|     versions,
 | |
|     isFetching,
 | |
|   }
 | |
| }
 | 
