OutlinePane.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import React, { useState } from 'react'
  2. import PropTypes from 'prop-types'
  3. import { OverlayTrigger, Tooltip } from 'react-bootstrap'
  4. import classNames from 'classnames'
  5. import OutlineRoot from './OutlineRoot'
  6. function OutlinePane({ isTexFile, outline, jumpToLine }) {
  7. const [expanded, setExpanded] = useState(true)
  8. const expandCollapseIconClasses = classNames('fa', 'outline-caret-icon', {
  9. 'fa-angle-down': expanded,
  10. 'fa-angle-right': !expanded
  11. })
  12. const headerClasses = classNames('outline-pane', {
  13. 'outline-pane-disabled': !isTexFile
  14. })
  15. function handleExpandCollapseClick() {
  16. if (isTexFile) {
  17. setExpanded(!expanded)
  18. }
  19. }
  20. return (
  21. <div className={headerClasses}>
  22. <header className="outline-header">
  23. <button
  24. className="outline-header-expand-collapse-btn"
  25. disabled={!isTexFile}
  26. onClick={handleExpandCollapseClick}
  27. >
  28. <i className={expandCollapseIconClasses} />
  29. <h4 className="outline-header-name">File outline</h4>
  30. </button>
  31. <OverlayTrigger placement="top" overlay={tooltip} delayHide={100}>
  32. <a
  33. href="/beta/participate"
  34. target="_blank"
  35. rel="noopener noreferrer"
  36. className="outline-header-beta-badge"
  37. >
  38. <span className="sr-only">
  39. The File outline is a beta feature. Click here to manage your beta
  40. program membership.
  41. </span>
  42. </a>
  43. </OverlayTrigger>
  44. </header>
  45. {expanded && isTexFile ? (
  46. <div className="outline-body">
  47. <OutlineRoot outline={outline} jumpToLine={jumpToLine} />
  48. </div>
  49. ) : null}
  50. </div>
  51. )
  52. }
  53. const tooltip = (
  54. <Tooltip id="outline-beta-badge-tooltip">
  55. The <strong>File outline</strong> is a beta feature.
  56. </Tooltip>
  57. )
  58. OutlinePane.propTypes = {
  59. isTexFile: PropTypes.bool.isRequired,
  60. outline: PropTypes.array.isRequired,
  61. jumpToLine: PropTypes.func.isRequired
  62. }
  63. export default OutlinePane