use-rail-overflow.tsx 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import { useCallback, useState } from 'react'
  2. import { RailElement } from '../util/rail-types'
  3. import { useResizeObserver } from '@/shared/hooks/use-resize-observer'
  4. const useRailOverflow = (railTabs: RailElement[]) => {
  5. const [tabsInRail, setTabsInRail] = useState<RailElement[]>(railTabs)
  6. const [tabsInOverflow, setTabsInOverflow] = useState<RailElement[]>([])
  7. const handleResize = useCallback(
  8. (element: Element) => {
  9. const height = (element as HTMLElement).offsetHeight
  10. const tabHeight =
  11. (element.querySelector('.ide-rail-tab-link')?.clientHeight ?? 0) + 4 // 4px gap between tabs
  12. const numTabsToFit = Math.floor(height / tabHeight)
  13. if (numTabsToFit >= railTabs.length) {
  14. setTabsInRail(railTabs)
  15. setTabsInOverflow([])
  16. } else {
  17. const sliceIndex = Math.max(numTabsToFit - 1, 0)
  18. setTabsInRail(railTabs.slice(0, sliceIndex))
  19. setTabsInOverflow(railTabs.slice(sliceIndex))
  20. }
  21. },
  22. [railTabs]
  23. )
  24. const { elementRef: tabWrapperRef } = useResizeObserver(handleResize)
  25. return { tabsInRail, tabsInOverflow, tabWrapperRef }
  26. }
  27. export default useRailOverflow