'use client' import React, { useState } from 'react' import Modal from '@/app/components/base/modal' import type { Item } from '@/app/components/base/select' import type { InstallState } from '@/app/components/plugins/types' import { useGitHubReleases, useGitHubUpload } from '../hooks' import { parseGitHubUrl } from '../utils' import type { PluginDeclaration } from '../../types' import { InstallStepFromGitHub } from '../../types' import Toast from '@/app/components/base/toast' import SetURL from './steps/setURL' import SelectPackage from './steps/selectPackage' import Installed from './steps/installed' import Loaded from './steps/loaded' 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 [uniqueIdentifier, setUniqueIdentifier] = useState(null) const [manifest, setManifest] = useState(null) 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.name, name: asset.name, })) || []) : [] const { isLoading, handleUpload, error } = useGitHubUpload() const { fetchReleases } = useGitHubReleases() const handleInstall = async () => { } 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 } await fetchReleases(owner, repo, (fetchedReleases) => { setState(prevState => ({ ...prevState, releases: fetchedReleases, step: InstallStepFromGitHub.selectPackage, })) }) break } case InstallStepFromGitHub.selectPackage: { const repo = state.repoUrl.replace('https://github.com/', '') if (error) { Toast.notify({ type: 'error', message: error, }) } else { await handleUpload(repo, state.selectedVersion, state.selectedPackage, (GitHubPackage) => { setManifest(GitHubPackage.manifest) setUniqueIdentifier(GitHubPackage.uniqueIdentifier) setState(prevState => ({ ...prevState, step: InstallStepFromGitHub.loaded })) }) } break } case InstallStepFromGitHub.loaded: setState(prevState => ({ ...prevState, step: InstallStepFromGitHub.installed })) handleInstall() break case InstallStepFromGitHub.installed: break } } const handleBack = () => { setState((prevState) => { switch (prevState.step) { case InstallStepFromGitHub.selectPackage: return { ...prevState, step: InstallStepFromGitHub.setUrl } case InstallStepFromGitHub.loaded: return { ...prevState, step: InstallStepFromGitHub.selectPackage } 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.selectPackage && ( setState(prevState => ({ ...prevState, selectedVersion: item.value as string }))} selectedPackage={state.selectedPackage} packages={packages} onSelectPackage={item => setState(prevState => ({ ...prevState, selectedPackage: item.value as string }))} onNext={handleNext} onBack={handleBack} /> )} {state.step === InstallStepFromGitHub.loaded && ( )} {state.step === InstallStepFromGitHub.installed && ( )}
) } export default InstallFromGitHub