portal element

pull/21398/head
zxhlyh 12 months ago
parent 7ce9710229
commit bbbcd68258

@ -1,5 +1,5 @@
'use client' 'use client'
import React from 'react' import React, { useCallback, useMemo, useState } from 'react'
import { import {
FloatingPortal, FloatingPortal,
autoUpdate, autoUpdate,
@ -7,6 +7,7 @@ import {
offset, offset,
shift, shift,
size, size,
useClick,
useDismiss, useDismiss,
useFloating, useFloating,
useFocus, useFocus,
@ -33,17 +34,22 @@ export type PortalToFollowElemOptions = {
export function usePortalToFollowElem({ export function usePortalToFollowElem({
placement = 'bottom', placement = 'bottom',
open, open: controlledOpen,
offset: offsetValue = 0, offset: offsetValue = 0,
onOpenChange: setControlledOpen, onOpenChange: setControlledOpen,
triggerPopupSameWidth, triggerPopupSameWidth,
}: PortalToFollowElemOptions = {}) { }: 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({ const data = useFloating({
placement, placement,
open, open,
onOpenChange: setOpen, onOpenChange: handleOpenChange,
whileElementsMounted: autoUpdate, whileElementsMounted: autoUpdate,
middleware: [ middleware: [
offset(offsetValue), offset(offsetValue),
@ -74,16 +80,25 @@ export function usePortalToFollowElem({
const dismiss = useDismiss(context) const dismiss = useDismiss(context)
const role = useRole(context, { role: 'tooltip' }) 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( return React.useMemo(
() => ({ () => ({
open, open,
setOpen, setOpen: handleOpenChange,
...interactions, ...interactions,
...data, ...data,
}), }),
[open, setOpen, interactions, data], [open, handleOpenChange, interactions, data],
) )
} }

@ -77,7 +77,7 @@ const Popup = () => {
} }
</Button> </Button>
</div> </div>
<div className='border-t-[0.5px] border-t-divider-regular p-4 pt-3'> <div className='space-y-1 border-t-[0.5px] border-t-divider-regular p-4 pt-3'>
<Button <Button
className='w-full' className='w-full'
> >

Loading…
Cancel
Save