preview-logs-toggle-button.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import React from 'react'
  2. import { OverlayTrigger, Tooltip } from 'react-bootstrap'
  3. import PropTypes from 'prop-types'
  4. import classNames from 'classnames'
  5. import { useTranslation } from 'react-i18next'
  6. import Icon from '../../../shared/components/icon'
  7. function PreviewLogsToggleButton({
  8. onToggle,
  9. showLogs,
  10. logsState: { nErrors, nWarnings },
  11. showText
  12. }) {
  13. const { t } = useTranslation()
  14. const toggleButtonClasses = classNames(
  15. 'btn',
  16. 'btn-xs',
  17. 'btn-toggle-logs',
  18. 'toolbar-item',
  19. {
  20. 'btn-danger': !showLogs && nErrors,
  21. 'btn-warning': !showLogs && !nErrors && nWarnings,
  22. 'btn-default': showLogs || (!nErrors && !nWarnings)
  23. }
  24. )
  25. let textStyle = {}
  26. if (!showText) {
  27. textStyle = {
  28. position: 'absolute',
  29. right: '-100vw'
  30. }
  31. }
  32. function handleOnClick(e) {
  33. e.currentTarget.blur()
  34. onToggle()
  35. }
  36. const buttonElement = (
  37. <button
  38. id="logs-toggle"
  39. type="button"
  40. className={toggleButtonClasses}
  41. onClick={handleOnClick}
  42. >
  43. {showLogs ? (
  44. <ViewPdfButton textStyle={textStyle} />
  45. ) : (
  46. <CompilationResultIndicator
  47. textStyle={textStyle}
  48. nErrors={nErrors}
  49. nWarnings={nWarnings}
  50. />
  51. )}
  52. </button>
  53. )
  54. return showText ? (
  55. buttonElement
  56. ) : (
  57. <OverlayTrigger
  58. placement="bottom"
  59. overlay={
  60. <Tooltip id="tooltip-logs-toggle">
  61. {showLogs ? t('view_pdf') : t('view_logs')}
  62. </Tooltip>
  63. }
  64. >
  65. {buttonElement}
  66. </OverlayTrigger>
  67. )
  68. }
  69. function CompilationResultIndicator({ textStyle, nErrors, nWarnings }) {
  70. if (nErrors || nWarnings) {
  71. return (
  72. <LogsCompilationResultIndicator
  73. logType={nErrors ? 'errors' : 'warnings'}
  74. nLogs={nErrors || nWarnings}
  75. textStyle={textStyle}
  76. />
  77. )
  78. } else {
  79. return <ViewLogsButton textStyle={textStyle} />
  80. }
  81. }
  82. function LogsCompilationResultIndicator({ textStyle, logType, nLogs }) {
  83. const { t } = useTranslation()
  84. const label =
  85. logType === 'errors' ? t('your_project_has_errors') : t('view_warnings')
  86. return (
  87. <>
  88. <Icon type="file-text-o" />
  89. <span
  90. className="btn-toggle-logs-label toolbar-text"
  91. aria-label={label}
  92. style={textStyle}
  93. >
  94. {`${label} (${nLogs > 9 ? '9+' : nLogs})`}
  95. </span>
  96. </>
  97. )
  98. }
  99. function ViewLogsButton({ textStyle }) {
  100. const { t } = useTranslation()
  101. return (
  102. <>
  103. <Icon type="file-text-o" />
  104. <span className="toolbar-text" style={textStyle}>
  105. {t('view_logs')}
  106. </span>
  107. </>
  108. )
  109. }
  110. function ViewPdfButton({ textStyle }) {
  111. const { t } = useTranslation()
  112. return (
  113. <>
  114. <Icon type="file-pdf-o" />
  115. <span className="toolbar-text" style={textStyle}>
  116. {t('view_pdf')}
  117. </span>
  118. </>
  119. )
  120. }
  121. PreviewLogsToggleButton.propTypes = {
  122. onToggle: PropTypes.func.isRequired,
  123. logsState: PropTypes.shape({
  124. nErrors: PropTypes.number.isRequired,
  125. nWarnings: PropTypes.number.isRequired,
  126. nLogEntries: PropTypes.number.isRequired
  127. }),
  128. showLogs: PropTypes.bool.isRequired,
  129. showText: PropTypes.bool.isRequired
  130. }
  131. LogsCompilationResultIndicator.propTypes = {
  132. logType: PropTypes.string.isRequired,
  133. nLogs: PropTypes.number.isRequired,
  134. textStyle: PropTypes.object.isRequired
  135. }
  136. ViewLogsButton.propTypes = {
  137. textStyle: PropTypes.object.isRequired
  138. }
  139. ViewPdfButton.propTypes = {
  140. textStyle: PropTypes.object.isRequired
  141. }
  142. export default PreviewLogsToggleButton