rail-panel.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { Panel } from 'react-resizable-panels'
  2. import { useRailContext } from '@/features/ide-react/context/rail-context'
  3. import classNames from 'classnames'
  4. import { useCallback, useMemo } from 'react'
  5. import usePreviousValue from '@/shared/hooks/use-previous-value'
  6. import { HistorySidebar } from '@/features/ide-react/components/history-sidebar'
  7. import { Tab } from 'react-bootstrap'
  8. import { RailElement } from '@/features/ide-react/util/rail-types'
  9. import { shouldIncludeElement } from '@/features/ide-react/util/rail-utils'
  10. export default function RailPanel({
  11. isReviewPanelOpen,
  12. isHistoryView,
  13. railTabs,
  14. }: {
  15. isReviewPanelOpen: boolean
  16. isHistoryView: boolean
  17. railTabs: RailElement[]
  18. }) {
  19. const { selectedTab, panelRef, handlePaneExpand, handlePaneCollapse } =
  20. useRailContext()
  21. const prevTab = usePreviousValue(selectedTab)
  22. const tabHasChanged = useMemo(() => {
  23. return prevTab !== selectedTab
  24. }, [prevTab, selectedTab])
  25. const onCollapse = useCallback(() => {
  26. if (!tabHasChanged) {
  27. handlePaneCollapse()
  28. }
  29. }, [tabHasChanged, handlePaneCollapse])
  30. return (
  31. <Panel
  32. id={`ide-redesign-sidebar-panel-${isHistoryView ? 'file-tree' : selectedTab}`}
  33. className={classNames({ hidden: isReviewPanelOpen })}
  34. order={1}
  35. defaultSize={selectedTab === 'workbench' ? 20 : 15}
  36. minSize={5}
  37. maxSize={80}
  38. ref={panelRef}
  39. collapsible
  40. onCollapse={onCollapse}
  41. onExpand={handlePaneExpand}
  42. >
  43. {isHistoryView && <HistorySidebar />}
  44. <div
  45. className={classNames('ide-rail-content', {
  46. hidden: isHistoryView,
  47. })}
  48. >
  49. <Tab.Content className="ide-rail-tab-content">
  50. {railTabs
  51. .filter(shouldIncludeElement)
  52. .map(({ key, component, mountOnFirstLoad }) => (
  53. <Tab.Pane
  54. eventKey={key}
  55. key={key}
  56. mountOnEnter={!mountOnFirstLoad}
  57. >
  58. {component}
  59. </Tab.Pane>
  60. ))}
  61. </Tab.Content>
  62. </div>
  63. </Panel>
  64. )
  65. }