overview-file.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { useMemo } from 'react'
  2. import Icon from '../../../../shared/components/icon'
  3. import {
  4. useReviewPanelUpdaterFnsContext,
  5. useReviewPanelValueContext,
  6. } from '../../context/review-panel/review-panel-context'
  7. import classnames from 'classnames'
  8. import { ReviewPanelDocEntries } from '../../../../../../types/review-panel/review-panel'
  9. import { MainDocument } from '../../../../../../types/project-settings'
  10. import OverviewFileEntries from '@/features/source-editor/components/review-panel/entries/overview-file-entries'
  11. type OverviewFileProps = {
  12. docId: MainDocument['doc']['id']
  13. docPath: MainDocument['path']
  14. }
  15. function OverviewFile({ docId, docPath }: OverviewFileProps) {
  16. const { entries, collapsed } = useReviewPanelValueContext()
  17. const { setCollapsed } = useReviewPanelUpdaterFnsContext()
  18. const docCollapsed = collapsed[docId]
  19. const docEntries = useMemo(() => {
  20. return docId in entries ? entries[docId] : ({} as ReviewPanelDocEntries)
  21. }, [docId, entries])
  22. const entryCount = useMemo(() => {
  23. return Object.keys(docEntries).filter(
  24. key => key !== 'add-comment' && key !== 'bulk-actions'
  25. ).length
  26. }, [docEntries])
  27. const handleToggleCollapsed = () => {
  28. setCollapsed({ ...collapsed, [docId]: !docCollapsed })
  29. }
  30. return (
  31. <div className="rp-overview-file">
  32. {entryCount > 0 && (
  33. // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
  34. <div
  35. className="rp-overview-file-header"
  36. onClick={handleToggleCollapsed}
  37. >
  38. <span
  39. className={classnames('rp-overview-file-header-collapse', {
  40. 'rp-overview-file-header-collapse-on': docCollapsed,
  41. })}
  42. >
  43. <Icon type="angle-down" />
  44. </span>
  45. {docPath}
  46. {docCollapsed && (
  47. <>
  48. &nbsp;
  49. <span className="rp-overview-file-num-entries">
  50. ({entryCount})
  51. </span>
  52. </>
  53. )}
  54. </div>
  55. )}
  56. {!docCollapsed && (
  57. <OverviewFileEntries docId={docId} docEntries={docEntries} />
  58. )}
  59. </div>
  60. )
  61. }
  62. export default OverviewFile