'use client' import { useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { RiDragDropLine, RiEqualizer2Line, RiInstallFill, } from '@remixicon/react' import { useBoolean } from 'ahooks' import InstallFromLocalPackage from '../install-plugin/install-from-local-package' import { PluginPageContextProvider, usePluginPageContext, } from './context' import InstallPluginDropdown from './install-plugin-dropdown' import { useUploader } from './use-uploader' import usePermission from './use-permission' import DebugInfo from './debug-info' import { useTabSearchParams } from '@/hooks/use-tab-searchparams' import Button from '@/app/components/base/button' import TabSlider from '@/app/components/base/tab-slider' import Tooltip from '@/app/components/base/tooltip' import cn from '@/utils/classnames' import PermissionSetModal from '@/app/components/plugins/permission-setting-modal/modal' import { useSelector as useAppContextSelector } from '@/context/app-context' import InstallFromMarketplace from '../install-plugin/install-from-marketplace' import { useRouter, useSearchParams, } from 'next/navigation' import type { PluginDeclaration } from '../types' import { toolNotionManifest } from '../card/card-mock' import { sleep } from '@/utils' const PACKAGE_IDS_KEY = 'package-ids' export interface PluginPageProps { plugins: React.ReactNode marketplace: React.ReactNode } const PluginPage = ({ plugins, marketplace, }: PluginPageProps) => { const { t } = useTranslation() const searchParams = useSearchParams() const { replace } = useRouter() // just support install one package now const packageId = useMemo(() => { const idStrings = searchParams.get(PACKAGE_IDS_KEY) try { return idStrings ? JSON.parse(idStrings)[0] : '' } catch (e) { return '' } }, [searchParams]) const [isShowInstallFromMarketplace, { setTrue: showInstallFromMarketplace, setFalse: doHideInstallFromMarketplace, }] = useBoolean(false) const hideInstallFromMarketplace = () => { doHideInstallFromMarketplace() const url = new URL(window.location.href) url.searchParams.delete(PACKAGE_IDS_KEY) replace(url.toString()) } const [manifest, setManifest] = useState(null) useEffect(() => { (async () => { await sleep(100) if (packageId) { // setManifest(toolNotionManifest) // TODO // const data = await fetchManifest(encodeURIComponent(packageId)) setManifest(toolNotionManifest) showInstallFromMarketplace() } })() }, [packageId]) const { canManagement, canDebugger, canSetPermissions, permissions, setPermissions, } = usePermission() const [showPluginSettingModal, { setTrue: setShowPluginSettingModal, setFalse: setHidePluginSettingModal, }] = useBoolean() const [currentFile, setCurrentFile] = useState(null) const containerRef = usePluginPageContext(v => v.containerRef) const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures) const [installed, total] = [2, 3] // Replace this with the actual progress const progressPercentage = (installed / total) * 100 const options = useMemo(() => { return [ { value: 'plugins', text: t('common.menus.plugins') }, ...( enable_marketplace ? [{ value: 'discover', text: 'Explore Marketplace' }] : [] ), ] }, [t, enable_marketplace]) const [activeTab, setActiveTab] = useTabSearchParams({ defaultTab: options[0].value, }) const uploaderProps = useUploader({ onFileChange: setCurrentFile, containerRef, enabled: activeTab === 'plugins', }) const { dragging, fileUploader, fileChangeHandle, removeFile } = uploaderProps return (
{canManagement && ( setActiveTab('discover')} /> )} { canDebugger && ( ) } { canSetPermissions && ( ) }
{activeTab === 'plugins' && ( <> {plugins} {dragging && (
)}
Drop plugin package here to install
{currentFile && ( { })} onSuccess={() => { }} /> )} { })} /> )} { activeTab === 'discover' && enable_marketplace && marketplace } {showPluginSettingModal && ( )} { isShowInstallFromMarketplace && ( ) }
) } const PluginPageWithContext = (props: PluginPageProps) => { return ( ) } export default PluginPageWithContext