️(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 { InfoToggle } from '../../components/controls/InfoToggle'
import { AdminToggle } from '../../components/AdminToggle' import { AdminToggle } from '../../components/AdminToggle'
import { useSize } from '../../hooks/useResizeObserver' 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 { Dialog, DialogTrigger, Popover } from 'react-aria-components'
import { Button } from '@/primitives' import { Button } from '@/primitives'
import type { ToggleButtonProps } from '@/primitives/ToggleButton' 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 = ({ export const MoreOptions = ({
parentElement, parentElement,
}: { }: {
parentElement: RefObject<HTMLDivElement> parentElement: RefObject<HTMLDivElement>
}) => { }) => {
const { width: parentWidth } = useSize(parentElement) const [isWide, setIsWide] = useState(false)
return ( return (
<nav <nav
className={css({ className={css({
@@ -83,11 +103,11 @@ export const MoreOptions = ({
paddingRight: '0.25rem', paddingRight: '0.25rem',
})} })}
> >
{parentWidth > CONTROL_BAR_BREAKPOINT ? ( <BreakpointObserver
<NavigationControls /> containerRef={parentElement}
) : ( onWideChange={setIsWide}
<LateralMenu /> />
)} {isWide ? <NavigationControls /> : <LateralMenu />}
</nav> </nav>
) )
} }