Fix plugin install detection for tool nodes

This commit is contained in:
lyzno1 2025-10-30 14:42:52 +08:00
parent 6e0765fbaf
commit ff0f645e54
No known key found for this signature in database
4 changed files with 34 additions and 4 deletions

View File

@ -7,15 +7,25 @@ import { useCheckInstalled, useInstallPackageFromMarketPlace } from '@/service/u
type InstallPluginButtonProps = Omit<ComponentProps<typeof Button>, 'children' | 'loading'> & { type InstallPluginButtonProps = Omit<ComponentProps<typeof Button>, 'children' | 'loading'> & {
uniqueIdentifier: string uniqueIdentifier: string
extraIdentifiers?: string[]
onSuccess?: () => void onSuccess?: () => void
} }
export const InstallPluginButton = (props: InstallPluginButtonProps) => { export const InstallPluginButton = (props: InstallPluginButtonProps) => {
const { className, uniqueIdentifier, onSuccess, ...rest } = props const {
className,
uniqueIdentifier,
extraIdentifiers = [],
onSuccess,
...rest
} = props
const { t } = useTranslation() const { t } = useTranslation()
const identifiers = Array.from(new Set(
[uniqueIdentifier, ...extraIdentifiers].filter((item): item is string => Boolean(item)),
))
const manifest = useCheckInstalled({ const manifest = useCheckInstalled({
pluginIds: [uniqueIdentifier], pluginIds: identifiers,
enabled: !!uniqueIdentifier, enabled: identifiers.length > 0,
}) })
const install = useInstallPackageFromMarketPlace() const install = useInstallPackageFromMarketPlace()
const isLoading = manifest.isLoading || install.isPending const isLoading = manifest.isLoading || install.isPending
@ -31,7 +41,13 @@ export const InstallPluginButton = (props: InstallPluginButtonProps) => {
}) })
} }
if (!manifest.data) return null if (!manifest.data) return null
if (manifest.data.plugins.some(plugin => plugin.id === uniqueIdentifier)) return null const identifierSet = new Set(identifiers)
const isInstalled = manifest.data.plugins.some(plugin => (
identifierSet.has(plugin.id)
|| (plugin.plugin_unique_identifier && identifierSet.has(plugin.plugin_unique_identifier))
|| (plugin.plugin_id && identifierSet.has(plugin.plugin_id))
))
if (isInstalled) return null
return <Button return <Button
variant={'secondary'} variant={'secondary'}
disabled={isLoading} disabled={isLoading}

View File

@ -26,6 +26,10 @@ const Node: FC<NodeProps<DataSourceNodeType>> = ({
<div className='absolute right-3 top-[-32px] z-20'> <div className='absolute right-3 top-[-32px] z-20'>
<InstallPluginButton <InstallPluginButton
size='small' size='small'
extraIdentifiers={[
data.plugin_id,
data.provider_name,
].filter(Boolean) as string[]}
className='!font-medium !text-text-accent' className='!font-medium !text-text-accent'
uniqueIdentifier={uniqueIdentifier!} uniqueIdentifier={uniqueIdentifier!}
onSuccess={onInstallSuccess} onSuccess={onInstallSuccess}

View File

@ -32,6 +32,11 @@ const Node: FC<NodeProps<ToolNodeType>> = ({
<InstallPluginButton <InstallPluginButton
size='small' size='small'
className='!font-medium !text-text-accent' className='!font-medium !text-text-accent'
extraIdentifiers={[
data.plugin_id,
data.provider_id,
data.provider_name,
].filter(Boolean) as string[]}
uniqueIdentifier={uniqueIdentifier!} uniqueIdentifier={uniqueIdentifier!}
onSuccess={onInstallSuccess} onSuccess={onInstallSuccess}
/> />

View File

@ -65,6 +65,11 @@ const Node: FC<NodeProps<PluginTriggerNodeType>> = ({
<div className="absolute right-3 top-[-32px] z-20"> <div className="absolute right-3 top-[-32px] z-20">
<InstallPluginButton <InstallPluginButton
size="small" size="small"
extraIdentifiers={[
data.plugin_id,
data.provider_id,
data.provider_name,
].filter(Boolean) as string[]}
className="!font-medium !text-text-accent" className="!font-medium !text-text-accent"
uniqueIdentifier={uniqueIdentifier!} uniqueIdentifier={uniqueIdentifier!}
onSuccess={onInstallSuccess} onSuccess={onInstallSuccess}