OutlineItem.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import React, { useState } from 'react'
  2. import PropTypes from 'prop-types'
  3. import classNames from 'classnames'
  4. import OutlineList from './OutlineList'
  5. function OutlineItem({ outlineItem, jumpToLine }) {
  6. const [expanded, setExpanded] = useState(true)
  7. const mainItemClasses = classNames('outline-item', {
  8. 'outline-item-no-children': !outlineItem.children
  9. })
  10. const expandCollapseIconClasses = classNames('fa', 'outline-caret-icon', {
  11. 'fa-angle-down': expanded,
  12. 'fa-angle-right': !expanded
  13. })
  14. function handleExpandCollapseClick() {
  15. setExpanded(!expanded)
  16. }
  17. function handleOutlineItemLinkClick() {
  18. jumpToLine(outlineItem.line)
  19. }
  20. return (
  21. <li className={mainItemClasses}>
  22. <div className="outline-item-row">
  23. {outlineItem.children ? (
  24. <button
  25. className="outline-item-expand-collapse-btn"
  26. onClick={handleExpandCollapseClick}
  27. >
  28. <i className={expandCollapseIconClasses} />
  29. </button>
  30. ) : null}
  31. <button
  32. className="outline-item-link"
  33. onClick={handleOutlineItemLinkClick}
  34. >
  35. {outlineItem.title}
  36. </button>
  37. </div>
  38. {expanded && outlineItem.children ? (
  39. <OutlineList
  40. outline={outlineItem.children}
  41. jumpToLine={jumpToLine}
  42. isRoot={false}
  43. />
  44. ) : null}
  45. </li>
  46. )
  47. }
  48. OutlineItem.propTypes = {
  49. outlineItem: PropTypes.exact({
  50. line: PropTypes.number.isRequired,
  51. title: PropTypes.string.isRequired,
  52. level: PropTypes.number.isRequired,
  53. children: PropTypes.array
  54. }).isRequired,
  55. jumpToLine: PropTypes.func.isRequired
  56. }
  57. export default OutlineItem