From ffa163a8a8e8defd49cb66f8593f87ca3769f133 Mon Sep 17 00:00:00 2001 From: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:57:33 +0800 Subject: [PATCH] refactor: simplify portal interactions and manage state in Configure component (#25906) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../base/portal-to-follow-elem/index.tsx | 19 ++++-------------- .../data-source-page-new/configure.tsx | 20 ++++++++++++++++--- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/web/app/components/base/portal-to-follow-elem/index.tsx b/web/app/components/base/portal-to-follow-elem/index.tsx index ddba0b6545..71ee251edd 100644 --- a/web/app/components/base/portal-to-follow-elem/index.tsx +++ b/web/app/components/base/portal-to-follow-elem/index.tsx @@ -1,5 +1,5 @@ 'use client' -import React, { useCallback, useMemo, useState } from 'react' +import React, { useCallback, useState } from 'react' import { FloatingPortal, autoUpdate, @@ -7,7 +7,6 @@ import { offset, shift, size, - useClick, useDismiss, useFloating, useFocus, @@ -41,7 +40,6 @@ export function usePortalToFollowElem({ }: PortalToFollowElemOptions = {}) { const [localOpen, setLocalOpen] = useState(false) const open = controlledOpen ?? localOpen - const isControlled = controlledOpen !== undefined const handleOpenChange = useCallback((newOpen: boolean) => { setLocalOpen(newOpen) setControlledOpen?.(newOpen) @@ -73,24 +71,15 @@ export function usePortalToFollowElem({ const hover = useHover(context, { move: false, - enabled: !isControlled, + enabled: controlledOpen === undefined, }) const focus = useFocus(context, { - enabled: !isControlled, + enabled: controlledOpen === undefined, }) const dismiss = useDismiss(context) const role = useRole(context, { role: 'tooltip' }) - const click = useClick(context) - - const interactionsArray = useMemo(() => { - const result = [hover, focus, dismiss, role] - - if (!isControlled) - result.push(click) - return result - }, [isControlled, hover, focus, dismiss, role, click]) - const interactions = useInteractions(interactionsArray) + const interactions = useInteractions([hover, focus, dismiss, role]) return React.useMemo( () => ({ diff --git a/web/app/components/header/account-setting/data-source-page-new/configure.tsx b/web/app/components/header/account-setting/data-source-page-new/configure.tsx index aa4a6e9d1d..e597efe14f 100644 --- a/web/app/components/header/account-setting/data-source-page-new/configure.tsx +++ b/web/app/components/header/account-setting/data-source-page-new/configure.tsx @@ -1,6 +1,8 @@ import { memo, + useCallback, useMemo, + useState, } from 'react' import { RiAddLine, @@ -36,6 +38,7 @@ const Configure = ({ disabled, }: ConfigureProps) => { const { t } = useTranslation() + const [open, setOpen] = useState(false) const canApiKey = item.credential_schema?.length const oAuthData = item.oauth_schema || {} const canOAuth = oAuthData.client_schema?.length @@ -53,16 +56,27 @@ const Configure = ({ } }, [pluginPayload, t]) + const handleToggle = useCallback(() => { + setOpen(v => !v) + }, []) + + const handleUpdate = useCallback(() => { + setOpen(false) + onUpdate?.() + }, [onUpdate]) + return ( <> - +