diff --git a/web/app/components/plugins/plugin-detail-panel/detail-header.tsx b/web/app/components/plugins/plugin-detail-panel/detail-header.tsx
index b40f264967..97e61b66d8 100644
--- a/web/app/components/plugins/plugin-detail-panel/detail-header.tsx
+++ b/web/app/components/plugins/plugin-detail-panel/detail-header.tsx
@@ -28,7 +28,7 @@ import { Github } from '@/app/components/base/icons/src/public/common'
import { uninstallPlugin } from '@/service/plugins'
import { useGetLanguage } from '@/context/i18n'
import { useModalContext } from '@/context/modal-context'
-
+import UpdateFromMarketplace from '@/app/components/plugins/update-plugin/from-market-place'
import { API_PREFIX, MARKETPLACE_URL_PREFIX } from '@/config'
import cn from '@/utils/classnames'
@@ -55,17 +55,35 @@ const DetailHeader = ({
source,
tenant_id,
version,
+ latest_unique_identifier,
latest_version,
meta,
} = detail
const { author, name, label, description, icon, verified } = detail.declaration
const isFromGitHub = source === PluginSource.github
+ const isFromMarketplace = source === PluginSource.marketplace
const hasNewVersion = useMemo(() => {
- return source === PluginSource.github && latest_version !== version
- }, [source, latest_version, version])
+ if (isFromGitHub)
+ return latest_version !== version
+
+ if (isFromMarketplace)
+ return !!latest_version && latest_version !== version
+
+ return false
+ }, [isFromGitHub, isFromMarketplace, latest_version, version])
+
+ const [isShowUpdateModal, {
+ setTrue: showUpdateModal,
+ setFalse: hideUpdateModal,
+ }] = useBoolean(false)
const handleUpdate = async () => {
+ if (isFromMarketplace) {
+ showUpdateModal()
+ return
+ }
+
try {
const fetchedReleases = await fetchReleases(author, name)
if (fetchedReleases.length === 0)
@@ -106,6 +124,11 @@ const DetailHeader = ({
}
}
+ const handleUpdatedFromMarketplace = () => {
+ onUpdate()
+ hideUpdateModal()
+ }
+
const [isShowPluginInfo, {
setTrue: showPluginInfo,
setFalse: hidePluginInfo,
@@ -222,6 +245,24 @@ const DetailHeader = ({
isDisabled={deleting}
/>
)}
+ {
+ isShowUpdateModal && (
+
+ )
+ }
)
}
diff --git a/web/app/components/plugins/types.ts b/web/app/components/plugins/types.ts
index 40627f67a3..a869b2c556 100644
--- a/web/app/components/plugins/types.ts
+++ b/web/app/components/plugins/types.ts
@@ -100,6 +100,7 @@ export type PluginDetail = {
endpoints_active: number
version: string
latest_version: string
+ latest_unique_identifier: string
source: PluginSource
meta?: MetaData
}
diff --git a/web/app/components/plugins/update-plugin/from-market-place.tsx b/web/app/components/plugins/update-plugin/from-market-place.tsx
index 0454617a2e..c76b154c40 100644
--- a/web/app/components/plugins/update-plugin/from-market-place.tsx
+++ b/web/app/components/plugins/update-plugin/from-market-place.tsx
@@ -69,23 +69,30 @@ const UpdatePluginModal: FC = ({
const handleConfirm = useCallback(async () => {
if (uploadStep === UploadStep.notStarted) {
setUploadStep(UploadStep.upgrading)
- const {
- all_installed: isInstalled,
- task_id: taskId,
- } = await updateFromMarketPlace({
- original_plugin_unique_identifier: originalPackageInfo.id,
- new_plugin_unique_identifier: targetPackageInfo.id,
- })
- if (isInstalled) {
+ try {
+ const {
+ all_installed: isInstalled,
+ task_id: taskId,
+ } = await updateFromMarketPlace({
+ original_plugin_unique_identifier: originalPackageInfo.id,
+ new_plugin_unique_identifier: targetPackageInfo.id,
+ })
+
+ if (isInstalled) {
+ onSave()
+ return
+ }
+ setPluginTasksWithPolling()
+ await check({
+ taskId,
+ pluginUniqueIdentifier: targetPackageInfo.id,
+ })
onSave()
- return
}
- setPluginTasksWithPolling()
- await check({
- taskId,
- pluginUniqueIdentifier: targetPackageInfo.id,
- })
- onSave()
+ catch (e) {
+ setUploadStep(UploadStep.notStarted)
+ }
+ return
}
if (uploadStep === UploadStep.installed) {
onSave()