pdf-preview-pane.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { ElementType, memo, Suspense } from 'react'
  2. import classNames from 'classnames'
  3. import PdfLogsViewer from './pdf-logs-viewer'
  4. import PdfViewer from './pdf-viewer'
  5. import { FullSizeLoadingSpinner } from '../../../shared/components/loading-spinner'
  6. import PdfHybridPreviewToolbar from './pdf-preview-hybrid-toolbar'
  7. import { useDetachCompileContext as useCompileContext } from '../../../shared/context/detach-compile-context'
  8. import { PdfPreviewMessages } from './pdf-preview-messages'
  9. import CompileTimeWarningUpgradePrompt from './compile-time-warning-upgrade-prompt'
  10. import { PdfPreviewProvider } from './pdf-preview-provider'
  11. import PdfPreviewHybridToolbarNew from '@/features/ide-redesign/components/pdf-preview/pdf-preview-hybrid-toolbar'
  12. import { useIsNewEditorEnabled } from '@/features/ide-redesign/utils/new-editor-utils'
  13. import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
  14. import PdfCodeCheckFailedBanner from '@/features/ide-redesign/components/pdf-preview/pdf-code-check-failed-banner'
  15. import getMeta from '@/utils/meta'
  16. import NewPdfLogsViewer from '@/features/ide-redesign/components/pdf-preview/pdf-logs-viewer'
  17. function PdfPreviewPane() {
  18. const {
  19. pdfUrl,
  20. pdfViewer,
  21. darkModePdf: darkModeSetting,
  22. activeOverallTheme,
  23. } = useCompileContext()
  24. const { compileTimeout } = getMeta('ol-compileSettings')
  25. const usesNewEditor = useIsNewEditorEnabled()
  26. const darkModePdf =
  27. usesNewEditor &&
  28. pdfViewer === 'pdfjs' &&
  29. activeOverallTheme === 'dark' &&
  30. darkModeSetting
  31. const classes = classNames('pdf', 'full-size', {
  32. 'pdf-empty': !pdfUrl,
  33. 'pdf-dark-mode': darkModePdf,
  34. })
  35. const newEditor = useIsNewEditorEnabled()
  36. const pdfPromotions = importOverleafModules('pdfPreviewPromotions') as {
  37. import: { default: ElementType }
  38. path: string
  39. }[]
  40. return (
  41. <div className={classes}>
  42. <PdfPreviewProvider>
  43. {newEditor ? (
  44. <PdfPreviewHybridToolbarNew />
  45. ) : (
  46. <PdfHybridPreviewToolbar />
  47. )}
  48. {newEditor && <PdfCodeCheckFailedBanner />}
  49. <PdfPreviewMessages>
  50. {compileTimeout < 60 && <CompileTimeWarningUpgradePrompt />}
  51. </PdfPreviewMessages>
  52. <Suspense fallback={<FullSizeLoadingSpinner delay={500} />}>
  53. <div className="pdf-viewer" data-testid="pdf-viewer">
  54. <PdfViewer />
  55. </div>
  56. </Suspense>
  57. {newEditor ? <NewPdfLogsViewer /> : <PdfLogsViewer />}
  58. {pdfPromotions.map(({ import: { default: Component }, path }) => (
  59. <Component key={path} />
  60. ))}
  61. </PdfPreviewProvider>
  62. </div>
  63. )
  64. }
  65. export default memo(PdfPreviewPane)