import React, { useMemo, useRef, useState } from 'react' import { MagicBox } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices' import { FileZip } from '@/app/components/base/icons/src/vender/solid/files' import { Github } from '@/app/components/base/icons/src/vender/solid/general' import InstallFromGitHub from '@/app/components/plugins/install-plugin/install-from-github' import InstallFromLocalPackage from '@/app/components/plugins/install-plugin/install-from-local-package' import { usePluginPageContext } from '../context' import { Group } from '@/app/components/base/icons/src/vender/other' import { useSelector as useAppContextSelector } from '@/context/app-context' import Line from '../../marketplace/empty/line' import { useInstalledPluginList } from '@/service/use-plugins' import { useTranslation } from 'react-i18next' import { SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS } from '@/config' const Empty = () => { const { t } = useTranslation() const fileInputRef = useRef(null) const [selectedAction, setSelectedAction] = useState(null) const [selectedFile, setSelectedFile] = useState(null) const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures) const setActiveTab = usePluginPageContext(v => v.setActiveTab) const handleFileChange = (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (file) { setSelectedFile(file) setSelectedAction('local') } } const filters = usePluginPageContext(v => v.filters) const { data: pluginList } = useInstalledPluginList() const text = useMemo(() => { if (pluginList?.plugins.length === 0) return t('plugin.list.noInstalled') if (filters.categories.length > 0 || filters.tags.length > 0 || filters.searchQuery) return t('plugin.list.notFound') }, [pluginList?.plugins.length, t, filters.categories.length, filters.tags.length, filters.searchQuery]) return (
{/* skeleton */}
{Array.from({ length: 20 }).fill(0).map((_, i) => (
))}
{/* mask */}
{text}
{[ ...( (enable_marketplace && true) ? [{ icon: MagicBox, text: t('plugin.list.source.marketplace'), action: 'marketplace' }] : [] ), { icon: Github, text: t('plugin.list.source.github'), action: 'github' }, { icon: FileZip, text: t('plugin.list.source.local'), action: 'local' }, ].map(({ icon: Icon, text, action }) => (
{ if (action === 'local') fileInputRef.current?.click() else if (action === 'marketplace') setActiveTab('discover') else setSelectedAction(action) }} > {text}
))}
{selectedAction === 'github' && { }} onClose={() => setSelectedAction(null)} />} {selectedAction === 'local' && selectedFile && ( setSelectedAction(null)} onSuccess={() => { }} /> ) }
) } Empty.displayName = 'Empty' export default React.memo(Empty)