import {act, cleanup, fireEvent, render, screen} from '@testing-library/react'; import {useEffect, useLayoutEffect, useRef, useState} from 'react'; import {vi} from 'vitest'; import { arrow, flip, hide, limitShift, offset, shift, size, useFloating, } from '../src'; test('middleware is always fresh and does not cause an infinite loop', async () => { function InlineMiddleware() { const arrowRef = useRef(null); const {refs} = useFloating({ placement: 'right', middleware: [ offset(), offset(10), offset(() => 5), offset(() => ({crossAxis: 10})), offset({crossAxis: 10, mainAxis: 10}), flip({fallbackPlacements: ['top', 'bottom']}), shift(), shift({crossAxis: true}), shift({boundary: document.createElement('div')}), shift({boundary: [document.createElement('div')]}), shift({limiter: limitShift()}), shift({limiter: limitShift({offset: 10})}), shift({limiter: limitShift({offset: {crossAxis: 10}})}), shift({limiter: limitShift({offset: () => 5})}), shift({limiter: limitShift({offset: () => ({crossAxis: 10})})}), arrow({element: arrowRef}), hide(), size({ apply({availableHeight, elements}) { Object.assign(elements.floating.style, { maxHeight: `${availableHeight}px`, }); }, }), ], }); return ( <>
); } function StateMiddleware() { const arrowRef = useRef(null); const [middleware, setMiddleware] = useState([ offset(), offset(10), offset(() => 5), offset(() => ({crossAxis: 10})), offset({crossAxis: 10, mainAxis: 10}), // should also test `autoPlacement.allowedPlacements` // can't have both `flip` and `autoPlacement` in the same middleware // array, or multiple `flip`s flip({fallbackPlacements: ['top', 'bottom']}), shift(), shift({crossAxis: true}), shift({boundary: document.createElement('div')}), shift({boundary: [document.createElement('div')]}), shift({limiter: limitShift()}), shift({limiter: limitShift({offset: 10})}), shift({limiter: limitShift({offset: {crossAxis: 10}})}), shift({limiter: limitShift({offset: () => 5})}), shift({limiter: limitShift({offset: () => ({crossAxis: 10})})}), arrow({element: arrowRef}), hide(), size({ apply({availableHeight, elements}) { Object.assign(elements.floating.style, { maxHeight: `${availableHeight}px`, }); }, }), ]); const {x, y, refs} = useFloating({ placement: 'right', middleware, }); return ( <>