@@ -2,7 +2,7 @@ import { useI18n } from '@affine/i18n';
22import { ArrowLeftSmallIcon } from '@blocksuite/icons/rc' ;
33import { Slot } from '@radix-ui/react-slot' ;
44import clsx from 'clsx' ;
5- import { useCallback , useContext , useMemo , useState } from 'react' ;
5+ import { useCallback , useContext , useEffect , useState } from 'react' ;
66
77import { observeResize } from '../../../utils' ;
88import { 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