entry.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import { memo } from 'react'
  2. import ChangeEntry from './entries/change-entry'
  3. import AggregateChangeEntry from './entries/aggregate-change-entry'
  4. import CommentEntry from './entries/comment-entry'
  5. import AddCommentEntry from './entries/add-comment-entry'
  6. import BulkActionsEntry from './entries/bulk-actions-entry/bulk-actions-entry'
  7. import {
  8. ReviewPanelDocEntries,
  9. ThreadId,
  10. } from '../../../../../../types/review-panel/review-panel'
  11. import { useReviewPanelValueContext } from '../../context/review-panel/review-panel-context'
  12. import { useEditorContext } from '../../../../shared/context/editor-context'
  13. type Props = {
  14. entry: ReviewPanelDocEntries[keyof ReviewPanelDocEntries]
  15. id: ThreadId | 'add-comment' | 'bulk-actions'
  16. }
  17. const isEntryAThreadId = (
  18. entry: keyof ReviewPanelDocEntries
  19. ): entry is ThreadId => entry !== 'add-comment' && entry !== 'bulk-actions'
  20. function Entry({ entry, id }: Props) {
  21. const {
  22. commentThreads,
  23. openDocId,
  24. permissions,
  25. loadingThreads,
  26. users,
  27. nVisibleSelectedChanges: nChanges,
  28. } = useReviewPanelValueContext()
  29. const { isRestrictedTokenMember } = useEditorContext()
  30. if (!entry.visible || !openDocId) {
  31. return null
  32. }
  33. if (
  34. isEntryAThreadId(id) &&
  35. (entry.type === 'insert' || entry.type === 'delete')
  36. ) {
  37. return (
  38. <ChangeEntry
  39. key={id}
  40. docId={openDocId}
  41. entryId={id}
  42. permissions={permissions}
  43. user={users[entry.metadata.user_id]}
  44. content={entry.content}
  45. offset={entry.offset}
  46. type={entry.type}
  47. focused={entry.focused}
  48. entryIds={entry.entry_ids}
  49. timestamp={entry.metadata.ts}
  50. />
  51. )
  52. }
  53. if (isEntryAThreadId(id) && entry.type === 'aggregate-change') {
  54. return (
  55. <AggregateChangeEntry
  56. key={id}
  57. docId={openDocId}
  58. entryId={id}
  59. permissions={permissions}
  60. user={users[entry.metadata.user_id]}
  61. content={entry.content}
  62. replacedContent={entry.metadata.replaced_content}
  63. offset={entry.offset}
  64. focused={entry.focused}
  65. entryIds={entry.entry_ids}
  66. timestamp={entry.metadata.ts}
  67. />
  68. )
  69. }
  70. if (isEntryAThreadId(id) && entry.type === 'comment' && !loadingThreads) {
  71. return (
  72. <CommentEntry
  73. key={id}
  74. docId={openDocId}
  75. threadId={entry.thread_id}
  76. thread={commentThreads[entry.thread_id]}
  77. entryId={id}
  78. offset={entry.offset}
  79. focused={entry.focused}
  80. permissions={permissions}
  81. />
  82. )
  83. }
  84. if (
  85. entry.type === 'add-comment' &&
  86. permissions.comment &&
  87. !isRestrictedTokenMember
  88. ) {
  89. return <AddCommentEntry key={id} />
  90. }
  91. if (entry.type === 'bulk-actions' && permissions.write) {
  92. return (
  93. <BulkActionsEntry key={id} entryId={entry.type} nChanges={nChanges} />
  94. )
  95. }
  96. return null
  97. }
  98. export default memo(Entry)