@ynput/ayon-frontend-shared 0.2.11 → 0.2.13

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 (43) hide show
  1. package/dist/_virtual/index.cjs10.js +5 -3
  2. package/dist/_virtual/index.cjs10.js.map +1 -1
  3. package/dist/_virtual/index.cjs7.js +3 -5
  4. package/dist/_virtual/index.cjs7.js.map +1 -1
  5. package/dist/_virtual/index.cjs8.js +4 -4
  6. package/dist/_virtual/index.cjs9.js +4 -4
  7. package/dist/_virtual/index.es10.js +5 -2
  8. package/dist/_virtual/index.es10.js.map +1 -1
  9. package/dist/_virtual/index.es7.js +2 -5
  10. package/dist/_virtual/index.es7.js.map +1 -1
  11. package/dist/_virtual/index.es8.js +4 -4
  12. package/dist/_virtual/index.es9.js +4 -4
  13. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +2 -2
  14. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  15. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  16. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  17. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  18. package/dist/node_modules/remove-accents/index.es.js +1 -1
  19. package/dist/node_modules/vfile/lib/index.cjs.js +1 -1
  20. package/dist/node_modules/vfile/lib/index.es.js +1 -1
  21. package/dist/shared/src/api/queries/users/updateUsers.cjs.js +4 -9
  22. package/dist/shared/src/api/queries/users/updateUsers.cjs.js.map +1 -1
  23. package/dist/shared/src/api/queries/users/updateUsers.es.js +4 -9
  24. package/dist/shared/src/api/queries/users/updateUsers.es.js.map +1 -1
  25. package/dist/shared/src/containers/Feed/Feed.cjs.js +9 -4
  26. package/dist/shared/src/containers/Feed/Feed.cjs.js.map +1 -1
  27. package/dist/shared/src/containers/Feed/Feed.es.js +9 -4
  28. package/dist/shared/src/containers/Feed/Feed.es.js.map +1 -1
  29. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +2 -1
  30. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
  31. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +2 -1
  32. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
  33. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  34. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  35. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +1 -1
  36. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  37. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +2 -0
  38. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
  39. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +2 -0
  40. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
  41. package/dist/types/api/queries/users/updateUsers.d.ts +1492 -0
  42. package/dist/types/containers/Feed/index.d.ts +1 -0
  43. package/package.json +1 -1
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- var removeAccents = { exports: {} };
4
- exports.__module = removeAccents;
2
+ const _commonjsHelpers = require("./_commonjsHelpers.cjs.js");
3
+ const index = require("../node_modules/extend/index.cjs.js");
4
+ var extendExports = index.__require();
5
+ const extend = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(extendExports);
6
+ module.exports = extend;
5
7
  //# sourceMappingURL=index.cjs10.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs10.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.cjs10.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
- const _commonjsHelpers = require("./_commonjsHelpers.cjs.js");
3
- const index = require("../node_modules/parse5/lib/parser/index.cjs.js");
4
- var parserExports = index.__require();
5
- const Parser5 = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(parserExports);
6
- module.exports = Parser5;
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ var removeAccents = { exports: {} };
4
+ exports.__module = removeAccents;
7
5
  //# sourceMappingURL=index.cjs7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
1
+ {"version":3,"file":"index.cjs7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const _commonjsHelpers = require("./_commonjsHelpers.cjs.js");
3
- const index = require("../node_modules/is-buffer/index.cjs.js");
4
- var isBufferExports = index.__require();
5
- const isBuffer = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(isBufferExports);
6
- module.exports = isBuffer;
3
+ const index = require("../node_modules/parse5/lib/parser/index.cjs.js");
4
+ var parserExports = index.__require();
5
+ const Parser5 = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(parserExports);
6
+ module.exports = Parser5;
7
7
  //# sourceMappingURL=index.cjs8.js.map
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const _commonjsHelpers = require("./_commonjsHelpers.cjs.js");
3
- const index = require("../node_modules/extend/index.cjs.js");
4
- var extendExports = index.__require();
5
- const extend = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(extendExports);
6
- module.exports = extend;
3
+ const index = require("../node_modules/is-buffer/index.cjs.js");
4
+ var isBufferExports = index.__require();
5
+ const isBuffer = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(isBufferExports);
6
+ module.exports = isBuffer;
7
7
  //# sourceMappingURL=index.cjs9.js.map
@@ -1,5 +1,8 @@
1
- var removeAccents = { exports: {} };
1
+ import { getDefaultExportFromCjs } from "./_commonjsHelpers.es.js";
2
+ import { __require as requireExtend } from "../node_modules/extend/index.es.js";
3
+ var extendExports = requireExtend();
4
+ const extend = /* @__PURE__ */ getDefaultExportFromCjs(extendExports);
2
5
  export {
3
- removeAccents as __module
6
+ extend as default
4
7
  };
5
8
  //# sourceMappingURL=index.es10.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es10.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.es10.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,8 +1,5 @@
1
- import { getDefaultExportFromCjs } from "./_commonjsHelpers.es.js";
2
- import { __require as requireParser } from "../node_modules/parse5/lib/parser/index.es.js";
3
- var parserExports = requireParser();
4
- const Parser5 = /* @__PURE__ */ getDefaultExportFromCjs(parserExports);
1
+ var removeAccents = { exports: {} };
5
2
  export {
6
- Parser5 as default
3
+ removeAccents as __module
7
4
  };
8
5
  //# sourceMappingURL=index.es7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.es7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,8 +1,8 @@
1
1
  import { getDefaultExportFromCjs } from "./_commonjsHelpers.es.js";
2
- import { __require as requireIsBuffer } from "../node_modules/is-buffer/index.es.js";
3
- var isBufferExports = requireIsBuffer();
4
- const isBuffer = /* @__PURE__ */ getDefaultExportFromCjs(isBufferExports);
2
+ import { __require as requireParser } from "../node_modules/parse5/lib/parser/index.es.js";
3
+ var parserExports = requireParser();
4
+ const Parser5 = /* @__PURE__ */ getDefaultExportFromCjs(parserExports);
5
5
  export {
6
- isBuffer as default
6
+ Parser5 as default
7
7
  };
8
8
  //# sourceMappingURL=index.es8.js.map
@@ -1,8 +1,8 @@
1
1
  import { getDefaultExportFromCjs } from "./_commonjsHelpers.es.js";
2
- import { __require as requireExtend } from "../node_modules/extend/index.es.js";
3
- var extendExports = requireExtend();
4
- const extend = /* @__PURE__ */ getDefaultExportFromCjs(extendExports);
2
+ import { __require as requireIsBuffer } from "../node_modules/is-buffer/index.es.js";
3
+ var isBufferExports = requireIsBuffer();
4
+ const isBuffer = /* @__PURE__ */ getDefaultExportFromCjs(isBufferExports);
5
5
  export {
6
- extend as default
6
+ isBuffer as default
7
7
  };
8
8
  //# sourceMappingURL=index.es9.js.map
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const index$3 = require("../../../../bail/index.cjs.js");
4
- const index$5 = require("../../../../../_virtual/index.cjs8.js");
5
- const index = require("../../../../../_virtual/index.cjs9.js");
4
+ const index$5 = require("../../../../../_virtual/index.cjs9.js");
5
+ const index = require("../../../../../_virtual/index.cjs10.js");
6
6
  const index$2 = require("../../../../is-plain-obj/index.cjs.js");
7
7
  const index$1 = require("../../../../trough/lib/index.cjs.js");
8
8
  const index$4 = require("../../../../vfile/lib/index.cjs.js");
@@ -1,6 +1,6 @@
1
1
  import { bail } from "../../../../bail/index.es.js";
2
- import isBuffer from "../../../../../_virtual/index.es8.js";
3
- import extend from "../../../../../_virtual/index.es9.js";
2
+ import isBuffer from "../../../../../_virtual/index.es9.js";
3
+ import extend from "../../../../../_virtual/index.es10.js";
4
4
  import isPlainObject from "../../../../is-plain-obj/index.es.js";
5
5
  import { trough } from "../../../../trough/lib/index.es.js";
6
6
  import { VFile } from "../../../../vfile/lib/index.es.js";
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const index = require("../../../_virtual/index.cjs7.js");
2
+ const index = require("../../../_virtual/index.cjs8.js");
3
3
  const errors = require("./errors.cjs.js");
4
4
  const index$1 = require("../../hast-util-from-parse5/lib/index.cjs.js");
5
5
  const base = "https://html.spec.whatwg.org/multipage/parsing.html#parse-error-";
@@ -1,4 +1,4 @@
1
- import Parser5 from "../../../_virtual/index.es7.js";
1
+ import Parser5 from "../../../_virtual/index.es8.js";
2
2
  import { errors } from "./errors.es.js";
3
3
  import { fromParse5 } from "../../hast-util-from-parse5/lib/index.es.js";
4
4
  const base = "https://html.spec.whatwg.org/multipage/parsing.html#parse-error-";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const index = require("../../_virtual/index.cjs10.js");
3
+ const index = require("../../_virtual/index.cjs7.js");
4
4
  var hasRequiredRemoveAccents;
5
5
  function requireRemoveAccents() {
6
6
  if (hasRequiredRemoveAccents) return index.__module.exports;
@@ -1,4 +1,4 @@
1
- import { __module as removeAccents } from "../../_virtual/index.es10.js";
1
+ import { __module as removeAccents } from "../../_virtual/index.es7.js";
2
2
  var hasRequiredRemoveAccents;
3
3
  function requireRemoveAccents() {
4
4
  if (hasRequiredRemoveAccents) return removeAccents.exports;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const index$1 = require("../../../_virtual/index.cjs8.js");
3
+ const index$1 = require("../../../_virtual/index.cjs9.js");
4
4
  const minpath_browser = require("./minpath.browser.cjs.js");
5
5
  const minproc_browser = require("./minproc.browser.cjs.js");
6
6
  const minurl_browser = require("./minurl.browser.cjs.js");
@@ -1,4 +1,4 @@
1
- import isBuffer from "../../../_virtual/index.es8.js";
1
+ import isBuffer from "../../../_virtual/index.es9.js";
2
2
  import { path } from "./minpath.browser.es.js";
3
3
  import { proc } from "./minproc.browser.es.js";
4
4
  import { urlToPath } from "./minurl.browser.es.js";
@@ -37,6 +37,10 @@ require("../../generated/workfiles.cjs.js");
37
37
  require("../../generated/ynputCloud.cjs.js");
38
38
  const updateUserApi = users.api.enhanceEndpoints({
39
39
  endpoints: {
40
+ deleteUser: {
41
+ transformErrorResponse: (res) => res.data,
42
+ invalidatesTags: () => [{ type: "user", id: "LIST" }]
43
+ },
40
44
  setFrontendPreferences: {
41
45
  // @ts-expect-error - disableInvalidations is not in the api
42
46
  invalidatesTags: (_result, _error, { userName, disableInvalidations }) => !disableInvalidations ? [{ type: "user", id: userName }, "info"] : [],
@@ -105,14 +109,6 @@ const updateUser = updateUserApi.injectEndpoints({
105
109
  transformErrorResponse: (res) => res.data,
106
110
  invalidatesTags: [{ type: "user", id: "LIST" }]
107
111
  }),
108
- deleteUser: build.mutation({
109
- query: ({ user }) => ({
110
- url: `/api/users/${user}`,
111
- method: "DELETE"
112
- }),
113
- transformErrorResponse: (res) => res.data,
114
- invalidatesTags: () => [{ type: "user", id: "LIST" }]
115
- }),
116
112
  updateUserAPIKey: build.mutation({
117
113
  query: ({ name, apiKey }) => ({
118
114
  url: `/api/users/${name}/password`,
@@ -159,7 +155,6 @@ const {
159
155
  useUpdateUserPasswordMutation,
160
156
  useAddUserMutation,
161
157
  useDeleteUserMutation,
162
- // move to enhanced
163
158
  useUpdateUserAPIKeyMutation,
164
159
  useInvalidateUserSessionMutation,
165
160
  useSetFrontendPreferencesMutation
@@ -1 +1 @@
1
- {"version":3,"file":"updateUsers.cjs.js","sources":["../../../../../../src/api/queries/users/updateUsers.ts"],"sourcesContent":["import { FetchBaseQueryError } from '@reduxjs/toolkit/query'\nimport { usersApi } from '@shared/api/generated'\n\nconst updateUserApi = usersApi.enhanceEndpoints({\n endpoints: {\n setFrontendPreferences: {\n // @ts-expect-error - disableInvalidations is not in the api\n invalidatesTags: (_result, _error, { userName, disableInvalidations }) =>\n !disableInvalidations ? [{ type: 'user', id: userName }, 'info'] : [],\n async onQueryStarted({ patchData }, { dispatch, queryFulfilled, getState }) {\n // get current preferences\n\n // optimistic update the user cache\n const patch = dispatch(\n usersApi.util.updateQueryData('getCurrentUser', undefined, (draft) => {\n if (draft?.data) {\n draft.data.frontendPreferences = { ...draft.data.frontendPreferences, ...patchData }\n }\n }),\n )\n try {\n await queryFulfilled\n } catch {\n // rollback the optimistic update if the query fails\n patch.undo()\n }\n }, // onQueryStarted\n },\n },\n})\n\nconst updateUser = updateUserApi.injectEndpoints({\n endpoints: (build) => ({\n updateUser: build.mutation({\n query: ({ name, patch }) => ({\n url: `/api/users/${name}`,\n method: 'PATCH',\n body: patch,\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: (_result, _error, { name }) => [\n { type: 'user', id: name },\n { type: 'user', id: 'LIST' },\n { type: 'userPool', id: 'LIST' },\n { type: 'feedback', id: 'LIST' },\n 'info',\n ],\n }),\n updateUserName: build.mutation({\n query: ({ name, newName }) => ({\n url: `/api/users/${name}/rename`,\n method: 'PATCH',\n body: { newName },\n }),\n invalidatesTags: (_result, _error, { name }) => [\n { type: 'user', id: name },\n { type: 'user', id: 'LIST' },\n ],\n transformErrorResponse: (res) => res.data,\n }),\n updateUserPassword: build.mutation({\n query: ({ name, password }) => ({\n url: `/api/users/${name}/password`,\n method: 'PATCH',\n body: { password },\n }),\n invalidatesTags: () => ['user'],\n transformErrorResponse: (res) => res.data,\n }),\n addUser: build.mutation({\n query: ({ name, user }) => ({\n url: `/api/users/${name}`,\n method: 'PUT',\n body: user,\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: [{ type: 'user', id: 'LIST' }],\n }),\n deleteUser: build.mutation({\n query: ({ user }) => ({\n url: `/api/users/${user}`,\n method: 'DELETE',\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: () => [{ type: 'user', id: 'LIST' }],\n }),\n updateUserAPIKey: build.mutation({\n query: ({ name, apiKey }) => ({\n url: `/api/users/${name}/password`,\n method: 'PATCH',\n body: { apiKey },\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: () => [{ type: 'user', id: 'LIST' }],\n }),\n invalidateUserSession: build.mutation({\n query: ({ name, token }) => ({\n url: `/api/users/${name}/sessions/${token}`,\n method: 'DELETE',\n }),\n invalidatesTags: (_res, _err, { token }) => [{ type: 'session', id: token }],\n }),\n }),\n overrideExisting: true,\n})\n\nconst updateUser2 = updateUser.injectEndpoints({\n endpoints: (build) => ({\n // update multiple users at once\n updateUsers: build.mutation<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any[],\n { name: string; patch: object }[]\n >({\n //\n queryFn: async (updates, { dispatch }) => {\n const results = await Promise.all(\n updates.map(({ name, patch }: { name: string; patch: object }) => {\n return dispatch(updateUser.endpoints.updateUser.initiate({ name, patch }))\n }),\n )\n\n // Check if any of the results have an error\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstError = results.find((result: any) => result.error)\n if (firstError) {\n return { error: firstError.error as FetchBaseQueryError }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { data: results.map((result: any) => result.data) }\n },\n }),\n }),\n})\n\nexport const {\n useUpdateUserMutation,\n useUpdateUsersMutation,\n useUpdateUserNameMutation,\n useUpdateUserPasswordMutation,\n useAddUserMutation,\n useDeleteUserMutation, // move to enhanced\n useUpdateUserAPIKeyMutation,\n useInvalidateUserSessionMutation,\n useSetFrontendPreferencesMutation,\n} = updateUser2\nexport { updateUser2 as userQueries }\n"],"names":["usersApi"],"mappings":"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"}
1
+ {"version":3,"file":"updateUsers.cjs.js","sources":["../../../../../../src/api/queries/users/updateUsers.ts"],"sourcesContent":["import { FetchBaseQueryError } from '@reduxjs/toolkit/query'\nimport { usersApi } from '@shared/api/generated'\n\nconst updateUserApi = usersApi.enhanceEndpoints({\n endpoints: {\n deleteUser: {\n transformErrorResponse: (res) => res.data,\n invalidatesTags: () => [{ type: 'user', id: 'LIST' }],\n },\n setFrontendPreferences: {\n // @ts-expect-error - disableInvalidations is not in the api\n invalidatesTags: (_result, _error, { userName, disableInvalidations }) =>\n !disableInvalidations ? [{ type: 'user', id: userName }, 'info'] : [],\n async onQueryStarted({ patchData }, { dispatch, queryFulfilled, getState }) {\n // get current preferences\n\n // optimistic update the user cache\n const patch = dispatch(\n usersApi.util.updateQueryData('getCurrentUser', undefined, (draft) => {\n if (draft?.data) {\n draft.data.frontendPreferences = { ...draft.data.frontendPreferences, ...patchData }\n }\n }),\n )\n try {\n await queryFulfilled\n } catch {\n // rollback the optimistic update if the query fails\n patch.undo()\n }\n }, // onQueryStarted\n },\n },\n})\n\nconst updateUser = updateUserApi.injectEndpoints({\n endpoints: (build) => ({\n updateUser: build.mutation({\n query: ({ name, patch }) => ({\n url: `/api/users/${name}`,\n method: 'PATCH',\n body: patch,\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: (_result, _error, { name }) => [\n { type: 'user', id: name },\n { type: 'user', id: 'LIST' },\n { type: 'userPool', id: 'LIST' },\n { type: 'feedback', id: 'LIST' },\n 'info',\n ],\n }),\n updateUserName: build.mutation({\n query: ({ name, newName }) => ({\n url: `/api/users/${name}/rename`,\n method: 'PATCH',\n body: { newName },\n }),\n invalidatesTags: (_result, _error, { name }) => [\n { type: 'user', id: name },\n { type: 'user', id: 'LIST' },\n ],\n transformErrorResponse: (res) => res.data,\n }),\n updateUserPassword: build.mutation({\n query: ({ name, password }) => ({\n url: `/api/users/${name}/password`,\n method: 'PATCH',\n body: { password },\n }),\n invalidatesTags: () => ['user'],\n transformErrorResponse: (res) => res.data,\n }),\n addUser: build.mutation({\n query: ({ name, user }) => ({\n url: `/api/users/${name}`,\n method: 'PUT',\n body: user,\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: [{ type: 'user', id: 'LIST' }],\n }),\n updateUserAPIKey: build.mutation({\n query: ({ name, apiKey }) => ({\n url: `/api/users/${name}/password`,\n method: 'PATCH',\n body: { apiKey },\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: () => [{ type: 'user', id: 'LIST' }],\n }),\n invalidateUserSession: build.mutation({\n query: ({ name, token }) => ({\n url: `/api/users/${name}/sessions/${token}`,\n method: 'DELETE',\n }),\n invalidatesTags: (_res, _err, { token }) => [{ type: 'session', id: token }],\n }),\n }),\n overrideExisting: true,\n})\n\nconst updateUser2 = updateUser.injectEndpoints({\n endpoints: (build) => ({\n // update multiple users at once\n updateUsers: build.mutation<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any[],\n { name: string; patch: object }[]\n >({\n //\n queryFn: async (updates, { dispatch }) => {\n const results = await Promise.all(\n updates.map(({ name, patch }: { name: string; patch: object }) => {\n return dispatch(updateUser.endpoints.updateUser.initiate({ name, patch }))\n }),\n )\n\n // Check if any of the results have an error\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstError = results.find((result: any) => result.error)\n if (firstError) {\n return { error: firstError.error as FetchBaseQueryError }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { data: results.map((result: any) => result.data) }\n },\n }),\n }),\n})\n\nexport const {\n useUpdateUserMutation,\n useUpdateUsersMutation,\n useUpdateUserNameMutation,\n useUpdateUserPasswordMutation,\n useAddUserMutation,\n useDeleteUserMutation,\n useUpdateUserAPIKeyMutation,\n useInvalidateUserSessionMutation,\n useSetFrontendPreferencesMutation,\n} = updateUser2\nexport { updateUser2 as userQueries }\n"],"names":["usersApi"],"mappings":"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"}
@@ -35,6 +35,10 @@ import "../../generated/workfiles.es.js";
35
35
  import "../../generated/ynputCloud.es.js";
36
36
  const updateUserApi = injectedRtkApi.enhanceEndpoints({
37
37
  endpoints: {
38
+ deleteUser: {
39
+ transformErrorResponse: (res) => res.data,
40
+ invalidatesTags: () => [{ type: "user", id: "LIST" }]
41
+ },
38
42
  setFrontendPreferences: {
39
43
  // @ts-expect-error - disableInvalidations is not in the api
40
44
  invalidatesTags: (_result, _error, { userName, disableInvalidations }) => !disableInvalidations ? [{ type: "user", id: userName }, "info"] : [],
@@ -103,14 +107,6 @@ const updateUser = updateUserApi.injectEndpoints({
103
107
  transformErrorResponse: (res) => res.data,
104
108
  invalidatesTags: [{ type: "user", id: "LIST" }]
105
109
  }),
106
- deleteUser: build.mutation({
107
- query: ({ user }) => ({
108
- url: `/api/users/${user}`,
109
- method: "DELETE"
110
- }),
111
- transformErrorResponse: (res) => res.data,
112
- invalidatesTags: () => [{ type: "user", id: "LIST" }]
113
- }),
114
110
  updateUserAPIKey: build.mutation({
115
111
  query: ({ name, apiKey }) => ({
116
112
  url: `/api/users/${name}/password`,
@@ -157,7 +153,6 @@ const {
157
153
  useUpdateUserPasswordMutation,
158
154
  useAddUserMutation,
159
155
  useDeleteUserMutation,
160
- // move to enhanced
161
156
  useUpdateUserAPIKeyMutation,
162
157
  useInvalidateUserSessionMutation,
163
158
  useSetFrontendPreferencesMutation
@@ -1 +1 @@
1
- {"version":3,"file":"updateUsers.es.js","sources":["../../../../../../src/api/queries/users/updateUsers.ts"],"sourcesContent":["import { FetchBaseQueryError } from '@reduxjs/toolkit/query'\nimport { usersApi } from '@shared/api/generated'\n\nconst updateUserApi = usersApi.enhanceEndpoints({\n endpoints: {\n setFrontendPreferences: {\n // @ts-expect-error - disableInvalidations is not in the api\n invalidatesTags: (_result, _error, { userName, disableInvalidations }) =>\n !disableInvalidations ? [{ type: 'user', id: userName }, 'info'] : [],\n async onQueryStarted({ patchData }, { dispatch, queryFulfilled, getState }) {\n // get current preferences\n\n // optimistic update the user cache\n const patch = dispatch(\n usersApi.util.updateQueryData('getCurrentUser', undefined, (draft) => {\n if (draft?.data) {\n draft.data.frontendPreferences = { ...draft.data.frontendPreferences, ...patchData }\n }\n }),\n )\n try {\n await queryFulfilled\n } catch {\n // rollback the optimistic update if the query fails\n patch.undo()\n }\n }, // onQueryStarted\n },\n },\n})\n\nconst updateUser = updateUserApi.injectEndpoints({\n endpoints: (build) => ({\n updateUser: build.mutation({\n query: ({ name, patch }) => ({\n url: `/api/users/${name}`,\n method: 'PATCH',\n body: patch,\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: (_result, _error, { name }) => [\n { type: 'user', id: name },\n { type: 'user', id: 'LIST' },\n { type: 'userPool', id: 'LIST' },\n { type: 'feedback', id: 'LIST' },\n 'info',\n ],\n }),\n updateUserName: build.mutation({\n query: ({ name, newName }) => ({\n url: `/api/users/${name}/rename`,\n method: 'PATCH',\n body: { newName },\n }),\n invalidatesTags: (_result, _error, { name }) => [\n { type: 'user', id: name },\n { type: 'user', id: 'LIST' },\n ],\n transformErrorResponse: (res) => res.data,\n }),\n updateUserPassword: build.mutation({\n query: ({ name, password }) => ({\n url: `/api/users/${name}/password`,\n method: 'PATCH',\n body: { password },\n }),\n invalidatesTags: () => ['user'],\n transformErrorResponse: (res) => res.data,\n }),\n addUser: build.mutation({\n query: ({ name, user }) => ({\n url: `/api/users/${name}`,\n method: 'PUT',\n body: user,\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: [{ type: 'user', id: 'LIST' }],\n }),\n deleteUser: build.mutation({\n query: ({ user }) => ({\n url: `/api/users/${user}`,\n method: 'DELETE',\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: () => [{ type: 'user', id: 'LIST' }],\n }),\n updateUserAPIKey: build.mutation({\n query: ({ name, apiKey }) => ({\n url: `/api/users/${name}/password`,\n method: 'PATCH',\n body: { apiKey },\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: () => [{ type: 'user', id: 'LIST' }],\n }),\n invalidateUserSession: build.mutation({\n query: ({ name, token }) => ({\n url: `/api/users/${name}/sessions/${token}`,\n method: 'DELETE',\n }),\n invalidatesTags: (_res, _err, { token }) => [{ type: 'session', id: token }],\n }),\n }),\n overrideExisting: true,\n})\n\nconst updateUser2 = updateUser.injectEndpoints({\n endpoints: (build) => ({\n // update multiple users at once\n updateUsers: build.mutation<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any[],\n { name: string; patch: object }[]\n >({\n //\n queryFn: async (updates, { dispatch }) => {\n const results = await Promise.all(\n updates.map(({ name, patch }: { name: string; patch: object }) => {\n return dispatch(updateUser.endpoints.updateUser.initiate({ name, patch }))\n }),\n )\n\n // Check if any of the results have an error\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstError = results.find((result: any) => result.error)\n if (firstError) {\n return { error: firstError.error as FetchBaseQueryError }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { data: results.map((result: any) => result.data) }\n },\n }),\n }),\n})\n\nexport const {\n useUpdateUserMutation,\n useUpdateUsersMutation,\n useUpdateUserNameMutation,\n useUpdateUserPasswordMutation,\n useAddUserMutation,\n useDeleteUserMutation, // move to enhanced\n useUpdateUserAPIKeyMutation,\n useInvalidateUserSessionMutation,\n useSetFrontendPreferencesMutation,\n} = updateUser2\nexport { updateUser2 as userQueries }\n"],"names":["usersApi"],"mappings":"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"}
1
+ {"version":3,"file":"updateUsers.es.js","sources":["../../../../../../src/api/queries/users/updateUsers.ts"],"sourcesContent":["import { FetchBaseQueryError } from '@reduxjs/toolkit/query'\nimport { usersApi } from '@shared/api/generated'\n\nconst updateUserApi = usersApi.enhanceEndpoints({\n endpoints: {\n deleteUser: {\n transformErrorResponse: (res) => res.data,\n invalidatesTags: () => [{ type: 'user', id: 'LIST' }],\n },\n setFrontendPreferences: {\n // @ts-expect-error - disableInvalidations is not in the api\n invalidatesTags: (_result, _error, { userName, disableInvalidations }) =>\n !disableInvalidations ? [{ type: 'user', id: userName }, 'info'] : [],\n async onQueryStarted({ patchData }, { dispatch, queryFulfilled, getState }) {\n // get current preferences\n\n // optimistic update the user cache\n const patch = dispatch(\n usersApi.util.updateQueryData('getCurrentUser', undefined, (draft) => {\n if (draft?.data) {\n draft.data.frontendPreferences = { ...draft.data.frontendPreferences, ...patchData }\n }\n }),\n )\n try {\n await queryFulfilled\n } catch {\n // rollback the optimistic update if the query fails\n patch.undo()\n }\n }, // onQueryStarted\n },\n },\n})\n\nconst updateUser = updateUserApi.injectEndpoints({\n endpoints: (build) => ({\n updateUser: build.mutation({\n query: ({ name, patch }) => ({\n url: `/api/users/${name}`,\n method: 'PATCH',\n body: patch,\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: (_result, _error, { name }) => [\n { type: 'user', id: name },\n { type: 'user', id: 'LIST' },\n { type: 'userPool', id: 'LIST' },\n { type: 'feedback', id: 'LIST' },\n 'info',\n ],\n }),\n updateUserName: build.mutation({\n query: ({ name, newName }) => ({\n url: `/api/users/${name}/rename`,\n method: 'PATCH',\n body: { newName },\n }),\n invalidatesTags: (_result, _error, { name }) => [\n { type: 'user', id: name },\n { type: 'user', id: 'LIST' },\n ],\n transformErrorResponse: (res) => res.data,\n }),\n updateUserPassword: build.mutation({\n query: ({ name, password }) => ({\n url: `/api/users/${name}/password`,\n method: 'PATCH',\n body: { password },\n }),\n invalidatesTags: () => ['user'],\n transformErrorResponse: (res) => res.data,\n }),\n addUser: build.mutation({\n query: ({ name, user }) => ({\n url: `/api/users/${name}`,\n method: 'PUT',\n body: user,\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: [{ type: 'user', id: 'LIST' }],\n }),\n updateUserAPIKey: build.mutation({\n query: ({ name, apiKey }) => ({\n url: `/api/users/${name}/password`,\n method: 'PATCH',\n body: { apiKey },\n }),\n transformErrorResponse: (res) => res.data,\n invalidatesTags: () => [{ type: 'user', id: 'LIST' }],\n }),\n invalidateUserSession: build.mutation({\n query: ({ name, token }) => ({\n url: `/api/users/${name}/sessions/${token}`,\n method: 'DELETE',\n }),\n invalidatesTags: (_res, _err, { token }) => [{ type: 'session', id: token }],\n }),\n }),\n overrideExisting: true,\n})\n\nconst updateUser2 = updateUser.injectEndpoints({\n endpoints: (build) => ({\n // update multiple users at once\n updateUsers: build.mutation<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any[],\n { name: string; patch: object }[]\n >({\n //\n queryFn: async (updates, { dispatch }) => {\n const results = await Promise.all(\n updates.map(({ name, patch }: { name: string; patch: object }) => {\n return dispatch(updateUser.endpoints.updateUser.initiate({ name, patch }))\n }),\n )\n\n // Check if any of the results have an error\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstError = results.find((result: any) => result.error)\n if (firstError) {\n return { error: firstError.error as FetchBaseQueryError }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { data: results.map((result: any) => result.data) }\n },\n }),\n }),\n})\n\nexport const {\n useUpdateUserMutation,\n useUpdateUsersMutation,\n useUpdateUserNameMutation,\n useUpdateUserPasswordMutation,\n useAddUserMutation,\n useDeleteUserMutation,\n useUpdateUserAPIKeyMutation,\n useInvalidateUserSessionMutation,\n useSetFrontendPreferencesMutation,\n} = updateUser2\nexport { updateUser2 as userQueries }\n"],"names":["usersApi"],"mappings":"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"}
@@ -62,10 +62,15 @@ const Feed = ({ isMultiProjects, readOnly, statuses = [] }) => {
62
62
  if (!activitiesWithMergedAnnotations.length) {
63
63
  setFeedAnnotations([]);
64
64
  }
65
- const annotations = activitiesWithMergedAnnotations.map((activity) => {
66
- var _a;
67
- return (_a = activity.activityData) == null ? void 0 : _a.annotations;
68
- }).filter(Boolean).flat();
65
+ const annotations = activitiesWithMergedAnnotations.map(
66
+ (activity) => {
67
+ var _a, _b;
68
+ return (_b = (_a = activity.activityData) == null ? void 0 : _a.annotations) == null ? void 0 : _b.map((a) => ({
69
+ ...a,
70
+ activityId: activity.activityId
71
+ }));
72
+ }
73
+ ).filter(Boolean).flat();
69
74
  setFeedAnnotations(annotations);
70
75
  }, [activitiesWithMergedAnnotations]);
71
76
  const transformedActivitiesData = useTransformActivities.default(
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.cjs.js","sources":["../../../../../src/containers/Feed/Feed.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react'\nimport ActivityItem from './components/ActivityItem'\nimport CommentInput from './components/CommentInput/CommentInput'\nimport * as Styled from './Feed.styled'\nimport useCommentMutations, { Activity } from './hooks/useCommentMutations'\nimport useTransformActivities from './hooks/useTransformActivities'\nimport { InView } from 'react-intersection-observer'\nimport useSaveScrollPos from './hooks/useSaveScrollPos'\nimport useScrollOnInputOpen from './hooks/useScrollOnInputOpen'\nimport { getLoadingPlaceholders } from './feedHelpers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport useScrollToHighlighted from './hooks/useScrollToHighlighted'\nimport { isFilePreviewable } from './components/FileUploadPreview/FileUploadPreview'\nimport EmptyPlaceholder from '@shared/components/EmptyPlaceholder'\nimport { useFeedContext, FEED_NEW_COMMENT } from './context/FeedContext'\nimport { Status } from '../ProjectTreeTable/types/project'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { DetailsPanelEntityType } from '@shared/api'\nimport mergeAnnotationAttachments from './helpers/mergeAnnotationAttachments'\n\n// number of activities to get\nexport const activitiesLast = 30\n\nexport type FeedProps = {\n isMultiProjects: boolean\n readOnly: boolean\n statuses: Status[]\n}\n\nexport const Feed = ({ isMultiProjects, readOnly, statuses = [] }: FeedProps) => {\n const {\n projectName,\n entities,\n entityType,\n editingId,\n projectInfo,\n setEditingId,\n userName,\n activitiesData,\n isLoadingNew,\n isLoadingNextPage,\n loadNextPage,\n hasNextPage,\n users,\n currentTab,\n } = useFeedContext()\n\n const {\n openSlideOut,\n highlightedActivities,\n setHighlightedActivities,\n onOpenImage,\n setFeedAnnotations,\n } = useDetailsPanelContext()\n\n // hide comment input for specific filters\n const hideCommentInput = ['versions'].includes(currentTab)\n\n const activitiesWithMergedAnnotations = useMemo(\n () => mergeAnnotationAttachments(activitiesData),\n [activitiesData],\n )\n\n useEffect(() => {\n if (!activitiesWithMergedAnnotations.length) {\n setFeedAnnotations([])\n }\n\n const annotations = activitiesWithMergedAnnotations\n .map((activity) => activity.activityData?.annotations)\n .filter(Boolean)\n .flat()\n\n setFeedAnnotations(annotations)\n }, [activitiesWithMergedAnnotations])\n\n // do any transformation on activities data\n // 1. status change activities, attach status data based on projectName\n // 2. reverse the order\n // 3. is this activity from the current user?\n const transformedActivitiesData = useTransformActivities(\n // @ts-ignore\n activitiesWithMergedAnnotations,\n users,\n projectInfo,\n entityType,\n userName,\n ) as any[]\n\n // REFS\n const feedRef = useRef(null)\n // const commentInputRef = useRef(null)\n\n // scroll by height of comment input when it opens or closes\n useScrollOnInputOpen({ feedRef, isInputOpen: editingId === FEED_NEW_COMMENT, height: 93 })\n\n // save scroll position of a feed\n useSaveScrollPos({\n entities,\n feedRef,\n filter: currentTab,\n disabled: !!highlightedActivities.length,\n isLoading: isLoadingNew,\n })\n\n // try and scroll to highlightedActivities activity\n useScrollToHighlighted({\n feedRef,\n highlighted: highlightedActivities,\n isLoading: isLoadingNew,\n loadNextPage,\n hasNextPage: !!loadNextPage,\n })\n\n // comment mutations here!\n const { submitComment, updateComment, deleteComment, isSaving } = useCommentMutations({\n projectName,\n entityType: entityType,\n entities,\n filter: currentTab,\n })\n\n // When a checkbox is clicked, update the body to add/remove \"x\" in [ ] markdown\n // Then update comment with new body\n const handleCommentChecked = (e: React.ChangeEvent<HTMLInputElement>, activity: Activity) => {\n const target = e?.target\n if (!target || !activity) return console.log('no target or activity')\n\n // the value that it's changing to\n const checked: boolean = target.checked\n const currentMarkdown: string = checked ? '[ ]' : '[x]'\n const newMarkdown: string = checked ? '[x]' : '[ ]'\n\n const { body } = activity\n\n // based on all li elements in the whole className 'comment-body' with className 'task-list-item'\n // find the index of the task that was checked\n const taskIndex: number = Array.from(\n target.closest('.comment-body')?.querySelectorAll('.task-list-item') || [],\n ).findIndex((li: Element) => li === target.closest('li'))\n\n let replaceIndex: number = taskIndex\n\n // count the number of current markdowns in the body\n const allMarkdowns: string[] = body.match(/\\[.\\]/g) || []\n\n allMarkdowns.forEach((markdown: string, index: number) => {\n // does it match the current markdown?\n if (markdown !== currentMarkdown && index < taskIndex) replaceIndex--\n })\n\n // now find the indexes of the current markdown to replace\n const indexesOfCurrentMarkdownInBody: number[] = []\n let index: number = -1\n while ((index = body.indexOf(currentMarkdown, index + 1)) > -1) {\n indexesOfCurrentMarkdownInBody.push(index)\n }\n\n const indexToReplaceInBody: number | undefined = indexesOfCurrentMarkdownInBody[replaceIndex]\n if (indexToReplaceInBody === undefined) return\n\n const endReplaceIndex: number = indexToReplaceInBody + currentMarkdown.length\n\n // replace the current markdown with the new markdown\n const newBody: string =\n body.slice(0, indexToReplaceInBody) + newMarkdown + body.slice(endReplaceIndex)\n\n if (!newBody) return\n\n updateComment(activity, newBody, activity.files)\n }\n\n const handleRefClick = (ref: {\n entityId: string\n entityType: DetailsPanelEntityType\n activityId: string\n }) => {\n const { entityId, entityType, activityId } = ref\n const supportedTypes = ['version', 'task', 'folder']\n\n if (!entityType || !supportedTypes.includes(entityType))\n return console.log('Entity type not supported yet')\n\n if (!entityId || !entityType || !projectName) return console.log('No entity id or type found')\n\n // open the slide out\n openSlideOut({ entityId, entityType, projectName })\n // set highlighted activity\n setHighlightedActivities([activityId])\n }\n\n const handleFileExpand = ({ index, activityId }: { index: number; activityId: string }) => {\n const previewableFiles = Object.values(transformedActivitiesData)\n .reverse()\n .filter((a) => a.activityType == 'comment')\n .map((a) => ({\n id: a.activityId,\n files: a.files.filter((file: any) => isFilePreviewable(file.mime, file.ext)),\n }))\n .filter((a) => a.files.length > 0)\n\n // open image callback\n onOpenImage?.({ files: previewableFiles, activityId, index, projectName })\n }\n\n const loadingPlaceholders = useMemo(() => getLoadingPlaceholders(10), [])\n\n let warningMessage\n\n // only viewing activities from one project\n if (isMultiProjects)\n warningMessage = `You are only viewing activities from one project: ${projectName}.`\n\n return (\n <>\n <Styled.FeedContainer className=\"feed\">\n {warningMessage && (\n <Styled.Warning>\n <Icon icon=\"info\" />\n {warningMessage}\n </Styled.Warning>\n )}\n <Styled.FeedContent ref={feedRef} className={clsx({ loading: isLoadingNew }, 'no-shimmer')}>\n {isLoadingNew\n ? loadingPlaceholders\n : transformedActivitiesData.map((activity) => (\n <ActivityItem\n key={activity.activityId}\n activity={activity}\n onCheckChange={handleCommentChecked}\n onDelete={deleteComment}\n onUpdate={async (value, files, _refs) =>\n await updateComment(activity, value, files)\n }\n projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={handleRefClick}\n createdAts={entities.map((e) => e.createdAt)}\n onFileExpand={handleFileExpand}\n showOrigin={entities.length > 1}\n filter={currentTab}\n editProps={{\n projectName,\n entities: entities,\n entityType,\n }}\n isHighlighted={highlightedActivities.includes(activity.activityId)}\n readOnly={readOnly}\n statuses={statuses}\n />\n ))}\n {/* message when no versions published */}\n {transformedActivitiesData.length === 1 && currentTab === 'versions' && !isLoadingNew && (\n <EmptyPlaceholder message=\"No versions published yet\" icon=\"layers\" />\n )}\n {hasNextPage && loadNextPage && (\n <InView\n root={feedRef.current}\n onChange={(inView) => inView && loadNextPage()}\n rootMargin={'400px 0px 0px 0px'}\n >\n <Styled.LoadMore style={{ height: 0 }} onClick={() => loadNextPage()}>\n {isLoadingNextPage ? 'Loading more...' : 'Click to load more'}\n </Styled.LoadMore>\n </InView>\n )}\n </Styled.FeedContent>\n {!hideCommentInput && (\n <CommentInput\n initValue={null}\n onSubmit={submitComment}\n isOpen={editingId === FEED_NEW_COMMENT}\n onClose={() => setEditingId(null)}\n onOpen={() => setEditingId(FEED_NEW_COMMENT)}\n disabled={isMultiProjects}\n isLoading={isLoadingNew || !entities.length || isSaving}\n />\n )}\n </Styled.FeedContainer>\n </>\n )\n}\n"],"names":["useFeedContext","useDetailsPanelContext","useMemo","useEffect","useTransformActivities","useRef","FEED_NEW_COMMENT","index","entityType","isFilePreviewable","getLoadingPlaceholders","jsxs","Styled.FeedContainer","Styled.Warning","jsx","Icon","Styled.FeedContent","EmptyPlaceholder","InView","Styled.LoadMore","CommentInput"],"mappings":"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"}
1
+ {"version":3,"file":"Feed.cjs.js","sources":["../../../../../src/containers/Feed/Feed.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react'\nimport ActivityItem from './components/ActivityItem'\nimport CommentInput from './components/CommentInput/CommentInput'\nimport * as Styled from './Feed.styled'\nimport useCommentMutations, { Activity } from './hooks/useCommentMutations'\nimport useTransformActivities from './hooks/useTransformActivities'\nimport { InView } from 'react-intersection-observer'\nimport useSaveScrollPos from './hooks/useSaveScrollPos'\nimport useScrollOnInputOpen from './hooks/useScrollOnInputOpen'\nimport { getLoadingPlaceholders } from './feedHelpers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport useScrollToHighlighted from './hooks/useScrollToHighlighted'\nimport { isFilePreviewable } from './components/FileUploadPreview/FileUploadPreview'\nimport EmptyPlaceholder from '@shared/components/EmptyPlaceholder'\nimport { useFeedContext, FEED_NEW_COMMENT } from './context/FeedContext'\nimport { Status } from '../ProjectTreeTable/types/project'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { DetailsPanelEntityType } from '@shared/api'\nimport mergeAnnotationAttachments from './helpers/mergeAnnotationAttachments'\nimport { SavedAnnotationMetadata } from '.'\n\n// number of activities to get\nexport const activitiesLast = 30\n\nexport type FeedProps = {\n isMultiProjects: boolean\n readOnly: boolean\n statuses: Status[]\n}\n\nexport const Feed = ({ isMultiProjects, readOnly, statuses = [] }: FeedProps) => {\n const {\n projectName,\n entities,\n entityType,\n editingId,\n projectInfo,\n setEditingId,\n userName,\n activitiesData,\n isLoadingNew,\n isLoadingNextPage,\n loadNextPage,\n hasNextPage,\n users,\n currentTab,\n } = useFeedContext()\n\n const {\n openSlideOut,\n highlightedActivities,\n setHighlightedActivities,\n onOpenImage,\n setFeedAnnotations,\n } = useDetailsPanelContext()\n\n // hide comment input for specific filters\n const hideCommentInput = ['versions'].includes(currentTab)\n\n const activitiesWithMergedAnnotations = useMemo(\n () => mergeAnnotationAttachments(activitiesData),\n [activitiesData],\n )\n\n useEffect(() => {\n if (!activitiesWithMergedAnnotations.length) {\n setFeedAnnotations([])\n }\n\n const annotations = activitiesWithMergedAnnotations\n .map((activity) =>\n activity.activityData?.annotations?.map((a: SavedAnnotationMetadata) => ({\n ...a,\n activityId: activity.activityId,\n })),\n )\n .filter(Boolean)\n .flat()\n\n setFeedAnnotations(annotations)\n }, [activitiesWithMergedAnnotations])\n\n // do any transformation on activities data\n // 1. status change activities, attach status data based on projectName\n // 2. reverse the order\n // 3. is this activity from the current user?\n const transformedActivitiesData = useTransformActivities(\n // @ts-ignore\n activitiesWithMergedAnnotations,\n users,\n projectInfo,\n entityType,\n userName,\n ) as any[]\n\n // REFS\n const feedRef = useRef(null)\n // const commentInputRef = useRef(null)\n\n // scroll by height of comment input when it opens or closes\n useScrollOnInputOpen({ feedRef, isInputOpen: editingId === FEED_NEW_COMMENT, height: 93 })\n\n // save scroll position of a feed\n useSaveScrollPos({\n entities,\n feedRef,\n filter: currentTab,\n disabled: !!highlightedActivities.length,\n isLoading: isLoadingNew,\n })\n\n // try and scroll to highlightedActivities activity\n useScrollToHighlighted({\n feedRef,\n highlighted: highlightedActivities,\n isLoading: isLoadingNew,\n loadNextPage,\n hasNextPage: !!loadNextPage,\n })\n\n // comment mutations here!\n const { submitComment, updateComment, deleteComment, isSaving } = useCommentMutations({\n projectName,\n entityType: entityType,\n entities,\n filter: currentTab,\n })\n\n // When a checkbox is clicked, update the body to add/remove \"x\" in [ ] markdown\n // Then update comment with new body\n const handleCommentChecked = (e: React.ChangeEvent<HTMLInputElement>, activity: Activity) => {\n const target = e?.target\n if (!target || !activity) return console.log('no target or activity')\n\n // the value that it's changing to\n const checked: boolean = target.checked\n const currentMarkdown: string = checked ? '[ ]' : '[x]'\n const newMarkdown: string = checked ? '[x]' : '[ ]'\n\n const { body } = activity\n\n // based on all li elements in the whole className 'comment-body' with className 'task-list-item'\n // find the index of the task that was checked\n const taskIndex: number = Array.from(\n target.closest('.comment-body')?.querySelectorAll('.task-list-item') || [],\n ).findIndex((li: Element) => li === target.closest('li'))\n\n let replaceIndex: number = taskIndex\n\n // count the number of current markdowns in the body\n const allMarkdowns: string[] = body.match(/\\[.\\]/g) || []\n\n allMarkdowns.forEach((markdown: string, index: number) => {\n // does it match the current markdown?\n if (markdown !== currentMarkdown && index < taskIndex) replaceIndex--\n })\n\n // now find the indexes of the current markdown to replace\n const indexesOfCurrentMarkdownInBody: number[] = []\n let index: number = -1\n while ((index = body.indexOf(currentMarkdown, index + 1)) > -1) {\n indexesOfCurrentMarkdownInBody.push(index)\n }\n\n const indexToReplaceInBody: number | undefined = indexesOfCurrentMarkdownInBody[replaceIndex]\n if (indexToReplaceInBody === undefined) return\n\n const endReplaceIndex: number = indexToReplaceInBody + currentMarkdown.length\n\n // replace the current markdown with the new markdown\n const newBody: string =\n body.slice(0, indexToReplaceInBody) + newMarkdown + body.slice(endReplaceIndex)\n\n if (!newBody) return\n\n updateComment(activity, newBody, activity.files)\n }\n\n const handleRefClick = (ref: {\n entityId: string\n entityType: DetailsPanelEntityType\n activityId: string\n }) => {\n const { entityId, entityType, activityId } = ref\n const supportedTypes = ['version', 'task', 'folder']\n\n if (!entityType || !supportedTypes.includes(entityType))\n return console.log('Entity type not supported yet')\n\n if (!entityId || !entityType || !projectName) return console.log('No entity id or type found')\n\n // open the slide out\n openSlideOut({ entityId, entityType, projectName })\n // set highlighted activity\n setHighlightedActivities([activityId])\n }\n\n const handleFileExpand = ({ index, activityId }: { index: number; activityId: string }) => {\n const previewableFiles = Object.values(transformedActivitiesData)\n .reverse()\n .filter((a) => a.activityType == 'comment')\n .map((a) => ({\n id: a.activityId,\n files: a.files.filter((file: any) => isFilePreviewable(file.mime, file.ext)),\n }))\n .filter((a) => a.files.length > 0)\n\n // open image callback\n onOpenImage?.({ files: previewableFiles, activityId, index, projectName })\n }\n\n const loadingPlaceholders = useMemo(() => getLoadingPlaceholders(10), [])\n\n let warningMessage\n\n // only viewing activities from one project\n if (isMultiProjects)\n warningMessage = `You are only viewing activities from one project: ${projectName}.`\n\n return (\n <>\n <Styled.FeedContainer className=\"feed\">\n {warningMessage && (\n <Styled.Warning>\n <Icon icon=\"info\" />\n {warningMessage}\n </Styled.Warning>\n )}\n <Styled.FeedContent ref={feedRef} className={clsx({ loading: isLoadingNew }, 'no-shimmer')}>\n {isLoadingNew\n ? loadingPlaceholders\n : transformedActivitiesData.map((activity) => (\n <ActivityItem\n key={activity.activityId}\n activity={activity}\n onCheckChange={handleCommentChecked}\n onDelete={deleteComment}\n onUpdate={async (value, files, _refs) =>\n await updateComment(activity, value, files)\n }\n projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={handleRefClick}\n createdAts={entities.map((e) => e.createdAt)}\n onFileExpand={handleFileExpand}\n showOrigin={entities.length > 1}\n filter={currentTab}\n editProps={{\n projectName,\n entities: entities,\n entityType,\n }}\n isHighlighted={highlightedActivities.includes(activity.activityId)}\n readOnly={readOnly}\n statuses={statuses}\n />\n ))}\n {/* message when no versions published */}\n {transformedActivitiesData.length === 1 && currentTab === 'versions' && !isLoadingNew && (\n <EmptyPlaceholder message=\"No versions published yet\" icon=\"layers\" />\n )}\n {hasNextPage && loadNextPage && (\n <InView\n root={feedRef.current}\n onChange={(inView) => inView && loadNextPage()}\n rootMargin={'400px 0px 0px 0px'}\n >\n <Styled.LoadMore style={{ height: 0 }} onClick={() => loadNextPage()}>\n {isLoadingNextPage ? 'Loading more...' : 'Click to load more'}\n </Styled.LoadMore>\n </InView>\n )}\n </Styled.FeedContent>\n {!hideCommentInput && (\n <CommentInput\n initValue={null}\n onSubmit={submitComment}\n isOpen={editingId === FEED_NEW_COMMENT}\n onClose={() => setEditingId(null)}\n onOpen={() => setEditingId(FEED_NEW_COMMENT)}\n disabled={isMultiProjects}\n isLoading={isLoadingNew || !entities.length || isSaving}\n />\n )}\n </Styled.FeedContainer>\n </>\n )\n}\n"],"names":["useFeedContext","useDetailsPanelContext","useMemo","useEffect","useTransformActivities","useRef","FEED_NEW_COMMENT","index","entityType","isFilePreviewable","getLoadingPlaceholders","jsxs","Styled.FeedContainer","Styled.Warning","jsx","Icon","Styled.FeedContent","EmptyPlaceholder","InView","Styled.LoadMore","CommentInput"],"mappings":"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"}
@@ -60,10 +60,15 @@ const Feed = ({ isMultiProjects, readOnly, statuses = [] }) => {
60
60
  if (!activitiesWithMergedAnnotations.length) {
61
61
  setFeedAnnotations([]);
62
62
  }
63
- const annotations = activitiesWithMergedAnnotations.map((activity) => {
64
- var _a;
65
- return (_a = activity.activityData) == null ? void 0 : _a.annotations;
66
- }).filter(Boolean).flat();
63
+ const annotations = activitiesWithMergedAnnotations.map(
64
+ (activity) => {
65
+ var _a, _b;
66
+ return (_b = (_a = activity.activityData) == null ? void 0 : _a.annotations) == null ? void 0 : _b.map((a) => ({
67
+ ...a,
68
+ activityId: activity.activityId
69
+ }));
70
+ }
71
+ ).filter(Boolean).flat();
67
72
  setFeedAnnotations(annotations);
68
73
  }, [activitiesWithMergedAnnotations]);
69
74
  const transformedActivitiesData = useTransformActivities(
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.es.js","sources":["../../../../../src/containers/Feed/Feed.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react'\nimport ActivityItem from './components/ActivityItem'\nimport CommentInput from './components/CommentInput/CommentInput'\nimport * as Styled from './Feed.styled'\nimport useCommentMutations, { Activity } from './hooks/useCommentMutations'\nimport useTransformActivities from './hooks/useTransformActivities'\nimport { InView } from 'react-intersection-observer'\nimport useSaveScrollPos from './hooks/useSaveScrollPos'\nimport useScrollOnInputOpen from './hooks/useScrollOnInputOpen'\nimport { getLoadingPlaceholders } from './feedHelpers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport useScrollToHighlighted from './hooks/useScrollToHighlighted'\nimport { isFilePreviewable } from './components/FileUploadPreview/FileUploadPreview'\nimport EmptyPlaceholder from '@shared/components/EmptyPlaceholder'\nimport { useFeedContext, FEED_NEW_COMMENT } from './context/FeedContext'\nimport { Status } from '../ProjectTreeTable/types/project'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { DetailsPanelEntityType } from '@shared/api'\nimport mergeAnnotationAttachments from './helpers/mergeAnnotationAttachments'\n\n// number of activities to get\nexport const activitiesLast = 30\n\nexport type FeedProps = {\n isMultiProjects: boolean\n readOnly: boolean\n statuses: Status[]\n}\n\nexport const Feed = ({ isMultiProjects, readOnly, statuses = [] }: FeedProps) => {\n const {\n projectName,\n entities,\n entityType,\n editingId,\n projectInfo,\n setEditingId,\n userName,\n activitiesData,\n isLoadingNew,\n isLoadingNextPage,\n loadNextPage,\n hasNextPage,\n users,\n currentTab,\n } = useFeedContext()\n\n const {\n openSlideOut,\n highlightedActivities,\n setHighlightedActivities,\n onOpenImage,\n setFeedAnnotations,\n } = useDetailsPanelContext()\n\n // hide comment input for specific filters\n const hideCommentInput = ['versions'].includes(currentTab)\n\n const activitiesWithMergedAnnotations = useMemo(\n () => mergeAnnotationAttachments(activitiesData),\n [activitiesData],\n )\n\n useEffect(() => {\n if (!activitiesWithMergedAnnotations.length) {\n setFeedAnnotations([])\n }\n\n const annotations = activitiesWithMergedAnnotations\n .map((activity) => activity.activityData?.annotations)\n .filter(Boolean)\n .flat()\n\n setFeedAnnotations(annotations)\n }, [activitiesWithMergedAnnotations])\n\n // do any transformation on activities data\n // 1. status change activities, attach status data based on projectName\n // 2. reverse the order\n // 3. is this activity from the current user?\n const transformedActivitiesData = useTransformActivities(\n // @ts-ignore\n activitiesWithMergedAnnotations,\n users,\n projectInfo,\n entityType,\n userName,\n ) as any[]\n\n // REFS\n const feedRef = useRef(null)\n // const commentInputRef = useRef(null)\n\n // scroll by height of comment input when it opens or closes\n useScrollOnInputOpen({ feedRef, isInputOpen: editingId === FEED_NEW_COMMENT, height: 93 })\n\n // save scroll position of a feed\n useSaveScrollPos({\n entities,\n feedRef,\n filter: currentTab,\n disabled: !!highlightedActivities.length,\n isLoading: isLoadingNew,\n })\n\n // try and scroll to highlightedActivities activity\n useScrollToHighlighted({\n feedRef,\n highlighted: highlightedActivities,\n isLoading: isLoadingNew,\n loadNextPage,\n hasNextPage: !!loadNextPage,\n })\n\n // comment mutations here!\n const { submitComment, updateComment, deleteComment, isSaving } = useCommentMutations({\n projectName,\n entityType: entityType,\n entities,\n filter: currentTab,\n })\n\n // When a checkbox is clicked, update the body to add/remove \"x\" in [ ] markdown\n // Then update comment with new body\n const handleCommentChecked = (e: React.ChangeEvent<HTMLInputElement>, activity: Activity) => {\n const target = e?.target\n if (!target || !activity) return console.log('no target or activity')\n\n // the value that it's changing to\n const checked: boolean = target.checked\n const currentMarkdown: string = checked ? '[ ]' : '[x]'\n const newMarkdown: string = checked ? '[x]' : '[ ]'\n\n const { body } = activity\n\n // based on all li elements in the whole className 'comment-body' with className 'task-list-item'\n // find the index of the task that was checked\n const taskIndex: number = Array.from(\n target.closest('.comment-body')?.querySelectorAll('.task-list-item') || [],\n ).findIndex((li: Element) => li === target.closest('li'))\n\n let replaceIndex: number = taskIndex\n\n // count the number of current markdowns in the body\n const allMarkdowns: string[] = body.match(/\\[.\\]/g) || []\n\n allMarkdowns.forEach((markdown: string, index: number) => {\n // does it match the current markdown?\n if (markdown !== currentMarkdown && index < taskIndex) replaceIndex--\n })\n\n // now find the indexes of the current markdown to replace\n const indexesOfCurrentMarkdownInBody: number[] = []\n let index: number = -1\n while ((index = body.indexOf(currentMarkdown, index + 1)) > -1) {\n indexesOfCurrentMarkdownInBody.push(index)\n }\n\n const indexToReplaceInBody: number | undefined = indexesOfCurrentMarkdownInBody[replaceIndex]\n if (indexToReplaceInBody === undefined) return\n\n const endReplaceIndex: number = indexToReplaceInBody + currentMarkdown.length\n\n // replace the current markdown with the new markdown\n const newBody: string =\n body.slice(0, indexToReplaceInBody) + newMarkdown + body.slice(endReplaceIndex)\n\n if (!newBody) return\n\n updateComment(activity, newBody, activity.files)\n }\n\n const handleRefClick = (ref: {\n entityId: string\n entityType: DetailsPanelEntityType\n activityId: string\n }) => {\n const { entityId, entityType, activityId } = ref\n const supportedTypes = ['version', 'task', 'folder']\n\n if (!entityType || !supportedTypes.includes(entityType))\n return console.log('Entity type not supported yet')\n\n if (!entityId || !entityType || !projectName) return console.log('No entity id or type found')\n\n // open the slide out\n openSlideOut({ entityId, entityType, projectName })\n // set highlighted activity\n setHighlightedActivities([activityId])\n }\n\n const handleFileExpand = ({ index, activityId }: { index: number; activityId: string }) => {\n const previewableFiles = Object.values(transformedActivitiesData)\n .reverse()\n .filter((a) => a.activityType == 'comment')\n .map((a) => ({\n id: a.activityId,\n files: a.files.filter((file: any) => isFilePreviewable(file.mime, file.ext)),\n }))\n .filter((a) => a.files.length > 0)\n\n // open image callback\n onOpenImage?.({ files: previewableFiles, activityId, index, projectName })\n }\n\n const loadingPlaceholders = useMemo(() => getLoadingPlaceholders(10), [])\n\n let warningMessage\n\n // only viewing activities from one project\n if (isMultiProjects)\n warningMessage = `You are only viewing activities from one project: ${projectName}.`\n\n return (\n <>\n <Styled.FeedContainer className=\"feed\">\n {warningMessage && (\n <Styled.Warning>\n <Icon icon=\"info\" />\n {warningMessage}\n </Styled.Warning>\n )}\n <Styled.FeedContent ref={feedRef} className={clsx({ loading: isLoadingNew }, 'no-shimmer')}>\n {isLoadingNew\n ? loadingPlaceholders\n : transformedActivitiesData.map((activity) => (\n <ActivityItem\n key={activity.activityId}\n activity={activity}\n onCheckChange={handleCommentChecked}\n onDelete={deleteComment}\n onUpdate={async (value, files, _refs) =>\n await updateComment(activity, value, files)\n }\n projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={handleRefClick}\n createdAts={entities.map((e) => e.createdAt)}\n onFileExpand={handleFileExpand}\n showOrigin={entities.length > 1}\n filter={currentTab}\n editProps={{\n projectName,\n entities: entities,\n entityType,\n }}\n isHighlighted={highlightedActivities.includes(activity.activityId)}\n readOnly={readOnly}\n statuses={statuses}\n />\n ))}\n {/* message when no versions published */}\n {transformedActivitiesData.length === 1 && currentTab === 'versions' && !isLoadingNew && (\n <EmptyPlaceholder message=\"No versions published yet\" icon=\"layers\" />\n )}\n {hasNextPage && loadNextPage && (\n <InView\n root={feedRef.current}\n onChange={(inView) => inView && loadNextPage()}\n rootMargin={'400px 0px 0px 0px'}\n >\n <Styled.LoadMore style={{ height: 0 }} onClick={() => loadNextPage()}>\n {isLoadingNextPage ? 'Loading more...' : 'Click to load more'}\n </Styled.LoadMore>\n </InView>\n )}\n </Styled.FeedContent>\n {!hideCommentInput && (\n <CommentInput\n initValue={null}\n onSubmit={submitComment}\n isOpen={editingId === FEED_NEW_COMMENT}\n onClose={() => setEditingId(null)}\n onOpen={() => setEditingId(FEED_NEW_COMMENT)}\n disabled={isMultiProjects}\n isLoading={isLoadingNew || !entities.length || isSaving}\n />\n )}\n </Styled.FeedContainer>\n </>\n )\n}\n"],"names":["index","entityType","jsxs","Styled.FeedContainer","Styled.Warning","jsx","Styled.FeedContent","Styled.LoadMore"],"mappings":"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"}
1
+ {"version":3,"file":"Feed.es.js","sources":["../../../../../src/containers/Feed/Feed.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react'\nimport ActivityItem from './components/ActivityItem'\nimport CommentInput from './components/CommentInput/CommentInput'\nimport * as Styled from './Feed.styled'\nimport useCommentMutations, { Activity } from './hooks/useCommentMutations'\nimport useTransformActivities from './hooks/useTransformActivities'\nimport { InView } from 'react-intersection-observer'\nimport useSaveScrollPos from './hooks/useSaveScrollPos'\nimport useScrollOnInputOpen from './hooks/useScrollOnInputOpen'\nimport { getLoadingPlaceholders } from './feedHelpers'\nimport { Icon } from '@ynput/ayon-react-components'\nimport clsx from 'clsx'\nimport useScrollToHighlighted from './hooks/useScrollToHighlighted'\nimport { isFilePreviewable } from './components/FileUploadPreview/FileUploadPreview'\nimport EmptyPlaceholder from '@shared/components/EmptyPlaceholder'\nimport { useFeedContext, FEED_NEW_COMMENT } from './context/FeedContext'\nimport { Status } from '../ProjectTreeTable/types/project'\nimport { useDetailsPanelContext } from '@shared/context'\nimport { DetailsPanelEntityType } from '@shared/api'\nimport mergeAnnotationAttachments from './helpers/mergeAnnotationAttachments'\nimport { SavedAnnotationMetadata } from '.'\n\n// number of activities to get\nexport const activitiesLast = 30\n\nexport type FeedProps = {\n isMultiProjects: boolean\n readOnly: boolean\n statuses: Status[]\n}\n\nexport const Feed = ({ isMultiProjects, readOnly, statuses = [] }: FeedProps) => {\n const {\n projectName,\n entities,\n entityType,\n editingId,\n projectInfo,\n setEditingId,\n userName,\n activitiesData,\n isLoadingNew,\n isLoadingNextPage,\n loadNextPage,\n hasNextPage,\n users,\n currentTab,\n } = useFeedContext()\n\n const {\n openSlideOut,\n highlightedActivities,\n setHighlightedActivities,\n onOpenImage,\n setFeedAnnotations,\n } = useDetailsPanelContext()\n\n // hide comment input for specific filters\n const hideCommentInput = ['versions'].includes(currentTab)\n\n const activitiesWithMergedAnnotations = useMemo(\n () => mergeAnnotationAttachments(activitiesData),\n [activitiesData],\n )\n\n useEffect(() => {\n if (!activitiesWithMergedAnnotations.length) {\n setFeedAnnotations([])\n }\n\n const annotations = activitiesWithMergedAnnotations\n .map((activity) =>\n activity.activityData?.annotations?.map((a: SavedAnnotationMetadata) => ({\n ...a,\n activityId: activity.activityId,\n })),\n )\n .filter(Boolean)\n .flat()\n\n setFeedAnnotations(annotations)\n }, [activitiesWithMergedAnnotations])\n\n // do any transformation on activities data\n // 1. status change activities, attach status data based on projectName\n // 2. reverse the order\n // 3. is this activity from the current user?\n const transformedActivitiesData = useTransformActivities(\n // @ts-ignore\n activitiesWithMergedAnnotations,\n users,\n projectInfo,\n entityType,\n userName,\n ) as any[]\n\n // REFS\n const feedRef = useRef(null)\n // const commentInputRef = useRef(null)\n\n // scroll by height of comment input when it opens or closes\n useScrollOnInputOpen({ feedRef, isInputOpen: editingId === FEED_NEW_COMMENT, height: 93 })\n\n // save scroll position of a feed\n useSaveScrollPos({\n entities,\n feedRef,\n filter: currentTab,\n disabled: !!highlightedActivities.length,\n isLoading: isLoadingNew,\n })\n\n // try and scroll to highlightedActivities activity\n useScrollToHighlighted({\n feedRef,\n highlighted: highlightedActivities,\n isLoading: isLoadingNew,\n loadNextPage,\n hasNextPage: !!loadNextPage,\n })\n\n // comment mutations here!\n const { submitComment, updateComment, deleteComment, isSaving } = useCommentMutations({\n projectName,\n entityType: entityType,\n entities,\n filter: currentTab,\n })\n\n // When a checkbox is clicked, update the body to add/remove \"x\" in [ ] markdown\n // Then update comment with new body\n const handleCommentChecked = (e: React.ChangeEvent<HTMLInputElement>, activity: Activity) => {\n const target = e?.target\n if (!target || !activity) return console.log('no target or activity')\n\n // the value that it's changing to\n const checked: boolean = target.checked\n const currentMarkdown: string = checked ? '[ ]' : '[x]'\n const newMarkdown: string = checked ? '[x]' : '[ ]'\n\n const { body } = activity\n\n // based on all li elements in the whole className 'comment-body' with className 'task-list-item'\n // find the index of the task that was checked\n const taskIndex: number = Array.from(\n target.closest('.comment-body')?.querySelectorAll('.task-list-item') || [],\n ).findIndex((li: Element) => li === target.closest('li'))\n\n let replaceIndex: number = taskIndex\n\n // count the number of current markdowns in the body\n const allMarkdowns: string[] = body.match(/\\[.\\]/g) || []\n\n allMarkdowns.forEach((markdown: string, index: number) => {\n // does it match the current markdown?\n if (markdown !== currentMarkdown && index < taskIndex) replaceIndex--\n })\n\n // now find the indexes of the current markdown to replace\n const indexesOfCurrentMarkdownInBody: number[] = []\n let index: number = -1\n while ((index = body.indexOf(currentMarkdown, index + 1)) > -1) {\n indexesOfCurrentMarkdownInBody.push(index)\n }\n\n const indexToReplaceInBody: number | undefined = indexesOfCurrentMarkdownInBody[replaceIndex]\n if (indexToReplaceInBody === undefined) return\n\n const endReplaceIndex: number = indexToReplaceInBody + currentMarkdown.length\n\n // replace the current markdown with the new markdown\n const newBody: string =\n body.slice(0, indexToReplaceInBody) + newMarkdown + body.slice(endReplaceIndex)\n\n if (!newBody) return\n\n updateComment(activity, newBody, activity.files)\n }\n\n const handleRefClick = (ref: {\n entityId: string\n entityType: DetailsPanelEntityType\n activityId: string\n }) => {\n const { entityId, entityType, activityId } = ref\n const supportedTypes = ['version', 'task', 'folder']\n\n if (!entityType || !supportedTypes.includes(entityType))\n return console.log('Entity type not supported yet')\n\n if (!entityId || !entityType || !projectName) return console.log('No entity id or type found')\n\n // open the slide out\n openSlideOut({ entityId, entityType, projectName })\n // set highlighted activity\n setHighlightedActivities([activityId])\n }\n\n const handleFileExpand = ({ index, activityId }: { index: number; activityId: string }) => {\n const previewableFiles = Object.values(transformedActivitiesData)\n .reverse()\n .filter((a) => a.activityType == 'comment')\n .map((a) => ({\n id: a.activityId,\n files: a.files.filter((file: any) => isFilePreviewable(file.mime, file.ext)),\n }))\n .filter((a) => a.files.length > 0)\n\n // open image callback\n onOpenImage?.({ files: previewableFiles, activityId, index, projectName })\n }\n\n const loadingPlaceholders = useMemo(() => getLoadingPlaceholders(10), [])\n\n let warningMessage\n\n // only viewing activities from one project\n if (isMultiProjects)\n warningMessage = `You are only viewing activities from one project: ${projectName}.`\n\n return (\n <>\n <Styled.FeedContainer className=\"feed\">\n {warningMessage && (\n <Styled.Warning>\n <Icon icon=\"info\" />\n {warningMessage}\n </Styled.Warning>\n )}\n <Styled.FeedContent ref={feedRef} className={clsx({ loading: isLoadingNew }, 'no-shimmer')}>\n {isLoadingNew\n ? loadingPlaceholders\n : transformedActivitiesData.map((activity) => (\n <ActivityItem\n key={activity.activityId}\n activity={activity}\n onCheckChange={handleCommentChecked}\n onDelete={deleteComment}\n onUpdate={async (value, files, _refs) =>\n await updateComment(activity, value, files)\n }\n projectInfo={projectInfo}\n projectName={projectName}\n entityType={entityType}\n onReferenceClick={handleRefClick}\n createdAts={entities.map((e) => e.createdAt)}\n onFileExpand={handleFileExpand}\n showOrigin={entities.length > 1}\n filter={currentTab}\n editProps={{\n projectName,\n entities: entities,\n entityType,\n }}\n isHighlighted={highlightedActivities.includes(activity.activityId)}\n readOnly={readOnly}\n statuses={statuses}\n />\n ))}\n {/* message when no versions published */}\n {transformedActivitiesData.length === 1 && currentTab === 'versions' && !isLoadingNew && (\n <EmptyPlaceholder message=\"No versions published yet\" icon=\"layers\" />\n )}\n {hasNextPage && loadNextPage && (\n <InView\n root={feedRef.current}\n onChange={(inView) => inView && loadNextPage()}\n rootMargin={'400px 0px 0px 0px'}\n >\n <Styled.LoadMore style={{ height: 0 }} onClick={() => loadNextPage()}>\n {isLoadingNextPage ? 'Loading more...' : 'Click to load more'}\n </Styled.LoadMore>\n </InView>\n )}\n </Styled.FeedContent>\n {!hideCommentInput && (\n <CommentInput\n initValue={null}\n onSubmit={submitComment}\n isOpen={editingId === FEED_NEW_COMMENT}\n onClose={() => setEditingId(null)}\n onOpen={() => setEditingId(FEED_NEW_COMMENT)}\n disabled={isMultiProjects}\n isLoading={isLoadingNew || !entities.length || isSaving}\n />\n )}\n </Styled.FeedContainer>\n </>\n )\n}\n"],"names":["index","entityType","jsxs","Styled.FeedContainer","Styled.Warning","jsx","Styled.FeedContent","Styled.LoadMore"],"mappings":"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"}
@@ -65,7 +65,7 @@ const ActivityComment = ({
65
65
  if (!authorName) authorName = (author == null ? void 0 : author.name) || "";
66
66
  if (!authorFullName) authorFullName = (author == null ? void 0 : author.fullName) || authorName;
67
67
  const { editingId, setEditingId } = FeedContext.useFeedContext();
68
- const { onGoToFrame } = DetailsPanelContext.useDetailsPanelContext();
68
+ const { onGoToFrame, setHighlightedActivities } = DetailsPanelContext.useDetailsPanelContext();
69
69
  const handleEditComment = () => {
70
70
  setEditingId(activityId);
71
71
  };
@@ -124,6 +124,7 @@ const ActivityComment = ({
124
124
  (file) => {
125
125
  if (!file.annotation) return;
126
126
  onGoToFrame == null ? void 0 : onGoToFrame(file.annotation.range[0] - 1);
127
+ setHighlightedActivities([activityId]);
127
128
  },
128
129
  [onGoToFrame]
129
130
  );