editor-and-pdf.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { ReactNode, useRef, useState } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import {
  4. ImperativePanelHandle,
  5. Panel,
  6. PanelGroup,
  7. } from 'react-resizable-panels'
  8. import { HorizontalResizeHandle } from '@/features/ide-react/components/resize/horizontal-resize-handle'
  9. import { HorizontalToggler } from '@/features/ide-react/components/resize/horizontal-toggler'
  10. import useCollapsiblePanel from '@/features/ide-react/hooks/use-collapsible-panel'
  11. import { useLayoutContext } from '@/shared/context/layout-context'
  12. import PdfPreview from '@/features/pdf-preview/components/pdf-preview'
  13. import { DefaultSynctexControl } from '@/features/pdf-preview/components/detach-synctex-control'
  14. import classnames from 'classnames'
  15. export type EditorProps = {
  16. editorContent: ReactNode
  17. }
  18. export default function EditorAndPdf({ editorContent }: EditorProps) {
  19. const { t } = useTranslation()
  20. const { view, pdfLayout, changeLayout, detachRole, reattach } =
  21. useLayoutContext()
  22. const [resizing, setResizing] = useState(false)
  23. const pdfPanelRef = useRef<ImperativePanelHandle>(null)
  24. const isDualPane = pdfLayout === 'sideBySide'
  25. const editorIsVisible = isDualPane || view === 'editor' || view === 'file'
  26. const pdfIsOpen = isDualPane || view === 'pdf'
  27. useCollapsiblePanel(pdfIsOpen, pdfPanelRef)
  28. const historyIsOpen = view === 'history'
  29. function setPdfIsOpen(isOpen: boolean) {
  30. if (isOpen) {
  31. if (detachRole === 'detacher') {
  32. reattach()
  33. }
  34. changeLayout('sideBySide')
  35. } else {
  36. changeLayout('flat', 'editor')
  37. }
  38. }
  39. return (
  40. <PanelGroup
  41. autoSaveId="ide-react-editor-and-pdf-layout"
  42. direction="horizontal"
  43. className={classnames('ide-react-editor-and-pdf', {
  44. hide: historyIsOpen,
  45. 'ide-react-editor-and-pdf-resizing': resizing,
  46. })}
  47. >
  48. {editorIsVisible ? (
  49. <Panel
  50. id="editor"
  51. order={1}
  52. defaultSize={50}
  53. className="ide-react-panel"
  54. >
  55. <div className="ide-react-editor-content full-size">
  56. {editorContent}
  57. </div>
  58. </Panel>
  59. ) : null}
  60. <HorizontalResizeHandle
  61. resizable={isDualPane}
  62. onDoubleClick={() => setPdfIsOpen(!pdfIsOpen)}
  63. onDragging={setResizing}
  64. >
  65. <HorizontalToggler
  66. id="editor-pdf"
  67. togglerType="east"
  68. isOpen={pdfIsOpen}
  69. setIsOpen={setPdfIsOpen}
  70. tooltipWhenOpen={t('tooltip_hide_pdf')}
  71. tooltipWhenClosed={t('tooltip_show_pdf')}
  72. />
  73. {isDualPane ? (
  74. <div className="synctex-controls">
  75. <DefaultSynctexControl />
  76. </div>
  77. ) : null}
  78. </HorizontalResizeHandle>
  79. <Panel
  80. ref={pdfPanelRef}
  81. id="pdf"
  82. order={2}
  83. defaultSize={50}
  84. minSize={5}
  85. collapsible
  86. onCollapse={collapsed => setPdfIsOpen(!collapsed)}
  87. className="ide-react-panel"
  88. >
  89. {pdfIsOpen || resizing ? <PdfPreview /> : null}
  90. </Panel>
  91. </PanelGroup>
  92. )
  93. }