'use client' import React, { useCallback, useState } from 'react' import Modal from '@/app/components/base/modal' import type { Dependency, Plugin, PluginManifestInMarket } from '../../types' import { InstallStep, PluginType } from '../../types' import Install from './steps/install' import Installed from '../base/installed' import { useTranslation } from 'react-i18next' import { useUpdateModelProviders } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useInvalidateInstalledPluginList } from '@/service/use-plugins' import { useInvalidateAllToolProviders } from '@/service/use-tools' import ReadyToInstallBundle from '../install-bundle/ready-to-install' const i18nPrefix = 'plugin.installModal' type InstallFromMarketplaceProps = { uniqueIdentifier: string manifest: PluginManifestInMarket | Plugin isBundle?: boolean dependencies?: Dependency[] onSuccess: () => void onClose: () => void } const InstallFromMarketplace: React.FC = ({ uniqueIdentifier, manifest, isBundle, dependencies, onSuccess, onClose, }) => { const { t } = useTranslation() // readyToInstall -> check installed -> installed/failed const [step, setStep] = useState(InstallStep.readyToInstall) const [errorMsg, setErrorMsg] = useState(null) const updateModelProviders = useUpdateModelProviders() const invalidateAllToolProviders = useInvalidateAllToolProviders() const invalidateInstalledPluginList = useInvalidateInstalledPluginList() const getTitle = useCallback(() => { if (isBundle && step === InstallStep.installed) return t(`${i18nPrefix}.installComplete`) if (step === InstallStep.installed) return t(`${i18nPrefix}.installedSuccessfully`) if (step === InstallStep.installFailed) return t(`${i18nPrefix}.installFailed`) return t(`${i18nPrefix}.installPlugin`) }, [isBundle, step, t]) const handleInstalled = useCallback(() => { setStep(InstallStep.installed) invalidateInstalledPluginList() if (PluginType.model.includes(manifest.category)) updateModelProviders() if (PluginType.tool.includes(manifest.category)) invalidateAllToolProviders() }, [invalidateAllToolProviders, invalidateInstalledPluginList, manifest, updateModelProviders]) const handleFailed = useCallback((errorMsg?: string) => { setStep(InstallStep.installFailed) if (errorMsg) setErrorMsg(errorMsg) }, []) return (
{getTitle()}
{ isBundle ? ( ) : (<> { step === InstallStep.readyToInstall && ( )} { [InstallStep.installed, InstallStep.installFailed].includes(step) && ( ) } ) }
) } export default InstallFromMarketplace