'use client' import type { FC } from 'react' import React, { useCallback } from 'react' import type { Dependency, Plugin } from '../../../types' import Button from '@/app/components/base/button' import { RiLoader2Line } from '@remixicon/react' import { useTranslation } from 'react-i18next' import InstallByDSLList from './install-by-dsl-list' import { useInstallFromMarketplaceAndGitHub } from '@/service/use-plugins' import { useInvalidateInstalledPluginList } from '@/service/use-plugins' const i18nPrefix = 'plugin.installModal' type Props = { fromDSLPayload: Dependency[] onInstalled: (plugins: Plugin[], installStatus: { success: boolean }[]) => void onCancel: () => void } const Install: FC = ({ fromDSLPayload, onInstalled, onCancel, }) => { const { t } = useTranslation() const [selectedPlugins, setSelectedPlugins] = React.useState([]) const [selectedIndexes, setSelectedIndexes] = React.useState([]) const selectedPluginsNum = selectedPlugins.length const invalidateInstalledPluginList = useInvalidateInstalledPluginList() const handleSelect = (plugin: Plugin, selectedIndex: number) => { const isSelected = !!selectedPlugins.find(p => p.plugin_id === plugin.plugin_id) let nextSelectedPlugins if (isSelected) nextSelectedPlugins = selectedPlugins.filter(p => p.plugin_id !== plugin.plugin_id) else nextSelectedPlugins = [...selectedPlugins, plugin] setSelectedPlugins(nextSelectedPlugins) const nextSelectedIndexes = isSelected ? selectedIndexes.filter(i => i !== selectedIndex) : [...selectedIndexes, selectedIndex] setSelectedIndexes(nextSelectedIndexes) } const [canInstall, setCanInstall] = React.useState(false) const handleLoadedAllPlugin = useCallback(() => { setCanInstall(true) }, []) // Install from marketplace and github const { mutate: installFromMarketplaceAndGitHub, isPending: isInstalling } = useInstallFromMarketplaceAndGitHub({ onSuccess: (res: { success: boolean }[]) => { onInstalled(selectedPlugins, res) const hasInstallSuccess = res.some(r => r.success) if (hasInstallSuccess) invalidateInstalledPluginList() }, }) const handleInstall = () => { installFromMarketplaceAndGitHub(fromDSLPayload.filter((_d, index) => selectedIndexes.includes(index))) } return ( <>

{t(`${i18nPrefix}.${selectedPluginsNum > 1 ? 'readyToInstallPackages' : 'readyToInstallPackage'}`, { num: selectedPluginsNum })}

{/* Action Buttons */}
{!canInstall && ( )}
) } export default React.memo(Install)