From bbbcd68258c956e64e370850c85e6a2f316d4500 Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Wed, 7 May 2025 18:13:55 +0800 Subject: [PATCH] portal element --- .../base/portal-to-follow-elem/index.tsx | 29 ++++++++++++++----- .../rag-pipeline-header/publisher/popup.tsx | 2 +- 2 files changed, 23 insertions(+), 8 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 1e2e198775..7267229e07 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 from 'react' +import React, { useCallback, useMemo, useState } from 'react' import { FloatingPortal, autoUpdate, @@ -7,6 +7,7 @@ import { offset, shift, size, + useClick, useDismiss, useFloating, useFocus, @@ -33,17 +34,22 @@ export type PortalToFollowElemOptions = { export function usePortalToFollowElem({ placement = 'bottom', - open, + open: controlledOpen, offset: offsetValue = 0, onOpenChange: setControlledOpen, triggerPopupSameWidth, }: PortalToFollowElemOptions = {}) { - const setOpen = setControlledOpen + const [localOpen, setLocalOpen] = useState(false) + const open = controlledOpen ?? localOpen + const handleOpenChange = useCallback((newOpen: boolean) => { + setLocalOpen(newOpen) + setControlledOpen?.(newOpen) + }, [setControlledOpen, setLocalOpen]) const data = useFloating({ placement, open, - onOpenChange: setOpen, + onOpenChange: handleOpenChange, whileElementsMounted: autoUpdate, middleware: [ offset(offsetValue), @@ -74,16 +80,25 @@ export function usePortalToFollowElem({ const dismiss = useDismiss(context) const role = useRole(context, { role: 'tooltip' }) - const interactions = useInteractions([hover, focus, dismiss, role]) + const click = useClick(context) + + const interactionsArray = useMemo(() => { + const result = [hover, focus, dismiss, role] + + if (!setControlledOpen) + result.push(click) + return result + }, [setControlledOpen, hover, focus, dismiss, role, click]) + const interactions = useInteractions(interactionsArray) return React.useMemo( () => ({ open, - setOpen, + setOpen: handleOpenChange, ...interactions, ...data, }), - [open, setOpen, interactions, data], + [open, handleOpenChange, interactions, data], ) } diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx index 91042068df..edbb87ccab 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-header/publisher/popup.tsx @@ -77,7 +77,7 @@ const Popup = () => { } -
+