current-file-container.tsx 4.9 KB

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