mirror of
https://github.com/langgenius/dify.git
synced 2026-04-25 09:36:40 +08:00
refactor: simplify portal interactions and manage state in Configure component (#25906)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
parent
8f86f5749d
commit
ffa163a8a8
@ -1,5 +1,5 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import React, { useCallback, useMemo, useState } from 'react'
|
import React, { useCallback, useState } from 'react'
|
||||||
import {
|
import {
|
||||||
FloatingPortal,
|
FloatingPortal,
|
||||||
autoUpdate,
|
autoUpdate,
|
||||||
@ -7,7 +7,6 @@ import {
|
|||||||
offset,
|
offset,
|
||||||
shift,
|
shift,
|
||||||
size,
|
size,
|
||||||
useClick,
|
|
||||||
useDismiss,
|
useDismiss,
|
||||||
useFloating,
|
useFloating,
|
||||||
useFocus,
|
useFocus,
|
||||||
@ -41,7 +40,6 @@ export function usePortalToFollowElem({
|
|||||||
}: PortalToFollowElemOptions = {}) {
|
}: PortalToFollowElemOptions = {}) {
|
||||||
const [localOpen, setLocalOpen] = useState(false)
|
const [localOpen, setLocalOpen] = useState(false)
|
||||||
const open = controlledOpen ?? localOpen
|
const open = controlledOpen ?? localOpen
|
||||||
const isControlled = controlledOpen !== undefined
|
|
||||||
const handleOpenChange = useCallback((newOpen: boolean) => {
|
const handleOpenChange = useCallback((newOpen: boolean) => {
|
||||||
setLocalOpen(newOpen)
|
setLocalOpen(newOpen)
|
||||||
setControlledOpen?.(newOpen)
|
setControlledOpen?.(newOpen)
|
||||||
@ -73,24 +71,15 @@ export function usePortalToFollowElem({
|
|||||||
|
|
||||||
const hover = useHover(context, {
|
const hover = useHover(context, {
|
||||||
move: false,
|
move: false,
|
||||||
enabled: !isControlled,
|
enabled: controlledOpen === undefined,
|
||||||
})
|
})
|
||||||
const focus = useFocus(context, {
|
const focus = useFocus(context, {
|
||||||
enabled: !isControlled,
|
enabled: controlledOpen === undefined,
|
||||||
})
|
})
|
||||||
const dismiss = useDismiss(context)
|
const dismiss = useDismiss(context)
|
||||||
const role = useRole(context, { role: 'tooltip' })
|
const role = useRole(context, { role: 'tooltip' })
|
||||||
|
|
||||||
const click = useClick(context)
|
const interactions = useInteractions([hover, focus, dismiss, role])
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
return React.useMemo(
|
return React.useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
import {
|
import {
|
||||||
memo,
|
memo,
|
||||||
|
useCallback,
|
||||||
useMemo,
|
useMemo,
|
||||||
|
useState,
|
||||||
} from 'react'
|
} from 'react'
|
||||||
import {
|
import {
|
||||||
RiAddLine,
|
RiAddLine,
|
||||||
@ -36,6 +38,7 @@ const Configure = ({
|
|||||||
disabled,
|
disabled,
|
||||||
}: ConfigureProps) => {
|
}: ConfigureProps) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
|
const [open, setOpen] = useState(false)
|
||||||
const canApiKey = item.credential_schema?.length
|
const canApiKey = item.credential_schema?.length
|
||||||
const oAuthData = item.oauth_schema || {}
|
const oAuthData = item.oauth_schema || {}
|
||||||
const canOAuth = oAuthData.client_schema?.length
|
const canOAuth = oAuthData.client_schema?.length
|
||||||
@ -53,16 +56,27 @@ const Configure = ({
|
|||||||
}
|
}
|
||||||
}, [pluginPayload, t])
|
}, [pluginPayload, t])
|
||||||
|
|
||||||
|
const handleToggle = useCallback(() => {
|
||||||
|
setOpen(v => !v)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleUpdate = useCallback(() => {
|
||||||
|
setOpen(false)
|
||||||
|
onUpdate?.()
|
||||||
|
}, [onUpdate])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PortalToFollowElem
|
<PortalToFollowElem
|
||||||
|
open={open}
|
||||||
|
onOpenChange={setOpen}
|
||||||
placement='bottom-end'
|
placement='bottom-end'
|
||||||
offset={{
|
offset={{
|
||||||
mainAxis: 4,
|
mainAxis: 4,
|
||||||
crossAxis: -4,
|
crossAxis: -4,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<PortalToFollowElemTrigger>
|
<PortalToFollowElemTrigger onClick={handleToggle}>
|
||||||
<Button
|
<Button
|
||||||
variant='secondary-accent'
|
variant='secondary-accent'
|
||||||
>
|
>
|
||||||
@ -76,7 +90,7 @@ const Configure = ({
|
|||||||
!!canOAuth && (
|
!!canOAuth && (
|
||||||
<AddOAuthButton
|
<AddOAuthButton
|
||||||
{...oAuthButtonProps}
|
{...oAuthButtonProps}
|
||||||
onUpdate={onUpdate}
|
onUpdate={handleUpdate}
|
||||||
oAuthData={{
|
oAuthData={{
|
||||||
schema: oAuthData.client_schema || [],
|
schema: oAuthData.client_schema || [],
|
||||||
is_oauth_custom_client_enabled: oAuthData.is_oauth_custom_client_enabled,
|
is_oauth_custom_client_enabled: oAuthData.is_oauth_custom_client_enabled,
|
||||||
@ -102,7 +116,7 @@ const Configure = ({
|
|||||||
<AddApiKeyButton
|
<AddApiKeyButton
|
||||||
{...apiKeyButtonProps}
|
{...apiKeyButtonProps}
|
||||||
formSchemas={item.credential_schema}
|
formSchemas={item.credential_schema}
|
||||||
onUpdate={onUpdate}
|
onUpdate={handleUpdate}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user