current-file-container.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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/bulk-actions-entry'
  11. import PositionedEntries from './positioned-entries'
  12. import { useReviewPanelValueContext } from '../../context/review-panel/review-panel-context'
  13. import useCodeMirrorContentHeight from '../../hooks/use-codemirror-content-height'
  14. import { ReviewPanelEntry } from '../../../../../../types/review-panel/entry'
  15. import {
  16. ReviewPanelDocEntries,
  17. ThreadId,
  18. } from '../../../../../../types/review-panel/review-panel'
  19. const isEntryAThreadId = (
  20. entry: keyof ReviewPanelDocEntries
  21. ): entry is ThreadId => entry !== 'add-comment' && entry !== 'bulk-actions'
  22. function CurrentFileContainer() {
  23. const {
  24. commentThreads,
  25. entries,
  26. openDocId,
  27. permissions,
  28. loadingThreads,
  29. users,
  30. entryHover,
  31. nVisibleSelectedChanges: nChanges,
  32. } = useReviewPanelValueContext()
  33. const contentHeight = useCodeMirrorContentHeight()
  34. const currentDocEntries =
  35. openDocId && openDocId in entries ? entries[openDocId] : undefined
  36. const objectEntries = useMemo(() => {
  37. return Object.entries(currentDocEntries || {}) as Array<
  38. [keyof ReviewPanelDocEntries, ReviewPanelEntry]
  39. >
  40. }, [currentDocEntries])
  41. return (
  42. <Container
  43. classNames={{
  44. 'rp-collapsed-displaying-entry': entryHover,
  45. 'rp-current-file-container': true,
  46. }}
  47. >
  48. <div className="review-panel-tools">
  49. <Toolbar />
  50. <Nav />
  51. </div>
  52. <Toggler />
  53. <div
  54. id="review-panel-current-file"
  55. role="tabpanel"
  56. tabIndex={0}
  57. aria-labelledby="review-panel-tab-current-file"
  58. >
  59. <PositionedEntries
  60. entries={objectEntries}
  61. contentHeight={contentHeight}
  62. >
  63. {openDocId &&
  64. objectEntries.map(([id, entry]) => {
  65. if (!entry.visible) {
  66. return null
  67. }
  68. if (
  69. isEntryAThreadId(id) &&
  70. (entry.type === 'insert' || entry.type === 'delete')
  71. ) {
  72. return (
  73. <ChangeEntry
  74. key={id}
  75. docId={openDocId}
  76. entryId={id}
  77. permissions={permissions}
  78. user={users[entry.metadata.user_id]}
  79. content={entry.content}
  80. offset={entry.offset}
  81. type={entry.type}
  82. focused={entry.focused}
  83. entryIds={entry.entry_ids}
  84. timestamp={entry.metadata.ts}
  85. />
  86. )
  87. }
  88. if (isEntryAThreadId(id) && entry.type === 'aggregate-change') {
  89. return (
  90. <AggregateChangeEntry
  91. key={id}
  92. docId={openDocId}
  93. entryId={id}
  94. permissions={permissions}
  95. user={users[entry.metadata.user_id]}
  96. content={entry.content}
  97. replacedContent={entry.metadata.replaced_content}
  98. offset={entry.offset}
  99. focused={entry.focused}
  100. entryIds={entry.entry_ids}
  101. timestamp={entry.metadata.ts}
  102. />
  103. )
  104. }
  105. if (
  106. isEntryAThreadId(id) &&
  107. entry.type === 'comment' &&
  108. !loadingThreads
  109. ) {
  110. return (
  111. <CommentEntry
  112. key={id}
  113. docId={openDocId}
  114. threadId={entry.thread_id}
  115. thread={commentThreads[entry.thread_id]}
  116. entryId={id}
  117. offset={entry.offset}
  118. focused={entry.focused}
  119. permissions={permissions}
  120. />
  121. )
  122. }
  123. if (entry.type === 'add-comment' && permissions.comment) {
  124. return <AddCommentEntry key={id} entryId={entry.type} />
  125. }
  126. if (entry.type === 'bulk-actions') {
  127. return (
  128. <BulkActionsEntry
  129. key={id}
  130. entryId={entry.type}
  131. nChanges={nChanges}
  132. />
  133. )
  134. }
  135. return null
  136. })}
  137. </PositionedEntries>
  138. </div>
  139. </Container>
  140. )
  141. }
  142. export default CurrentFileContainer