preview-pane.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import React, { useState } from 'react'
  2. import PropTypes from 'prop-types'
  3. import PreviewToolbar from './preview-toolbar'
  4. import PreviewLogsPane from './preview-logs-pane'
  5. import PreviewFirstErrorPopUp from './preview-first-error-pop-up'
  6. import { useTranslation } from 'react-i18next'
  7. function PreviewPane({
  8. compilerState,
  9. onClearCache,
  10. onRecompile,
  11. onRunSyntaxCheckNow,
  12. onSetAutoCompile,
  13. onSetDraftMode,
  14. onSetSyntaxCheck,
  15. onToggleLogs,
  16. outputFiles,
  17. pdfDownloadUrl,
  18. onLogEntryLocationClick,
  19. showLogs
  20. }) {
  21. const { t } = useTranslation()
  22. const [lastCompileTimestamp, setLastCompileTimestamp] = useState(
  23. compilerState.lastCompileTimestamp
  24. )
  25. const [seenLogsForCurrentCompile, setSeenLogsForCurrentCompile] = useState(
  26. false
  27. )
  28. const [dismissedFirstErrorPopUp, setDismissedFirstErrorPopUp] = useState(
  29. false
  30. )
  31. if (lastCompileTimestamp < compilerState.lastCompileTimestamp) {
  32. setLastCompileTimestamp(compilerState.lastCompileTimestamp)
  33. setSeenLogsForCurrentCompile(false)
  34. }
  35. if (showLogs && !seenLogsForCurrentCompile) {
  36. setSeenLogsForCurrentCompile(true)
  37. }
  38. const nErrors =
  39. compilerState.logEntries && compilerState.logEntries.errors
  40. ? compilerState.logEntries.errors.length
  41. : 0
  42. const nWarnings =
  43. compilerState.logEntries && compilerState.logEntries.warnings
  44. ? compilerState.logEntries.warnings.length
  45. : 0
  46. const nLogEntries =
  47. compilerState.logEntries && compilerState.logEntries.all
  48. ? compilerState.logEntries.all.length
  49. : 0
  50. const showFirstErrorPopUp =
  51. nErrors > 0 &&
  52. !seenLogsForCurrentCompile &&
  53. !dismissedFirstErrorPopUp &&
  54. !compilerState.isCompiling
  55. function handleFirstErrorPopUpClose() {
  56. setDismissedFirstErrorPopUp(true)
  57. }
  58. return (
  59. <>
  60. <PreviewToolbar
  61. compilerState={compilerState}
  62. logsState={{ nErrors, nWarnings, nLogEntries }}
  63. showLogs={showLogs}
  64. onClearCache={onClearCache}
  65. onRecompile={onRecompile}
  66. onRunSyntaxCheckNow={onRunSyntaxCheckNow}
  67. onSetAutoCompile={onSetAutoCompile}
  68. onSetDraftMode={onSetDraftMode}
  69. onSetSyntaxCheck={onSetSyntaxCheck}
  70. onToggleLogs={onToggleLogs}
  71. outputFiles={outputFiles}
  72. pdfDownloadUrl={pdfDownloadUrl}
  73. />
  74. <span aria-live="polite" className="sr-only">
  75. {nErrors && !compilerState.isCompiling
  76. ? t('n_errors', { count: nErrors })
  77. : ''}
  78. </span>
  79. <span aria-live="polite" className="sr-only">
  80. {nWarnings && !compilerState.isCompiling
  81. ? t('n_warnings', { count: nWarnings })
  82. : ''}
  83. </span>
  84. {showFirstErrorPopUp ? (
  85. <PreviewFirstErrorPopUp
  86. logEntry={compilerState.logEntries.errors[0]}
  87. onGoToErrorLocation={onLogEntryLocationClick}
  88. onViewLogs={onToggleLogs}
  89. onClose={handleFirstErrorPopUpClose}
  90. />
  91. ) : null}
  92. {showLogs ? (
  93. <PreviewLogsPane
  94. logEntries={compilerState.logEntries.all}
  95. rawLog={compilerState.rawLog}
  96. onLogEntryLocationClick={onLogEntryLocationClick}
  97. />
  98. ) : null}
  99. </>
  100. )
  101. }
  102. PreviewPane.propTypes = {
  103. compilerState: PropTypes.shape({
  104. isAutoCompileOn: PropTypes.bool.isRequired,
  105. isCompiling: PropTypes.bool.isRequired,
  106. isDraftModeOn: PropTypes.bool.isRequired,
  107. isSyntaxCheckOn: PropTypes.bool.isRequired,
  108. lastCompileTimestamp: PropTypes.number,
  109. logEntries: PropTypes.object.isRequired,
  110. rawLog: PropTypes.string
  111. }),
  112. onClearCache: PropTypes.func.isRequired,
  113. onLogEntryLocationClick: PropTypes.func.isRequired,
  114. onRecompile: PropTypes.func.isRequired,
  115. onRunSyntaxCheckNow: PropTypes.func.isRequired,
  116. onSetAutoCompile: PropTypes.func.isRequired,
  117. onSetDraftMode: PropTypes.func.isRequired,
  118. onSetSyntaxCheck: PropTypes.func.isRequired,
  119. onToggleLogs: PropTypes.func.isRequired,
  120. outputFiles: PropTypes.array,
  121. pdfDownloadUrl: PropTypes.string,
  122. showLogs: PropTypes.bool.isRequired
  123. }
  124. export default PreviewPane