mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 10:53:02 +00:00 
			
		
		
		
	
		
			
	
	
		
			108 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|   | import Toast, { type IToastProps } from '@/app/components/base/toast' | ||
|  | import { uploadGitHub } from '@/service/plugins' | ||
|  | import { compareVersion, getLatestVersion } from '@/utils/semver' | ||
|  | import type { GitHubRepoReleaseResponse } from '../types' | ||
|  | import { GITHUB_ACCESS_TOKEN } from '@/config' | ||
|  | 
 | ||
|  | const formatReleases = (releases: any) => { | ||
|  |   return releases.map((release: any) => ({ | ||
|  |     tag_name: release.tag_name, | ||
|  |     assets: release.assets.map((asset: any) => ({ | ||
|  |       browser_download_url: asset.browser_download_url, | ||
|  |       name: asset.name, | ||
|  |     })), | ||
|  |   })) | ||
|  | } | ||
|  | 
 | ||
|  | export const useGitHubReleases = () => { | ||
|  |   const fetchReleases = async (owner: string, repo: string) => { | ||
|  |     try { | ||
|  |       if (!GITHUB_ACCESS_TOKEN) { | ||
|  |         // Fetch releases without authentication from client
 | ||
|  |         const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/releases`) | ||
|  |         if (!res.ok) throw new Error('Failed to fetch repository releases') | ||
|  |         const data = await res.json() | ||
|  |         return formatReleases(data) | ||
|  |       } | ||
|  |       else { | ||
|  |         // Fetch releases with authentication from server
 | ||
|  |         const res = await fetch(`/repos/${owner}/${repo}/releases`) | ||
|  |         const bodyJson = await res.json() | ||
|  |         if (bodyJson.status !== 200) throw new Error(bodyJson.data.message) | ||
|  |         return formatReleases(bodyJson.data) | ||
|  |       } | ||
|  |     } | ||
|  |     catch (error) { | ||
|  |       if (error instanceof Error) { | ||
|  |         Toast.notify({ | ||
|  |           type: 'error', | ||
|  |           message: error.message, | ||
|  |         }) | ||
|  |       } | ||
|  |       else { | ||
|  |         Toast.notify({ | ||
|  |           type: 'error', | ||
|  |           message: 'Failed to fetch repository releases', | ||
|  |         }) | ||
|  |       } | ||
|  |       return [] | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const checkForUpdates = (fetchedReleases: GitHubRepoReleaseResponse[], currentVersion: string) => { | ||
|  |     let needUpdate = false | ||
|  |     const toastProps: IToastProps = { | ||
|  |       type: 'info', | ||
|  |       message: 'No new version available', | ||
|  |     } | ||
|  |     if (fetchedReleases.length === 0) { | ||
|  |       toastProps.type = 'error' | ||
|  |       toastProps.message = 'Input releases is empty' | ||
|  |       return { needUpdate, toastProps } | ||
|  |     } | ||
|  |     const versions = fetchedReleases.map(release => release.tag_name) | ||
|  |     const latestVersion = getLatestVersion(versions) | ||
|  |     try { | ||
|  |       needUpdate = compareVersion(latestVersion, currentVersion) === 1 | ||
|  |       if (needUpdate) | ||
|  |         toastProps.message = `New version available: ${latestVersion}` | ||
|  |     } | ||
|  |     catch { | ||
|  |       needUpdate = false | ||
|  |       toastProps.type = 'error' | ||
|  |       toastProps.message = 'Fail to compare versions, please check the version format' | ||
|  |     } | ||
|  |     return { needUpdate, toastProps } | ||
|  |   } | ||
|  | 
 | ||
|  |   return { fetchReleases, checkForUpdates } | ||
|  | } | ||
|  | 
 | ||
|  | export const useGitHubUpload = () => { | ||
|  |   const handleUpload = async ( | ||
|  |     repoUrl: string, | ||
|  |     selectedVersion: string, | ||
|  |     selectedPackage: string, | ||
|  |     onSuccess?: (GitHubPackage: { manifest: any; unique_identifier: string }) => void, | ||
|  |   ) => { | ||
|  |     try { | ||
|  |       const response = await uploadGitHub(repoUrl, selectedVersion, selectedPackage) | ||
|  |       const GitHubPackage = { | ||
|  |         manifest: response.manifest, | ||
|  |         unique_identifier: response.unique_identifier, | ||
|  |       } | ||
|  |       if (onSuccess) onSuccess(GitHubPackage) | ||
|  |       return GitHubPackage | ||
|  |     } | ||
|  |     catch (error) { | ||
|  |       Toast.notify({ | ||
|  |         type: 'error', | ||
|  |         message: 'Error uploading package', | ||
|  |       }) | ||
|  |       throw error | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return { handleUpload } | ||
|  | } |