Skip to content

Commit 197996d

Browse files
committed
fix(mobile): handle menu ref better (#8051)
1 parent 392fef6 commit 197996d

File tree

1 file changed

+12
-14
lines changed
  • packages/frontend/component/src/ui/menu/mobile

1 file changed

+12
-14
lines changed

packages/frontend/component/src/ui/menu/mobile/root.tsx

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useI18n } from '@affine/i18n';
22
import { ArrowLeftSmallIcon } from '@blocksuite/icons/rc';
33
import { Slot } from '@radix-ui/react-slot';
44
import clsx from 'clsx';
5-
import { useCallback, useContext, useMemo, useState } from 'react';
5+
import { useCallback, useContext, useEffect, useState } from 'react';
66

77
import { observeResize } from '../../../utils';
88
import { Button } from '../../button';
@@ -31,30 +31,28 @@ export const MobileMenu = ({
3131
const [subMenus, setSubMenus] = useState<SubMenuContent[]>([]);
3232
const [open, setOpen] = useState(false);
3333
const [sliderHeight, setSliderHeight] = useState(0);
34+
const [sliderElement, setSliderElement] = useState<HTMLDivElement | null>(
35+
null
36+
);
3437
const { setOpen: pSetOpen } = useContext(MobileMenuContext);
3538
const finalOpen = rootOptions?.open ?? open;
3639
const activeIndex = subMenus.length;
3740

3841
// dynamic height for slider
39-
const onSliderRef = useMemo(() => {
40-
let unsub: (() => void) | null = null;
41-
42-
return (sliderDiv: HTMLDivElement | null) => {
43-
unsub?.();
44-
45-
if (!sliderDiv || !finalOpen) return;
46-
47-
const active = sliderDiv.querySelector(
42+
useEffect(() => {
43+
if (sliderElement && finalOpen) {
44+
const active = sliderElement.querySelector(
4845
`.${styles.menuContent}[data-index="${activeIndex}"]`
4946
);
5047
if (!active) return;
5148

5249
// for the situation that content is loaded asynchronously
53-
unsub = observeResize(active, entry => {
50+
return observeResize(active, entry => {
5451
setSliderHeight(entry.borderBoxSize[0].blockSize);
5552
});
56-
};
57-
}, [activeIndex, finalOpen]);
53+
}
54+
return;
55+
}, [activeIndex, finalOpen, sliderElement]);
5856

5957
const onOpenChange = useCallback(
6058
(open: boolean) => {
@@ -117,7 +115,7 @@ export const MobileMenu = ({
117115
}}
118116
>
119117
<div
120-
ref={onSliderRef}
118+
ref={setSliderElement}
121119
className={styles.slider}
122120
style={{
123121
transform: `translateX(-${100 * activeIndex}%)`,

0 commit comments

Comments
 (0)