fix: Unwanted width calculation in Dropdown (#15239)

This commit is contained in:
Aswath K 2022-07-20 11:35:44 +05:30 committed by GitHub
parent 1af9e2042f
commit 8724f1c4fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 6 deletions

View File

@ -21,7 +21,7 @@ import { TooltipComponent as Tooltip } from "design-system";
import { isEllipsisActive } from "utils/helpers";
import SegmentHeader from "components/ads/ListSegmentHeader";
import { useTheme } from "styled-components";
import { findIndex, isArray } from "lodash";
import { debounce, findIndex, isArray } from "lodash";
import { TooltipComponent } from "design-system";
import { SubTextPosition } from "components/constants";
import { DSEventTypes, emitDSEvent } from "utils/AppsmithUtils";
@ -1149,12 +1149,36 @@ export default function Dropdown(props: DropdownProps) {
[isOpen, props.options, props.selected, selected, highlight],
);
let dropdownWrapperWidth = "100%";
const [dropdownWrapperWidth, setDropdownWrapperWidth] = useState<string>(
"100%",
);
if (dropdownWrapperRef.current) {
const { width } = dropdownWrapperRef.current.getBoundingClientRect();
dropdownWrapperWidth = `${width}px`;
}
const prevWidth = useRef(0);
const onParentResize = useCallback(
debounce((entries) => {
requestAnimationFrame(() => {
if (dropdownWrapperRef.current) {
const width = entries[0].borderBoxSize?.[0].inlineSize;
if (typeof width === "number" && width !== prevWidth.current) {
prevWidth.current = width;
setDropdownWrapperWidth(`${width}px`);
}
}
});
}, 300),
[dropdownWrapperRef.current],
);
useEffect(() => {
const resizeObserver = new ResizeObserver(onParentResize);
if (dropdownWrapperRef.current && props.fillOptions)
resizeObserver.observe(dropdownWrapperRef.current);
return () => {
resizeObserver.disconnect();
};
}, [dropdownWrapperRef.current, props.fillOptions]);
let dropdownHeight = props.isMultiSelect ? "auto" : "36px";
if (props.height) {

View File

@ -14,6 +14,7 @@ const mockObserveFn = () => {
};
window.IntersectionObserver = jest.fn().mockImplementation(mockObserveFn);
window.ResizeObserver = jest.fn().mockImplementation(mockObserveFn);
// establish API mocking before all tests
beforeAll(() => server.listen());