editor-and-pdf.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { ReactNode, useRef } 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. shouldPersistLayout?: boolean
  17. editorContent: ReactNode
  18. }
  19. export default function EditorAndPdf({
  20. shouldPersistLayout = false,
  21. editorContent,
  22. }: EditorProps) {
  23. const { t } = useTranslation()
  24. const { view, pdfLayout, changeLayout } = useLayoutContext()
  25. const pdfPanelRef = useRef<ImperativePanelHandle>(null)
  26. const isDualPane = pdfLayout === 'sideBySide'
  27. const editorIsVisible = isDualPane || view === 'editor'
  28. const pdfIsOpen = isDualPane || view === 'pdf'
  29. useCollapsiblePanel(pdfIsOpen, pdfPanelRef)
  30. const historyIsOpen = view === 'history'
  31. function setPdfIsOpen(isOpen: boolean) {
  32. if (isOpen) {
  33. changeLayout('sideBySide')
  34. } else {
  35. changeLayout('flat', 'editor')
  36. }
  37. }
  38. return (
  39. <PanelGroup
  40. autoSaveId={
  41. shouldPersistLayout ? 'ide-react-editor-and-pdf-layout' : undefined
  42. }
  43. direction="horizontal"
  44. className={classnames({ hide: historyIsOpen })}
  45. >
  46. {editorIsVisible ? (
  47. <Panel
  48. id="editor"
  49. order={1}
  50. defaultSize={50}
  51. className="ide-react-panel"
  52. >
  53. {editorContent}
  54. </Panel>
  55. ) : null}
  56. {isDualPane ? (
  57. <HorizontalResizeHandle>
  58. <HorizontalToggler
  59. id="editor-pdf"
  60. togglerType="east"
  61. isOpen={pdfIsOpen}
  62. setIsOpen={isOpen => setPdfIsOpen(isOpen)}
  63. tooltipWhenOpen={t('tooltip_hide_pdf')}
  64. tooltipWhenClosed={t('tooltip_show_pdf')}
  65. />
  66. <div className="synctex-controls">
  67. <DefaultSynctexControl />
  68. </div>
  69. </HorizontalResizeHandle>
  70. ) : null}
  71. {pdfIsOpen ? (
  72. <Panel
  73. ref={pdfPanelRef}
  74. id="pdf"
  75. order={2}
  76. defaultSize={50}
  77. minSize={5}
  78. collapsible
  79. onCollapse={collapsed => setPdfIsOpen(!collapsed)}
  80. className="ide-react-panel"
  81. >
  82. <PdfPreview />
  83. </Panel>
  84. ) : null}
  85. </PanelGroup>
  86. )
  87. }