rail-panel.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. focusMode,
  15. }: {
  16. isReviewPanelOpen: boolean
  17. isHistoryView: boolean
  18. railTabs: RailElement[]
  19. focusMode: boolean
  20. }) {
  21. const { selectedTab, panelRef, handlePaneExpand, handlePaneCollapse } =
  22. useRailContext()
  23. const prevTab = usePreviousValue(selectedTab)
  24. const tabHasChanged = useMemo(() => {
  25. return prevTab !== selectedTab
  26. }, [prevTab, selectedTab])
  27. const onCollapse = useCallback(() => {
  28. if (!tabHasChanged) {
  29. handlePaneCollapse()
  30. }
  31. }, [tabHasChanged, handlePaneCollapse])
  32. return (
  33. <Panel
  34. id={`ide-redesign-sidebar-panel-${isHistoryView ? 'file-tree' : selectedTab}`}
  35. className={classNames({ hidden: isReviewPanelOpen || focusMode })}
  36. order={1}
  37. defaultSize={selectedTab === 'workbench' ? 20 : 15}
  38. minSize={5}
  39. maxSize={80}
  40. ref={panelRef}
  41. collapsible
  42. onCollapse={onCollapse}
  43. onExpand={handlePaneExpand}
  44. >
  45. {isHistoryView && <HistorySidebar />}
  46. <div
  47. className={classNames('ide-rail-content', {
  48. hidden: isHistoryView,
  49. })}
  50. >
  51. <Tab.Content className="ide-rail-tab-content">
  52. {railTabs
  53. .filter(shouldIncludeElement)
  54. .map(({ key, component, mountOnFirstLoad }) => (
  55. <Tab.Pane
  56. eventKey={key}
  57. key={key}
  58. mountOnEnter={!mountOnFirstLoad}
  59. >
  60. {component}
  61. </Tab.Pane>
  62. ))}
  63. </Tab.Content>
  64. </div>
  65. </Panel>
  66. )
  67. }