@ynput/ayon-frontend-shared 0.3.33 → 0.3.34

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 (76) hide show
  1. package/dist/_virtual/index.cjs7.js +1 -1
  2. package/dist/_virtual/index.cjs9.js +1 -1
  3. package/dist/_virtual/index.es7.js +2 -5
  4. package/dist/_virtual/index.es7.js.map +1 -1
  5. package/dist/_virtual/index.es9.js +5 -2
  6. package/dist/_virtual/index.es9.js.map +1 -1
  7. package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
  8. package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
  9. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
  10. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
  11. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
  12. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
  13. package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
  14. package/dist/shared/node_modules/react-is/index.es.js +1 -1
  15. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
  16. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
  17. package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
  18. package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
  19. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
  20. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
  21. package/dist/shared/src/api/generated/graphql.cjs.js +2 -2
  22. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  23. package/dist/shared/src/api/generated/graphql.es.js +2 -2
  24. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  25. package/dist/shared/src/api/generated/graphqlLinks.cjs.js.map +1 -1
  26. package/dist/shared/src/api/generated/graphqlLinks.es.js.map +1 -1
  27. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js +1 -1
  28. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js.map +1 -1
  29. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js +7 -7
  30. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
  31. package/dist/shared/src/containers/Feed/Feed.cjs.js +1 -1
  32. package/dist/shared/src/containers/Feed/Feed.cjs.js.map +1 -1
  33. package/dist/shared/src/containers/Feed/Feed.es.js +95 -93
  34. package/dist/shared/src/containers/Feed/Feed.es.js.map +1 -1
  35. package/dist/shared/src/containers/Feed/components/ActivityDate.cjs.js +3 -3
  36. package/dist/shared/src/containers/Feed/components/ActivityDate.cjs.js.map +1 -1
  37. package/dist/shared/src/containers/Feed/components/ActivityDate.es.js +37 -35
  38. package/dist/shared/src/containers/Feed/components/ActivityDate.es.js.map +1 -1
  39. package/dist/shared/src/containers/Feed/components/ActivityItem.cjs.js +1 -1
  40. package/dist/shared/src/containers/Feed/components/ActivityItem.cjs.js.map +1 -1
  41. package/dist/shared/src/containers/Feed/components/ActivityItem.es.js +14 -13
  42. package/dist/shared/src/containers/Feed/components/ActivityItem.es.js.map +1 -1
  43. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.cjs.js +1 -1
  44. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.cjs.js.map +1 -1
  45. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.es.js +34 -38
  46. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.es.js.map +1 -1
  47. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.styled.cjs.js +13 -4
  48. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.styled.cjs.js.map +1 -1
  49. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.styled.es.js +17 -8
  50. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.styled.es.js.map +1 -1
  51. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.styled.cjs.js +2 -0
  52. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.styled.cjs.js.map +1 -1
  53. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.styled.es.js +6 -4
  54. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.styled.es.js.map +1 -1
  55. package/dist/shared/src/containers/Feed/hooks/useLastVersionReview.cjs.js +1 -1
  56. package/dist/shared/src/containers/Feed/hooks/useLastVersionReview.cjs.js.map +1 -1
  57. package/dist/shared/src/containers/Feed/hooks/useLastVersionReview.es.js +8 -8
  58. package/dist/shared/src/containers/Feed/hooks/useLastVersionReview.es.js.map +1 -1
  59. package/dist/types/api/generated/graphql.d.ts +4 -3
  60. package/dist/types/api/generated/graphqlLinks.d.ts +2 -1
  61. package/dist/types/api/queries/activities/getActivities.d.ts +77 -77
  62. package/dist/types/api/queries/activities/updateActivities.d.ts +4 -4
  63. package/dist/types/api/queries/entities/getEntity.d.ts +1 -1
  64. package/dist/types/api/queries/entities/getEntityPanel.d.ts +1 -1
  65. package/dist/types/api/queries/entities/updateEntity.d.ts +1 -1
  66. package/dist/types/api/queries/entityLists/getLists.d.ts +1 -1
  67. package/dist/types/api/queries/overview/getOverview.d.ts +1 -1
  68. package/dist/types/api/queries/project/getProject.d.ts +1 -1
  69. package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +1 -1
  70. package/dist/types/api/queries/users/getUsers.d.ts +1 -1
  71. package/dist/types/api/queries/versions/getVersionsProducts.d.ts +2 -2
  72. package/dist/types/containers/Feed/components/ActivityDate.d.ts +2 -1
  73. package/dist/types/containers/Feed/components/ActivityItem.d.ts +1 -0
  74. package/dist/types/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.d.ts +1 -0
  75. package/dist/types/containers/Feed/hooks/useGetFeedActivitiesData.d.ts +3 -3
  76. package/package.json +1 -1
@@ -1,23 +1,23 @@
1
1
  import { j as r } from "../../../../_virtual/jsx-runtime.es.js";
2
- import { useMemo as _, useEffect as ft, useRef as gt, useCallback as B } from "react";
3
- import ht from "./components/ActivityItem.es.js";
4
- import yt from "./components/CommentInput/CommentInput.es.js";
5
- import { FeedContainer as vt, FeedContent as xt, LoadMore as kt } from "./Feed.styled.es.js";
6
- import Ct from "./hooks/useCommentMutations.es.js";
7
- import wt from "./hooks/useTransformActivities.es.js";
8
- import { InView as It } from "../../../../node_modules/react-intersection-observer/dist/index.es.js";
9
- import Ft from "./hooks/useSaveScrollPos.es.js";
10
- import bt from "./hooks/useScrollOnInputOpen.es.js";
11
- import { getLoadingPlaceholders as At } from "./feedHelpers.es.js";
2
+ import { useMemo as _, useEffect as gt, useRef as ht, useCallback as B } from "react";
3
+ import yt from "./components/ActivityItem.es.js";
4
+ import vt from "./components/CommentInput/CommentInput.es.js";
5
+ import { FeedContainer as xt, FeedContent as kt, LoadMore as Ct } from "./Feed.styled.es.js";
6
+ import wt from "./hooks/useCommentMutations.es.js";
7
+ import It from "./hooks/useTransformActivities.es.js";
8
+ import { InView as Ft } from "../../../../node_modules/react-intersection-observer/dist/index.es.js";
9
+ import bt from "./hooks/useSaveScrollPos.es.js";
10
+ import At from "./hooks/useScrollOnInputOpen.es.js";
11
+ import { getLoadingPlaceholders as Mt } from "./feedHelpers.es.js";
12
12
  import "@ynput/ayon-react-components";
13
- import Mt from "clsx";
14
- import jt from "./hooks/useScrollToHighlighted.es.js";
15
- import { isFilePreviewable as Pt } from "./components/FileUploadPreview/FileUploadPreview.es.js";
16
- import { EmptyPlaceholder as Rt } from "../../components/EmptyPlaceholder/EmptyPlaceholder.es.js";
13
+ import jt from "clsx";
14
+ import Pt from "./hooks/useScrollToHighlighted.es.js";
15
+ import { isFilePreviewable as Rt } from "./components/FileUploadPreview/FileUploadPreview.es.js";
16
+ import { EmptyPlaceholder as Lt } from "../../components/EmptyPlaceholder/EmptyPlaceholder.es.js";
17
17
  import "../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.es.js";
18
- import { useFeedContext as Lt, FEED_NEW_COMMENT as C } from "./context/FeedContext.es.js";
18
+ import { useFeedContext as Et, FEED_NEW_COMMENT as C } from "./context/FeedContext.es.js";
19
19
  import "../../context/RemoteModulesContext.es.js";
20
- import { useDetailsPanelContext as Et } from "../../context/DetailsPanelContext.es.js";
20
+ import { useDetailsPanelContext as Nt } from "../../context/DetailsPanelContext.es.js";
21
21
  import "../../../../_virtual/runtime.es.js";
22
22
  import "../../../../_virtual/semver.es.js";
23
23
  import "../../api/base/client.es.js";
@@ -93,7 +93,7 @@ import "../../api/queries/folders/getFolderDeleteInfo.es.js";
93
93
  import "../../api/queries/grouping/getGrouping.es.js";
94
94
  import "../../api/queries/links/updateLinks.es.js";
95
95
  import "../../api/queries/links/getLinks.es.js";
96
- import { useGetMyProjectPermissionsQuery as Nt } from "../../api/queries/permissions/getPermissions.es.js";
96
+ import { useGetMyProjectPermissionsQuery as Ot } from "../../api/queries/permissions/getPermissions.es.js";
97
97
  import "../../api/queries/products/createProduct.es.js";
98
98
  import "../../api/queries/products/getFolderProducts.es.js";
99
99
  import "../../api/queries/project/getProject.es.js";
@@ -138,10 +138,10 @@ import "../../context/GlobalContext.es.js";
138
138
  import "../../context/ProjectContext.es.js";
139
139
  import "../../context/ProjectFoldersContext.es.js";
140
140
  import "../../context/UriContext.es.js";
141
- import Ot from "./helpers/mergeAnnotationAttachments.es.js";
142
- import Tt from "../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.es.js";
143
- import { useLastVersionReview as St } from "./hooks/useLastVersionReview.es.js";
144
- const Io = 30, Dt = [
141
+ import Tt from "./helpers/mergeAnnotationAttachments.es.js";
142
+ import St from "../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.es.js";
143
+ import { useLastVersionReview as Dt } from "./hooks/useLastVersionReview.es.js";
144
+ const Fo = 30, Vt = [
145
145
  {
146
146
  id: "comments",
147
147
  tooltip: "Comments",
@@ -162,16 +162,16 @@ const Io = 30, Dt = [
162
162
  tooltip: "Entity updates",
163
163
  icon: "arrow_circle_right"
164
164
  }
165
- ], Fo = ({
165
+ ], bo = ({
166
166
  disabled: H,
167
- readOnly: W,
168
- statuses: q = [],
169
- entityListId: G,
167
+ readOnly: G,
168
+ statuses: W = [],
169
+ entityListId: q,
170
170
  isSlideOut: Q,
171
171
  versionReview: w = !1
172
172
  }) => {
173
173
  const {
174
- projectName: n,
174
+ projectName: s,
175
175
  entities: l,
176
176
  entityType: d,
177
177
  editingId: I,
@@ -179,37 +179,38 @@ const Io = 30, Dt = [
179
179
  setEditingId: b,
180
180
  userName: A,
181
181
  activitiesData: h,
182
- isLoadingNew: s,
182
+ isLoadingNew: m,
183
183
  isLoadingNextPage: M,
184
184
  loadNextPage: c,
185
185
  hasNextPage: U,
186
186
  users: z,
187
187
  feedFilter: p,
188
- setFeedFilter: J
189
- } = Lt(), {
190
- openSlideOut: K,
188
+ setFeedFilter: J,
189
+ isGuest: K
190
+ } = Et(), {
191
+ openSlideOut: X,
191
192
  highlightedActivities: y,
192
- setHighlightedActivities: X,
193
- onOpenImage: Y,
193
+ setHighlightedActivities: Y,
194
+ onOpenImage: Z,
194
195
  setFeedAnnotations: j,
195
196
  user: P
196
- } = Et(), Z = p.conditions?.some(
197
+ } = Nt(), $ = p.conditions?.some(
197
198
  (t) => "key" in t && t.key === "versions" && t.value === !0
198
- ), $ = p.conditions?.some(
199
+ ), tt = p.conditions?.some(
199
200
  (t) => "key" in t && ["comments", "checklists", "versions", "updates"].includes(t.key) && t.value === !0
200
201
  ), R = p.conditions?.some(
201
202
  (t) => "key" in t && (t.key === "comments" || t.key === "checklists") && t.value === !0
202
203
  ), {
203
204
  data: L,
204
- isLoading: tt
205
- } = Nt(
206
- { projectName: n },
207
- { skip: !n }
208
- ), it = !P.data?.isManager && !P.data?.isAdmin && !tt && L?.activities?.enabled && !L?.activities?.activities?.includes("comment") || $ && !R, u = _(
209
- () => Ot(h),
205
+ isLoading: it
206
+ } = Ot(
207
+ { projectName: s },
208
+ { skip: !s }
209
+ ), et = !P.data?.isManager && !P.data?.isAdmin && !it && L?.activities?.enabled && !L?.activities?.activities?.includes("comment") || tt && !R, u = _(
210
+ () => Tt(h),
210
211
  [h]
211
212
  );
212
- ft(() => {
213
+ gt(() => {
213
214
  u.length || j([]);
214
215
  const t = u.map(
215
216
  (i) => i.activityData?.annotations?.map((e) => ({
@@ -219,7 +220,7 @@ const Io = 30, Dt = [
219
220
  ).filter(Boolean).flat();
220
221
  j(t);
221
222
  }, [u]);
222
- const f = wt(
223
+ const f = It(
223
224
  // @ts-ignore
224
225
  u,
225
226
  z,
@@ -227,17 +228,17 @@ const Io = 30, Dt = [
227
228
  d,
228
229
  A,
229
230
  p
230
- ), a = gt(null);
231
- bt({ feedRef: a, isInputOpen: I === C, height: 93 }), Ft({
231
+ ), a = ht(null);
232
+ At({ feedRef: a, isInputOpen: I === C, height: 93 }), bt({
232
233
  entities: l,
233
234
  feedRef: a,
234
235
  filter: p,
235
236
  disabled: !!y.length,
236
- isLoading: s
237
- }), jt({
237
+ isLoading: m
238
+ }), Pt({
238
239
  feedRef: a,
239
240
  highlighted: y,
240
- isLoading: s || M,
241
+ isLoading: m || M,
241
242
  loadNextPage: c,
242
243
  hasNextPage: !!c,
243
244
  activities: h
@@ -245,16 +246,16 @@ const Io = 30, Dt = [
245
246
  const {
246
247
  submitComment: E,
247
248
  updateComment: N,
248
- deleteComment: et,
249
+ deleteComment: ot,
249
250
  submitReview: O,
250
- isSaving: ot
251
- } = Ct({
252
- projectName: n,
251
+ isSaving: rt
252
+ } = wt({
253
+ projectName: s,
253
254
  entityType: d,
254
255
  entities: l,
255
256
  filter: p,
256
- entityListId: G
257
- }), rt = B(
257
+ entityListId: q
258
+ }), st = B(
258
259
  async (t, i = [], e = {}) => {
259
260
  await E(t, i, e), a.current && a.current.scrollTo({ top: 0 });
260
261
  },
@@ -264,111 +265,112 @@ const Io = 30, Dt = [
264
265
  }, [O]), mt = (t, i) => {
265
266
  const e = t?.target;
266
267
  if (!e || !i) return console.log("no target or activity");
267
- const o = e.checked, m = o ? "[ ]" : "[x]", ct = o ? "[x]" : "[ ]", { body: g } = i, T = Array.from(
268
+ const o = e.checked, n = o ? "[ ]" : "[x]", dt = o ? "[x]" : "[ ]", { body: g } = i, T = Array.from(
268
269
  e.closest(".comment-body")?.querySelectorAll(".task-list-item") || []
269
270
  ).findIndex((k) => k === e.closest("li"));
270
271
  let S = T;
271
- (g.match(/\[.\]/g) || []).forEach((k, ut) => {
272
- k !== m && ut < T && S--;
272
+ (g.match(/\[.\]/g) || []).forEach((k, ft) => {
273
+ k !== n && ft < T && S--;
273
274
  });
274
275
  const D = [];
275
276
  let v = -1;
276
- for (; (v = g.indexOf(m, v + 1)) > -1; )
277
+ for (; (v = g.indexOf(n, v + 1)) > -1; )
277
278
  D.push(v);
278
279
  const x = D[S];
279
280
  if (x === void 0) return;
280
- const dt = x + m.length, V = g.slice(0, x) + ct + g.slice(dt);
281
+ const ut = x + n.length, V = g.slice(0, x) + dt + g.slice(ut);
281
282
  V && N(i, V, i.files);
282
- }, st = (t) => {
283
+ }, pt = (t) => {
283
284
  const { entityId: i, entityType: e, activityId: o } = t;
284
285
  if (!e || !["version", "task", "folder"].includes(e))
285
286
  return console.log("Entity type not supported yet");
286
- if (!i || !e || !n) return console.log("No entity id or type found");
287
- K({ entityId: i, entityType: e, projectName: n }), X([o]);
288
- }, pt = ({ index: t, activityId: i }) => {
287
+ if (!i || !e || !s) return console.log("No entity id or type found");
288
+ X({ entityId: i, entityType: e, projectName: s }), Y([o]);
289
+ }, at = ({ index: t, activityId: i }) => {
289
290
  const e = Object.values(f).reverse().filter((o) => o.activityType == "comment").map((o) => ({
290
291
  id: o.activityId,
291
- files: o.files.filter((m) => Pt(m.mime, m.ext))
292
+ files: o.files.filter((n) => Rt(n.mime, n.ext))
292
293
  })).filter((o) => o.files.length > 0);
293
- Y?.({ files: e, activityId: i, index: t, projectName: n });
294
- }, at = _(() => At(10), []), lt = St({
295
- projectName: n,
294
+ Z?.({ files: e, activityId: i, index: t, projectName: s });
295
+ }, lt = _(() => Mt(10), []), ct = Dt({
296
+ projectName: s,
296
297
  enabled: w,
297
298
  entityIds: l.map((t) => t.id),
298
299
  activities: f,
299
- loadingActivities: s,
300
+ loadingActivities: m,
300
301
  userName: A
301
302
  });
302
- return /* @__PURE__ */ r.jsx(r.Fragment, { children: /* @__PURE__ */ r.jsxs(vt, { className: "feed", children: [
303
+ return /* @__PURE__ */ r.jsx(r.Fragment, { children: /* @__PURE__ */ r.jsxs(xt, { className: "feed", children: [
303
304
  void 0,
304
305
  /* @__PURE__ */ r.jsx(
305
- Tt,
306
+ St,
306
307
  {
307
308
  label: "Activity Feed",
308
- filters: Dt,
309
+ filters: Vt,
309
310
  currentFilter: p,
310
311
  onFilterChange: J,
311
- isLoading: s
312
+ isLoading: m
312
313
  }
313
314
  ),
314
- /* @__PURE__ */ r.jsxs(xt, { ref: a, className: Mt({ loading: s }, "no-shimmer"), children: [
315
- s ? at : f.map((t) => /* @__PURE__ */ r.jsx(
316
- ht,
315
+ /* @__PURE__ */ r.jsxs(kt, { ref: a, className: jt({ loading: m }, "no-shimmer"), children: [
316
+ m ? lt : f.map((t) => /* @__PURE__ */ r.jsx(
317
+ yt,
317
318
  {
318
319
  activity: t,
319
320
  onCheckChange: mt,
320
- onDelete: et,
321
- onUpdate: async (i, e, o, m) => await N(t, i, e, m),
321
+ onDelete: ot,
322
+ onUpdate: async (i, e, o, n) => await N(t, i, e, n),
322
323
  projectInfo: F,
323
- projectName: n,
324
+ projectName: s,
324
325
  entityType: d,
325
- onReferenceClick: st,
326
+ onReferenceClick: pt,
326
327
  createdAts: l.map((i) => i.createdAt),
327
- onFileExpand: pt,
328
+ onFileExpand: at,
328
329
  showOrigin: l.length > 1,
329
330
  filter: p,
330
331
  editProps: {
331
- projectName: n,
332
+ projectName: s,
332
333
  entities: l,
333
334
  entityType: d
334
335
  },
335
336
  isHighlighted: y.includes(t.activityId),
336
- readOnly: W,
337
- statuses: q,
338
- isSlideOut: Q
337
+ readOnly: G,
338
+ statuses: W,
339
+ isSlideOut: Q,
340
+ isGuest: K
339
341
  },
340
342
  t.activityId
341
343
  )),
342
- f.length === 0 && Z && !R && !s && /* @__PURE__ */ r.jsx(Rt, { message: "No versions published yet", icon: "layers" }),
344
+ f.length === 0 && $ && !R && !m && /* @__PURE__ */ r.jsx(Lt, { message: "No versions published yet", icon: "layers" }),
343
345
  U && c && /* @__PURE__ */ r.jsx(
344
- It,
346
+ Ft,
345
347
  {
346
348
  root: a.current,
347
349
  onChange: (t) => t && c(),
348
350
  rootMargin: "400px 0px 0px 0px",
349
- children: /* @__PURE__ */ r.jsx(kt, { style: { height: 0 }, onClick: () => c(), children: M ? "Loading more..." : "Click to load more" })
351
+ children: /* @__PURE__ */ r.jsx(Ct, { style: { height: 0 }, onClick: () => c(), children: M ? "Loading more..." : "Click to load more" })
350
352
  }
351
353
  )
352
354
  ] }),
353
- !it && /* @__PURE__ */ r.jsx(
354
- yt,
355
+ !et && /* @__PURE__ */ r.jsx(
356
+ vt,
355
357
  {
356
358
  initValue: null,
357
- onSubmit: rt,
359
+ onSubmit: st,
358
360
  isOpen: I === C,
359
361
  onClose: () => b(null),
360
362
  onOpen: () => b(C),
361
363
  disabled: H,
362
- isLoading: s || !l.length || ot,
364
+ isLoading: m || !l.length || rt,
363
365
  versionReview: w,
364
- lastOwnVersionReview: lt,
366
+ lastOwnVersionReview: ct,
365
367
  onReview: nt
366
368
  }
367
369
  )
368
370
  ] }) });
369
371
  };
370
372
  export {
371
- Fo as Feed,
372
- Io as activitiesLast
373
+ bo as Feed,
374
+ Fo as activitiesLast
373
375
  };
374
376
  //# sourceMappingURL=Feed.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.es.js","sources":["../../../../../src/containers/Feed/Feed.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react'\nimport ActivityItem from './components/ActivityItem'\nimport CommentInput, { VersionReviewFeedback } 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, useGetMyProjectPermissionsQuery } from '@shared/api'\nimport mergeAnnotationAttachments from './helpers/mergeAnnotationAttachments'\nimport { SavedAnnotationMetadata } from '.'\nimport TabHeaderAndFilters, {\n FilterItem,\n} from '../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters'\nimport { useLastVersionReview } from './hooks/useLastVersionReview'\n\n// number of activities to get\nexport const activitiesLast = 30\n\nconst feedFilters: FilterItem<string>[] = [\n {\n id: 'comments',\n tooltip: 'Comments',\n icon: 'chat',\n },\n {\n id: 'checklists',\n tooltip: 'Checklists',\n icon: 'checklist',\n },\n {\n id: 'versions',\n tooltip: 'Published versions',\n icon: 'layers',\n },\n {\n id: 'updates',\n tooltip: 'Entity updates',\n icon: 'arrow_circle_right',\n },\n]\n\nexport type FeedProps = {\n disabled?: boolean\n readOnly: boolean\n statuses: Status[]\n entityListId?: string | undefined\n isSlideOut?: boolean\n versionReview?: boolean\n}\n\nexport const Feed = ({\n disabled,\n readOnly,\n statuses = [],\n entityListId,\n isSlideOut,\n versionReview = false,\n}: 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 feedFilter,\n setFeedFilter,\n } = useFeedContext()\n\n const {\n openSlideOut,\n highlightedActivities,\n setHighlightedActivities,\n onOpenImage,\n setFeedAnnotations,\n user,\n } = useDetailsPanelContext()\n\n const isVersionsFilter = feedFilter.conditions?.some(\n (c) => 'key' in c && c.key === 'versions' && c.value === true,\n )\n const hasActiveFilters = feedFilter.conditions?.some(\n (c) => 'key' in c && ['comments', 'checklists', 'versions', 'updates'].includes(c.key) && c.value === true,\n )\n const hasCommentLikeFilter = feedFilter.conditions?.some(\n (c) => 'key' in c && (c.key === 'comments' || c.key === 'checklists') && c.value === true,\n )\n\n // check activities permission for commenting\n const {\n data: projectPermissions,\n isLoading: isLoadingPermissions,\n } = useGetMyProjectPermissionsQuery(\n { projectName },\n { skip: !projectName },\n )\n const isCommentRestricted =\n !user.data?.isManager &&\n !user.data?.isAdmin &&\n !isLoadingPermissions &&\n projectPermissions?.activities?.enabled &&\n !projectPermissions?.activities?.activities?.includes('comment')\n\n // hide comment input for specific filters or when restricted by permissions\n const hideCommentInput = isCommentRestricted || (hasActiveFilters && !hasCommentLikeFilter)\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 feedFilter,\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: feedFilter,\n disabled: !!highlightedActivities.length,\n isLoading: isLoadingNew,\n })\n // try and scroll to highlightedActivities activity\n useScrollToHighlighted({\n feedRef,\n highlighted: highlightedActivities,\n isLoading: isLoadingNew || isLoadingNextPage,\n loadNextPage,\n hasNextPage: !!loadNextPage,\n activities: activitiesData,\n })\n\n // comment mutations here!\n const {\n submitComment: submitCommentMutation,\n updateComment,\n deleteComment,\n submitReview: submitReviewMutation,\n isSaving,\n } = useCommentMutations({\n projectName,\n entityType: entityType,\n entities,\n filter: feedFilter,\n entityListId,\n })\n\n // wrap submitComment to scroll to bottom\n const submitComment = useCallback(\n async (value: string, files: any[] = [], data: any = {}) => {\n await submitCommentMutation(value, files, data)\n // scroll to bottom (scrollTop 0 is bottom because of column-reverse)\n if (feedRef.current) {\n ;(feedRef.current as any).scrollTo({ top: 0 })\n }\n },\n [submitCommentMutation, feedRef],\n )\n\n const submitReview = useCallback(async (feedback: VersionReviewFeedback) => {\n await submitReviewMutation(feedback)\n }, [submitReviewMutation])\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 const lastVersionReview = useLastVersionReview({\n projectName,\n enabled: versionReview,\n entityIds: entities.map(e => e.id),\n activities: transformedActivitiesData,\n loadingActivities: isLoadingNew,\n userName,\n })\n\n let warningMessage\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 <TabHeaderAndFilters\n label=\"Activity Feed\"\n filters={feedFilters}\n currentFilter={feedFilter}\n onFilterChange={setFeedFilter}\n isLoading={isLoadingNew}\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, data) =>\n await updateComment(activity, value, files, data)\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={feedFilter}\n editProps={{\n projectName,\n entities: entities,\n entityType,\n }}\n isHighlighted={highlightedActivities.includes(activity.activityId)}\n readOnly={readOnly}\n statuses={statuses}\n isSlideOut={isSlideOut}\n />\n ))}\n {/* message when no versions published */}\n {transformedActivitiesData.length === 0 &&\n isVersionsFilter &&\n !hasCommentLikeFilter &&\n !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={disabled}\n isLoading={isLoadingNew || !entities.length || isSaving}\n versionReview={versionReview}\n lastOwnVersionReview={lastVersionReview}\n onReview={submitReview}\n />\n )}\n </Styled.FeedContainer>\n </>\n )\n}\n"],"names":["activitiesLast","feedFilters","Feed","disabled","readOnly","statuses","entityListId","isSlideOut","versionReview","projectName","entities","entityType","editingId","projectInfo","setEditingId","userName","activitiesData","isLoadingNew","isLoadingNextPage","loadNextPage","hasNextPage","users","feedFilter","setFeedFilter","useFeedContext","openSlideOut","highlightedActivities","setHighlightedActivities","onOpenImage","setFeedAnnotations","user","useDetailsPanelContext","isVersionsFilter","c","hasActiveFilters","hasCommentLikeFilter","projectPermissions","isLoadingPermissions","useGetMyProjectPermissionsQuery","hideCommentInput","activitiesWithMergedAnnotations","useMemo","mergeAnnotationAttachments","useEffect","annotations","activity","a","transformedActivitiesData","useTransformActivities","feedRef","useRef","useScrollOnInputOpen","FEED_NEW_COMMENT","useSaveScrollPos","useScrollToHighlighted","submitCommentMutation","updateComment","deleteComment","submitReviewMutation","isSaving","useCommentMutations","submitComment","useCallback","value","files","data","submitReview","feedback","handleCommentChecked","e","target","checked","currentMarkdown","newMarkdown","body","taskIndex","li","replaceIndex","markdown","index","indexesOfCurrentMarkdownInBody","indexToReplaceInBody","endReplaceIndex","newBody","handleRefClick","ref","entityId","activityId","handleFileExpand","previewableFiles","file","isFilePreviewable","loadingPlaceholders","getLoadingPlaceholders","lastVersionReview","useLastVersionReview","jsxs","Styled.FeedContainer","jsx","TabHeaderAndFilters","Styled.FeedContent","clsx","ActivityItem","_refs","EmptyPlaceholder","InView","inView","Styled.LoadMore","CommentInput"],"mappings":"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"}
1
+ {"version":3,"file":"Feed.es.js","sources":["../../../../../src/containers/Feed/Feed.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react'\nimport ActivityItem from './components/ActivityItem'\nimport CommentInput, { VersionReviewFeedback } 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, useGetMyProjectPermissionsQuery } from '@shared/api'\nimport mergeAnnotationAttachments from './helpers/mergeAnnotationAttachments'\nimport { SavedAnnotationMetadata } from '.'\nimport TabHeaderAndFilters, {\n FilterItem,\n} from '../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters'\nimport { useLastVersionReview } from './hooks/useLastVersionReview'\n\n// number of activities to get\nexport const activitiesLast = 30\n\nconst feedFilters: FilterItem<string>[] = [\n {\n id: 'comments',\n tooltip: 'Comments',\n icon: 'chat',\n },\n {\n id: 'checklists',\n tooltip: 'Checklists',\n icon: 'checklist',\n },\n {\n id: 'versions',\n tooltip: 'Published versions',\n icon: 'layers',\n },\n {\n id: 'updates',\n tooltip: 'Entity updates',\n icon: 'arrow_circle_right',\n },\n]\n\nexport type FeedProps = {\n disabled?: boolean\n readOnly: boolean\n statuses: Status[]\n entityListId?: string | undefined\n isSlideOut?: boolean\n versionReview?: boolean\n}\n\nexport const Feed = ({\n disabled,\n readOnly,\n statuses = [],\n entityListId,\n isSlideOut,\n versionReview = false,\n}: 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 feedFilter,\n setFeedFilter,\n isGuest,\n } = useFeedContext()\n\n const {\n openSlideOut,\n highlightedActivities,\n setHighlightedActivities,\n onOpenImage,\n setFeedAnnotations,\n user,\n } = useDetailsPanelContext()\n\n const isVersionsFilter = feedFilter.conditions?.some(\n (c) => 'key' in c && c.key === 'versions' && c.value === true,\n )\n const hasActiveFilters = feedFilter.conditions?.some(\n (c) => 'key' in c && ['comments', 'checklists', 'versions', 'updates'].includes(c.key) && c.value === true,\n )\n const hasCommentLikeFilter = feedFilter.conditions?.some(\n (c) => 'key' in c && (c.key === 'comments' || c.key === 'checklists') && c.value === true,\n )\n\n // check activities permission for commenting\n const {\n data: projectPermissions,\n isLoading: isLoadingPermissions,\n } = useGetMyProjectPermissionsQuery(\n { projectName },\n { skip: !projectName },\n )\n const isCommentRestricted =\n !user.data?.isManager &&\n !user.data?.isAdmin &&\n !isLoadingPermissions &&\n projectPermissions?.activities?.enabled &&\n !projectPermissions?.activities?.activities?.includes('comment')\n\n // hide comment input for specific filters or when restricted by permissions\n const hideCommentInput = isCommentRestricted || (hasActiveFilters && !hasCommentLikeFilter)\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 feedFilter,\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: feedFilter,\n disabled: !!highlightedActivities.length,\n isLoading: isLoadingNew,\n })\n // try and scroll to highlightedActivities activity\n useScrollToHighlighted({\n feedRef,\n highlighted: highlightedActivities,\n isLoading: isLoadingNew || isLoadingNextPage,\n loadNextPage,\n hasNextPage: !!loadNextPage,\n activities: activitiesData,\n })\n\n // comment mutations here!\n const {\n submitComment: submitCommentMutation,\n updateComment,\n deleteComment,\n submitReview: submitReviewMutation,\n isSaving,\n } = useCommentMutations({\n projectName,\n entityType: entityType,\n entities,\n filter: feedFilter,\n entityListId,\n })\n\n // wrap submitComment to scroll to bottom\n const submitComment = useCallback(\n async (value: string, files: any[] = [], data: any = {}) => {\n await submitCommentMutation(value, files, data)\n // scroll to bottom (scrollTop 0 is bottom because of column-reverse)\n if (feedRef.current) {\n ;(feedRef.current as any).scrollTo({ top: 0 })\n }\n },\n [submitCommentMutation, feedRef],\n )\n\n const submitReview = useCallback(async (feedback: VersionReviewFeedback) => {\n await submitReviewMutation(feedback)\n }, [submitReviewMutation])\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 const lastVersionReview = useLastVersionReview({\n projectName,\n enabled: versionReview,\n entityIds: entities.map(e => e.id),\n activities: transformedActivitiesData,\n loadingActivities: isLoadingNew,\n userName,\n })\n\n let warningMessage\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 <TabHeaderAndFilters\n label=\"Activity Feed\"\n filters={feedFilters}\n currentFilter={feedFilter}\n onFilterChange={setFeedFilter}\n isLoading={isLoadingNew}\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, data) =>\n await updateComment(activity, value, files, data)\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={feedFilter}\n editProps={{\n projectName,\n entities: entities,\n entityType,\n }}\n isHighlighted={highlightedActivities.includes(activity.activityId)}\n readOnly={readOnly}\n statuses={statuses}\n isSlideOut={isSlideOut}\n isGuest={isGuest}\n />\n ))}\n {/* message when no versions published */}\n {transformedActivitiesData.length === 0 &&\n isVersionsFilter &&\n !hasCommentLikeFilter &&\n !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={disabled}\n isLoading={isLoadingNew || !entities.length || isSaving}\n versionReview={versionReview}\n lastOwnVersionReview={lastVersionReview}\n onReview={submitReview}\n />\n )}\n </Styled.FeedContainer>\n </>\n )\n}\n"],"names":["activitiesLast","feedFilters","Feed","disabled","readOnly","statuses","entityListId","isSlideOut","versionReview","projectName","entities","entityType","editingId","projectInfo","setEditingId","userName","activitiesData","isLoadingNew","isLoadingNextPage","loadNextPage","hasNextPage","users","feedFilter","setFeedFilter","isGuest","useFeedContext","openSlideOut","highlightedActivities","setHighlightedActivities","onOpenImage","setFeedAnnotations","user","useDetailsPanelContext","isVersionsFilter","c","hasActiveFilters","hasCommentLikeFilter","projectPermissions","isLoadingPermissions","useGetMyProjectPermissionsQuery","hideCommentInput","activitiesWithMergedAnnotations","useMemo","mergeAnnotationAttachments","useEffect","annotations","activity","a","transformedActivitiesData","useTransformActivities","feedRef","useRef","useScrollOnInputOpen","FEED_NEW_COMMENT","useSaveScrollPos","useScrollToHighlighted","submitCommentMutation","updateComment","deleteComment","submitReviewMutation","isSaving","useCommentMutations","submitComment","useCallback","value","files","data","submitReview","feedback","handleCommentChecked","e","target","checked","currentMarkdown","newMarkdown","body","taskIndex","li","replaceIndex","markdown","index","indexesOfCurrentMarkdownInBody","indexToReplaceInBody","endReplaceIndex","newBody","handleRefClick","ref","entityId","activityId","handleFileExpand","previewableFiles","file","isFilePreviewable","loadingPlaceholders","getLoadingPlaceholders","lastVersionReview","useLastVersionReview","jsxs","Styled.FeedContainer","jsx","TabHeaderAndFilters","Styled.FeedContent","clsx","ActivityItem","_refs","EmptyPlaceholder","InView","inView","Styled.LoadMore","CommentInput"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const g=require("../../../../../_virtual/jsx-runtime.cjs.js"),t=require("date-fns"),v=require("clsx"),F=require("styled-components"),u=require("react"),R=require("@ynput/ayon-react-components"),m=1e4,x=F.span`
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const R=require("../../../../../_virtual/jsx-runtime.cjs.js"),s=require("date-fns"),h=require("clsx"),x=require("styled-components"),o=require("react"),q=require("@ynput/ayon-react-components"),f=1e4,_=x.span`
2
2
  margin-left: auto;
3
3
  color: var(--md-sys-color-outline);
4
4
  user-select: none;
@@ -11,6 +11,6 @@
11
11
  min-width: 0;
12
12
  max-width: fit-content;
13
13
 
14
- ${R.theme.bodySmall}
15
- `,d=n=>{let e=t.formatDistanceToNow(n,{addSuffix:!0});return e=e.replace("about",""),e=e.replace("minutes","mins"),e=e.replace("minute","min"),e=e.replace(" ago",""),t.isSameMinute(n,new Date)&&(e="Just now"),e},h=({date:n,isExact:e,...y})=>{const[r,i]=u.useState(!0),[a,f]=u.useState(new Date);if(!n)return null;const s=new Date(n);if(!t.isValid(s))return null;u.useEffect(()=>{const E=setInterval(()=>f(new Date),m);return()=>clearInterval(E)},[]);const M=t.isToday(s),S=t.isSameYear(s,a),l=t.isSameDay(s,new Date(a.setDate(a.getDate()-1))),w=t.isSameWeek(s,a),D=t.isSameMinute(s,a),p=l?"":S?w?"E":"MMM d":"MMM d yyyy",c="h:mm a";let o=r&&!e?M?d(s):t.format(s,`${p}, ${c}`):t.format(s,`EEEE, dd MMM yyyy ${c}`);l&&r&&!e&&(o=`Yesterday${o}`),D&&(o="Just now");const z=()=>{i(!r)};return g.jsxRuntimeExports.jsx(x,{className:v("date"),...y,onClick:z,onMouseOver:()=>i(!1),onMouseOut:()=>i(!0),children:o})};exports.REFRESH_INTERVAL_MS=m;exports.default=h;exports.getFuzzyDate=d;
14
+ ${q.theme.bodySmall}
15
+ `,M=n=>{let e=s.formatDistanceToNow(n,{addSuffix:!0});return e=e.replace("about",""),e=e.replace("minutes","mins"),e=e.replace("minute","min"),e=e.replace(" ago",""),s.isSameMinute(n,new Date)&&(e="Just now"),e},b=({date:n,isExact:e,exactTooltip:i=!1,...S})=>{const[u,l]=o.useState(!0),[a,w]=o.useState(new Date);if(!n)return null;const t=new Date(n);if(!s.isValid(t))return null;o.useEffect(()=>{const F=setInterval(()=>w(new Date),f);return()=>clearInterval(F)},[]);const c=s.isToday(t),D=s.isSameYear(t,a),m=s.isSameDay(t,new Date(a.setDate(a.getDate()-1))),z=s.isSameWeek(t,a),p=s.isSameMinute(t,a),E=m?"":D?z?"E":"MMM d":"MMM d yyyy",d="h:mm a",g=o.useMemo(()=>M(t),[t]),y=o.useMemo(()=>c?s.format(t,`${E}, ${d}`):s.format(t,`EEEE, dd MMM yyyy ${d}`),[t,c]);let r=u&&!e?g:y;m&&u&&!e&&(r=`Yesterday${r}`),p&&(r="Just now");const v=()=>{l(!u)};return R.jsxRuntimeExports.jsx(_,{className:h("date"),...S,onClick:v,onMouseOver:()=>!i&&l(!1),onMouseOut:()=>!i&&l(!0),"data-tooltip":i?y:null,"data-tooltip-delay":0,children:r})};exports.REFRESH_INTERVAL_MS=f;exports.default=b;exports.getFuzzyDate=M;
16
16
  //# sourceMappingURL=ActivityDate.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityDate.cjs.js","sources":["../../../../../../src/containers/Feed/components/ActivityDate.tsx"],"sourcesContent":["import {\n format,\n formatDistanceToNow,\n isValid,\n isToday,\n isSameYear,\n isSameDay,\n isSameWeek,\n isSameMinute,\n} from 'date-fns'\nimport clsx from 'clsx'\nimport styled from 'styled-components'\nimport { useEffect, useState } from 'react'\nimport { theme } from '@ynput/ayon-react-components'\n\nexport const REFRESH_INTERVAL_MS = 10_000\n\nconst DateStyled = styled.span`\n margin-left: auto;\n color: var(--md-sys-color-outline);\n user-select: none;\n white-space: nowrap;\n display: flex;\n align-items: center;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 3;\n min-width: 0;\n max-width: fit-content;\n\n ${theme.bodySmall}\n`\n\nexport const getFuzzyDate = (date: Date) => {\n let fuzzyDate = formatDistanceToNow(date, { addSuffix: true })\n\n // remove 'about' from the string\n fuzzyDate = fuzzyDate.replace('about', '')\n // replace minutes with min\n fuzzyDate = fuzzyDate.replace('minutes', 'mins')\n fuzzyDate = fuzzyDate.replace('minute', 'min')\n // remove the word ' ago'\n fuzzyDate = fuzzyDate.replace(' ago', '')\n\n // if date is less than a minute ago, return 'Just now'\n if (isSameMinute(date, new Date())) fuzzyDate = 'Just now'\n\n return fuzzyDate\n}\n\ninterface ActivityDateProps extends React.HTMLAttributes<HTMLElement> {\n date?: string\n isExact?: boolean\n}\n\nconst ActivityDate = ({ date, isExact, ...props }: ActivityDateProps) => {\n const [isFuzzy, setIsFuzzy] = useState(true)\n const [now, setNow] = useState(new Date())\n if (!date) return null\n\n const dateObj = new Date(date)\n if (!isValid(dateObj)) return null\n\n useEffect(() => {\n const interval = setInterval(\n () => setNow(new Date()),\n REFRESH_INTERVAL_MS,\n )\n\n return () => clearInterval(interval)\n }, [])\n\n // is date over a day old?\n const today = isToday(dateObj)\n const sameYear = isSameYear(dateObj, now)\n const yesterday = isSameDay(dateObj, new Date(now.setDate(now.getDate() - 1)))\n const sameWeek = isSameWeek(dateObj, now)\n const sameMin = isSameMinute(dateObj, now)\n\n const dateFormat = yesterday ? '' : sameYear ? (sameWeek ? 'E' : 'MMM d') : 'MMM d yyyy'\n const timeFormat = 'h:mm a'\n\n let dateString =\n isFuzzy && !isExact\n ? today\n ? getFuzzyDate(dateObj)\n : format(dateObj, `${dateFormat}, ${timeFormat}`)\n : format(dateObj, `EEEE, dd MMM yyyy ${timeFormat}`)\n\n if (yesterday && isFuzzy && !isExact) dateString = `Yesterday${dateString}`\n\n // if less than a minute ago overwrite the date string\n if (sameMin) dateString = 'Just now'\n\n const toggleFuzzy = () => {\n setIsFuzzy(!isFuzzy)\n }\n\n return (\n <DateStyled\n className={clsx('date')}\n {...props}\n onClick={toggleFuzzy}\n onMouseOver={() => setIsFuzzy(false)}\n onMouseOut={() => setIsFuzzy(true)}\n >\n {dateString}\n </DateStyled>\n )\n}\n\nexport default ActivityDate\n"],"names":["REFRESH_INTERVAL_MS","DateStyled","styled","theme","getFuzzyDate","date","fuzzyDate","formatDistanceToNow","isSameMinute","ActivityDate","isExact","props","isFuzzy","setIsFuzzy","useState","now","setNow","dateObj","isValid","useEffect","interval","today","isToday","sameYear","isSameYear","yesterday","isSameDay","sameWeek","isSameWeek","sameMin","dateFormat","timeFormat","dateString","format","toggleFuzzy","jsx","clsx"],"mappings":"8SAeaA,EAAsB,IAE7BC,EAAaC,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAatBC,EAAAA,MAAM,SAAS;AAAA,EAGNC,EAAgBC,GAAe,CAC1C,IAAIC,EAAYC,EAAAA,oBAAoBF,EAAM,CAAE,UAAW,GAAM,EAG7D,OAAAC,EAAYA,EAAU,QAAQ,QAAS,EAAE,EAEzCA,EAAYA,EAAU,QAAQ,UAAW,MAAM,EAC/CA,EAAYA,EAAU,QAAQ,SAAU,KAAK,EAE7CA,EAAYA,EAAU,QAAQ,OAAQ,EAAE,EAGpCE,EAAAA,aAAaH,EAAM,IAAI,IAAM,IAAGC,EAAY,YAEzCA,CACT,EAOMG,EAAe,CAAC,CAAE,KAAAJ,EAAM,QAAAK,EAAS,GAAGC,KAA+B,CACvE,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAI,EACrC,CAACC,EAAKC,CAAM,EAAIF,EAAAA,SAAS,IAAI,IAAM,EACzC,GAAI,CAACT,EAAM,OAAO,KAElB,MAAMY,EAAU,IAAI,KAAKZ,CAAI,EAC7B,GAAI,CAACa,EAAAA,QAAQD,CAAO,EAAG,OAAO,KAE9BE,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YACf,IAAMJ,EAAO,IAAI,IAAM,EACvBhB,CAAA,EAGF,MAAO,IAAM,cAAcoB,CAAQ,CACrC,EAAG,CAAA,CAAE,EAGL,MAAMC,EAAQC,EAAAA,QAAQL,CAAO,EACvBM,EAAWC,EAAAA,WAAWP,EAASF,CAAG,EAClCU,EAAYC,EAAAA,UAAUT,EAAS,IAAI,KAAKF,EAAI,QAAQA,EAAI,UAAY,CAAC,CAAC,CAAC,EACvEY,EAAWC,EAAAA,WAAWX,EAASF,CAAG,EAClCc,EAAUrB,EAAAA,aAAaS,EAASF,CAAG,EAEnCe,EAAaL,EAAY,GAAKF,EAAYI,EAAW,IAAM,QAAW,aACtEI,EAAa,SAEnB,IAAIC,EACFpB,GAAW,CAACF,EACRW,EACEjB,EAAaa,CAAO,EACpBgB,EAAAA,OAAOhB,EAAS,GAAGa,CAAU,KAAKC,CAAU,EAAE,EAChDE,EAAAA,OAAOhB,EAAS,qBAAqBc,CAAU,EAAE,EAEnDN,GAAab,GAAW,CAACF,IAASsB,EAAa,YAAYA,CAAU,IAGrEH,IAASG,EAAa,YAE1B,MAAME,EAAc,IAAM,CACxBrB,EAAW,CAACD,CAAO,CACrB,EAEA,OACEuB,EAAAA,kBAAAA,IAAClC,EAAA,CACC,UAAWmC,EAAK,MAAM,EACrB,GAAGzB,EACJ,QAASuB,EACT,YAAa,IAAMrB,EAAW,EAAK,EACnC,WAAY,IAAMA,EAAW,EAAI,EAEhC,SAAAmB,CAAA,CAAA,CAGP"}
1
+ {"version":3,"file":"ActivityDate.cjs.js","sources":["../../../../../../src/containers/Feed/components/ActivityDate.tsx"],"sourcesContent":["import {\n format,\n formatDistanceToNow,\n isValid,\n isToday,\n isSameYear,\n isSameDay,\n isSameWeek,\n isSameMinute,\n} from 'date-fns'\nimport clsx from 'clsx'\nimport styled from 'styled-components'\nimport { useEffect, useMemo, useState } from 'react'\nimport { theme } from '@ynput/ayon-react-components'\n\nexport const REFRESH_INTERVAL_MS = 10_000\n\nconst DateStyled = styled.span`\n margin-left: auto;\n color: var(--md-sys-color-outline);\n user-select: none;\n white-space: nowrap;\n display: flex;\n align-items: center;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 3;\n min-width: 0;\n max-width: fit-content;\n\n ${theme.bodySmall}\n`\n\nexport const getFuzzyDate = (date: Date) => {\n let fuzzyDate = formatDistanceToNow(date, { addSuffix: true })\n\n // remove 'about' from the string\n fuzzyDate = fuzzyDate.replace('about', '')\n // replace minutes with min\n fuzzyDate = fuzzyDate.replace('minutes', 'mins')\n fuzzyDate = fuzzyDate.replace('minute', 'min')\n // remove the word ' ago'\n fuzzyDate = fuzzyDate.replace(' ago', '')\n\n // if date is less than a minute ago, return 'Just now'\n if (isSameMinute(date, new Date())) fuzzyDate = 'Just now'\n\n return fuzzyDate\n}\n\ninterface ActivityDateProps extends React.HTMLAttributes<HTMLElement> {\n date?: string\n isExact?: boolean\n exactTooltip?: boolean\n}\n\nconst ActivityDate = ({ date, isExact, exactTooltip = false, ...props }: ActivityDateProps) => {\n const [isFuzzy, setIsFuzzy] = useState(true)\n const [now, setNow] = useState(new Date())\n if (!date) return null\n\n const dateObj = new Date(date)\n if (!isValid(dateObj)) return null\n\n useEffect(() => {\n const interval = setInterval(\n () => setNow(new Date()),\n REFRESH_INTERVAL_MS,\n )\n\n return () => clearInterval(interval)\n }, [])\n\n // is date over a day old?\n const today = isToday(dateObj)\n const sameYear = isSameYear(dateObj, now)\n const yesterday = isSameDay(dateObj, new Date(now.setDate(now.getDate() - 1)))\n const sameWeek = isSameWeek(dateObj, now)\n const sameMin = isSameMinute(dateObj, now)\n\n const dateFormat = yesterday ? '' : sameYear ? (sameWeek ? 'E' : 'MMM d') : 'MMM d yyyy'\n const timeFormat = 'h:mm a'\n\n const fuzzyDate = useMemo(() => getFuzzyDate(dateObj), [dateObj])\n const exactDate = useMemo(() => {\n if (today) return format(dateObj, `${dateFormat}, ${timeFormat}`)\n return format(dateObj, `EEEE, dd MMM yyyy ${timeFormat}`)\n }, [dateObj, today])\n\n let dateString =\n isFuzzy && !isExact\n ? fuzzyDate\n : exactDate\n\n if (yesterday && isFuzzy && !isExact) dateString = `Yesterday${dateString}`\n\n // if less than a minute ago overwrite the date string\n if (sameMin) dateString = 'Just now'\n\n const toggleFuzzy = () => {\n setIsFuzzy(!isFuzzy)\n }\n\n return (\n <DateStyled\n className={clsx('date')}\n {...props}\n onClick={toggleFuzzy}\n onMouseOver={() => !exactTooltip && setIsFuzzy(false)}\n onMouseOut={() => !exactTooltip && setIsFuzzy(true)}\n data-tooltip={exactTooltip ? exactDate : null}\n data-tooltip-delay={0}\n >\n {dateString}\n </DateStyled>\n )\n}\n\nexport default ActivityDate\n"],"names":["REFRESH_INTERVAL_MS","DateStyled","styled","theme","getFuzzyDate","date","fuzzyDate","formatDistanceToNow","isSameMinute","ActivityDate","isExact","exactTooltip","props","isFuzzy","setIsFuzzy","useState","now","setNow","dateObj","isValid","useEffect","interval","today","isToday","sameYear","isSameYear","yesterday","isSameDay","sameWeek","isSameWeek","sameMin","dateFormat","timeFormat","useMemo","exactDate","format","dateString","toggleFuzzy","jsx","clsx"],"mappings":"8SAeaA,EAAsB,IAE7BC,EAAaC,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAatBC,EAAAA,MAAM,SAAS;AAAA,EAGNC,EAAgBC,GAAe,CAC1C,IAAIC,EAAYC,EAAAA,oBAAoBF,EAAM,CAAE,UAAW,GAAM,EAG7D,OAAAC,EAAYA,EAAU,QAAQ,QAAS,EAAE,EAEzCA,EAAYA,EAAU,QAAQ,UAAW,MAAM,EAC/CA,EAAYA,EAAU,QAAQ,SAAU,KAAK,EAE7CA,EAAYA,EAAU,QAAQ,OAAQ,EAAE,EAGpCE,EAAAA,aAAaH,EAAM,IAAI,IAAM,IAAGC,EAAY,YAEzCA,CACT,EAQMG,EAAe,CAAC,CAAE,KAAAJ,EAAM,QAAAK,EAAS,aAAAC,EAAe,GAAO,GAAGC,KAA+B,CAC7F,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAI,EACrC,CAACC,EAAKC,CAAM,EAAIF,EAAAA,SAAS,IAAI,IAAM,EACzC,GAAI,CAACV,EAAM,OAAO,KAElB,MAAMa,EAAU,IAAI,KAAKb,CAAI,EAC7B,GAAI,CAACc,EAAAA,QAAQD,CAAO,EAAG,OAAO,KAE9BE,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YACf,IAAMJ,EAAO,IAAI,IAAM,EACvBjB,CAAA,EAGF,MAAO,IAAM,cAAcqB,CAAQ,CACrC,EAAG,CAAA,CAAE,EAGL,MAAMC,EAAQC,EAAAA,QAAQL,CAAO,EACvBM,EAAWC,EAAAA,WAAWP,EAASF,CAAG,EAClCU,EAAYC,EAAAA,UAAUT,EAAS,IAAI,KAAKF,EAAI,QAAQA,EAAI,UAAY,CAAC,CAAC,CAAC,EACvEY,EAAWC,EAAAA,WAAWX,EAASF,CAAG,EAClCc,EAAUtB,EAAAA,aAAaU,EAASF,CAAG,EAEnCe,EAAaL,EAAY,GAAKF,EAAYI,EAAW,IAAM,QAAW,aACtEI,EAAa,SAEb1B,EAAY2B,EAAAA,QAAQ,IAAM7B,EAAac,CAAO,EAAG,CAACA,CAAO,CAAC,EAC1DgB,EAAYD,EAAAA,QAAQ,IACpBX,EAAca,EAAAA,OAAOjB,EAAS,GAAGa,CAAU,KAAKC,CAAU,EAAE,EACzDG,EAAAA,OAAOjB,EAAS,qBAAqBc,CAAU,EAAE,EACvD,CAACd,EAASI,CAAK,CAAC,EAEnB,IAAIc,EACFvB,GAAW,CAACH,EACRJ,EACA4B,EAEFR,GAAab,GAAW,CAACH,IAAS0B,EAAa,YAAYA,CAAU,IAGrEN,IAASM,EAAa,YAE1B,MAAMC,EAAc,IAAM,CACxBvB,EAAW,CAACD,CAAO,CACrB,EAEA,OACEyB,EAAAA,kBAAAA,IAACrC,EAAA,CACC,UAAWsC,EAAK,MAAM,EACrB,GAAG3B,EACJ,QAASyB,EACT,YAAa,IAAM,CAAC1B,GAAgBG,EAAW,EAAK,EACpD,WAAY,IAAM,CAACH,GAAgBG,EAAW,EAAI,EAClD,eAAcH,EAAeuB,EAAY,KACzC,qBAAoB,EAEnB,SAAAE,CAAA,CAAA,CAGP"}
@@ -1,10 +1,10 @@
1
1
  import { j as x } from "../../../../../_virtual/jsx-runtime.es.js";
2
- import { isValid as E, isToday as g, isSameYear as h, isSameDay as v, isSameWeek as F, isSameMinute as u, format as m, formatDistanceToNow as $ } from "date-fns";
3
- import j from "clsx";
4
- import k from "styled-components";
5
- import { useState as c, useEffect as I } from "react";
6
- import { theme as N } from "@ynput/ayon-react-components";
7
- const R = 1e4, b = k.span`
2
+ import { isValid as F, isToday as $, isSameYear as j, isSameDay as k, isSameWeek as I, isSameMinute as p, format as f, formatDistanceToNow as N } from "date-fns";
3
+ import R from "clsx";
4
+ import b from "styled-components";
5
+ import { useState as d, useEffect as O, useMemo as y } from "react";
6
+ import { theme as Y } from "@ynput/ayon-react-components";
7
+ const A = 1e4, J = b.span`
8
8
  margin-left: auto;
9
9
  color: var(--md-sys-color-outline);
10
10
  user-select: none;
@@ -17,43 +17,45 @@ const R = 1e4, b = k.span`
17
17
  min-width: 0;
18
18
  max-width: fit-content;
19
19
 
20
- ${N.bodySmall}
21
- `, O = (o) => {
22
- let e = $(o, { addSuffix: !0 });
23
- return e = e.replace("about", ""), e = e.replace("minutes", "mins"), e = e.replace("minute", "min"), e = e.replace(" ago", ""), u(o, /* @__PURE__ */ new Date()) && (e = "Just now"), e;
24
- }, _ = ({ date: o, isExact: e, ...f }) => {
25
- const [n, r] = c(!0), [s, y] = c(/* @__PURE__ */ new Date());
26
- if (!o) return null;
27
- const t = new Date(o);
28
- if (!E(t)) return null;
29
- I(() => {
30
- const z = setInterval(
31
- () => y(/* @__PURE__ */ new Date()),
32
- R
20
+ ${Y.bodySmall}
21
+ `, V = (a) => {
22
+ let e = N(a, { addSuffix: !0 });
23
+ return e = e.replace("about", ""), e = e.replace("minutes", "mins"), e = e.replace("minute", "min"), e = e.replace(" ago", ""), p(a, /* @__PURE__ */ new Date()) && (e = "Just now"), e;
24
+ }, q = ({ date: a, isExact: e, exactTooltip: n = !1, ...w }) => {
25
+ const [r, i] = d(!0), [o, D] = d(/* @__PURE__ */ new Date());
26
+ if (!a) return null;
27
+ const t = new Date(a);
28
+ if (!F(t)) return null;
29
+ O(() => {
30
+ const v = setInterval(
31
+ () => D(/* @__PURE__ */ new Date()),
32
+ A
33
33
  );
34
- return () => clearInterval(z);
34
+ return () => clearInterval(v);
35
35
  }, []);
36
- const d = g(t), p = h(t, s), i = v(t, new Date(s.setDate(s.getDate() - 1))), w = F(t, s), M = u(t, s), D = i ? "" : p ? w ? "E" : "MMM d" : "MMM d yyyy", l = "h:mm a";
37
- let a = n && !e ? d ? O(t) : m(t, `${D}, ${l}`) : m(t, `EEEE, dd MMM yyyy ${l}`);
38
- i && n && !e && (a = `Yesterday${a}`), M && (a = "Just now");
39
- const S = () => {
40
- r(!n);
36
+ const l = $(t), M = j(t, o), m = k(t, new Date(o.setDate(o.getDate() - 1))), z = I(t, o), S = p(t, o), E = m ? "" : M ? z ? "E" : "MMM d" : "MMM d yyyy", u = "h:mm a", g = y(() => V(t), [t]), c = y(() => l ? f(t, `${E}, ${u}`) : f(t, `EEEE, dd MMM yyyy ${u}`), [t, l]);
37
+ let s = r && !e ? g : c;
38
+ m && r && !e && (s = `Yesterday${s}`), S && (s = "Just now");
39
+ const h = () => {
40
+ i(!r);
41
41
  };
42
42
  return /* @__PURE__ */ x.jsx(
43
- b,
43
+ J,
44
44
  {
45
- className: j("date"),
46
- ...f,
47
- onClick: S,
48
- onMouseOver: () => r(!1),
49
- onMouseOut: () => r(!0),
50
- children: a
45
+ className: R("date"),
46
+ ...w,
47
+ onClick: h,
48
+ onMouseOver: () => !n && i(!1),
49
+ onMouseOut: () => !n && i(!0),
50
+ "data-tooltip": n ? c : null,
51
+ "data-tooltip-delay": 0,
52
+ children: s
51
53
  }
52
54
  );
53
55
  };
54
56
  export {
55
- R as REFRESH_INTERVAL_MS,
56
- _ as default,
57
- O as getFuzzyDate
57
+ A as REFRESH_INTERVAL_MS,
58
+ q as default,
59
+ V as getFuzzyDate
58
60
  };
59
61
  //# sourceMappingURL=ActivityDate.es.js.map