diff --git a/web/app/components/plugins/install-plugin/base/version.tsx b/web/app/components/plugins/install-plugin/base/version.tsx new file mode 100644 index 0000000000..891294f095 --- /dev/null +++ b/web/app/components/plugins/install-plugin/base/version.tsx @@ -0,0 +1,39 @@ +'use client' +import type { FC } from 'react' +import React from 'react' +import Badge, { BadgeState } from '@/app/components/base/badge/index' + +type Props = { + hasInstalled: boolean + installedVersion?: string + toInstallVersion: string +} + +const Version: FC = ({ + hasInstalled, + installedVersion, + toInstallVersion, +}) => { + return ( + <> + { + !hasInstalled + ? ( + {toInstallVersion} + ) + : ( + <> + + {`${installedVersion} -> ${toInstallVersion}`} + + {/*
+
Used in 3 apps
+ +
*/} + + ) + } + + ) +} +export default React.memo(Version) diff --git a/web/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx b/web/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx index 43c2a03319..d37275f19a 100644 --- a/web/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx +++ b/web/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx @@ -1,16 +1,16 @@ 'use client' import type { FC } from 'react' -import React from 'react' +import React, { useEffect } from 'react' import type { PluginDeclaration } from '../../../types' import Card from '../../../card' import { pluginManifestToCardPluginProps } from '../../utils' import Button from '@/app/components/base/button' import { Trans, useTranslation } from 'react-i18next' import { RiLoader2Line } from '@remixicon/react' -import Badge, { BadgeState } from '@/app/components/base/badge/index' -import { useInstallPackageFromLocal } from '@/service/use-plugins' import checkTaskStatus from '../../base/check-task-status' -import { usePluginTaskList } from '@/service/use-plugins' +import { useInstallPackageFromLocal, usePluginTaskList, useUpdatePackageFromMarketPlace } from '@/service/use-plugins' +import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed' +import Version from '../../base/version' const i18nPrefix = 'plugin.installModal' @@ -32,8 +32,24 @@ const Installed: FC = ({ onFailed, }) => { const { t } = useTranslation() + const toInstallVersion = payload.version + const pluginId = `${payload.author}/${payload.name}` + const { installedInfo, isLoading } = useCheckInstalled({ + pluginIds: [pluginId], + enabled: !!pluginId, + }) + const installedInfoPayload = installedInfo?.[pluginId] + const installedVersion = installedInfoPayload?.installedVersion + const hasInstalled = !!installedVersion + + useEffect(() => { + if (hasInstalled && toInstallVersion === installedVersion) + onInstalled() + }, [hasInstalled, toInstallVersion, installedVersion]) + const [isInstalling, setIsInstalling] = React.useState(false) const { mutateAsync: installPackageFromLocal } = useInstallPackageFromLocal() + const { mutateAsync: updatePackageFromMarketPlace } = useUpdatePackageFromMarketPlace() const { check, @@ -52,10 +68,28 @@ const Installed: FC = ({ onStartToInstall?.() try { - const { - all_installed: isInstalled, - task_id: taskId, - } = await installPackageFromLocal(uniqueIdentifier) + let taskId + let isInstalled + if (hasInstalled) { + const { + all_installed, + task_id, + } = await updatePackageFromMarketPlace({ + original_plugin_unique_identifier: installedInfoPayload.uniqueIdentifier, + new_plugin_unique_identifier: uniqueIdentifier, + }) + taskId = task_id + isInstalled = all_installed + } + else { + const { + all_installed, + task_id, + } = await installPackageFromLocal(uniqueIdentifier) + taskId = task_id + isInstalled = all_installed + } + if (isInstalled) { onInstalled() return @@ -92,7 +126,11 @@ const Installed: FC = ({ {payload.version}} + titleLeft={!isLoading && } /> @@ -106,7 +144,7 @@ const Installed: FC = ({