outline-pane.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import React, { useEffect } from 'react'
  2. import classNames from 'classnames'
  3. import OutlineRoot from './outline-root'
  4. import withErrorBoundary from '../../../infrastructure/error-boundary'
  5. import { OutlineToggleButton } from '@/features/outline/components/outline-toggle-button'
  6. import { OutlineItemData } from '@/features/ide-react/types/outline'
  7. const OutlinePane = React.memo<{
  8. isTexFile: boolean
  9. outline: OutlineItemData[]
  10. jumpToLine(line: number): void
  11. onToggle(value: boolean): void
  12. eventTracking: any
  13. highlightedLine?: number
  14. show: boolean
  15. isPartial?: boolean
  16. expanded?: boolean
  17. toggleExpanded: () => void
  18. }>(function OutlinePane({
  19. isTexFile,
  20. outline,
  21. jumpToLine,
  22. onToggle,
  23. highlightedLine,
  24. isPartial = false,
  25. expanded,
  26. toggleExpanded,
  27. }) {
  28. const isOpen = Boolean(isTexFile && expanded)
  29. useEffect(() => {
  30. onToggle(isOpen)
  31. }, [isOpen, onToggle])
  32. const headerClasses = classNames('outline-pane', {
  33. 'outline-pane-disabled': !isTexFile,
  34. })
  35. return (
  36. <div className={headerClasses}>
  37. <div className="outline-header">
  38. <OutlineToggleButton
  39. toggleExpanded={toggleExpanded}
  40. expanded={expanded}
  41. isOpen={isOpen}
  42. isPartial={isPartial}
  43. isTexFile={isTexFile}
  44. />
  45. </div>
  46. {isOpen && (
  47. <div className="outline-body">
  48. <OutlineRoot
  49. outline={outline}
  50. jumpToLine={jumpToLine}
  51. highlightedLine={highlightedLine}
  52. />
  53. </div>
  54. )}
  55. </div>
  56. )
  57. })
  58. export default withErrorBoundary(OutlinePane)