️(frontend) isolate useSize in a child of MoreOptions

Move the useSize subscription into a dedicated child component of
MoreOptions.

The options now only re-render when they actually need to collapse,
instead of on every size change of the container.
This commit is contained in:
lebaudantoine
2026-07-22 18:37:30 +02:00
committed by aleb_the_flash
parent 932332c858
commit ef05c0ab19
@@ -5,7 +5,7 @@ import { ToolsToggle } from '../../components/controls/ToolsToggle'
import { InfoToggle } from '../../components/controls/InfoToggle'
import { AdminToggle } from '../../components/AdminToggle'
import { useSize } from '../../hooks/useResizeObserver'
import { useState, RefObject } from 'react'
import { useState, RefObject, useEffect } from 'react'
import { Dialog, DialogTrigger, Popover } from 'react-aria-components'
import { Button } from '@/primitives'
import type { ToggleButtonProps } from '@/primitives/ToggleButton'
@@ -66,12 +66,32 @@ export const LateralMenu = () => {
)
}
interface BreakpointObserverProps {
containerRef: RefObject<HTMLDivElement>
onWideChange: (isWide: boolean) => void
}
const BreakpointObserver = ({
containerRef,
onWideChange,
}: BreakpointObserverProps) => {
const { width } = useSize(containerRef)
const isWide = width > CONTROL_BAR_BREAKPOINT
useEffect(() => {
onWideChange(isWide)
}, [isWide, onWideChange])
return null
}
export const MoreOptions = ({
parentElement,
}: {
parentElement: RefObject<HTMLDivElement>
}) => {
const { width: parentWidth } = useSize(parentElement)
const [isWide, setIsWide] = useState(false)
return (
<nav
className={css({
@@ -83,11 +103,11 @@ export const MoreOptions = ({
paddingRight: '0.25rem',
})}
>
{parentWidth > CONTROL_BAR_BREAKPOINT ? (
<NavigationControls />
) : (
<LateralMenu />
)}
<BreakpointObserver
containerRef={parentElement}
onWideChange={setIsWide}
/>
{isWide ? <NavigationControls /> : <LateralMenu />}
</nav>
)
}