'use client'; import PluginInstalledComponent, { PluginInstalledComponentRef, } from '@/app/home/plugins/plugin-installed/PluginInstalledComponent'; import PluginMarketComponent from '@/app/home/plugins/plugin-market/PluginMarketComponent'; import PluginSortDialog from '@/app/home/plugins/plugin-sort/PluginSortDialog'; import styles from './plugins.module.css'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Button } from '@/components/ui/button'; import { PlusIcon } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { GithubIcon } from 'lucide-react'; import { useState, useRef } from 'react'; import { httpClient } from '@/app/infra/http/HttpClient'; import { toast } from 'sonner'; import { useTranslation } from 'react-i18next'; enum PluginInstallStatus { WAIT_INPUT = 'wait_input', INSTALLING = 'installing', ERROR = 'error', } export default function PluginConfigPage() { const { t } = useTranslation(); const [modalOpen, setModalOpen] = useState(false); const [sortModalOpen, setSortModalOpen] = useState(false); const [pluginInstallStatus, setPluginInstallStatus] = useState(PluginInstallStatus.WAIT_INPUT); const [installError, setInstallError] = useState(null); const [githubURL, setGithubURL] = useState(''); const pluginInstalledRef = useRef(null); function handleModalConfirm() { installPlugin(githubURL); } function installPlugin(url: string) { setPluginInstallStatus(PluginInstallStatus.INSTALLING); httpClient .installPluginFromGithub(url) .then((resp) => { const taskId = resp.task_id; let alreadySuccess = false; console.log('taskId:', taskId); // 每秒拉取一次任务状态 const interval = setInterval(() => { httpClient.getAsyncTask(taskId).then((resp) => { console.log('task status:', resp); if (resp.runtime.done) { clearInterval(interval); if (resp.runtime.exception) { setInstallError(resp.runtime.exception); setPluginInstallStatus(PluginInstallStatus.ERROR); } else { // success if (!alreadySuccess) { toast.success(t('plugins.installSuccess')); alreadySuccess = true; } setGithubURL(''); setModalOpen(false); pluginInstalledRef.current?.refreshPluginList(); } } }); }, 1000); }) .catch((err) => { console.log('error when install plugin:', err); setInstallError(err.message); setPluginInstallStatus(PluginInstallStatus.ERROR); }); } return (
{t('plugins.installed')} {t('plugins.marketplace')}
{ setGithubURL(githubURL); setModalOpen(true); setPluginInstallStatus(PluginInstallStatus.WAIT_INPUT); setInstallError(null); }} />
{t('plugins.installFromGithub')} {pluginInstallStatus === PluginInstallStatus.WAIT_INPUT && (

{t('plugins.onlySupportGithub')}

setGithubURL(e.target.value)} className="mb-4" />
)} {pluginInstallStatus === PluginInstallStatus.INSTALLING && (

{t('plugins.installing')}

)} {pluginInstallStatus === PluginInstallStatus.ERROR && (

{t('plugins.installFailed')}

{installError}

)} {pluginInstallStatus === PluginInstallStatus.WAIT_INPUT && ( <> )} {pluginInstallStatus === PluginInstallStatus.ERROR && ( )}
{ pluginInstalledRef.current?.refreshPluginList(); }} />
); }