'use client' import React, { useCallback, useState } from 'react' import Modal from '@/app/components/base/modal' import type { Dependency, PluginDeclaration } from '../../types' import { InstallStep } from '../../types' import Uploading from './steps/uploading' import { useTranslation } from 'react-i18next' import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon' import ReadyToInstallPackage from './ready-to-install' import ReadyToInstallBundle from '../install-bundle/ready-to-install' import useHideLogic from '../hooks/use-hide-logic' import cn from '@/utils/classnames' const i18nPrefix = 'plugin.installModal' type InstallFromLocalPackageProps = { file: File onSuccess: () => void onClose: () => void } const InstallFromLocalPackage: React.FC = ({ file, onClose, }) => { const { t } = useTranslation() // uploading -> !uploadFailed -> readyToInstall -> installed/failed const [step, setStep] = useState(InstallStep.uploading) const [uniqueIdentifier, setUniqueIdentifier] = useState(null) const [manifest, setManifest] = useState(null) const [errorMsg, setErrorMsg] = useState(null) const isBundle = file.name.endsWith('.difybndl') const [dependencies, setDependencies] = useState([]) const { modalClassName, foldAnimInto, setIsInstalling, handleStartToInstall, } = useHideLogic(onClose) const getTitle = useCallback(() => { if (step === InstallStep.uploadFailed) return t(`${i18nPrefix}.uploadFailed`) 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 { getIconUrl } = useGetIcon() const handlePackageUploaded = useCallback(async (result: { uniqueIdentifier: string manifest: PluginDeclaration }) => { const { manifest, uniqueIdentifier, } = result const icon = await getIconUrl(manifest!.icon) setUniqueIdentifier(uniqueIdentifier) setManifest({ ...manifest, icon, }) setStep(InstallStep.readyToInstall) }, [getIconUrl]) const handleBundleUploaded = useCallback((result: Dependency[]) => { setDependencies(result) setStep(InstallStep.readyToInstall) }, []) const handleUploadFail = useCallback((errorMsg: string) => { setErrorMsg(errorMsg) setStep(InstallStep.uploadFailed) }, []) return (
{getTitle()}
{step === InstallStep.uploading && ( )} {isBundle ? ( ) : ( )}
) } export default InstallFromLocalPackage