'use client' import React, { useState } from 'react' import Modal from '@/app/components/base/modal' import type { Item } from '@/app/components/base/select' import type { GitHubUrlInfo, InstallState } from '@/app/components/plugins/types' import { InstallStepFromGitHub } from '../../types' import Toast from '@/app/components/base/toast' import SetURL from './steps/setURL' import SetVersion from './steps/setVersion' import SetPackage from './steps/setPackage' import Installed from './steps/installed' import { useTranslation } from 'react-i18next' type InstallFromGitHubProps = { onClose: () => void } const InstallFromGitHub: React.FC = ({ onClose }) => { const { t } = useTranslation() const [state, setState] = useState({ step: InstallStepFromGitHub.setUrl, repoUrl: '', selectedVersion: '', selectedPackage: '', releases: [], }) const versions: Item[] = state.releases.map(release => ({ value: release.tag_name, name: release.tag_name, })) const packages: Item[] = state.selectedVersion ? (state.releases .find(release => release.tag_name === state.selectedVersion) ?.assets .map(asset => ({ value: asset.browser_download_url, name: asset.name, })) || []) : [] const parseGitHubUrl = (url: string): GitHubUrlInfo => { const githubUrlRegex = /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/?$/ const match = url.match(githubUrlRegex) if (match) { return { isValid: true, owner: match[1], repo: match[2], } } return { isValid: false } } const handleInstall = async () => { // try { // const response = await installPackageFromGitHub({ repo: state.repoUrl, version: state.selectedVersion, package: state.selectedPackage }) // if (response.plugin_unique_identifier) { // setState(prevState => ({...prevState, step: InstallStep.installed})) // console.log('Package installed:') // } // else { // console.error('Failed to install package:') // } // } // catch (error) { // console.error('Error installing package:') // } setState(prevState => ({ ...prevState, step: InstallStepFromGitHub.installed })) } const handleNext = async () => { switch (state.step) { case InstallStepFromGitHub.setUrl: { const { isValid, owner, repo } = parseGitHubUrl(state.repoUrl) if (!isValid || !owner || !repo) { Toast.notify({ type: 'error', message: t('plugin.error.inValidGitHubUrl'), }) break } try { const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/releases`) if (!res.ok) throw new Error('Failed to fetch releases') const data = await res.json() const formattedReleases = data.map((release: any) => ({ tag_name: release.tag_name, assets: release.assets.map((asset: any) => ({ browser_download_url: asset.browser_download_url, id: asset.id, name: asset.name, })), })) setState(prevState => ({ ...prevState, releases: formattedReleases, step: InstallStepFromGitHub.setVersion })) } catch (error) { Toast.notify({ type: 'error', message: 'Failed to fetch repository release', }) } break } case InstallStepFromGitHub.setVersion: setState(prevState => ({ ...prevState, step: InstallStepFromGitHub.setPackage })) break case InstallStepFromGitHub.setPackage: handleInstall() break } } const handleBack = () => { setState((prevState) => { switch (prevState.step) { case InstallStepFromGitHub.setVersion: return { ...prevState, step: InstallStepFromGitHub.setUrl } case InstallStepFromGitHub.setPackage: return { ...prevState, step: InstallStepFromGitHub.setVersion } default: return prevState } }) } return (
{t('plugin.installFromGitHub.installPlugin')}
{state.step !== InstallStepFromGitHub.installed && t('plugin.installFromGitHub.installNote')}
{state.step === InstallStepFromGitHub.setUrl && ( setState(prevState => ({ ...prevState, repoUrl: value }))} onNext={handleNext} onCancel={onClose} /> )} {state.step === InstallStepFromGitHub.setVersion && ( setState(prevState => ({ ...prevState, selectedVersion: item.value as string }))} onNext={handleNext} onBack={handleBack} /> )} {state.step === InstallStepFromGitHub.setPackage && ( setState(prevState => ({ ...prevState, selectedPackage: item.value as string }))} onInstall={handleInstall} onBack={handleBack} /> )} {state.step === InstallStepFromGitHub.installed && ( )}
) } export default InstallFromGitHub