current-file-container.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { useMemo } from 'react'
  2. import Container from './container'
  3. import Toolbar from './toolbar/toolbar'
  4. import Nav from './nav'
  5. import Toggler from './toggler'
  6. import ChangeEntry from './entries/change-entry'
  7. import AggregateChangeEntry from './entries/aggregate-change-entry'
  8. import CommentEntry from './entries/comment-entry'
  9. import AddCommentEntry from './entries/add-comment-entry'
  10. import BulkActionsEntry from './entries/bulk-actions-entry'
  11. import {
  12. useReviewPanelUpdaterFnsContext,
  13. useReviewPanelValueContext,
  14. } from '../../context/review-panel/review-panel-context'
  15. import useCodeMirrorContentHeight from '../../hooks/use-codemirror-content-height'
  16. import { ReviewPanelEntry } from '../../../../../../types/review-panel/entry'
  17. import { ThreadId } from '../../../../../../types/review-panel/review-panel'
  18. function CurrentFileContainer() {
  19. const {
  20. commentThreads,
  21. entries,
  22. openDocId,
  23. permissions,
  24. loadingThreads,
  25. users,
  26. toggleReviewPanel,
  27. } = useReviewPanelValueContext()
  28. const { setEntryHover } = useReviewPanelUpdaterFnsContext()
  29. const contentHeight = useCodeMirrorContentHeight()
  30. console.log('Review panel got content height', contentHeight)
  31. const currentDocEntries =
  32. openDocId && openDocId in entries ? entries[openDocId] : undefined
  33. const objectEntries = useMemo(() => {
  34. return Object.entries(currentDocEntries || {}) as Array<
  35. [ThreadId, ReviewPanelEntry]
  36. >
  37. }, [currentDocEntries])
  38. return (
  39. <Container>
  40. <div className="review-panel-tools">
  41. <Toolbar />
  42. <Nav />
  43. </div>
  44. <Toggler />
  45. <div
  46. id="review-panel-current-file"
  47. role="tabpanel"
  48. tabIndex={0}
  49. aria-labelledby="review-panel-tab-current-file"
  50. >
  51. <div
  52. className="rp-entry-list-inner"
  53. style={{ height: `${contentHeight}px` }}
  54. >
  55. {openDocId &&
  56. objectEntries.map(([id, entry]) => {
  57. if (!entry.visible) {
  58. return null
  59. }
  60. if (entry.type === 'insert' || entry.type === 'delete') {
  61. return (
  62. <ChangeEntry
  63. key={id}
  64. docId={openDocId}
  65. entry={entry}
  66. permissions={permissions}
  67. user={users[entry.metadata.user_id]}
  68. onMouseEnter={setEntryHover.bind(null, true)}
  69. onMouseLeave={setEntryHover.bind(null, false)}
  70. onIndicatorClick={toggleReviewPanel}
  71. />
  72. )
  73. }
  74. if (entry.type === 'aggregate-change') {
  75. return (
  76. <AggregateChangeEntry
  77. key={id}
  78. docId={openDocId}
  79. entry={entry}
  80. permissions={permissions}
  81. user={users[entry.metadata.user_id]}
  82. onMouseEnter={setEntryHover.bind(null, true)}
  83. onMouseLeave={setEntryHover.bind(null, false)}
  84. onIndicatorClick={toggleReviewPanel}
  85. />
  86. )
  87. }
  88. if (entry.type === 'comment' && !loadingThreads) {
  89. return (
  90. <CommentEntry
  91. key={id}
  92. docId={openDocId}
  93. entry={entry}
  94. entryId={id}
  95. permissions={permissions}
  96. threads={commentThreads}
  97. onMouseEnter={setEntryHover.bind(null, true)}
  98. onMouseLeave={setEntryHover.bind(null, false)}
  99. onIndicatorClick={toggleReviewPanel}
  100. />
  101. )
  102. }
  103. if (entry.type === 'add-comment' && permissions.comment) {
  104. return <AddCommentEntry key={id} />
  105. }
  106. if (entry.type === 'bulk-actions') {
  107. return <BulkActionsEntry key={id} />
  108. }
  109. return null
  110. })}
  111. </div>
  112. </div>
  113. </Container>
  114. )
  115. }
  116. export default CurrentFileContainer