pdf-log-entry-raw-content.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { useCallback, useState } from 'react'
  2. import { useResizeObserver } from '../../../shared/hooks/use-resize-observer'
  3. import { useTranslation } from 'react-i18next'
  4. import classNames from 'classnames'
  5. import OLButton from '@/shared/components/ol/ol-button'
  6. export default function PdfLogEntryRawContent({
  7. rawContent,
  8. collapsedSize = 0,
  9. alwaysExpanded = false,
  10. }: {
  11. rawContent: string
  12. collapsedSize?: number
  13. alwaysExpanded?: boolean
  14. }) {
  15. const [expanded, setExpanded] = useState(alwaysExpanded)
  16. const [needsExpander, setNeedsExpander] = useState(!alwaysExpanded)
  17. const { elementRef } = useResizeObserver(
  18. useCallback(
  19. (element: Element) => {
  20. if (element.scrollHeight === 0) return // skip update when logs-pane is closed
  21. setNeedsExpander(
  22. !alwaysExpanded && element.scrollHeight > collapsedSize
  23. )
  24. },
  25. [collapsedSize, alwaysExpanded]
  26. )
  27. )
  28. const { t } = useTranslation()
  29. return (
  30. <div className="log-entry-content-raw-container">
  31. <div
  32. className="expand-collapse-container"
  33. style={{
  34. height: expanded || !needsExpander ? 'auto' : collapsedSize,
  35. }}
  36. >
  37. <pre className="log-entry-content-raw" ref={elementRef} translate="no">
  38. {rawContent.trim()}
  39. </pre>
  40. </div>
  41. {needsExpander && (
  42. <div
  43. className={classNames('log-entry-content-button-container', {
  44. 'log-entry-content-button-container-collapsed': !expanded,
  45. })}
  46. >
  47. <OLButton
  48. variant="secondary"
  49. size="sm"
  50. leadingIcon={expanded ? 'expand_less' : 'expand_more'}
  51. onClick={() => setExpanded(value => !value)}
  52. >
  53. {expanded ? t('collapse') : t('expand')}
  54. </OLButton>
  55. </div>
  56. )}
  57. </div>
  58. )
  59. }