current-file-container.tsx 4.7 KB

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