diff --git a/web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx b/web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx index b70a481b74..6034d0c2cc 100644 --- a/web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx +++ b/web/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx @@ -22,9 +22,21 @@ const InstallByDSLList: FC = ({ onSelect, onLoadedAllPlugin, }) => { - const { isLoading: isFetchingMarketplaceData, data: marketplaceRes } = useFetchPluginsInMarketPlaceByIds(allPlugins.filter(d => d.type === 'marketplace').map(d => d.value.plugin_unique_identifier!)) + const { isLoading: isFetchingMarketplaceData, data: marketplaceRes } = useFetchPluginsInMarketPlaceByIds(allPlugins.filter(d => d.type === 'marketplace').map(d => (d as GitHubItemAndMarketPlaceDependency).value.plugin_unique_identifier!)) - const [plugins, setPlugins, getPlugins] = useGetState([]) + const [plugins, setPlugins, getPlugins] = useGetState<(Plugin | undefined)[]>((() => { + const hasLocalPackage = allPlugins.some(d => d.type === 'package') + if (!hasLocalPackage) + return [] + + const _plugins = allPlugins.map((d) => { + if (d.type === 'package') + return (d as any).value.manifest + + return undefined + }) + return _plugins + })()) const [errorIndexes, setErrorIndexes] = useState([]) @@ -53,15 +65,20 @@ const InstallByDSLList: FC = ({ }, [allPlugins]) useEffect(() => { - if (!isFetchingMarketplaceData && marketplaceRes?.data.plugins && marketplaceRes?.data.plugins.length > 0) { + if (!isFetchingMarketplaceData && marketplaceRes?.data.plugins) { const payloads = marketplaceRes?.data.plugins - + const failedIndex: number[] = [] const nextPlugins = produce(getPlugins(), (draft) => { marketPlaceInDSLIndex.forEach((index, i) => { - draft[index] = payloads[i] + if (payloads[i]) + draft[index] = payloads[i] + else + failedIndex.push(index) }) }) setPlugins(nextPlugins) + if (failedIndex.length > 0) + setErrorIndexes([...errorIndexes, ...failedIndex]) // marketplaceRes?.data.plugins } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -76,7 +93,7 @@ const InstallByDSLList: FC = ({ const handleSelect = useCallback((index: number) => { return () => { - onSelect(plugins[index], index) + onSelect(plugins[index]!, index) } }, [onSelect, plugins]) return ( diff --git a/web/service/use-plugins.ts b/web/service/use-plugins.ts index 8c45f35301..def7b42ec2 100644 --- a/web/service/use-plugins.ts +++ b/web/service/use-plugins.ts @@ -2,8 +2,10 @@ import { useCallback, useState } from 'react' import type { DebugInfo as DebugInfoTypes, Dependency, + GitHubItemAndMarketPlaceDependency, InstallPackageResponse, InstalledPluginListResponse, + PackageDependency, Permissions, PluginTask, PluginsFromMarketplaceResponse, @@ -119,21 +121,33 @@ export const useInstallFromMarketplaceAndGitHub = ({ return Promise.all(payload.map(async (item) => { try { if (item.type === 'github') { + const data = item as GitHubItemAndMarketPlaceDependency await post('/workspaces/current/plugin/install/github', { body: { - repo: item.value.repo!, - version: item.value.version!, - package: item.value.package!, - plugin_unique_identifier: item.value.github_plugin_unique_identifier!, + repo: data.value.repo!, + version: data.value.version!, + package: data.value.package!, + plugin_unique_identifier: data.value.github_plugin_unique_identifier!, + }, + }) + } + if (item.type === 'marketplace') { + const data = item as GitHubItemAndMarketPlaceDependency + + await post('/workspaces/current/plugin/install/marketplace', { + body: { + plugin_unique_identifiers: [data.value.plugin_unique_identifier!], + }, + }) + } + if (item.type === 'package') { + const data = item as PackageDependency + await post('/workspaces/current/plugin/install/pkg', { + body: { + plugin_unique_identifiers: [data.value.unique_identifier], }, }) - return ({ success: true }) } - await post('/workspaces/current/plugin/install/marketplace', { - body: { - plugin_unique_identifiers: [item.value.plugin_unique_identifier!], - }, - }) return ({ success: true }) } // eslint-disable-next-line unused-imports/no-unused-vars