main-layout.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { Panel, PanelGroup } from 'react-resizable-panels'
  2. import classNames from 'classnames'
  3. import { HorizontalResizeHandle } from '@/features/ide-react/components/resize/horizontal-resize-handle'
  4. import PdfPreview from '@/features/pdf-preview/components/pdf-preview'
  5. import { RailLayout } from '../rail/rail'
  6. import { Toolbar } from '../toolbar/toolbar'
  7. import { HorizontalToggler } from '@/features/ide-react/components/resize/horizontal-toggler'
  8. import { useTranslation } from 'react-i18next'
  9. import { usePdfPane } from '@/features/ide-react/hooks/use-pdf-pane'
  10. import { useLayoutContext } from '@/shared/context/layout-context'
  11. import { ElementType, useState } from 'react'
  12. import EditorPanel from '../editor/editor-panel'
  13. import { useRailContext } from '../../context/rail-context'
  14. import HistoryContainer from '@/features/ide-react/components/history-container'
  15. import { DefaultSynctexControl } from '@/features/pdf-preview/components/detach-synctex-control'
  16. import importOverleafModules from '../../../../../macros/import-overleaf-module.macro'
  17. const mainEditorLayoutPanels: Array<{
  18. import: { default: ElementType }
  19. path: string
  20. }> = importOverleafModules('mainEditorLayoutPanels')
  21. const mainEditorLayoutModalsModules: Array<{
  22. import: { default: ElementType }
  23. path: string
  24. }> = importOverleafModules('mainEditorLayoutModals')
  25. export default function MainLayout() {
  26. const [resizing, setResizing] = useState(false)
  27. const { resizing: railResizing } = useRailContext()
  28. const {
  29. togglePdfPane,
  30. handlePdfPaneExpand,
  31. handlePdfPaneCollapse,
  32. setPdfIsOpen: setIsPdfOpen,
  33. pdfIsOpen: isPdfOpen,
  34. pdfPanelRef,
  35. } = usePdfPane()
  36. const { view, pdfLayout } = useLayoutContext()
  37. const editorIsOpen =
  38. view === 'editor' || view === 'file' || pdfLayout === 'sideBySide'
  39. const { t } = useTranslation()
  40. return (
  41. <div className="ide-redesign-main">
  42. <Toolbar />
  43. <div className="ide-redesign-body">
  44. <PanelGroup
  45. autoSaveId="ide-redesign-outer-layout"
  46. direction="horizontal"
  47. className={classNames('ide-redesign-inner', {
  48. 'ide-panel-group-resizing': resizing || railResizing,
  49. })}
  50. >
  51. <RailLayout />
  52. <Panel id="ide-redesign-editor-and-pdf-panel" order={2}>
  53. <HistoryContainer />
  54. <PanelGroup
  55. autoSaveId="ide-redesign-editor-and-pdf-panel-group"
  56. direction="horizontal"
  57. className={classNames({
  58. hidden: view === 'history',
  59. })}
  60. >
  61. <Panel
  62. id="ide-redesign-editor-panel"
  63. order={1}
  64. className={classNames({
  65. hidden: !editorIsOpen || view === 'history',
  66. })}
  67. minSize={5}
  68. defaultSize={50}
  69. tagName="section"
  70. aria-label={t('editor')}
  71. >
  72. <div className="ide-redesign-editor-container">
  73. <EditorPanel />
  74. </div>
  75. </Panel>
  76. <HorizontalResizeHandle
  77. resizable={pdfLayout === 'sideBySide'}
  78. onDragging={setResizing}
  79. onDoubleClick={togglePdfPane}
  80. hitAreaMargins={{ coarse: 0, fine: 0 }}
  81. className={classNames({
  82. hidden: !editorIsOpen,
  83. })}
  84. >
  85. <HorizontalToggler
  86. id="ide-redesign-pdf-panel"
  87. togglerType="east"
  88. isOpen={isPdfOpen}
  89. setIsOpen={setIsPdfOpen}
  90. tooltipWhenOpen={t('tooltip_hide_pdf')}
  91. tooltipWhenClosed={t('tooltip_show_pdf')}
  92. />
  93. {pdfLayout === 'sideBySide' && (
  94. <div className="synctex-controls">
  95. <DefaultSynctexControl />
  96. </div>
  97. )}
  98. </HorizontalResizeHandle>
  99. <Panel
  100. collapsible
  101. className={classNames('ide-redesign-pdf-container', {
  102. hidden: view === 'history',
  103. })}
  104. id="ide-redesign-pdf-panel"
  105. order={2}
  106. defaultSize={50}
  107. minSize={5}
  108. ref={pdfPanelRef}
  109. onExpand={handlePdfPaneExpand}
  110. onCollapse={handlePdfPaneCollapse}
  111. tagName="section"
  112. aria-label={t('pdf_preview')}
  113. >
  114. <PdfPreview />
  115. {pdfLayout === 'flat' && view === 'pdf' && (
  116. <div className="synctex-controls" hidden>
  117. <DefaultSynctexControl />
  118. </div>
  119. )}
  120. </Panel>
  121. </PanelGroup>
  122. </Panel>
  123. {mainEditorLayoutPanels.map(
  124. ({ import: { default: Component }, path }, i) => {
  125. return <Component key={path} order={i + 3} />
  126. }
  127. )}
  128. </PanelGroup>
  129. </div>
  130. {mainEditorLayoutModalsModules.map(
  131. ({ import: { default: Component }, path }) => (
  132. <Component key={path} />
  133. )
  134. )}
  135. </div>
  136. )
  137. }