123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- 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 }
- }
|