From d7d7281c93acc2dbc2457c7e086f1e835acd3067 Mon Sep 17 00:00:00 2001 From: Yi Date: Mon, 16 Sep 2024 18:58:39 +0800 Subject: [PATCH] feat: plugin homepage --- web/app/(commonLayout)/plugins/Container.tsx | 29 +++++-- .../plugins/InstallPluginDropdown.tsx | 3 +- .../plugins/plugin-setting/modal.tsx | 81 +++++++++++++++++++ web/context/modal-context.tsx | 14 ++++ 4 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 web/app/components/plugins/plugin-setting/modal.tsx diff --git a/web/app/(commonLayout)/plugins/Container.tsx b/web/app/(commonLayout)/plugins/Container.tsx index bee44b7215..fde3f0335c 100644 --- a/web/app/(commonLayout)/plugins/Container.tsx +++ b/web/app/(commonLayout)/plugins/Container.tsx @@ -5,17 +5,21 @@ import { useTranslation } from 'react-i18next' import { RiArrowRightUpLine, RiBugLine, + RiClipboardLine, RiDragDropLine, RiEqualizer2Line, } from '@remixicon/react' import InstallPluginDropdown from './InstallPluginDropdown' import { useTabSearchParams } from '@/hooks/use-tab-searchparams' +import { useModalContext } from '@/context/modal-context' import Button from '@/app/components/base/button' import TabSlider from '@/app/components/base/tab-slider' +import ActionButton from '@/app/components/base/action-button' import Tooltip from '@/app/components/base/tooltip' const Container = () => { const { t } = useTranslation() + const { setShowPluginSettingModal } = useModalContext() const options = useMemo(() => { return [ @@ -56,14 +60,24 @@ const Container = () => {
-
- Port -
+ {['Port', 'Key'].map((label, index) => ( +
+ {label} +
+ + {index === 0 ? 'cloud.dify,ai:2048' : 'A1B2C3D4E5F6G7H8'} + + + + +
+
+ ))}
} popupClassName='flex flex-col items-start w-[256px] px-4 py-3.5 gap-1 border border-components-panel-border - rounded-xl bg-components-tooltip-bg shadows-shadow-lg' + rounded-xl bg-components-tooltip-bg shadows-shadow-lg z-50' asChild={false} position='bottom' > @@ -71,7 +85,12 @@ const Container = () => { - diff --git a/web/app/(commonLayout)/plugins/InstallPluginDropdown.tsx b/web/app/(commonLayout)/plugins/InstallPluginDropdown.tsx index 35b1089bae..c94ddfe75b 100644 --- a/web/app/(commonLayout)/plugins/InstallPluginDropdown.tsx +++ b/web/app/(commonLayout)/plugins/InstallPluginDropdown.tsx @@ -6,6 +6,7 @@ import Button from '@/app/components/base/button' 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 cn from '@/utils/classnames' const InstallPluginDropdown = () => { const [isMenuOpen, setIsMenuOpen] = useState(false) @@ -26,7 +27,7 @@ const InstallPluginDropdown = () => { return (
+ +
+ + + ) +} + +export default React.memo(PluginSettingModal) diff --git a/web/context/modal-context.tsx b/web/context/modal-context.tsx index 3547c45aac..db52cb6b27 100644 --- a/web/context/modal-context.tsx +++ b/web/context/modal-context.tsx @@ -5,6 +5,7 @@ import { useCallback, useState } from 'react' import { createContext, useContext, useContextSelector } from 'use-context-selector' import { useRouter, useSearchParams } from 'next/navigation' import AccountSetting from '@/app/components/header/account-setting' +import PluginSettingModal from '@/app/components/plugins/plugin-setting/modal' import ApiBasedExtensionModal from '@/app/components/header/account-setting/api-based-extension-page/modal' import ModerationSettingModal from '@/app/components/app/configuration/toolbox/moderation/moderation-setting-modal' import ExternalDataToolModal from '@/app/components/app/configuration/tools/external-data-tool-modal' @@ -46,6 +47,7 @@ export type LoadBalancingEntryModalType = ModelModalType & { } export type ModalContextState = { setShowAccountSettingModal: Dispatch | null>> + setShowPluginSettingModal: () => void setShowApiBasedExtensionModal: Dispatch | null>> setShowModerationSettingModal: Dispatch | null>> setShowExternalDataToolModal: Dispatch | null>> @@ -57,6 +59,7 @@ export type ModalContextState = { } const ModalContext = createContext({ setShowAccountSettingModal: () => { }, + setShowPluginSettingModal: () => { }, setShowApiBasedExtensionModal: () => { }, setShowModerationSettingModal: () => { }, setShowExternalDataToolModal: () => { }, @@ -92,6 +95,7 @@ export const ModalContextProvider = ({ const router = useRouter() const [showPricingModal, setShowPricingModal] = useState(searchParams.get('show-pricing') === '1') const [showAnnotationFullModal, setShowAnnotationFullModal] = useState(false) + const [showPluginSettingModal, setShowPluginSettingModal] = useState(false) const handleCancelAccountSettingModal = () => { setShowAccountSettingModal(null) if (showAccountSettingModal?.onCancelCallback) @@ -167,6 +171,7 @@ export const ModalContextProvider = ({ return ( setShowPluginSettingModal(true), setShowApiBasedExtensionModal, setShowModerationSettingModal, setShowExternalDataToolModal, @@ -187,6 +192,15 @@ export const ModalContextProvider = ({ ) } + { + !!showPluginSettingModal && ( + setShowPluginSettingModal(false)} + /> + ) + } + { !!showApiBasedExtensionModal && (