pdf-preview-pane.tsx 2.1 KB

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