diff --git a/web/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx b/web/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx index 195ff43d00..e2de988a74 100644 --- a/web/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx +++ b/web/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx @@ -1,10 +1,9 @@ 'use client' -import React from 'react' +import React, { useEffect } from 'react' import Button from '@/app/components/base/button' -import { type PluginDeclaration, type PluginType, TaskStatus, type UpdateFromGitHubPayload } from '../../../types' +import { type Plugin, type PluginDeclaration, TaskStatus, type UpdateFromGitHubPayload } from '../../../types' import Card from '../../../card' -import Badge, { BadgeState } from '@/app/components/base/badge/index' import { pluginManifestToCardPluginProps } from '../../utils' import { useTranslation } from 'react-i18next' import { updateFromGitHub } from '@/service/plugins' @@ -12,13 +11,14 @@ import { useInstallPackageFromGitHub } from '@/service/use-plugins' import { RiLoader2Line } from '@remixicon/react' import { usePluginTaskList } from '@/service/use-plugins' import checkTaskStatus from '../../base/check-task-status' +import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed' import { parseGitHubUrl } from '../../utils' -import { useCategories } from '../../../hooks' +import Version from '../../base/version' type LoadedProps = { updatePayload: UpdateFromGitHubPayload uniqueIdentifier: string - payload: PluginDeclaration + payload: PluginDeclaration | Plugin repoUrl: string selectedVersion: string selectedPackage: string @@ -41,12 +41,26 @@ const Loaded: React.FC = ({ onFailed, }) => { const { t } = useTranslation() - const { categoriesMap } = useCategories() + const toInstallVersion = payload.version + const pluginId = (payload as Plugin).plugin_id + const { installedInfo, isLoading } = useCheckInstalled({ + pluginIds: [pluginId], + enabled: !!pluginId, + }) + const installedInfoPayload = installedInfo?.[pluginId] + const installedVersion = installedInfoPayload?.installedVersion + const hasInstalled = !!installedVersion + const [isInstalling, setIsInstalling] = React.useState(false) const { mutateAsync: installPackageFromGitHub } = useInstallPackageFromGitHub() const { handleRefetch } = usePluginTaskList() const { check } = checkTaskStatus() + useEffect(() => { + if (hasInstalled && uniqueIdentifier === installedInfoPayload.uniqueIdentifier) + onInstalled() + }, [hasInstalled]) + const handleInstall = async () => { if (isInstalling) return setIsInstalling(true) @@ -54,8 +68,9 @@ const Loaded: React.FC = ({ try { const { owner, repo } = parseGitHubUrl(repoUrl) let taskId + let isInstalled if (updatePayload) { - const { all_installed: isInstalled, task_id } = await updateFromGitHub( + const { all_installed, task_id } = await updateFromGitHub( `${owner}/${repo}`, selectedVersion, selectedPackage, @@ -64,31 +79,41 @@ const Loaded: React.FC = ({ ) taskId = task_id - - if (isInstalled) { - onInstalled() - return - } - - handleRefetch() + isInstalled = all_installed } else { - const { all_installed: isInstalled, task_id } = await installPackageFromGitHub({ - repoUrl: `${owner}/${repo}`, - selectedVersion, - selectedPackage, - uniqueIdentifier, - }) - - taskId = task_id - - if (isInstalled) { - onInstalled() - return + if (hasInstalled) { + const { + all_installed, + task_id, + } = await updateFromGitHub( + `${owner}/${repo}`, + selectedVersion, + selectedPackage, + installedInfoPayload.uniqueIdentifier, + uniqueIdentifier, + ) + taskId = task_id + isInstalled = all_installed } + else { + const { all_installed, task_id } = await installPackageFromGitHub({ + repoUrl: `${owner}/${repo}`, + selectedVersion, + selectedPackage, + uniqueIdentifier, + }) - handleRefetch() + taskId = task_id + isInstalled = all_installed + } } + if (isInstalled) { + onInstalled() + return + } + + handleRefetch() const { status, error } = await check({ taskId, @@ -120,8 +145,12 @@ const Loaded: React.FC = ({
{payload.version}} + payload={pluginManifestToCardPluginProps(payload as PluginDeclaration)} + titleLeft={!isLoading && } />
@@ -134,7 +163,7 @@ const Loaded: React.FC = ({ variant='primary' className='min-w-[72px] flex space-x-0.5' onClick={handleInstall} - disabled={isInstalling} + disabled={isInstalling || isLoading} > {isInstalling && } {t(`${i18nPrefix}.${isInstalling ? 'installing' : 'install'}`)}