overview-file.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. import MaterialIcon from '@/shared/components/material-icon'
  12. import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher'
  13. type OverviewFileProps = {
  14. docId: MainDocument['doc']['id']
  15. docPath: MainDocument['path']
  16. }
  17. function OverviewFile({ docId, docPath }: OverviewFileProps) {
  18. const { entries, collapsed } = useReviewPanelValueContext()
  19. const { setCollapsed } = useReviewPanelUpdaterFnsContext()
  20. const docCollapsed = collapsed[docId]
  21. const docEntries = useMemo(() => {
  22. return docId in entries ? entries[docId] : ({} as ReviewPanelDocEntries)
  23. }, [docId, entries])
  24. const entryCount = useMemo(() => {
  25. return Object.keys(docEntries).filter(
  26. key => key !== 'add-comment' && key !== 'bulk-actions'
  27. ).length
  28. }, [docEntries])
  29. const handleToggleCollapsed = () => {
  30. setCollapsed({ ...collapsed, [docId]: !docCollapsed })
  31. }
  32. return (
  33. <div className="rp-overview-file">
  34. {entryCount > 0 && (
  35. // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
  36. <div
  37. className="rp-overview-file-header"
  38. onClick={handleToggleCollapsed}
  39. >
  40. <span
  41. className={classnames('rp-overview-file-header-collapse', {
  42. 'rp-overview-file-header-collapse-on': docCollapsed,
  43. })}
  44. >
  45. <BootstrapVersionSwitcher
  46. bs3={<Icon type="angle-down" />}
  47. bs5={<MaterialIcon type="expand_more" />}
  48. />
  49. </span>
  50. {docPath}
  51. {docCollapsed && (
  52. <>
  53. &nbsp;
  54. <span className="rp-overview-file-num-entries">
  55. ({entryCount})
  56. </span>
  57. </>
  58. )}
  59. </div>
  60. )}
  61. {!docCollapsed && (
  62. <OverviewFileEntries docId={docId} docEntries={docEntries} />
  63. )}
  64. </div>
  65. )
  66. }
  67. export default OverviewFile