current-file-container.tsx 4.9 KB

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