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 (
<>