main-layout.tsx 4.8 KB

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