Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>tags/1.9.0
| 'use client' | 'use client' | ||||
| import React, { useCallback, useMemo, useState } from 'react' | |||||
| import React, { useCallback, useState } from 'react' | |||||
| import { | import { | ||||
| FloatingPortal, | FloatingPortal, | ||||
| autoUpdate, | autoUpdate, | ||||
| offset, | offset, | ||||
| shift, | shift, | ||||
| size, | size, | ||||
| useClick, | |||||
| useDismiss, | useDismiss, | ||||
| useFloating, | useFloating, | ||||
| useFocus, | useFocus, | ||||
| }: 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) | ||||
| 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 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( | return React.useMemo( | ||||
| () => ({ | () => ({ |
| import { | import { | ||||
| memo, | memo, | ||||
| useCallback, | |||||
| useMemo, | useMemo, | ||||
| useState, | |||||
| } from 'react' | } from 'react' | ||||
| import { | import { | ||||
| RiAddLine, | RiAddLine, | ||||
| 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 | ||||
| } | } | ||||
| }, [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' | ||||
| > | > | ||||
| !!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, | ||||
| <AddApiKeyButton | <AddApiKeyButton | ||||
| {...apiKeyButtonProps} | {...apiKeyButtonProps} | ||||
| formSchemas={item.credential_schema} | formSchemas={item.credential_schema} | ||||
| onUpdate={onUpdate} | |||||
| onUpdate={handleUpdate} | |||||
| disabled={disabled} | disabled={disabled} | ||||
| /> | /> | ||||
| ) | ) |