Skip to content

Commit 94ae396

Browse files
committed
ref(widgetbuilder) disconnect observer
1 parent 72adf4c commit 94ae396

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

static/app/utils/useDimensions.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interface Props<Element extends HTMLElement> {
1010
* Returns a ref to be added to an element and returns the dimensions of that element
1111
*/
1212
export function useDimensions<Element extends HTMLElement>({elementRef}: Props<Element>) {
13-
const [dimensions, setDimensions] = useState({height: 0, width: 0, top: 0, left: 0});
13+
const [dimensions, setDimensions] = useState({height: 0, width: 0});
1414

1515
const element = elementRef.current;
1616

@@ -19,17 +19,13 @@ export function useDimensions<Element extends HTMLElement>({elementRef}: Props<E
1919
setDimensions({
2020
height: element?.clientHeight || 0,
2121
width: element?.clientWidth || 0,
22-
top: element?.offsetTop || 0,
23-
left: element?.offsetLeft || 0,
2422
});
2523
}, [element]);
2624

2725
const onResize = useCallback(() => {
2826
setDimensions({
2927
height: element?.clientHeight || 0,
3028
width: element?.clientWidth || 0,
31-
top: element?.offsetTop || 0,
32-
left: element?.offsetLeft || 0,
3329
});
3430
}, [element]);
3531

static/app/views/dashboards/widgetBuilder/components/newWidgetBuilder.tsx

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ export function WidgetBuilderV2({
9292
);
9393

9494
const navigationElementRef = useRef<HTMLDivElement>(null);
95-
const mainContentElementRef = useRef<HTMLDivElement>(null);
9695

9796
useEffect(() => {
9897
if (navigationElementRef.current) return;
@@ -105,17 +104,31 @@ export function WidgetBuilderV2({
105104
}
106105
}, []);
107106

107+
const [mainContentPosition, setMainContentPosition] = useState<{
108+
left: number;
109+
top: number;
110+
} | null>(null);
108111
useEffect(() => {
109-
if (mainContentElementRef.current) return;
110-
111112
const mainContentElement = document.querySelector('main');
113+
114+
const observer = new ResizeObserver(entries => {
115+
for (const entry of entries) {
116+
if (entry.target === mainContentElement) {
117+
const rect = entry.target.getBoundingClientRect();
118+
setMainContentPosition({top: rect.top, left: rect.left});
119+
}
120+
}
121+
});
112122
if (mainContentElement) {
113-
mainContentElementRef.current = mainContentElement as HTMLDivElement;
123+
observer.observe(mainContentElement);
114124
}
125+
126+
return () => {
127+
observer.disconnect();
128+
};
115129
}, []);
116130

117131
const dimensions = useDimensions({elementRef: navigationElementRef});
118-
const mainContentDimensions = useDimensions({elementRef: mainContentElementRef});
119132

120133
const handleDragEnd = ({over}: any) => {
121134
setTranslate(snapPreviewToCorners(over));
@@ -179,12 +192,12 @@ export function WidgetBuilderV2({
179192
? isMediumScreen
180193
? {
181194
left: 0,
182-
top: `${mainContentDimensions.top ?? 0}px`,
195+
top: `${mainContentPosition?.top ?? 0}px`,
183196
willChange: 'top',
184197
}
185198
: {
186199
left: `${dimensions.width ?? 0}px`,
187-
top: `${mainContentDimensions.top ?? 0}px`,
200+
top: `${mainContentPosition?.top ?? 0}px`,
188201
willChange: 'left',
189202
}
190203
: undefined

0 commit comments

Comments
 (0)