@ynput/ayon-frontend-shared 0.2.9 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/_virtual/index.cjs5.js +3 -5
  2. package/dist/_virtual/index.cjs5.js.map +1 -1
  3. package/dist/_virtual/index.cjs6.js +5 -3
  4. package/dist/_virtual/index.cjs6.js.map +1 -1
  5. package/dist/_virtual/index.es5.js +2 -5
  6. package/dist/_virtual/index.es5.js.map +1 -1
  7. package/dist/_virtual/index.es6.js +5 -2
  8. package/dist/_virtual/index.es6.js.map +1 -1
  9. package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
  10. package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
  11. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  12. package/dist/node_modules/remove-accents/index.es.js +1 -1
  13. package/dist/shared/src/containers/Feed/Feed.cjs.js +21 -2
  14. package/dist/shared/src/containers/Feed/Feed.cjs.js.map +1 -1
  15. package/dist/shared/src/containers/Feed/Feed.es.js +22 -3
  16. package/dist/shared/src/containers/Feed/Feed.es.js.map +1 -1
  17. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +18 -0
  18. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
  19. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +19 -1
  20. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
  21. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js +7 -4
  22. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js.map +1 -1
  23. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js +7 -4
  24. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js.map +1 -1
  25. package/dist/shared/src/containers/Feed/components/CommentInput/helpers.cjs.js.map +1 -1
  26. package/dist/shared/src/containers/Feed/components/CommentInput/helpers.es.js.map +1 -1
  27. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.cjs.js +1 -1
  28. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.cjs.js.map +1 -1
  29. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.es.js +1 -1
  30. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.es.js.map +1 -1
  31. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.cjs.js +27 -15
  32. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.cjs.js.map +1 -1
  33. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.es.js +27 -15
  34. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.es.js.map +1 -1
  35. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.cjs.js +40 -12
  36. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.cjs.js.map +1 -1
  37. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.es.js +41 -13
  38. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.es.js.map +1 -1
  39. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js +33 -19
  40. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js.map +1 -1
  41. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.es.js +33 -19
  42. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.es.js.map +1 -1
  43. package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.cjs.js +14 -12
  44. package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.cjs.js.map +1 -1
  45. package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.es.js +14 -12
  46. package/dist/shared/src/containers/Feed/components/FilesGrid/FilesGrid.es.js.map +1 -1
  47. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js +8 -8
  48. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js +8 -8
  49. package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.cjs.js +18 -0
  50. package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.cjs.js.map +1 -0
  51. package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.es.js +19 -0
  52. package/dist/shared/src/containers/Feed/helpers/mergeAnnotationAttachments.es.js.map +1 -0
  53. package/dist/shared/src/containers/Feed/hooks/useCommentMutations.cjs.js +12 -3
  54. package/dist/shared/src/containers/Feed/hooks/useCommentMutations.cjs.js.map +1 -1
  55. package/dist/shared/src/containers/Feed/hooks/useCommentMutations.es.js +12 -3
  56. package/dist/shared/src/containers/Feed/hooks/useCommentMutations.es.js.map +1 -1
  57. package/dist/shared/src/containers/Feed/hooks/useTransformActivities.cjs.js.map +1 -1
  58. package/dist/shared/src/containers/Feed/hooks/useTransformActivities.es.js.map +1 -1
  59. package/dist/shared/src/context/DetailsPanelContext.cjs.js +3 -0
  60. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  61. package/dist/shared/src/context/DetailsPanelContext.es.js +3 -0
  62. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  63. package/dist/types/containers/Feed/components/CommentInput/CommentInput.d.ts +1 -1
  64. package/dist/types/containers/Feed/components/CommentInput/helpers.d.ts +6 -1
  65. package/dist/types/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.d.ts +1 -1
  66. package/dist/types/containers/Feed/components/CommentInput/hooks/useAnnotationsUpload.d.ts +5 -1
  67. package/dist/types/containers/Feed/components/FileUploadCard/FileUploadCard.d.ts +5 -2
  68. package/dist/types/containers/Feed/components/FileUploadCard/FileUploadCard.styled.d.ts +4 -0
  69. package/dist/types/containers/Feed/components/FilesGrid/FilesGrid.d.ts +1 -1
  70. package/dist/types/containers/Feed/helpers/mergeAnnotationAttachments.d.ts +2 -0
  71. package/dist/types/containers/Feed/hooks/useCommentMutations.d.ts +1 -1
  72. package/dist/types/containers/Feed/index.d.ts +6 -0
  73. package/dist/types/context/DetailsPanelContext.d.ts +4 -0
  74. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FileUploadCard.styled.es.js","sources":["../../../../../../../src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.ts"],"sourcesContent":["import styled from 'styled-components'\n\nexport const File = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--border-radius-m);\n overflow: hidden;\n background-color: var(--md-sys-color-surface-container-low);\n z-index: 0;\n user-select: none;\n\n height: 105px;\n\n &.compact {\n height: 75px;\n }\n\n .icon {\n font-size: 30px;\n }\n\n .remove {\n position: absolute;\n top: 2px;\n right: 2px;\n padding: 2px;\n\n &:hover {\n background-color: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n }\n\n .icon {\n font-size: 20px;\n }\n }\n\n /* move icon up slightly to center it */\n .type-icon {\n margin-top: -20px;\n }\n\n /* set download default color outline */\n .download,\n .download-icon {\n color: var(--md-sys-color-outline);\n }\n\n .expand-icon {\n pointer-events: none;\n position: absolute;\n /* center */\n left: 50%;\n bottom: calc(50% - 20px);\n transform: translate(-50%, -50%);\n\n display: none;\n }\n`\n\nexport const Footer = styled.footer`\n background-color: var(--md-sys-color-surface-container-low);\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 var(--padding-s);\n overflow: hidden;\n color: var(--md-sys-color-on-surface);\n\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n\n transition: padding 0.2s ease;\n\n span {\n font-size: 12px;\n }\n\n .name-wrapper {\n overflow: hidden;\n }\n\n .download {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n display: none;\n color: var(--md-sys-color-on-surface);\n }\n\n .name {\n position: relative;\n\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n z-index: 20;\n display: inherit;\n }\n\n .extension {\n z-index: 20;\n min-width: fit-content;\n overflow: hidden;\n }\n\n .progress {\n position: absolute;\n inset: 0;\n background-color: var(--md-sys-color-primary-container);\n z-index: 10;\n\n transition: right 0.3s;\n\n display: none;\n }\n\n &.inProgress {\n .progress {\n display: block;\n }\n }\n\n .download-icon {\n font-size: 20px;\n }\n\n &.isDownloadable {\n &:hover {\n cursor: pointer;\n\n padding: var(--padding-m) var(--padding-s);\n\n background-color: var(--md-sys-color-surface-container-low-hover);\n\n .download,\n .download-icon {\n color: var(--md-sys-color-on-surface);\n }\n\n /* reveal size and download */\n .download {\n display: flex;\n }\n .name-wrapper,\n .extension {\n display: none;\n }\n }\n }\n`\n\nexport const ContentWrapper = styled.div`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: var(--md-sys-color-surface-container-lowest);\n\n flex: 1;\n\n .icon {\n user-select: none;\n }\n\n .download-icon {\n display: none;\n }\n\n /* previewable styles (it can be expanded) */\n /* on hover it shows the expand icon */\n &.isPreviewable,\n &.isAnnotation {\n cursor: pointer;\n\n &:hover {\n .expand-icon {\n display: block;\n }\n .type-icon {\n display: none;\n }\n }\n }\n`\n\nexport const ImageWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n background-color: var(--md-sys-color-surface-container-lowest);\n img {\n position: absolute;\n max-height: 100%;\n max-width: 100%;\n object-fit: contain;\n height: calc(100% - 20px);\n\n transition: scale 0.2s ease;\n }\n\n &::after {\n content: '';\n position: absolute;\n inset: 0;\n background-color: var(--md-sys-color-surface-container-lowest);\n opacity: 0;\n transition: opacity 0.1s ease;\n }\n\n &.isDownloadable {\n &:hover {\n &::after {\n opacity: 0.8;\n }\n\n .icon {\n display: block;\n z-index: 10;\n }\n }\n }\n`\n"],"names":[],"mappings":";AAEO,MAAM,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DpB,MAAM,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+FtB,MAAM,iBAAiB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkC9B,MAAM,eAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
1
+ {"version":3,"file":"FileUploadCard.styled.es.js","sources":["../../../../../../../src/containers/Feed/components/FileUploadCard/FileUploadCard.styled.ts"],"sourcesContent":["import { Button } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport const File = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n border-radius: var(--border-radius-m);\n overflow: hidden;\n background-color: var(--md-sys-color-surface-container-low);\n z-index: 0;\n user-select: none;\n\n height: 105px;\n\n &.compact {\n height: 75px;\n }\n\n .icon {\n font-size: 30px;\n }\n\n .remove {\n position: absolute;\n top: 2px;\n right: 2px;\n padding: 2px;\n\n &:hover {\n background-color: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n }\n\n .icon {\n font-size: 20px;\n }\n }\n\n /* move icon up slightly to center it */\n .type-icon {\n margin-top: -20px;\n }\n\n /* set download default color outline */\n .download,\n .download-icon {\n color: var(--md-sys-color-outline);\n }\n`\n\nexport const Footer = styled.footer`\n background-color: var(--md-sys-color-surface-container-low);\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 var(--padding-s);\n overflow: hidden;\n color: var(--md-sys-color-on-surface);\n\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n\n transition: padding 0.2s ease;\n\n span {\n font-size: 12px;\n }\n\n .name-wrapper {\n overflow: hidden;\n }\n\n .download {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n display: none;\n color: var(--md-sys-color-on-surface);\n }\n\n .name {\n position: relative;\n\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n z-index: 20;\n display: inherit;\n }\n\n .extension {\n z-index: 20;\n min-width: fit-content;\n overflow: hidden;\n }\n\n .progress {\n position: absolute;\n inset: 0;\n background-color: var(--md-sys-color-primary-container);\n z-index: 10;\n\n transition: right 0.3s;\n\n display: none;\n }\n\n &.inProgress {\n .progress {\n display: block;\n }\n }\n\n .download-icon {\n font-size: 20px;\n }\n\n &.isDownloadable {\n &:hover {\n cursor: pointer;\n\n padding: var(--padding-m) var(--padding-s);\n\n background-color: var(--md-sys-color-surface-container-low-hover);\n\n .download,\n .download-icon {\n color: var(--md-sys-color-on-surface);\n }\n\n /* reveal size and download */\n .download {\n display: flex;\n }\n .name-wrapper,\n .extension {\n display: none;\n }\n }\n }\n`\n\nexport const ContentWrapper = styled.div`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: var(--md-sys-color-surface-container-lowest);\n\n flex: 1;\n\n .icon {\n user-select: none;\n }\n\n .download-icon {\n display: none;\n }\n\n /* previewable styles (it can be expanded) */\n /* on hover it shows the expand buttons */\n &.isPreviewable,\n &.isUnsavedAnnotation {\n cursor: pointer;\n\n &:hover {\n .expand-buttons {\n display: flex;\n }\n .type-icon {\n display: none;\n }\n }\n }\n\n &:hover .image-wrapper::after {\n opacity: 0.8;\n }\n`\n\nexport const ImageWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n background-color: var(--md-sys-color-surface-container-lowest);\n img {\n position: absolute;\n max-height: 100%;\n max-width: 100%;\n object-fit: contain;\n height: calc(100% - 20px);\n\n transition: scale 0.2s ease;\n }\n\n &::after {\n content: '';\n position: absolute;\n inset: 0;\n background-color: var(--md-sys-color-surface-container-lowest);\n opacity: 0;\n transition: opacity 0.1s ease;\n }\n\n &.isDownloadable {\n &:hover {\n .icon {\n display: block;\n z-index: 10;\n }\n }\n }\n`\n\nexport const Buttons = styled.div`\n display: none;\n position: absolute;\n left: 0;\n top: 0;\n transform: none;\n height: calc(100% - 20px);\n width: 100%;\n gap: 0;\n`\n\nexport const ExpandButton = styled(Button)`\n height: 100%;\n width: 100%;\n border: none;\n opacity: 0.5;\n transition: opacity 250ms;\n\n &:hover {\n background: none;\n opacity: 1;\n }\n`\n"],"names":[],"mappings":";;AAGO,MAAM,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDpB,MAAM,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+FtB,MAAM,iBAAiB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsC9B,MAAM,eAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmC5B,MAAM,UAAU,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWjB,MAAA,eAAe,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
@@ -4,6 +4,7 @@ const FilesGrid_styled = require("./FilesGrid.styled.cjs.js");
4
4
  const clsx = require("clsx");
5
5
  const FileUploadCard = require("../FileUploadCard/FileUploadCard.cjs.js");
6
6
  const FileUploadPreview = require("../FileUploadPreview/FileUploadPreview.cjs.js");
7
+ const React = require("react");
7
8
  const FilesGrid = ({
8
9
  files = [],
9
10
  activityId,
@@ -16,15 +17,14 @@ const FilesGrid = ({
16
17
  ...props
17
18
  }) => {
18
19
  if (!files.length) return null;
19
- const handleExpand = (file, index) => {
20
- if (file.isAnnotation) {
21
- onAnnotationClick == null ? void 0 : onAnnotationClick(file);
22
- } else {
23
- const filteredFiles = files.filter((file2) => FileUploadPreview.isFilePreviewable(file2.mime, file2.ext));
24
- const updatedIndex = filteredFiles.findIndex((file2) => file2.id === files[index].id);
20
+ const handleExpand = React.useCallback(
21
+ (index) => {
22
+ const filteredFiles = files.filter((file) => FileUploadPreview.isFilePreviewable(file.mime, file.ext));
23
+ const updatedIndex = filteredFiles.findIndex((file) => file.id === files[index].id);
25
24
  onExpand == null ? void 0 : onExpand({ files: filteredFiles, index: updatedIndex, activityId: activityId || "" });
26
- }
27
- };
25
+ },
26
+ [onExpand]
27
+ );
28
28
  return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(FilesGrid_styled.Grid, { className: clsx({ compact: isCompact }), ...props, children: files.map((file, index) => /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
29
29
  FileUploadCard,
30
30
  {
@@ -32,13 +32,15 @@ const FilesGrid = ({
32
32
  name: file.name,
33
33
  mime: file.mime || file.type,
34
34
  size: file.size,
35
- src: file.isAnnotation ? file.thumbnail : `/api/projects/${projectName}/files/${file.id}`,
36
- isAnnotation: file.isAnnotation,
35
+ src: file.isUnsavedAnnotation ? file.thumbnail : `/api/projects/${projectName}/files/${file.id}`,
36
+ isUnsavedAnnotation: file.isUnsavedAnnotation,
37
+ savedAnnotation: file.annotation,
37
38
  progress: file.progress,
38
- onRemove: onRemove ? () => onRemove(file.id, file.name, file.isAnnotation) : void 0,
39
+ onRemove: onRemove ? () => onRemove(file.id, file.name, file.isUnsavedAnnotation) : void 0,
39
40
  isCompact,
40
41
  isDownloadable,
41
- onExpand: () => handleExpand(file, index)
42
+ onExpand: () => handleExpand(index),
43
+ onJumpTo: () => onAnnotationClick == null ? void 0 : onAnnotationClick(file)
42
44
  },
43
45
  index
44
46
  )) });
@@ -1 +1 @@
1
- {"version":3,"file":"FilesGrid.cjs.js","sources":["../../../../../../../src/containers/Feed/components/FilesGrid/FilesGrid.tsx"],"sourcesContent":["import * as Styled from './FilesGrid.styled'\nimport clsx from 'clsx'\nimport FileUploadCard from '../FileUploadCard'\nimport { isFilePreviewable } from '../FileUploadPreview'\n\nexport interface FilesGridProps {\n files?: any[]\n activityId?: string\n isCompact?: boolean\n onRemove?: (id: string, name: string, isAnnotation: boolean) => void\n projectName: string\n isDownloadable?: boolean\n onExpand?: (data: { files: any[]; index: number; activityId: string }) => void\n onAnnotationClick?: (file: any) => void\n [key: string]: any\n}\n\nconst FilesGrid: React.FC<FilesGridProps> = ({\n files = [],\n activityId,\n isCompact,\n onRemove,\n projectName,\n isDownloadable,\n onExpand,\n onAnnotationClick,\n ...props\n}) => {\n if (!files.length) return null\n\n const handleExpand = (file: any, index: number) => {\n if (file.isAnnotation) {\n onAnnotationClick?.(file)\n } else {\n const filteredFiles = files.filter((file) => isFilePreviewable(file.mime, file.ext))\n const updatedIndex = filteredFiles.findIndex((file) => file.id === files[index].id)\n onExpand?.({ files: filteredFiles, index: updatedIndex, activityId: activityId || '' })\n }\n }\n\n return (\n <Styled.Grid className={clsx({ compact: isCompact })} {...props}>\n {files.map((file, index) => (\n <FileUploadCard\n key={index}\n id={file.id || file.name}\n name={file.name}\n mime={file.mime || file.type}\n size={file.size}\n src={file.isAnnotation ? file.thumbnail : `/api/projects/${projectName}/files/${file.id}`}\n isAnnotation={file.isAnnotation}\n progress={file.progress}\n onRemove={onRemove ? () => onRemove(file.id, file.name, file.isAnnotation) : undefined}\n isCompact={isCompact}\n isDownloadable={isDownloadable}\n onExpand={() => handleExpand(file, index)}\n />\n ))}\n </Styled.Grid>\n )\n}\n\nexport default FilesGrid\n"],"names":["file","isFilePreviewable","Styled.Grid","jsx"],"mappings":";;;;;;AAiBA,MAAM,YAAsC,CAAC;AAAA,EAC3C,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACA,MAAA,CAAC,MAAM,OAAe,QAAA;AAEpB,QAAA,eAAe,CAAC,MAAW,UAAkB;AACjD,QAAI,KAAK,cAAc;AACrB,6DAAoB;AAAA,IAAI,OACnB;AACC,YAAA,gBAAgB,MAAM,OAAO,CAACA,UAASC,oCAAkBD,MAAK,MAAMA,MAAK,GAAG,CAAC;AAC7E,YAAA,eAAe,cAAc,UAAU,CAACA,UAASA,MAAK,OAAO,MAAM,KAAK,EAAE,EAAE;AACvE,2CAAA,EAAE,OAAO,eAAe,OAAO,cAAc,YAAY,cAAc;IAAI;AAAA,EAE1F;AAEA,0DACGE,iBAAAA,MAAA,EAAY,WAAW,KAAK,EAAE,SAAS,UAAU,CAAC,GAAI,GAAG,OACvD,gBAAM,IAAI,CAAC,MAAM,UAChBC,2BAAA,kBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,IAAI,KAAK,MAAM,KAAK;AAAA,MACpB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,MAAM,KAAK;AAAA,MACX,KAAK,KAAK,eAAe,KAAK,YAAY,iBAAiB,WAAW,UAAU,KAAK,EAAE;AAAA,MACvF,cAAc,KAAK;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,UAAU,WAAW,MAAM,SAAS,KAAK,IAAI,KAAK,MAAM,KAAK,YAAY,IAAI;AAAA,MAC7E;AAAA,MACA;AAAA,MACA,UAAU,MAAM,aAAa,MAAM,KAAK;AAAA,IAAA;AAAA,IAXnC;AAAA,EAaR,CAAA,GACH;AAEJ;;"}
1
+ {"version":3,"file":"FilesGrid.cjs.js","sources":["../../../../../../../src/containers/Feed/components/FilesGrid/FilesGrid.tsx"],"sourcesContent":["import * as Styled from './FilesGrid.styled'\nimport clsx from 'clsx'\nimport FileUploadCard from '../FileUploadCard'\nimport { isFilePreviewable } from '../FileUploadPreview'\nimport { useCallback } from 'react'\n\nexport interface FilesGridProps {\n files?: any[]\n activityId?: string\n isCompact?: boolean\n onRemove?: (id: string, name: string, isUnsavedAnnotation: boolean) => void\n projectName: string\n isDownloadable?: boolean\n onExpand?: (data: { files: any[]; index: number; activityId: string }) => void\n onAnnotationClick?: (file: any) => void\n [key: string]: any\n}\n\nconst FilesGrid: React.FC<FilesGridProps> = ({\n files = [],\n activityId,\n isCompact,\n onRemove,\n projectName,\n isDownloadable,\n onExpand,\n onAnnotationClick,\n ...props\n}) => {\n if (!files.length) return null\n\n const handleExpand = useCallback(\n (index: number) => {\n const filteredFiles = files.filter((file) => isFilePreviewable(file.mime, file.ext))\n const updatedIndex = filteredFiles.findIndex((file) => file.id === files[index].id)\n onExpand?.({ files: filteredFiles, index: updatedIndex, activityId: activityId || '' })\n },\n [onExpand],\n )\n\n return (\n <Styled.Grid className={clsx({ compact: isCompact })} {...props}>\n {files.map((file, index) => (\n <FileUploadCard\n key={index}\n id={file.id || file.name}\n name={file.name}\n mime={file.mime || file.type}\n size={file.size}\n src={\n file.isUnsavedAnnotation\n ? file.thumbnail\n : `/api/projects/${projectName}/files/${file.id}`\n }\n isUnsavedAnnotation={file.isUnsavedAnnotation}\n savedAnnotation={file.annotation}\n progress={file.progress}\n onRemove={\n onRemove ? () => onRemove(file.id, file.name, file.isUnsavedAnnotation) : undefined\n }\n isCompact={isCompact}\n isDownloadable={isDownloadable}\n onExpand={() => handleExpand(index)}\n onJumpTo={() => onAnnotationClick?.(file)}\n />\n ))}\n </Styled.Grid>\n )\n}\n\nexport default FilesGrid\n"],"names":["useCallback","isFilePreviewable","Styled.Grid","jsx"],"mappings":";;;;;;;AAkBA,MAAM,YAAsC,CAAC;AAAA,EAC3C,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACA,MAAA,CAAC,MAAM,OAAe,QAAA;AAE1B,QAAM,eAAeA,MAAA;AAAA,IACnB,CAAC,UAAkB;AACX,YAAA,gBAAgB,MAAM,OAAO,CAAC,SAASC,oCAAkB,KAAK,MAAM,KAAK,GAAG,CAAC;AAC7E,YAAA,eAAe,cAAc,UAAU,CAAC,SAAS,KAAK,OAAO,MAAM,KAAK,EAAE,EAAE;AACvE,2CAAA,EAAE,OAAO,eAAe,OAAO,cAAc,YAAY,cAAc;IACpF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,0DACGC,iBAAAA,MAAA,EAAY,WAAW,KAAK,EAAE,SAAS,UAAU,CAAC,GAAI,GAAG,OACvD,gBAAM,IAAI,CAAC,MAAM,UAChBC,2BAAA,kBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,IAAI,KAAK,MAAM,KAAK;AAAA,MACpB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,MAAM,KAAK;AAAA,MACX,KACE,KAAK,sBACD,KAAK,YACL,iBAAiB,WAAW,UAAU,KAAK,EAAE;AAAA,MAEnD,qBAAqB,KAAK;AAAA,MAC1B,iBAAiB,KAAK;AAAA,MACtB,UAAU,KAAK;AAAA,MACf,UACE,WAAW,MAAM,SAAS,KAAK,IAAI,KAAK,MAAM,KAAK,mBAAmB,IAAI;AAAA,MAE5E;AAAA,MACA;AAAA,MACA,UAAU,MAAM,aAAa,KAAK;AAAA,MAClC,UAAU,MAAM,uDAAoB;AAAA,IAAI;AAAA,IAnBnC;AAAA,EAqBR,CAAA,GACH;AAEJ;;"}
@@ -3,6 +3,7 @@ import { Grid } from "./FilesGrid.styled.es.js";
3
3
  import clsx from "clsx";
4
4
  import FileUploadCard from "../FileUploadCard/FileUploadCard.es.js";
5
5
  import { isFilePreviewable } from "../FileUploadPreview/FileUploadPreview.es.js";
6
+ import { useCallback } from "react";
6
7
  const FilesGrid = ({
7
8
  files = [],
8
9
  activityId,
@@ -15,15 +16,14 @@ const FilesGrid = ({
15
16
  ...props
16
17
  }) => {
17
18
  if (!files.length) return null;
18
- const handleExpand = (file, index) => {
19
- if (file.isAnnotation) {
20
- onAnnotationClick == null ? void 0 : onAnnotationClick(file);
21
- } else {
22
- const filteredFiles = files.filter((file2) => isFilePreviewable(file2.mime, file2.ext));
23
- const updatedIndex = filteredFiles.findIndex((file2) => file2.id === files[index].id);
19
+ const handleExpand = useCallback(
20
+ (index) => {
21
+ const filteredFiles = files.filter((file) => isFilePreviewable(file.mime, file.ext));
22
+ const updatedIndex = filteredFiles.findIndex((file) => file.id === files[index].id);
24
23
  onExpand == null ? void 0 : onExpand({ files: filteredFiles, index: updatedIndex, activityId: activityId || "" });
25
- }
26
- };
24
+ },
25
+ [onExpand]
26
+ );
27
27
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Grid, { className: clsx({ compact: isCompact }), ...props, children: files.map((file, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
28
28
  FileUploadCard,
29
29
  {
@@ -31,13 +31,15 @@ const FilesGrid = ({
31
31
  name: file.name,
32
32
  mime: file.mime || file.type,
33
33
  size: file.size,
34
- src: file.isAnnotation ? file.thumbnail : `/api/projects/${projectName}/files/${file.id}`,
35
- isAnnotation: file.isAnnotation,
34
+ src: file.isUnsavedAnnotation ? file.thumbnail : `/api/projects/${projectName}/files/${file.id}`,
35
+ isUnsavedAnnotation: file.isUnsavedAnnotation,
36
+ savedAnnotation: file.annotation,
36
37
  progress: file.progress,
37
- onRemove: onRemove ? () => onRemove(file.id, file.name, file.isAnnotation) : void 0,
38
+ onRemove: onRemove ? () => onRemove(file.id, file.name, file.isUnsavedAnnotation) : void 0,
38
39
  isCompact,
39
40
  isDownloadable,
40
- onExpand: () => handleExpand(file, index)
41
+ onExpand: () => handleExpand(index),
42
+ onJumpTo: () => onAnnotationClick == null ? void 0 : onAnnotationClick(file)
41
43
  },
42
44
  index
43
45
  )) });
@@ -1 +1 @@
1
- {"version":3,"file":"FilesGrid.es.js","sources":["../../../../../../../src/containers/Feed/components/FilesGrid/FilesGrid.tsx"],"sourcesContent":["import * as Styled from './FilesGrid.styled'\nimport clsx from 'clsx'\nimport FileUploadCard from '../FileUploadCard'\nimport { isFilePreviewable } from '../FileUploadPreview'\n\nexport interface FilesGridProps {\n files?: any[]\n activityId?: string\n isCompact?: boolean\n onRemove?: (id: string, name: string, isAnnotation: boolean) => void\n projectName: string\n isDownloadable?: boolean\n onExpand?: (data: { files: any[]; index: number; activityId: string }) => void\n onAnnotationClick?: (file: any) => void\n [key: string]: any\n}\n\nconst FilesGrid: React.FC<FilesGridProps> = ({\n files = [],\n activityId,\n isCompact,\n onRemove,\n projectName,\n isDownloadable,\n onExpand,\n onAnnotationClick,\n ...props\n}) => {\n if (!files.length) return null\n\n const handleExpand = (file: any, index: number) => {\n if (file.isAnnotation) {\n onAnnotationClick?.(file)\n } else {\n const filteredFiles = files.filter((file) => isFilePreviewable(file.mime, file.ext))\n const updatedIndex = filteredFiles.findIndex((file) => file.id === files[index].id)\n onExpand?.({ files: filteredFiles, index: updatedIndex, activityId: activityId || '' })\n }\n }\n\n return (\n <Styled.Grid className={clsx({ compact: isCompact })} {...props}>\n {files.map((file, index) => (\n <FileUploadCard\n key={index}\n id={file.id || file.name}\n name={file.name}\n mime={file.mime || file.type}\n size={file.size}\n src={file.isAnnotation ? file.thumbnail : `/api/projects/${projectName}/files/${file.id}`}\n isAnnotation={file.isAnnotation}\n progress={file.progress}\n onRemove={onRemove ? () => onRemove(file.id, file.name, file.isAnnotation) : undefined}\n isCompact={isCompact}\n isDownloadable={isDownloadable}\n onExpand={() => handleExpand(file, index)}\n />\n ))}\n </Styled.Grid>\n )\n}\n\nexport default FilesGrid\n"],"names":["file","Styled.Grid","jsx"],"mappings":";;;;;AAiBA,MAAM,YAAsC,CAAC;AAAA,EAC3C,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACA,MAAA,CAAC,MAAM,OAAe,QAAA;AAEpB,QAAA,eAAe,CAAC,MAAW,UAAkB;AACjD,QAAI,KAAK,cAAc;AACrB,6DAAoB;AAAA,IAAI,OACnB;AACC,YAAA,gBAAgB,MAAM,OAAO,CAACA,UAAS,kBAAkBA,MAAK,MAAMA,MAAK,GAAG,CAAC;AAC7E,YAAA,eAAe,cAAc,UAAU,CAACA,UAASA,MAAK,OAAO,MAAM,KAAK,EAAE,EAAE;AACvE,2CAAA,EAAE,OAAO,eAAe,OAAO,cAAc,YAAY,cAAc;IAAI;AAAA,EAE1F;AAEA,+CACGC,MAAA,EAAY,WAAW,KAAK,EAAE,SAAS,UAAU,CAAC,GAAI,GAAG,OACvD,gBAAM,IAAI,CAAC,MAAM,UAChBC,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,IAAI,KAAK,MAAM,KAAK;AAAA,MACpB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,MAAM,KAAK;AAAA,MACX,KAAK,KAAK,eAAe,KAAK,YAAY,iBAAiB,WAAW,UAAU,KAAK,EAAE;AAAA,MACvF,cAAc,KAAK;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,UAAU,WAAW,MAAM,SAAS,KAAK,IAAI,KAAK,MAAM,KAAK,YAAY,IAAI;AAAA,MAC7E;AAAA,MACA;AAAA,MACA,UAAU,MAAM,aAAa,MAAM,KAAK;AAAA,IAAA;AAAA,IAXnC;AAAA,EAaR,CAAA,GACH;AAEJ;"}
1
+ {"version":3,"file":"FilesGrid.es.js","sources":["../../../../../../../src/containers/Feed/components/FilesGrid/FilesGrid.tsx"],"sourcesContent":["import * as Styled from './FilesGrid.styled'\nimport clsx from 'clsx'\nimport FileUploadCard from '../FileUploadCard'\nimport { isFilePreviewable } from '../FileUploadPreview'\nimport { useCallback } from 'react'\n\nexport interface FilesGridProps {\n files?: any[]\n activityId?: string\n isCompact?: boolean\n onRemove?: (id: string, name: string, isUnsavedAnnotation: boolean) => void\n projectName: string\n isDownloadable?: boolean\n onExpand?: (data: { files: any[]; index: number; activityId: string }) => void\n onAnnotationClick?: (file: any) => void\n [key: string]: any\n}\n\nconst FilesGrid: React.FC<FilesGridProps> = ({\n files = [],\n activityId,\n isCompact,\n onRemove,\n projectName,\n isDownloadable,\n onExpand,\n onAnnotationClick,\n ...props\n}) => {\n if (!files.length) return null\n\n const handleExpand = useCallback(\n (index: number) => {\n const filteredFiles = files.filter((file) => isFilePreviewable(file.mime, file.ext))\n const updatedIndex = filteredFiles.findIndex((file) => file.id === files[index].id)\n onExpand?.({ files: filteredFiles, index: updatedIndex, activityId: activityId || '' })\n },\n [onExpand],\n )\n\n return (\n <Styled.Grid className={clsx({ compact: isCompact })} {...props}>\n {files.map((file, index) => (\n <FileUploadCard\n key={index}\n id={file.id || file.name}\n name={file.name}\n mime={file.mime || file.type}\n size={file.size}\n src={\n file.isUnsavedAnnotation\n ? file.thumbnail\n : `/api/projects/${projectName}/files/${file.id}`\n }\n isUnsavedAnnotation={file.isUnsavedAnnotation}\n savedAnnotation={file.annotation}\n progress={file.progress}\n onRemove={\n onRemove ? () => onRemove(file.id, file.name, file.isUnsavedAnnotation) : undefined\n }\n isCompact={isCompact}\n isDownloadable={isDownloadable}\n onExpand={() => handleExpand(index)}\n onJumpTo={() => onAnnotationClick?.(file)}\n />\n ))}\n </Styled.Grid>\n )\n}\n\nexport default FilesGrid\n"],"names":["Styled.Grid","jsx"],"mappings":";;;;;;AAkBA,MAAM,YAAsC,CAAC;AAAA,EAC3C,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACA,MAAA,CAAC,MAAM,OAAe,QAAA;AAE1B,QAAM,eAAe;AAAA,IACnB,CAAC,UAAkB;AACX,YAAA,gBAAgB,MAAM,OAAO,CAAC,SAAS,kBAAkB,KAAK,MAAM,KAAK,GAAG,CAAC;AAC7E,YAAA,eAAe,cAAc,UAAU,CAAC,SAAS,KAAK,OAAO,MAAM,KAAK,EAAE,EAAE;AACvE,2CAAA,EAAE,OAAO,eAAe,OAAO,cAAc,YAAY,cAAc;IACpF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,+CACGA,MAAA,EAAY,WAAW,KAAK,EAAE,SAAS,UAAU,CAAC,GAAI,GAAG,OACvD,gBAAM,IAAI,CAAC,MAAM,UAChBC,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,IAAI,KAAK,MAAM,KAAK;AAAA,MACpB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,MAAM,KAAK;AAAA,MACX,KACE,KAAK,sBACD,KAAK,YACL,iBAAiB,WAAW,UAAU,KAAK,EAAE;AAAA,MAEnD,qBAAqB,KAAK;AAAA,MAC1B,iBAAiB,KAAK;AAAA,MACtB,UAAU,KAAK;AAAA,MACf,UACE,WAAW,MAAM,SAAS,KAAK,IAAI,KAAK,MAAM,KAAK,mBAAmB,IAAI;AAAA,MAE5E;AAAA,MACA;AAAA,MACA,UAAU,MAAM,aAAa,KAAK;AAAA,MAClC,UAAU,MAAM,uDAAoB;AAAA,IAAI;AAAA,IAnBnC;AAAA,EAqBR,CAAA,GACH;AAEJ;"}
@@ -22,6 +22,14 @@ require("../../CommentInput/CommentInput.cjs.js");
22
22
  require("../../ReactionContainer/Reactions.styled.cjs.js");
23
23
  require("../../FilesGrid/FilesGrid.styled.cjs.js");
24
24
  require("../../FileUploadCard/FileUploadCard.styled.cjs.js");
25
+ require("../../../../../context/RemoteModulesContext.cjs.js");
26
+ require("../../../../../context/DetailsPanelContext.cjs.js");
27
+ require("../../../../../context/ThumbnailUploaderContext.cjs.js");
28
+ require("../../../../../context/SettingsPanelContext.cjs.js");
29
+ require("../../../../../context/pip/PiPProvider.cjs.js");
30
+ require("../../../../../context/pip/PiPWrapper.cjs.js");
31
+ require("../../../../../context/AddonProjectContext.cjs.js");
32
+ require("../../../../../context/AddonContext.cjs.js");
25
33
  require("../../CommentInput/quillToMarkdown.cjs.js");
26
34
  require("../../ActivityComment/ActivityComment.styled.cjs.js");
27
35
  require("../../ActivityCheckbox/ActivityCheckbox.styled.cjs.js");
@@ -34,14 +42,6 @@ require("../../ActivityStatusChange/ActivityStatusChange.styled.cjs.js");
34
42
  require("../../ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");
35
43
  require("../../ActivityVersions/ActivityVersions.styled.cjs.js");
36
44
  require("../../ActivityGroup/ActivityGroup.styled.cjs.js");
37
- require("../../../../../context/RemoteModulesContext.cjs.js");
38
- require("../../../../../context/DetailsPanelContext.cjs.js");
39
- require("../../../../../context/ThumbnailUploaderContext.cjs.js");
40
- require("../../../../../context/SettingsPanelContext.cjs.js");
41
- require("../../../../../context/pip/PiPProvider.cjs.js");
42
- require("../../../../../context/pip/PiPWrapper.cjs.js");
43
- require("../../../../../context/AddonProjectContext.cjs.js");
44
- require("../../../../../context/AddonContext.cjs.js");
45
45
  require("../../../Feed.styled.cjs.js");
46
46
  require("date-fns");
47
47
  require("../../../../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");
@@ -21,6 +21,14 @@ import "../../CommentInput/CommentInput.es.js";
21
21
  import "../../ReactionContainer/Reactions.styled.es.js";
22
22
  import "../../FilesGrid/FilesGrid.styled.es.js";
23
23
  import "../../FileUploadCard/FileUploadCard.styled.es.js";
24
+ import "../../../../../context/RemoteModulesContext.es.js";
25
+ import "../../../../../context/DetailsPanelContext.es.js";
26
+ import "../../../../../context/ThumbnailUploaderContext.es.js";
27
+ import "../../../../../context/SettingsPanelContext.es.js";
28
+ import "../../../../../context/pip/PiPProvider.es.js";
29
+ import "../../../../../context/pip/PiPWrapper.es.js";
30
+ import "../../../../../context/AddonProjectContext.es.js";
31
+ import "../../../../../context/AddonContext.es.js";
24
32
  import "../../CommentInput/quillToMarkdown.es.js";
25
33
  import "../../ActivityComment/ActivityComment.styled.es.js";
26
34
  import "../../ActivityCheckbox/ActivityCheckbox.styled.es.js";
@@ -33,14 +41,6 @@ import "../../ActivityStatusChange/ActivityStatusChange.styled.es.js";
33
41
  import "../../ActivityAssigneeChange/ActivityAssigneeChange.styled.es.js";
34
42
  import "../../ActivityVersions/ActivityVersions.styled.es.js";
35
43
  import "../../ActivityGroup/ActivityGroup.styled.es.js";
36
- import "../../../../../context/RemoteModulesContext.es.js";
37
- import "../../../../../context/DetailsPanelContext.es.js";
38
- import "../../../../../context/ThumbnailUploaderContext.es.js";
39
- import "../../../../../context/SettingsPanelContext.es.js";
40
- import "../../../../../context/pip/PiPProvider.es.js";
41
- import "../../../../../context/pip/PiPWrapper.es.js";
42
- import "../../../../../context/AddonProjectContext.es.js";
43
- import "../../../../../context/AddonContext.es.js";
44
44
  import "../../../Feed.styled.es.js";
45
45
  import "date-fns";
46
46
  import "../../../../../components/EmptyPlaceholder/EmptyPlaceholder.es.js";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ const mergeAnnotationAttachments = (activities) => {
3
+ return activities.map((activity) => {
4
+ var _a;
5
+ if (activity.activityType !== "comment" || !((_a = activity.activityData) == null ? void 0 : _a.annotations)) return activity;
6
+ const files = activity.files.map((file) => {
7
+ const annotation = activity.activityData.annotations.find(
8
+ (annotation2) => annotation2.composite === file.id || annotation2.transparent === file.id
9
+ );
10
+ if (annotation.transparent === file.id) return null;
11
+ return { ...file, annotation };
12
+ }).filter(Boolean);
13
+ const newActivity = { ...activity, files };
14
+ return newActivity;
15
+ });
16
+ };
17
+ module.exports = mergeAnnotationAttachments;
18
+ //# sourceMappingURL=mergeAnnotationAttachments.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeAnnotationAttachments.cjs.js","sources":["../../../../../../src/containers/Feed/helpers/mergeAnnotationAttachments.ts"],"sourcesContent":["import { SavedAnnotationMetadata } from '../../index'\n\nexport default (activities: any[]) => {\n return activities.map((activity) => {\n if (activity.activityType !== 'comment' || !activity.activityData?.annotations) return activity\n\n const files = activity.files\n .map((file: any) => {\n // look for an annotation that is using this file\n const annotation = activity.activityData.annotations.find(\n (annotation: SavedAnnotationMetadata) =>\n annotation.composite === file.id || annotation.transparent === file.id,\n )\n\n // if the file is the transparent version of the annotation, ignore it\n if (annotation.transparent === file.id) return null\n\n return { ...file, annotation }\n })\n .filter(Boolean)\n\n const newActivity = { ...activity, files }\n return newActivity\n })\n}\n"],"names":["annotation"],"mappings":";AAEA,MAAe,6BAAA,CAAC,eAAsB;AAC7B,SAAA,WAAW,IAAI,CAAC,aAAa;;AAClC,QAAI,SAAS,iBAAiB,aAAa,GAAC,cAAS,iBAAT,mBAAuB,aAAoB,QAAA;AAEvF,UAAM,QAAQ,SAAS,MACpB,IAAI,CAAC,SAAc;AAEZ,YAAA,aAAa,SAAS,aAAa,YAAY;AAAA,QACnD,CAACA,gBACCA,YAAW,cAAc,KAAK,MAAMA,YAAW,gBAAgB,KAAK;AAAA,MACxE;AAGA,UAAI,WAAW,gBAAgB,KAAK,GAAW,QAAA;AAExC,aAAA,EAAE,GAAG,MAAM,WAAW;AAAA,IAAA,CAC9B,EACA,OAAO,OAAO;AAEjB,UAAM,cAAc,EAAE,GAAG,UAAU,MAAM;AAClC,WAAA;AAAA,EAAA,CACR;AACH;;"}
@@ -0,0 +1,19 @@
1
+ const mergeAnnotationAttachments = (activities) => {
2
+ return activities.map((activity) => {
3
+ var _a;
4
+ if (activity.activityType !== "comment" || !((_a = activity.activityData) == null ? void 0 : _a.annotations)) return activity;
5
+ const files = activity.files.map((file) => {
6
+ const annotation = activity.activityData.annotations.find(
7
+ (annotation2) => annotation2.composite === file.id || annotation2.transparent === file.id
8
+ );
9
+ if (annotation.transparent === file.id) return null;
10
+ return { ...file, annotation };
11
+ }).filter(Boolean);
12
+ const newActivity = { ...activity, files };
13
+ return newActivity;
14
+ });
15
+ };
16
+ export {
17
+ mergeAnnotationAttachments as default
18
+ };
19
+ //# sourceMappingURL=mergeAnnotationAttachments.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeAnnotationAttachments.es.js","sources":["../../../../../../src/containers/Feed/helpers/mergeAnnotationAttachments.ts"],"sourcesContent":["import { SavedAnnotationMetadata } from '../../index'\n\nexport default (activities: any[]) => {\n return activities.map((activity) => {\n if (activity.activityType !== 'comment' || !activity.activityData?.annotations) return activity\n\n const files = activity.files\n .map((file: any) => {\n // look for an annotation that is using this file\n const annotation = activity.activityData.annotations.find(\n (annotation: SavedAnnotationMetadata) =>\n annotation.composite === file.id || annotation.transparent === file.id,\n )\n\n // if the file is the transparent version of the annotation, ignore it\n if (annotation.transparent === file.id) return null\n\n return { ...file, annotation }\n })\n .filter(Boolean)\n\n const newActivity = { ...activity, files }\n return newActivity\n })\n}\n"],"names":["annotation"],"mappings":"AAEA,MAAe,6BAAA,CAAC,eAAsB;AAC7B,SAAA,WAAW,IAAI,CAAC,aAAa;AADtC;AAEI,QAAI,SAAS,iBAAiB,aAAa,GAAC,cAAS,iBAAT,mBAAuB,aAAoB,QAAA;AAEvF,UAAM,QAAQ,SAAS,MACpB,IAAI,CAAC,SAAc;AAEZ,YAAA,aAAa,SAAS,aAAa,YAAY;AAAA,QACnD,CAACA,gBACCA,YAAW,cAAc,KAAK,MAAMA,YAAW,gBAAgB,KAAK;AAAA,MACxE;AAGA,UAAI,WAAW,gBAAgB,KAAK,GAAW,QAAA;AAExC,aAAA,EAAE,GAAG,MAAM,WAAW;AAAA,IAAA,CAC9B,EACA,OAAO,OAAO;AAEjB,UAAM,cAAc,EAAE,GAAG,UAAU,MAAM;AAClC,WAAA;AAAA,EAAA,CACR;AACH;"}
@@ -50,7 +50,7 @@ const useCommentMutations = ({
50
50
  return patch;
51
51
  };
52
52
  const getActivityId = () => v1().replace(/-/g, "");
53
- const submitComment = async (value, files = []) => {
53
+ const submitComment = async (value, files = [], data = {}) => {
54
54
  const promises = entities.map(({ id: entityId, subTitle }) => {
55
55
  const newId = getActivityId();
56
56
  const fileIds = files.map((file) => file.id);
@@ -58,9 +58,18 @@ const useCommentMutations = ({
58
58
  body: value,
59
59
  activityType: "comment",
60
60
  id: newId,
61
- files: fileIds
61
+ files: fileIds,
62
+ data
62
63
  };
63
- const patch = createPatch({ entityId, newId, subTitle, value, files });
64
+ const optimisticFiles = files.filter(
65
+ ({ id }) => {
66
+ var _a;
67
+ return !((_a = data.annotations) == null ? void 0 : _a.some(
68
+ (annotation) => annotation.transparent === id
69
+ ));
70
+ }
71
+ );
72
+ const patch = createPatch({ entityId, newId, subTitle, value, files: optimisticFiles });
64
73
  const argsForCachingMatching = { entityIds, activityTypes };
65
74
  return createEntityActivity({
66
75
  projectName,
@@ -1 +1 @@
1
- {"version":3,"file":"useCommentMutations.cjs.js","sources":["../../../../../../src/containers/Feed/hooks/useCommentMutations.ts"],"sourcesContent":["import { v1 as uuid1 } from 'uuid'\nimport { formatISO } from 'date-fns'\nimport { toast } from 'react-toastify'\nimport { useFeedContext } from '../context/FeedContext'\n\n// Type definitions\ninterface Entity {\n id: string\n subTitle?: string\n}\n\ninterface File {\n id: string\n [key: string]: any\n}\n\nexport interface Activity {\n activityId: string\n entityId: string\n body: string\n files: File[]\n [key: string]: any\n}\n\ninterface CommentPatch {\n body: string\n activityType: string\n activityId: string\n entityId: string\n referenceType: string\n authorName: string\n authorFullName?: string\n createdAt: string\n files: File[]\n reactions: any[]\n origin: {\n id: string\n type: string\n name?: string\n }\n author: {\n active: boolean\n deleted: boolean\n }\n}\n\ninterface CommentMutationsProps {\n projectName: string\n entityType: string\n entities: Entity[]\n filter: any\n}\n\ninterface CommentPayload {\n entityId: string\n newId: string\n subTitle?: string\n value: string\n files?: File[]\n}\n\n// does the body have a checklist anywhere in it\n// * [ ] or * [x]\nexport const bodyHasChecklist = (body: string): boolean => {\n return body.includes('* [ ]') || body.includes('* [x]')\n}\n\nconst useCommentMutations = ({\n projectName,\n entityType,\n entities = [],\n filter,\n}: CommentMutationsProps) => {\n const {\n createEntityActivity,\n updateActivity,\n deleteActivity,\n isUpdatingActivity,\n userName,\n userFullName,\n activityTypes,\n } = useFeedContext()\n const entityIds = entities.map((entity) => entity.id)\n\n const createPatch = ({\n entityId,\n newId,\n subTitle,\n value,\n files = [],\n }: CommentPayload): CommentPatch => {\n const patch: CommentPatch = {\n body: value,\n activityType: 'comment',\n activityId: newId,\n entityId: entityId,\n referenceType: 'origin',\n authorName: userName,\n authorFullName: userFullName,\n createdAt: formatISO(new Date()),\n files: files,\n reactions: [],\n origin: {\n id: '8090c2dafcc811eeaf820242c0a80002',\n type: entityType,\n name: subTitle,\n },\n author: {\n active: true,\n deleted: false,\n },\n }\n\n return patch\n }\n\n const getActivityId = (): string => uuid1().replace(/-/g, '')\n\n const submitComment = async (value: string, files: File[] = []): Promise<void> => {\n // map over all the entities and create a new comment for each\n let patchId: string | null = null\n const promises = entities.map(({ id: entityId, subTitle }) => {\n const newId = getActivityId()\n if (!patchId) patchId = newId\n const fileIds = files.map((file) => file.id)\n\n const newComment = {\n body: value,\n activityType: 'comment',\n id: newId,\n files: fileIds,\n }\n\n // create a new patch for optimistic update\n const patch = createPatch({ entityId, newId, subTitle, value, files })\n\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityIds, activityTypes }\n\n return createEntityActivity({\n projectName,\n entityType,\n entityId,\n data: newComment,\n patch,\n filter,\n ...argsForCachingMatching,\n })\n })\n\n await Promise.all(promises)\n }\n\n const updateComment = async (\n activity: Activity,\n value: string,\n files: File[] = [],\n ): Promise<void> => {\n const fileIds = files.map((file) => file.id)\n\n const updatedActivity = {\n body: value,\n files: fileIds,\n }\n\n const patch = {\n ...activity,\n ...updatedActivity,\n files,\n }\n\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityType, entityIds, activityTypes }\n\n try {\n await updateActivity({\n projectName,\n data: updatedActivity,\n activityId: activity.activityId,\n entityId: activity.entityId,\n patch,\n filter,\n ...argsForCachingMatching,\n })\n } catch (error: any) {\n console.error(error)\n toast.error(error?.data?.detail)\n // so higher level can detect the error\n throw error\n }\n }\n\n const deleteComment = async (id: string, entityId: string, refs: any[] = []): Promise<void> => {\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityType, entityIds, activityTypes }\n\n if (!id) return\n\n try {\n await deleteActivity({\n projectName,\n activityId: id,\n entityId,\n filter,\n patch: { activityId: id },\n refs,\n ...argsForCachingMatching,\n })\n } catch (error) {\n // error is handled in the mutation\n }\n }\n\n return {\n submitComment,\n updateComment,\n deleteComment,\n isSaving: isUpdatingActivity,\n }\n}\n\nexport default useCommentMutations\n"],"names":["useFeedContext","formatISO","uuid1","toast"],"mappings":"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"}
1
+ {"version":3,"file":"useCommentMutations.cjs.js","sources":["../../../../../../src/containers/Feed/hooks/useCommentMutations.ts"],"sourcesContent":["import { v1 as uuid1 } from 'uuid'\nimport { formatISO } from 'date-fns'\nimport { toast } from 'react-toastify'\nimport { useFeedContext } from '../context/FeedContext'\nimport { SavedAnnotationMetadata } from '..'\n\n// Type definitions\ninterface Entity {\n id: string\n subTitle?: string\n}\n\ninterface File {\n id: string\n [key: string]: any\n}\n\nexport interface Activity {\n activityId: string\n entityId: string\n body: string\n files: File[]\n [key: string]: any\n}\n\ninterface CommentPatch {\n body: string\n activityType: string\n activityId: string\n entityId: string\n referenceType: string\n authorName: string\n authorFullName?: string\n createdAt: string\n files: File[]\n reactions: any[]\n origin: {\n id: string\n type: string\n name?: string\n }\n author: {\n active: boolean\n deleted: boolean\n }\n}\n\ninterface CommentMutationsProps {\n projectName: string\n entityType: string\n entities: Entity[]\n filter: any\n}\n\ninterface CommentPayload {\n entityId: string\n newId: string\n subTitle?: string\n value: string\n files?: File[]\n}\n\n// does the body have a checklist anywhere in it\n// * [ ] or * [x]\nexport const bodyHasChecklist = (body: string): boolean => {\n return body.includes('* [ ]') || body.includes('* [x]')\n}\n\nconst useCommentMutations = ({\n projectName,\n entityType,\n entities = [],\n filter,\n}: CommentMutationsProps) => {\n const {\n createEntityActivity,\n updateActivity,\n deleteActivity,\n isUpdatingActivity,\n userName,\n userFullName,\n activityTypes,\n } = useFeedContext()\n const entityIds = entities.map((entity) => entity.id)\n\n const createPatch = ({\n entityId,\n newId,\n subTitle,\n value,\n files = [],\n }: CommentPayload): CommentPatch => {\n const patch: CommentPatch = {\n body: value,\n activityType: 'comment',\n activityId: newId,\n entityId: entityId,\n referenceType: 'origin',\n authorName: userName,\n authorFullName: userFullName,\n createdAt: formatISO(new Date()),\n files: files,\n reactions: [],\n origin: {\n id: '8090c2dafcc811eeaf820242c0a80002',\n type: entityType,\n name: subTitle,\n },\n author: {\n active: true,\n deleted: false,\n },\n }\n\n return patch\n }\n\n const getActivityId = (): string => uuid1().replace(/-/g, '')\n\n const submitComment = async (\n value: string,\n files: File[] = [],\n data: any = {},\n ): Promise<void> => {\n // map over all the entities and create a new comment for each\n let patchId: string | null = null\n const promises = entities.map(({ id: entityId, subTitle }) => {\n const newId = getActivityId()\n if (!patchId) patchId = newId\n const fileIds = files.map((file) => file.id)\n\n const newComment = {\n body: value,\n activityType: 'comment',\n id: newId,\n files: fileIds,\n data,\n }\n\n // filter out files which are transparent versions of an annotation\n const optimisticFiles = files.filter(\n ({ id }) =>\n !data.annotations?.some(\n (annotation: SavedAnnotationMetadata) => annotation.transparent === id,\n ),\n )\n\n // create a new patch for optimistic update\n const patch = createPatch({ entityId, newId, subTitle, value, files: optimisticFiles })\n\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityIds, activityTypes }\n\n return createEntityActivity({\n projectName,\n entityType,\n entityId,\n data: newComment,\n patch,\n filter,\n ...argsForCachingMatching,\n })\n })\n\n await Promise.all(promises)\n }\n\n const updateComment = async (\n activity: Activity,\n value: string,\n files: File[] = [],\n ): Promise<void> => {\n const fileIds = files.map((file) => file.id)\n\n const updatedActivity = {\n body: value,\n files: fileIds,\n }\n\n const patch = {\n ...activity,\n ...updatedActivity,\n files,\n }\n\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityType, entityIds, activityTypes }\n\n try {\n await updateActivity({\n projectName,\n data: updatedActivity,\n activityId: activity.activityId,\n entityId: activity.entityId,\n patch,\n filter,\n ...argsForCachingMatching,\n })\n } catch (error: any) {\n console.error(error)\n toast.error(error?.data?.detail)\n // so higher level can detect the error\n throw error\n }\n }\n\n const deleteComment = async (id: string, entityId: string, refs: any[] = []): Promise<void> => {\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityType, entityIds, activityTypes }\n\n if (!id) return\n\n try {\n await deleteActivity({\n projectName,\n activityId: id,\n entityId,\n filter,\n patch: { activityId: id },\n refs,\n ...argsForCachingMatching,\n })\n } catch (error) {\n // error is handled in the mutation\n }\n }\n\n return {\n submitComment,\n updateComment,\n deleteComment,\n isSaving: isUpdatingActivity,\n }\n}\n\nexport default useCommentMutations\n"],"names":["useFeedContext","formatISO","uuid1","toast"],"mappings":"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"}
@@ -49,7 +49,7 @@ const useCommentMutations = ({
49
49
  return patch;
50
50
  };
51
51
  const getActivityId = () => v1().replace(/-/g, "");
52
- const submitComment = async (value, files = []) => {
52
+ const submitComment = async (value, files = [], data = {}) => {
53
53
  const promises = entities.map(({ id: entityId, subTitle }) => {
54
54
  const newId = getActivityId();
55
55
  const fileIds = files.map((file) => file.id);
@@ -57,9 +57,18 @@ const useCommentMutations = ({
57
57
  body: value,
58
58
  activityType: "comment",
59
59
  id: newId,
60
- files: fileIds
60
+ files: fileIds,
61
+ data
61
62
  };
62
- const patch = createPatch({ entityId, newId, subTitle, value, files });
63
+ const optimisticFiles = files.filter(
64
+ ({ id }) => {
65
+ var _a;
66
+ return !((_a = data.annotations) == null ? void 0 : _a.some(
67
+ (annotation) => annotation.transparent === id
68
+ ));
69
+ }
70
+ );
71
+ const patch = createPatch({ entityId, newId, subTitle, value, files: optimisticFiles });
63
72
  const argsForCachingMatching = { entityIds, activityTypes };
64
73
  return createEntityActivity({
65
74
  projectName,
@@ -1 +1 @@
1
- {"version":3,"file":"useCommentMutations.es.js","sources":["../../../../../../src/containers/Feed/hooks/useCommentMutations.ts"],"sourcesContent":["import { v1 as uuid1 } from 'uuid'\nimport { formatISO } from 'date-fns'\nimport { toast } from 'react-toastify'\nimport { useFeedContext } from '../context/FeedContext'\n\n// Type definitions\ninterface Entity {\n id: string\n subTitle?: string\n}\n\ninterface File {\n id: string\n [key: string]: any\n}\n\nexport interface Activity {\n activityId: string\n entityId: string\n body: string\n files: File[]\n [key: string]: any\n}\n\ninterface CommentPatch {\n body: string\n activityType: string\n activityId: string\n entityId: string\n referenceType: string\n authorName: string\n authorFullName?: string\n createdAt: string\n files: File[]\n reactions: any[]\n origin: {\n id: string\n type: string\n name?: string\n }\n author: {\n active: boolean\n deleted: boolean\n }\n}\n\ninterface CommentMutationsProps {\n projectName: string\n entityType: string\n entities: Entity[]\n filter: any\n}\n\ninterface CommentPayload {\n entityId: string\n newId: string\n subTitle?: string\n value: string\n files?: File[]\n}\n\n// does the body have a checklist anywhere in it\n// * [ ] or * [x]\nexport const bodyHasChecklist = (body: string): boolean => {\n return body.includes('* [ ]') || body.includes('* [x]')\n}\n\nconst useCommentMutations = ({\n projectName,\n entityType,\n entities = [],\n filter,\n}: CommentMutationsProps) => {\n const {\n createEntityActivity,\n updateActivity,\n deleteActivity,\n isUpdatingActivity,\n userName,\n userFullName,\n activityTypes,\n } = useFeedContext()\n const entityIds = entities.map((entity) => entity.id)\n\n const createPatch = ({\n entityId,\n newId,\n subTitle,\n value,\n files = [],\n }: CommentPayload): CommentPatch => {\n const patch: CommentPatch = {\n body: value,\n activityType: 'comment',\n activityId: newId,\n entityId: entityId,\n referenceType: 'origin',\n authorName: userName,\n authorFullName: userFullName,\n createdAt: formatISO(new Date()),\n files: files,\n reactions: [],\n origin: {\n id: '8090c2dafcc811eeaf820242c0a80002',\n type: entityType,\n name: subTitle,\n },\n author: {\n active: true,\n deleted: false,\n },\n }\n\n return patch\n }\n\n const getActivityId = (): string => uuid1().replace(/-/g, '')\n\n const submitComment = async (value: string, files: File[] = []): Promise<void> => {\n // map over all the entities and create a new comment for each\n let patchId: string | null = null\n const promises = entities.map(({ id: entityId, subTitle }) => {\n const newId = getActivityId()\n if (!patchId) patchId = newId\n const fileIds = files.map((file) => file.id)\n\n const newComment = {\n body: value,\n activityType: 'comment',\n id: newId,\n files: fileIds,\n }\n\n // create a new patch for optimistic update\n const patch = createPatch({ entityId, newId, subTitle, value, files })\n\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityIds, activityTypes }\n\n return createEntityActivity({\n projectName,\n entityType,\n entityId,\n data: newComment,\n patch,\n filter,\n ...argsForCachingMatching,\n })\n })\n\n await Promise.all(promises)\n }\n\n const updateComment = async (\n activity: Activity,\n value: string,\n files: File[] = [],\n ): Promise<void> => {\n const fileIds = files.map((file) => file.id)\n\n const updatedActivity = {\n body: value,\n files: fileIds,\n }\n\n const patch = {\n ...activity,\n ...updatedActivity,\n files,\n }\n\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityType, entityIds, activityTypes }\n\n try {\n await updateActivity({\n projectName,\n data: updatedActivity,\n activityId: activity.activityId,\n entityId: activity.entityId,\n patch,\n filter,\n ...argsForCachingMatching,\n })\n } catch (error: any) {\n console.error(error)\n toast.error(error?.data?.detail)\n // so higher level can detect the error\n throw error\n }\n }\n\n const deleteComment = async (id: string, entityId: string, refs: any[] = []): Promise<void> => {\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityType, entityIds, activityTypes }\n\n if (!id) return\n\n try {\n await deleteActivity({\n projectName,\n activityId: id,\n entityId,\n filter,\n patch: { activityId: id },\n refs,\n ...argsForCachingMatching,\n })\n } catch (error) {\n // error is handled in the mutation\n }\n }\n\n return {\n submitComment,\n updateComment,\n deleteComment,\n isSaving: isUpdatingActivity,\n }\n}\n\nexport default useCommentMutations\n"],"names":["uuid1"],"mappings":"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"}
1
+ {"version":3,"file":"useCommentMutations.es.js","sources":["../../../../../../src/containers/Feed/hooks/useCommentMutations.ts"],"sourcesContent":["import { v1 as uuid1 } from 'uuid'\nimport { formatISO } from 'date-fns'\nimport { toast } from 'react-toastify'\nimport { useFeedContext } from '../context/FeedContext'\nimport { SavedAnnotationMetadata } from '..'\n\n// Type definitions\ninterface Entity {\n id: string\n subTitle?: string\n}\n\ninterface File {\n id: string\n [key: string]: any\n}\n\nexport interface Activity {\n activityId: string\n entityId: string\n body: string\n files: File[]\n [key: string]: any\n}\n\ninterface CommentPatch {\n body: string\n activityType: string\n activityId: string\n entityId: string\n referenceType: string\n authorName: string\n authorFullName?: string\n createdAt: string\n files: File[]\n reactions: any[]\n origin: {\n id: string\n type: string\n name?: string\n }\n author: {\n active: boolean\n deleted: boolean\n }\n}\n\ninterface CommentMutationsProps {\n projectName: string\n entityType: string\n entities: Entity[]\n filter: any\n}\n\ninterface CommentPayload {\n entityId: string\n newId: string\n subTitle?: string\n value: string\n files?: File[]\n}\n\n// does the body have a checklist anywhere in it\n// * [ ] or * [x]\nexport const bodyHasChecklist = (body: string): boolean => {\n return body.includes('* [ ]') || body.includes('* [x]')\n}\n\nconst useCommentMutations = ({\n projectName,\n entityType,\n entities = [],\n filter,\n}: CommentMutationsProps) => {\n const {\n createEntityActivity,\n updateActivity,\n deleteActivity,\n isUpdatingActivity,\n userName,\n userFullName,\n activityTypes,\n } = useFeedContext()\n const entityIds = entities.map((entity) => entity.id)\n\n const createPatch = ({\n entityId,\n newId,\n subTitle,\n value,\n files = [],\n }: CommentPayload): CommentPatch => {\n const patch: CommentPatch = {\n body: value,\n activityType: 'comment',\n activityId: newId,\n entityId: entityId,\n referenceType: 'origin',\n authorName: userName,\n authorFullName: userFullName,\n createdAt: formatISO(new Date()),\n files: files,\n reactions: [],\n origin: {\n id: '8090c2dafcc811eeaf820242c0a80002',\n type: entityType,\n name: subTitle,\n },\n author: {\n active: true,\n deleted: false,\n },\n }\n\n return patch\n }\n\n const getActivityId = (): string => uuid1().replace(/-/g, '')\n\n const submitComment = async (\n value: string,\n files: File[] = [],\n data: any = {},\n ): Promise<void> => {\n // map over all the entities and create a new comment for each\n let patchId: string | null = null\n const promises = entities.map(({ id: entityId, subTitle }) => {\n const newId = getActivityId()\n if (!patchId) patchId = newId\n const fileIds = files.map((file) => file.id)\n\n const newComment = {\n body: value,\n activityType: 'comment',\n id: newId,\n files: fileIds,\n data,\n }\n\n // filter out files which are transparent versions of an annotation\n const optimisticFiles = files.filter(\n ({ id }) =>\n !data.annotations?.some(\n (annotation: SavedAnnotationMetadata) => annotation.transparent === id,\n ),\n )\n\n // create a new patch for optimistic update\n const patch = createPatch({ entityId, newId, subTitle, value, files: optimisticFiles })\n\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityIds, activityTypes }\n\n return createEntityActivity({\n projectName,\n entityType,\n entityId,\n data: newComment,\n patch,\n filter,\n ...argsForCachingMatching,\n })\n })\n\n await Promise.all(promises)\n }\n\n const updateComment = async (\n activity: Activity,\n value: string,\n files: File[] = [],\n ): Promise<void> => {\n const fileIds = files.map((file) => file.id)\n\n const updatedActivity = {\n body: value,\n files: fileIds,\n }\n\n const patch = {\n ...activity,\n ...updatedActivity,\n files,\n }\n\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityType, entityIds, activityTypes }\n\n try {\n await updateActivity({\n projectName,\n data: updatedActivity,\n activityId: activity.activityId,\n entityId: activity.entityId,\n patch,\n filter,\n ...argsForCachingMatching,\n })\n } catch (error: any) {\n console.error(error)\n toast.error(error?.data?.detail)\n // so higher level can detect the error\n throw error\n }\n }\n\n const deleteComment = async (id: string, entityId: string, refs: any[] = []): Promise<void> => {\n // we only need these args to update the cache of the original query\n const argsForCachingMatching = { entityType, entityIds, activityTypes }\n\n if (!id) return\n\n try {\n await deleteActivity({\n projectName,\n activityId: id,\n entityId,\n filter,\n patch: { activityId: id },\n refs,\n ...argsForCachingMatching,\n })\n } catch (error) {\n // error is handled in the mutation\n }\n }\n\n return {\n submitComment,\n updateComment,\n deleteComment,\n isSaving: isUpdatingActivity,\n }\n}\n\nexport default useCommentMutations\n"],"names":["uuid1"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTransformActivities.cjs.js","sources":["../../../../../../src/containers/Feed/hooks/useTransformActivities.ts"],"sourcesContent":["// @ts-nocheck\n\nimport { compareAsc, isValid } from 'date-fns'\nimport { useMemo } from 'react'\nimport groupActivityVersions from '../helpers/groupActivityVersions'\nimport groupMinorActivities, { ActivityUser } from '../helpers/groupMinorActivities'\nimport mergeSimilarActivities from '../helpers/mergeSimilarActivities'\n\n// Define the types of activities that are considered minor\nconst minorActivityTypes = ['status.change', 'assignee.add', 'assignee.remove']\n\nconst getStatusActivityIcon = (activities = [], projectInfo = {}) => {\n return activities.map((activity) => {\n const newActivity = { ...activity, origin: { ...activity.origin } }\n\n // find status icon and data for status change activities\n if (newActivity.activityType === 'status.change') {\n if (!projectInfo) return newActivity\n const oldStatusName = newActivity.activityData?.oldValue\n const newStatusName = newActivity.activityData?.newValue\n\n const oldStatus = projectInfo.statuses?.find((status) => status.name === oldStatusName)\n const newStatus = projectInfo.statuses?.find((status) => status.name === newStatusName)\n\n newActivity.oldStatus = { ...oldStatus, name: oldStatusName }\n newActivity.newStatus = { ...newStatus, name: newStatusName }\n }\n\n return newActivity\n })\n}\n\nconst filterOutRelations = (activities = [], entityTypes = [], entityType) => {\n return !entityTypes.includes(entityType)\n ? activities\n : activities.filter((activity) => activity.referenceType !== 'relation')\n}\n\nconst useTransformActivities = (\n activities = [],\n users: ActivityUser[] = [],\n projectInfo = {},\n entityType,\n userName,\n) => {\n // 1. add status icons and data for status change activities\n const activitiesWithIcons = useMemo(\n () => getStatusActivityIcon(activities, projectInfo),\n [activities],\n )\n\n // add any extra meta data to the activities\n const activitiesWithMeta = useMemo(() => {\n return activitiesWithIcons.map((activity) => {\n const newActivity = { ...activity, isOwner: userName === activity.authorName }\n return newActivity\n })\n }, [activitiesWithIcons, userName])\n\n // 2. versions should not have relations shown (comments posted on parent task)\n const activitiesWithoutRelations = useMemo(\n () => filterOutRelations(activitiesWithMeta, ['version'], entityType),\n [activitiesWithMeta, projectInfo],\n )\n\n // 3. sort createdAt oldest first (because we are using flex: column-reverse)\n const reversedActivitiesData = useMemo(() => {\n const sortedActivities = [...activitiesWithoutRelations].sort((a, b) => {\n const dateA = new Date(a.createdAt)\n const dateB = new Date(b.createdAt)\n const validA = isValid(dateA)\n const validB = isValid(dateB)\n\n if (!validA && !validB) {\n return 0 // Both dates are invalid, keep original order\n } else if (!validA) {\n return 1 // Only dateA is invalid, it comes first\n } else if (!validB) {\n return -1 // Only dateB is invalid, dateA comes first\n }\n\n // If both dates are valid, compare them normally\n return compareAsc(dateB, dateA)\n })\n\n return sortedActivities\n }, [activitiesWithoutRelations])\n\n // 4. for status change activities that are together, merge them into one activity\n const mergedActivitiesData = useMemo(\n () => mergeSimilarActivities(reversedActivitiesData, 'status.change', 'oldStatus'),\n [reversedActivitiesData],\n )\n\n // 5. group minor activities together\n const groupedActivitiesData = useMemo(\n () => groupMinorActivities(mergedActivitiesData, users),\n [mergedActivitiesData, users],\n )\n\n // 6. group version activities together\n const groupedVersionsData = useMemo(\n () => groupActivityVersions(groupedActivitiesData),\n [groupedActivitiesData],\n )\n\n // 7. ensure there are no duplicate activities\n const uniqueActivitiesData = useMemo(() => {\n // Filter out invalid activities and create a Map to ensure uniqueness\n const activityMap = new Map(\n groupedVersionsData\n .filter((activity) => activity && activity.activityId)\n .map((activity) => [activity.activityId, activity]),\n )\n\n // Convert the Map values to an array\n return [...activityMap.values()]\n }, [groupedVersionsData])\n\n return uniqueActivitiesData\n}\n\nexport { minorActivityTypes }\nexport default useTransformActivities\n"],"names":["useMemo","isValid","compareAsc"],"mappings":"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"}
1
+ {"version":3,"file":"useTransformActivities.cjs.js","sources":["../../../../../../src/containers/Feed/hooks/useTransformActivities.ts"],"sourcesContent":["// @ts-nocheck\n\nimport { compareAsc, isValid } from 'date-fns'\nimport { useMemo } from 'react'\nimport groupActivityVersions from '../helpers/groupActivityVersions'\nimport groupMinorActivities, { ActivityUser } from '../helpers/groupMinorActivities'\nimport mergeSimilarActivities from '../helpers/mergeSimilarActivities'\n\n// Define the types of activities that are considered minor\nconst minorActivityTypes = ['status.change', 'assignee.add', 'assignee.remove']\n\nconst getStatusActivityIcon = (activities = [], projectInfo = {}) => {\n return activities.map((activity) => {\n const newActivity = { ...activity, origin: { ...activity.origin } }\n\n // find status icon and data for status change activities\n if (newActivity.activityType === 'status.change') {\n if (!projectInfo) return newActivity\n const oldStatusName = newActivity.activityData?.oldValue\n const newStatusName = newActivity.activityData?.newValue\n\n const oldStatus = projectInfo.statuses?.find((status) => status.name === oldStatusName)\n const newStatus = projectInfo.statuses?.find((status) => status.name === newStatusName)\n\n newActivity.oldStatus = { ...oldStatus, name: oldStatusName }\n newActivity.newStatus = { ...newStatus, name: newStatusName }\n }\n\n return newActivity\n })\n}\n\nconst filterOutRelations = (activities = [], entityTypes = [], entityType) => {\n return !entityTypes.includes(entityType)\n ? activities\n : activities.filter((activity) => activity.referenceType !== 'relation')\n}\n\nconst useTransformActivities = (\n activities = [],\n users: ActivityUser[] = [],\n projectInfo = {},\n entityType,\n userName,\n) => {\n // 1. add status icons and data for status change activities\n const activitiesWithIcons = useMemo(\n () => getStatusActivityIcon(activities, projectInfo),\n [activities],\n )\n\n // 1,5. add any extra meta data to the activities\n const activitiesWithMeta = useMemo(() => {\n return activitiesWithIcons.map((activity) => {\n const newActivity = { ...activity, isOwner: userName === activity.authorName }\n return newActivity\n })\n }, [activitiesWithIcons, userName])\n\n // 2. versions should not have relations shown (comments posted on parent task)\n const activitiesWithoutRelations = useMemo(\n () => filterOutRelations(activitiesWithMeta, ['version'], entityType),\n [activitiesWithMeta, projectInfo],\n )\n\n // 3. sort createdAt oldest first (because we are using flex: column-reverse)\n const reversedActivitiesData = useMemo(() => {\n const sortedActivities = [...activitiesWithoutRelations].sort((a, b) => {\n const dateA = new Date(a.createdAt)\n const dateB = new Date(b.createdAt)\n const validA = isValid(dateA)\n const validB = isValid(dateB)\n\n if (!validA && !validB) {\n return 0 // Both dates are invalid, keep original order\n } else if (!validA) {\n return 1 // Only dateA is invalid, it comes first\n } else if (!validB) {\n return -1 // Only dateB is invalid, dateA comes first\n }\n\n // If both dates are valid, compare them normally\n return compareAsc(dateB, dateA)\n })\n\n return sortedActivities\n }, [activitiesWithoutRelations])\n\n // 4. for status change activities that are together, merge them into one activity\n const mergedActivitiesData = useMemo(\n () => mergeSimilarActivities(reversedActivitiesData, 'status.change', 'oldStatus'),\n [reversedActivitiesData],\n )\n\n // 5. group minor activities together\n const groupedActivitiesData = useMemo(\n () => groupMinorActivities(mergedActivitiesData, users),\n [mergedActivitiesData, users],\n )\n\n // 6. group version activities together\n const groupedVersionsData = useMemo(\n () => groupActivityVersions(groupedActivitiesData),\n [groupedActivitiesData],\n )\n\n // 7. ensure there are no duplicate activities\n const uniqueActivitiesData = useMemo(() => {\n // Filter out invalid activities and create a Map to ensure uniqueness\n const activityMap = new Map(\n groupedVersionsData\n .filter((activity) => activity && activity.activityId)\n .map((activity) => [activity.activityId, activity]),\n )\n\n // Convert the Map values to an array\n return [...activityMap.values()]\n }, [groupedVersionsData])\n\n return uniqueActivitiesData\n}\n\nexport { minorActivityTypes }\nexport default useTransformActivities\n"],"names":["useMemo","isValid","compareAsc"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTransformActivities.es.js","sources":["../../../../../../src/containers/Feed/hooks/useTransformActivities.ts"],"sourcesContent":["// @ts-nocheck\n\nimport { compareAsc, isValid } from 'date-fns'\nimport { useMemo } from 'react'\nimport groupActivityVersions from '../helpers/groupActivityVersions'\nimport groupMinorActivities, { ActivityUser } from '../helpers/groupMinorActivities'\nimport mergeSimilarActivities from '../helpers/mergeSimilarActivities'\n\n// Define the types of activities that are considered minor\nconst minorActivityTypes = ['status.change', 'assignee.add', 'assignee.remove']\n\nconst getStatusActivityIcon = (activities = [], projectInfo = {}) => {\n return activities.map((activity) => {\n const newActivity = { ...activity, origin: { ...activity.origin } }\n\n // find status icon and data for status change activities\n if (newActivity.activityType === 'status.change') {\n if (!projectInfo) return newActivity\n const oldStatusName = newActivity.activityData?.oldValue\n const newStatusName = newActivity.activityData?.newValue\n\n const oldStatus = projectInfo.statuses?.find((status) => status.name === oldStatusName)\n const newStatus = projectInfo.statuses?.find((status) => status.name === newStatusName)\n\n newActivity.oldStatus = { ...oldStatus, name: oldStatusName }\n newActivity.newStatus = { ...newStatus, name: newStatusName }\n }\n\n return newActivity\n })\n}\n\nconst filterOutRelations = (activities = [], entityTypes = [], entityType) => {\n return !entityTypes.includes(entityType)\n ? activities\n : activities.filter((activity) => activity.referenceType !== 'relation')\n}\n\nconst useTransformActivities = (\n activities = [],\n users: ActivityUser[] = [],\n projectInfo = {},\n entityType,\n userName,\n) => {\n // 1. add status icons and data for status change activities\n const activitiesWithIcons = useMemo(\n () => getStatusActivityIcon(activities, projectInfo),\n [activities],\n )\n\n // add any extra meta data to the activities\n const activitiesWithMeta = useMemo(() => {\n return activitiesWithIcons.map((activity) => {\n const newActivity = { ...activity, isOwner: userName === activity.authorName }\n return newActivity\n })\n }, [activitiesWithIcons, userName])\n\n // 2. versions should not have relations shown (comments posted on parent task)\n const activitiesWithoutRelations = useMemo(\n () => filterOutRelations(activitiesWithMeta, ['version'], entityType),\n [activitiesWithMeta, projectInfo],\n )\n\n // 3. sort createdAt oldest first (because we are using flex: column-reverse)\n const reversedActivitiesData = useMemo(() => {\n const sortedActivities = [...activitiesWithoutRelations].sort((a, b) => {\n const dateA = new Date(a.createdAt)\n const dateB = new Date(b.createdAt)\n const validA = isValid(dateA)\n const validB = isValid(dateB)\n\n if (!validA && !validB) {\n return 0 // Both dates are invalid, keep original order\n } else if (!validA) {\n return 1 // Only dateA is invalid, it comes first\n } else if (!validB) {\n return -1 // Only dateB is invalid, dateA comes first\n }\n\n // If both dates are valid, compare them normally\n return compareAsc(dateB, dateA)\n })\n\n return sortedActivities\n }, [activitiesWithoutRelations])\n\n // 4. for status change activities that are together, merge them into one activity\n const mergedActivitiesData = useMemo(\n () => mergeSimilarActivities(reversedActivitiesData, 'status.change', 'oldStatus'),\n [reversedActivitiesData],\n )\n\n // 5. group minor activities together\n const groupedActivitiesData = useMemo(\n () => groupMinorActivities(mergedActivitiesData, users),\n [mergedActivitiesData, users],\n )\n\n // 6. group version activities together\n const groupedVersionsData = useMemo(\n () => groupActivityVersions(groupedActivitiesData),\n [groupedActivitiesData],\n )\n\n // 7. ensure there are no duplicate activities\n const uniqueActivitiesData = useMemo(() => {\n // Filter out invalid activities and create a Map to ensure uniqueness\n const activityMap = new Map(\n groupedVersionsData\n .filter((activity) => activity && activity.activityId)\n .map((activity) => [activity.activityId, activity]),\n )\n\n // Convert the Map values to an array\n return [...activityMap.values()]\n }, [groupedVersionsData])\n\n return uniqueActivitiesData\n}\n\nexport { minorActivityTypes }\nexport default useTransformActivities\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTransformActivities.es.js","sources":["../../../../../../src/containers/Feed/hooks/useTransformActivities.ts"],"sourcesContent":["// @ts-nocheck\n\nimport { compareAsc, isValid } from 'date-fns'\nimport { useMemo } from 'react'\nimport groupActivityVersions from '../helpers/groupActivityVersions'\nimport groupMinorActivities, { ActivityUser } from '../helpers/groupMinorActivities'\nimport mergeSimilarActivities from '../helpers/mergeSimilarActivities'\n\n// Define the types of activities that are considered minor\nconst minorActivityTypes = ['status.change', 'assignee.add', 'assignee.remove']\n\nconst getStatusActivityIcon = (activities = [], projectInfo = {}) => {\n return activities.map((activity) => {\n const newActivity = { ...activity, origin: { ...activity.origin } }\n\n // find status icon and data for status change activities\n if (newActivity.activityType === 'status.change') {\n if (!projectInfo) return newActivity\n const oldStatusName = newActivity.activityData?.oldValue\n const newStatusName = newActivity.activityData?.newValue\n\n const oldStatus = projectInfo.statuses?.find((status) => status.name === oldStatusName)\n const newStatus = projectInfo.statuses?.find((status) => status.name === newStatusName)\n\n newActivity.oldStatus = { ...oldStatus, name: oldStatusName }\n newActivity.newStatus = { ...newStatus, name: newStatusName }\n }\n\n return newActivity\n })\n}\n\nconst filterOutRelations = (activities = [], entityTypes = [], entityType) => {\n return !entityTypes.includes(entityType)\n ? activities\n : activities.filter((activity) => activity.referenceType !== 'relation')\n}\n\nconst useTransformActivities = (\n activities = [],\n users: ActivityUser[] = [],\n projectInfo = {},\n entityType,\n userName,\n) => {\n // 1. add status icons and data for status change activities\n const activitiesWithIcons = useMemo(\n () => getStatusActivityIcon(activities, projectInfo),\n [activities],\n )\n\n // 1,5. add any extra meta data to the activities\n const activitiesWithMeta = useMemo(() => {\n return activitiesWithIcons.map((activity) => {\n const newActivity = { ...activity, isOwner: userName === activity.authorName }\n return newActivity\n })\n }, [activitiesWithIcons, userName])\n\n // 2. versions should not have relations shown (comments posted on parent task)\n const activitiesWithoutRelations = useMemo(\n () => filterOutRelations(activitiesWithMeta, ['version'], entityType),\n [activitiesWithMeta, projectInfo],\n )\n\n // 3. sort createdAt oldest first (because we are using flex: column-reverse)\n const reversedActivitiesData = useMemo(() => {\n const sortedActivities = [...activitiesWithoutRelations].sort((a, b) => {\n const dateA = new Date(a.createdAt)\n const dateB = new Date(b.createdAt)\n const validA = isValid(dateA)\n const validB = isValid(dateB)\n\n if (!validA && !validB) {\n return 0 // Both dates are invalid, keep original order\n } else if (!validA) {\n return 1 // Only dateA is invalid, it comes first\n } else if (!validB) {\n return -1 // Only dateB is invalid, dateA comes first\n }\n\n // If both dates are valid, compare them normally\n return compareAsc(dateB, dateA)\n })\n\n return sortedActivities\n }, [activitiesWithoutRelations])\n\n // 4. for status change activities that are together, merge them into one activity\n const mergedActivitiesData = useMemo(\n () => mergeSimilarActivities(reversedActivitiesData, 'status.change', 'oldStatus'),\n [reversedActivitiesData],\n )\n\n // 5. group minor activities together\n const groupedActivitiesData = useMemo(\n () => groupMinorActivities(mergedActivitiesData, users),\n [mergedActivitiesData, users],\n )\n\n // 6. group version activities together\n const groupedVersionsData = useMemo(\n () => groupActivityVersions(groupedActivitiesData),\n [groupedActivitiesData],\n )\n\n // 7. ensure there are no duplicate activities\n const uniqueActivitiesData = useMemo(() => {\n // Filter out invalid activities and create a Map to ensure uniqueness\n const activityMap = new Map(\n groupedVersionsData\n .filter((activity) => activity && activity.activityId)\n .map((activity) => [activity.activityId, activity]),\n )\n\n // Convert the Map values to an array\n return [...activityMap.values()]\n }, [groupedVersionsData])\n\n return uniqueActivitiesData\n}\n\nexport { minorActivityTypes }\nexport default useTransformActivities\n"],"names":[],"mappings":"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"}
@@ -88,6 +88,7 @@ const DetailsPanelProvider = ({
88
88
  ...forwardedProps
89
89
  }) => {
90
90
  const [panelOpenByScope, setPanelOpenByScope] = React.useState({});
91
+ const [feedAnnotations, setFeedAnnotations] = React.useState([]);
91
92
  const getOpenForScope = React.useCallback(
92
93
  (scope) => {
93
94
  if (panelOpenByScope[scope]) {
@@ -163,6 +164,8 @@ const DetailsPanelProvider = ({
163
164
  pip,
164
165
  openPip,
165
166
  closePip,
167
+ feedAnnotations,
168
+ setFeedAnnotations,
166
169
  ...forwardedProps
167
170
  };
168
171
  return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(DetailsPanelContext.Provider, { value, children });
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanelContext.cjs.js","sources":["../../../../src/context/DetailsPanelContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useCallback, ReactNode, useState } from 'react'\nimport { useLocalStorage } from '@shared/hooks'\nimport { DetailsPanelEntityType } from '@shared/api'\nimport type { UserModel } from '@shared/api'\nimport { useLocation, useNavigate, useParams } from 'react-router-dom'\nimport { useSearchParams } from 'react-router-dom'\n\nexport type FeedFilters = 'activity' | 'comments' | 'versions' | 'checklists'\n\nexport type DetailsPanelTab = FeedFilters | 'attribs' | 'files'\n\nexport type SlideOut = {\n entityId: string\n entityType: DetailsPanelEntityType\n projectName: string\n}\n\nexport type DetailsPanelPip = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n scope: string\n}\n\nexport interface OpenStateByScope {\n [scope: string]: boolean\n}\n\n// Create a new interface for managing tab state by scope\nexport interface TabStateByScope {\n [scope: string]: DetailsPanelTab\n}\n\n// these props get forwarded to the details panel value\n// it's mainly redux callbacks that cannot be used in shared library\nexport interface DetailsPanelContextProps {\n dispatch?: any // this is a redux dispatch function and it's quite annoying we need to do this\n user: UserModel\n viewer?: {\n reviewableIds: string[]\n taskId?: string | null\n folderId?: string | null\n }\n // redux callback actions\n onOpenImage?: (args: any) => void\n onGoToFrame?: (frame: number) => void\n onOpenViewer?: (args: any) => void\n onUpdateEntity?: (data: { operations: any[]; entityType: string }) => void\n // route hooks\n useParams: typeof useParams\n useNavigate: typeof useNavigate\n useLocation: typeof useLocation\n useSearchParams: typeof useSearchParams\n}\n\n// Interface for our simplified context\nexport interface DetailsPanelContextType extends DetailsPanelContextProps {\n // Open state for the panel by scope\n panelOpenByScope: OpenStateByScope\n getOpenForScope: (scope: string) => boolean\n setPanelOpen: (scope: string, isOpen: boolean) => void\n setPanelOpenByScope: (newState: OpenStateByScope) => void\n\n // Tab preferences by scope\n tabsByScope: TabStateByScope\n getTabForScope: (scope: string) => DetailsPanelTab\n setTab: (scope: string, tab: DetailsPanelTab) => void\n\n // Slide out state\n slideOut: null | SlideOut\n openSlideOut: (slideOut: SlideOut) => void\n closeSlideOut: () => void\n\n // Highlighted activities\n highlightedActivities: string[]\n setHighlightedActivities: (activities: string[]) => void\n\n // PiP state\n pip: DetailsPanelPip | null\n openPip: (pip: DetailsPanelPip) => void\n closePip: () => void\n}\n\n// Create the context\nconst DetailsPanelContext = createContext<DetailsPanelContextType | undefined>(undefined)\n\n// Provider component\nexport interface DetailsPanelProviderProps extends DetailsPanelContextProps {\n children: ReactNode\n defaultTab?: DetailsPanelTab\n}\n\nexport const DetailsPanelProvider: React.FC<DetailsPanelProviderProps> = ({\n children,\n defaultTab = 'activity',\n ...forwardedProps\n}) => {\n // keep track of the currently open panel by scope\n const [panelOpenByScope, setPanelOpenByScope] = useState<OpenStateByScope>({})\n\n // get the current open state for a specific scope\n const getOpenForScope = useCallback(\n (scope: string): boolean => {\n // Check if we have a saved preference for this scope\n if (panelOpenByScope[scope]) {\n return panelOpenByScope[scope]\n }\n\n // Fall back to default\n return false\n },\n [panelOpenByScope],\n )\n // Set open state for a scope\n const setPanelOpen = useCallback(\n (scope: string, isOpen: boolean) => {\n // Create a new state object based on current open state\n const newState = { ...panelOpenByScope }\n newState[scope] = isOpen\n\n // Update the state with the new object\n setPanelOpenByScope(newState)\n },\n [panelOpenByScope],\n )\n\n // Use localStorage to persist tab preferences by scope\n const [tabsByScope, setTabsByScope] = useLocalStorage<TabStateByScope>(\n 'details/tabs-by-scope',\n {},\n )\n\n // Get the current tab for a specific scope\n const getTabForScope = useCallback(\n (scope: string): DetailsPanelTab => {\n // Check if we have a saved preference for this scope\n if (tabsByScope[scope]) {\n return tabsByScope[scope]\n }\n\n // Fall back to default\n return defaultTab\n },\n [tabsByScope, defaultTab],\n )\n\n // Set tab for a scope\n const setTab = useCallback(\n (scope: string, tab: DetailsPanelTab) => {\n // Create a new state object based on current tabsByScope\n const newState = { ...tabsByScope }\n newState[scope] = tab\n\n // Update the state with the new object\n setTabsByScope(newState)\n },\n [tabsByScope, setTabsByScope],\n )\n\n // is the slide out open?\n const [slideOut, setSlideOut] = useState<null | SlideOut>(null)\n\n // open the slide out\n const openSlideOut = useCallback<DetailsPanelContextType['openSlideOut']>((params) => {\n setSlideOut(params)\n }, [])\n\n // close the slide out\n const closeSlideOut = useCallback(() => {\n setSlideOut(null)\n setHighlightedActivities([])\n }, [])\n\n const [pip, setPip] = useState<DetailsPanelPip | null>(null)\n\n const openPip = useCallback((pip: DetailsPanelPip) => {\n setPip(pip)\n }, [])\n const closePip = useCallback(() => {\n setPip(null)\n }, [])\n\n const [highlightedActivities, setHighlightedActivities] = useState<string[]>([])\n\n const value = {\n // open state for the panel by scope\n panelOpenByScope,\n getOpenForScope,\n setPanelOpen,\n setPanelOpenByScope,\n // tab preferences\n tabsByScope,\n getTabForScope,\n setTab,\n // slide out state\n slideOut,\n openSlideOut,\n closeSlideOut,\n // highlighted activities\n highlightedActivities,\n setHighlightedActivities,\n // PiP state\n pip,\n openPip,\n closePip,\n ...forwardedProps,\n }\n\n return <DetailsPanelContext.Provider value={value}>{children}</DetailsPanelContext.Provider>\n}\n\n// Custom hook to use the details context\nexport const useDetailsPanelContext = (): DetailsPanelContextType => {\n const context = useContext(DetailsPanelContext)\n if (context === undefined) {\n throw new Error('useDetailsPanel must be used within a DetailsProvider')\n }\n return context\n}\n\n// Add a specialized hook for using a panel in a specific scope\nexport const useScopedDetailsPanel = (scope: string) => {\n const { getTabForScope, setTab, getOpenForScope, setPanelOpen } = useDetailsPanelContext()\n\n return {\n isOpen: getOpenForScope(scope),\n setOpen: (isOpen: boolean) => setPanelOpen(scope, isOpen),\n currentTab: getTabForScope(scope),\n setTab: (tab: DetailsPanelTab) => setTab(scope, tab),\n isFeed: ['activity', 'comments', 'versions', 'checklists'].includes(getTabForScope(scope)),\n }\n}\n"],"names":["createContext","useState","useCallback","useLocalStorage","pip","jsx","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"DetailsPanelContext.cjs.js","sources":["../../../../src/context/DetailsPanelContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useCallback, ReactNode, useState } from 'react'\nimport { useLocalStorage } from '@shared/hooks'\nimport { DetailsPanelEntityType } from '@shared/api'\nimport type { UserModel } from '@shared/api'\nimport { useLocation, useNavigate, useParams } from 'react-router-dom'\nimport { useSearchParams } from 'react-router-dom'\nimport { SavedAnnotationMetadata } from '@shared/containers'\n\nexport type FeedFilters = 'activity' | 'comments' | 'versions' | 'checklists'\n\nexport type DetailsPanelTab = FeedFilters | 'attribs' | 'files'\n\nexport type SlideOut = {\n entityId: string\n entityType: DetailsPanelEntityType\n projectName: string\n}\n\nexport type DetailsPanelPip = {\n entityType: DetailsPanelEntityType\n entities: { id: string; projectName: string }[]\n scope: string\n}\n\nexport interface OpenStateByScope {\n [scope: string]: boolean\n}\n\n// Create a new interface for managing tab state by scope\nexport interface TabStateByScope {\n [scope: string]: DetailsPanelTab\n}\n\n// these props get forwarded to the details panel value\n// it's mainly redux callbacks that cannot be used in shared library\nexport interface DetailsPanelContextProps {\n dispatch?: any // this is a redux dispatch function and it's quite annoying we need to do this\n user: UserModel\n viewer?: {\n reviewableIds: string[]\n taskId?: string | null\n folderId?: string | null\n }\n // redux callback actions\n onOpenImage?: (args: any) => void\n onGoToFrame?: (frame: number) => void\n onOpenViewer?: (args: any) => void\n onUpdateEntity?: (data: { operations: any[]; entityType: string }) => void\n // route hooks\n useParams: typeof useParams\n useNavigate: typeof useNavigate\n useLocation: typeof useLocation\n useSearchParams: typeof useSearchParams\n feedAnnotationsEnabled?: boolean\n}\n\n// Interface for our simplified context\nexport interface DetailsPanelContextType extends DetailsPanelContextProps {\n // Open state for the panel by scope\n panelOpenByScope: OpenStateByScope\n getOpenForScope: (scope: string) => boolean\n setPanelOpen: (scope: string, isOpen: boolean) => void\n setPanelOpenByScope: (newState: OpenStateByScope) => void\n\n // Tab preferences by scope\n tabsByScope: TabStateByScope\n getTabForScope: (scope: string) => DetailsPanelTab\n setTab: (scope: string, tab: DetailsPanelTab) => void\n\n // Slide out state\n slideOut: null | SlideOut\n openSlideOut: (slideOut: SlideOut) => void\n closeSlideOut: () => void\n\n // Highlighted activities\n highlightedActivities: string[]\n setHighlightedActivities: (activities: string[]) => void\n\n // PiP state\n pip: DetailsPanelPip | null\n openPip: (pip: DetailsPanelPip) => void\n closePip: () => void\n\n // Annotations\n feedAnnotations: SavedAnnotationMetadata[]\n setFeedAnnotations: (annotations: SavedAnnotationMetadata[]) => void\n}\n\n// Create the context\nconst DetailsPanelContext = createContext<DetailsPanelContextType | undefined>(undefined)\n\n// Provider component\nexport interface DetailsPanelProviderProps extends DetailsPanelContextProps {\n children: ReactNode\n defaultTab?: DetailsPanelTab\n}\n\nexport const DetailsPanelProvider: React.FC<DetailsPanelProviderProps> = ({\n children,\n defaultTab = 'activity',\n ...forwardedProps\n}) => {\n // keep track of the currently open panel by scope\n const [panelOpenByScope, setPanelOpenByScope] = useState<OpenStateByScope>({})\n const [feedAnnotations, setFeedAnnotations] = useState<SavedAnnotationMetadata[]>([])\n\n // get the current open state for a specific scope\n const getOpenForScope = useCallback(\n (scope: string): boolean => {\n // Check if we have a saved preference for this scope\n if (panelOpenByScope[scope]) {\n return panelOpenByScope[scope]\n }\n\n // Fall back to default\n return false\n },\n [panelOpenByScope],\n )\n // Set open state for a scope\n const setPanelOpen = useCallback(\n (scope: string, isOpen: boolean) => {\n // Create a new state object based on current open state\n const newState = { ...panelOpenByScope }\n newState[scope] = isOpen\n\n // Update the state with the new object\n setPanelOpenByScope(newState)\n },\n [panelOpenByScope],\n )\n\n // Use localStorage to persist tab preferences by scope\n const [tabsByScope, setTabsByScope] = useLocalStorage<TabStateByScope>(\n 'details/tabs-by-scope',\n {},\n )\n\n // Get the current tab for a specific scope\n const getTabForScope = useCallback(\n (scope: string): DetailsPanelTab => {\n // Check if we have a saved preference for this scope\n if (tabsByScope[scope]) {\n return tabsByScope[scope]\n }\n\n // Fall back to default\n return defaultTab\n },\n [tabsByScope, defaultTab],\n )\n\n // Set tab for a scope\n const setTab = useCallback(\n (scope: string, tab: DetailsPanelTab) => {\n // Create a new state object based on current tabsByScope\n const newState = { ...tabsByScope }\n newState[scope] = tab\n\n // Update the state with the new object\n setTabsByScope(newState)\n },\n [tabsByScope, setTabsByScope],\n )\n\n // is the slide out open?\n const [slideOut, setSlideOut] = useState<null | SlideOut>(null)\n\n // open the slide out\n const openSlideOut = useCallback<DetailsPanelContextType['openSlideOut']>((params) => {\n setSlideOut(params)\n }, [])\n\n // close the slide out\n const closeSlideOut = useCallback(() => {\n setSlideOut(null)\n setHighlightedActivities([])\n }, [])\n\n const [pip, setPip] = useState<DetailsPanelPip | null>(null)\n\n const openPip = useCallback((pip: DetailsPanelPip) => {\n setPip(pip)\n }, [])\n const closePip = useCallback(() => {\n setPip(null)\n }, [])\n\n const [highlightedActivities, setHighlightedActivities] = useState<string[]>([])\n\n const value = {\n // open state for the panel by scope\n panelOpenByScope,\n getOpenForScope,\n setPanelOpen,\n setPanelOpenByScope,\n // tab preferences\n tabsByScope,\n getTabForScope,\n setTab,\n // slide out state\n slideOut,\n openSlideOut,\n closeSlideOut,\n // highlighted activities\n highlightedActivities,\n setHighlightedActivities,\n // PiP state\n pip,\n openPip,\n closePip,\n feedAnnotations,\n setFeedAnnotations,\n ...forwardedProps,\n }\n\n return <DetailsPanelContext.Provider value={value}>{children}</DetailsPanelContext.Provider>\n}\n\n// Custom hook to use the details context\nexport const useDetailsPanelContext = (): DetailsPanelContextType => {\n const context = useContext(DetailsPanelContext)\n if (context === undefined) {\n throw new Error('useDetailsPanel must be used within a DetailsProvider')\n }\n return context\n}\n\n// Add a specialized hook for using a panel in a specific scope\nexport const useScopedDetailsPanel = (scope: string) => {\n const { getTabForScope, setTab, getOpenForScope, setPanelOpen } = useDetailsPanelContext()\n\n return {\n isOpen: getOpenForScope(scope),\n setOpen: (isOpen: boolean) => setPanelOpen(scope, isOpen),\n currentTab: getTabForScope(scope),\n setTab: (tab: DetailsPanelTab) => setTab(scope, tab),\n isFeed: ['activity', 'comments', 'versions', 'checklists'].includes(getTabForScope(scope)),\n }\n}\n"],"names":["createContext","useState","useCallback","useLocalStorage","pip","jsx","useContext"],"mappings":"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"}
@@ -86,6 +86,7 @@ const DetailsPanelProvider = ({
86
86
  ...forwardedProps
87
87
  }) => {
88
88
  const [panelOpenByScope, setPanelOpenByScope] = useState({});
89
+ const [feedAnnotations, setFeedAnnotations] = useState([]);
89
90
  const getOpenForScope = useCallback(
90
91
  (scope) => {
91
92
  if (panelOpenByScope[scope]) {
@@ -161,6 +162,8 @@ const DetailsPanelProvider = ({
161
162
  pip,
162
163
  openPip,
163
164
  closePip,
165
+ feedAnnotations,
166
+ setFeedAnnotations,
164
167
  ...forwardedProps
165
168
  };
166
169
  return /* @__PURE__ */ jsxRuntimeExports.jsx(DetailsPanelContext.Provider, { value, children });