@semapps/activitypub-components 0.7.0 → 0.8.1

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.
package/dist/index.cjs.js CHANGED
@@ -135,6 +135,8 @@ const $03510abb28fd3d8a$export$34aed805e991a647 = (iterable, predicate)=>{
135
135
  };
136
136
 
137
137
 
138
+ // Used to avoid re-renders
139
+ const $5ca5f7e9fc1c3544$var$emptyArray = [];
138
140
  const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
139
141
  const dataProvider = (0, $583VT$reactadmin.useDataProvider)();
140
142
  const items = (0, $583VT$react.useMemo)(()=>pages.flatMap((p)=>(0, $03510abb28fd3d8a$export$e57ff0f701c44363)(p.orderedItems || p.items)), [
@@ -148,7 +150,7 @@ const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
148
150
  items
149
151
  ]);
150
152
  // Dereference all items, if necessary (even if shouldDereference is false, the hook needs to be called).
151
- const itemQueries = (0, $583VT$reactquery.useQueries)(!shouldDereference ? [] : items.filter((item)=>typeof item === "string").map((itemUri)=>({
153
+ const itemQueries = (0, $583VT$reactquery.useQueries)(!shouldDereference ? $5ca5f7e9fc1c3544$var$emptyArray : items.filter((item)=>typeof item === "string").map((itemUri)=>({
152
154
  queryKey: [
153
155
  "resource",
154
156
  itemUri
@@ -176,16 +178,17 @@ const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
176
178
  /**
177
179
  * Subscribe a collection. Supports pagination.
178
180
  * @param predicateOrUrl The collection URI or the predicate to get the collection URI from the identity (webId).
179
- * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: true }`
181
+ * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: false }`
180
182
  */ const $5ca5f7e9fc1c3544$var$useCollection = (predicateOrUrl, options = {})=>{
181
- const { dereferenceItems: dereferenceItems = false, liveUpdates: liveUpdates = true } = options;
183
+ const { dereferenceItems: dereferenceItems = false, liveUpdates: liveUpdates = false } = options;
182
184
  const { data: identity } = (0, $583VT$reactadmin.useGetIdentity)();
183
- const [totalItems, setTotalItems] = (0, $583VT$react.useState)();
185
+ const [totalItems, setTotalItems] = (0, $583VT$react.useState)(0);
184
186
  const queryClient = (0, $583VT$reactquery.useQueryClient)();
185
187
  const [hasLiveUpdates, setHasLiveUpdates] = (0, $583VT$react.useState)({
186
188
  status: "connecting"
187
189
  });
188
190
  const dataProvider = (0, $583VT$reactadmin.useDataProvider)();
191
+ const webSocketRef = (0, $583VT$react.useRef)(null);
189
192
  // Get collectionUrl from webId predicate or URL.
190
193
  const collectionUrl = (0, $583VT$react.useMemo)(()=>{
191
194
  if (predicateOrUrl) {
@@ -232,7 +235,7 @@ const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
232
235
  getPreviousPageParam: (firstPage)=>firstPage.prev
233
236
  });
234
237
  // Put all items together in a list (and dereference, if required).
235
- const { loadedItems: items, isLoading: isLoadingItems, isFetching: isFetchingItems, errors: itemErrors } = $5ca5f7e9fc1c3544$var$useItemsFromPages(pageData?.pages ?? [], dereferenceItems);
238
+ const { loadedItems: items, isLoading: isLoadingItems, isFetching: isFetchingItems, errors: itemErrors } = $5ca5f7e9fc1c3544$var$useItemsFromPages(pageData?.pages ?? $5ca5f7e9fc1c3544$var$emptyArray, dereferenceItems);
236
239
  const allErrors = (0, $03510abb28fd3d8a$export$e57ff0f701c44363)(collectionError).concat((0, $03510abb28fd3d8a$export$e57ff0f701c44363)(itemErrors));
237
240
  const addItem = (0, $583VT$react.useCallback)((item, shouldRefetch = true)=>{
238
241
  queryClient.setQueryData([
@@ -242,13 +245,19 @@ const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
242
245
  }
243
246
  ], (oldData)=>{
244
247
  if (!oldData) return oldData;
245
- setTotalItems(totalItems && totalItems + 1);
248
+ setTotalItems((totalItems)=>totalItems + 1);
246
249
  // Destructure, so react knows, it needs to re-render the pages.
247
250
  const pages = [
248
251
  ...oldData.pages
249
252
  ];
250
- const firstPageItems = pages?.[0]?.orderedItems || pages?.[0]?.items || [];
251
- firstPageItems.unshift(item);
253
+ if (pages?.[0]?.orderedItems) pages[0].orderedItems = [
254
+ item,
255
+ ...(0, $03510abb28fd3d8a$export$e57ff0f701c44363)(pages[0].orderedItems)
256
+ ];
257
+ else if (pages?.[0]?.items) pages[0].items = [
258
+ item,
259
+ ...(0, $03510abb28fd3d8a$export$e57ff0f701c44363)(pages[0].items)
260
+ ];
252
261
  oldData.pages = pages;
253
262
  return oldData;
254
263
  });
@@ -263,7 +272,8 @@ const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
263
272
  }), typeof shouldRefetch === "number" ? shouldRefetch : 2000);
264
273
  }, [
265
274
  queryClient,
266
- collectionUrl
275
+ collectionUrl,
276
+ setTotalItems
267
277
  ]);
268
278
  const removeItem = (0, $583VT$react.useCallback)((item, shouldRefetch = true)=>{
269
279
  queryClient.setQueryData([
@@ -273,7 +283,7 @@ const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
273
283
  }
274
284
  ], (oldData)=>{
275
285
  if (!oldData) return oldData;
276
- setTotalItems(totalItems && totalItems - 1);
286
+ setTotalItems((totalItems)=>totalItems - 1);
277
287
  // Destructure, so react knows, it needs to re-render the pages array.
278
288
  const pages = [
279
289
  ...oldData.pages
@@ -297,39 +307,66 @@ const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
297
307
  }), typeof shouldRefetch === "number" ? shouldRefetch : 2000);
298
308
  }, [
299
309
  queryClient,
300
- collectionUrl
310
+ collectionUrl,
311
+ setTotalItems
301
312
  ]);
302
313
  // Live Updates
303
314
  (0, $583VT$react.useEffect)(()=>{
304
315
  if (liveUpdates && collectionUrl) // Create ws that listens to collectionUri changes
305
- (0, $583VT$semappssemanticdataprovider.getOrCreateWsChannel)(dataProvider.fetch, collectionUrl).then((webSocket)=>{
306
- webSocket.addEventListener("message", (e)=>{
316
+ (0, $583VT$semappssemanticdataprovider.getOrCreateWsChannel)(dataProvider.fetch, collectionUrl).then((ws)=>{
317
+ webSocketRef.current = ws; // Keep a ref to the webSocket so that it can be used elsewhere
318
+ webSocketRef.current.addEventListener("message", (e)=>{
307
319
  const data = JSON.parse(e.data);
308
320
  if (data.type === "Add") addItem(data.object, true);
309
321
  else if (data.type === "Remove") removeItem(data.object, true);
310
322
  });
311
- webSocket.addEventListener("error", (e)=>{
323
+ webSocketRef.current.addEventListener("error", (e)=>{
312
324
  setHasLiveUpdates({
313
325
  status: "error",
314
326
  error: e
315
327
  });
316
328
  // TODO: Retry after a while
317
329
  });
318
- webSocket.addEventListener("close", (e)=>{
330
+ webSocketRef.current.addEventListener("close", (e)=>{
319
331
  if (!hasLiveUpdates.error) setHasLiveUpdates({
320
332
  ...hasLiveUpdates,
321
333
  status: "closed"
322
334
  });
323
335
  });
324
336
  setHasLiveUpdates({
325
- status: "connected",
326
- webSocket: webSocket
337
+ status: "connected"
327
338
  });
328
339
  }).catch(()=>{}); // If it fails, we won't receive live updates. But that's okay.
329
340
  }, [
330
341
  collectionUrl,
331
342
  liveUpdates,
332
- dataProvider
343
+ dataProvider,
344
+ webSocketRef,
345
+ addItem,
346
+ removeItem,
347
+ setHasLiveUpdates
348
+ ]);
349
+ const awaitWebSocketConnection = (0, $583VT$react.useCallback)((options = {})=>{
350
+ const { timeout: timeout = 30000 } = options;
351
+ if (!liveUpdates) throw new Error(`Cannot call awaitWebSocketConnection because the liveUpdates option is set to false`);
352
+ return new Promise((resolve, reject)=>{
353
+ if (webSocketRef?.current) resolve(webSocketRef);
354
+ else {
355
+ const timeoutId = setTimeout(()=>{
356
+ reject(`No WebSocket connection found within ${Math.round(timeout / 1000)}s`);
357
+ }, timeout);
358
+ const intervalId = setInterval(()=>{
359
+ if (webSocketRef?.current) {
360
+ clearInterval(intervalId);
361
+ clearTimeout(timeoutId);
362
+ resolve(webSocketRef);
363
+ } else console.log("WebSocket is not initialized yet, waiting...");
364
+ }, 100);
365
+ }
366
+ });
367
+ }, [
368
+ webSocketRef,
369
+ liveUpdates
333
370
  ]);
334
371
  return {
335
372
  items: items,
@@ -344,7 +381,9 @@ const $5ca5f7e9fc1c3544$var$useItemsFromPages = (pages, dereferenceItems)=>{
344
381
  isFetching: isFetchingPage || isFetchingItems,
345
382
  isFetchingNextPage: isFetchingNextPage,
346
383
  url: collectionUrl,
347
- hasLiveUpdates: hasLiveUpdates
384
+ hasLiveUpdates: hasLiveUpdates,
385
+ awaitWebSocketConnection: awaitWebSocketConnection,
386
+ webSocketRef: webSocketRef
348
387
  };
349
388
  };
350
389
  var $5ca5f7e9fc1c3544$export$2e2bcd8739ae039 = $5ca5f7e9fc1c3544$var$useCollection;
@@ -354,49 +393,60 @@ var $5ca5f7e9fc1c3544$export$2e2bcd8739ae039 = $5ca5f7e9fc1c3544$var$useCollecti
354
393
 
355
394
  /**
356
395
  * Hook used internally by useInbox and useOutbox. This is not exported.
357
- * @param webSocket WebSocket which allow to listen to the inbox or outbox
396
+ * @param awaitWebSocketConnection Promise returning the WebSocket which allow to listen to the inbox or outbox
358
397
  * @param existingActivities Partial list of activities already received in the inbox and outbox
359
- */ const $5e70f9d0635e25dd$var$useAwaitActivity = (webSocket, existingActivities)=>{
398
+ */ const $5e70f9d0635e25dd$var$useAwaitActivity = (awaitWebSocketConnection, existingActivities)=>{
360
399
  const dataProvider = (0, $583VT$reactadmin.useDataProvider)();
361
- // TODO Allow to pass an object, and automatically dereference it if required, like on the @semapps/activitypub matchActivity util
400
+ // TODO Allow to pass an object, and automatically dereference it if required, like on the @semapps/activitypub matchActivity util
362
401
  return (0, $583VT$react.useCallback)((matchActivity, options = {})=>{
363
402
  const { timeout: timeout = 30000, checkExistingActivities: checkExistingActivities = false } = options;
364
403
  return new Promise((resolve, reject)=>{
365
- if (webSocket) {
404
+ awaitWebSocketConnection().then((webSocketRef)=>{
366
405
  const onMessage = (event)=>{
367
406
  const data = JSON.parse(event.data);
368
407
  if (data.type === "Add") dataProvider.fetch(data.object).then(({ json: json })=>{
369
408
  if (matchActivity(json)) {
370
- webSocket.removeEventListener("message", onMessage);
409
+ removeListeners();
371
410
  return resolve(json);
372
411
  }
373
412
  });
374
413
  };
375
- webSocket.addEventListener("message", onMessage);
376
- // TODO reconnect if connection closed
377
- webSocket.addEventListener("error", (e)=>{
414
+ const onError = (e)=>{
415
+ // TODO reconnect if connection closed
416
+ removeListeners();
378
417
  reject(e);
379
- });
380
- webSocket.addEventListener("close", (e)=>{
418
+ };
419
+ const onClose = (e)=>{
420
+ removeListeners();
381
421
  reject(new Error(`${e.reason} (Code: ${e.code})`));
382
- });
422
+ };
423
+ const removeListeners = ()=>{
424
+ webSocketRef.current?.removeEventListener("message", onMessage);
425
+ webSocketRef.current?.removeEventListener("error", onError);
426
+ webSocketRef.current?.removeEventListener("close", onClose);
427
+ };
428
+ webSocketRef.current?.addEventListener("message", onMessage);
429
+ webSocketRef.current?.addEventListener("error", onError);
430
+ webSocketRef.current?.addEventListener("close", onClose);
383
431
  // If a list of activities is already loaded, verify if there is a match
384
432
  if (existingActivities && checkExistingActivities) for (const a of existingActivities){
385
433
  if (typeof a !== "string") {
386
434
  if (matchActivity(a)) {
387
- webSocket.removeEventListener("message", onMessage);
435
+ removeListeners();
388
436
  return resolve(a);
389
437
  }
390
438
  }
391
439
  }
392
440
  setTimeout(()=>{
393
- webSocket.removeEventListener("message", onMessage);
441
+ removeListeners();
394
442
  reject(new Error("Timeout"));
395
443
  }, timeout);
396
- } else throw new Error("WebSocket is not initialized !");
444
+ }).catch((e)=>{
445
+ reject(e);
446
+ });
397
447
  });
398
448
  }, [
399
- webSocket,
449
+ awaitWebSocketConnection,
400
450
  existingActivities,
401
451
  dataProvider
402
452
  ]);
@@ -411,12 +461,12 @@ var $5e70f9d0635e25dd$export$2e2bcd8739ae039 = $5e70f9d0635e25dd$var$useAwaitAct
411
461
  * - `awaitActivity`: a function to wait for a certain activity to be posted
412
462
  * - `owner`: the WebID of the outbox's owner
413
463
  * See https://semapps.org/docs/frontend/activitypub-components#useoutbox for usage
414
- * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: true }`
464
+ * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: false }`
415
465
  */ const $456aea3814dded7d$var$useOutbox = (options = {})=>{
416
466
  const dataProvider = (0, $583VT$reactadmin.useDataProvider)();
417
467
  const { data: identity } = (0, $583VT$reactadmin.useGetIdentity)();
418
- const { url: url, hasLiveUpdates: hasLiveUpdates, items: items, ...rest } = (0, $5ca5f7e9fc1c3544$export$2e2bcd8739ae039)("outbox", options);
419
- const awaitActivity = (0, $5e70f9d0635e25dd$export$2e2bcd8739ae039)(hasLiveUpdates.webSocket, items);
468
+ const { url: url, items: items, awaitWebSocketConnection: awaitWebSocketConnection, ...rest } = (0, $5ca5f7e9fc1c3544$export$2e2bcd8739ae039)("outbox", options);
469
+ const awaitActivity = (0, $5e70f9d0635e25dd$export$2e2bcd8739ae039)(awaitWebSocketConnection, items);
420
470
  // Post an activity to the logged user's outbox and return its URI
421
471
  const post = (0, $583VT$react.useCallback)(async (activity)=>{
422
472
  if (!url) throw new Error("Cannot post to outbox before user identity is loaded. Please use the isLoading argument of useOutbox");
@@ -434,8 +484,8 @@ var $5e70f9d0635e25dd$export$2e2bcd8739ae039 = $5e70f9d0635e25dd$var$useAwaitAct
434
484
  ]);
435
485
  return {
436
486
  url: url,
437
- hasLiveUpdates: hasLiveUpdates,
438
487
  items: items,
488
+ awaitWebSocketConnection: awaitWebSocketConnection,
439
489
  post: post,
440
490
  awaitActivity: awaitActivity,
441
491
  owner: identity?.id,
@@ -894,15 +944,15 @@ var $b0c94a9bdea99da5$export$2e2bcd8739ae039 = $b0c94a9bdea99da5$var$ReferenceCo
894
944
  * - `awaitActivity`: a function to wait for a certain activity to be received
895
945
  * - `owner`: the WebID of the inbox's owner
896
946
  * See https://semapps.org/docs/frontend/activitypub-components#useinbox for usage
897
- * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: true }`
947
+ * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: false }`
898
948
  */ const $486f741c94cd8f74$var$useInbox = (options = {})=>{
899
949
  const { data: identity } = (0, $583VT$reactadmin.useGetIdentity)();
900
- const { items: items, url: url, hasLiveUpdates: hasLiveUpdates, ...rest } = (0, $5ca5f7e9fc1c3544$export$2e2bcd8739ae039)("inbox", options);
901
- const awaitActivity = (0, $5e70f9d0635e25dd$export$2e2bcd8739ae039)(hasLiveUpdates.webSocket);
950
+ const { url: url, items: items, awaitWebSocketConnection: awaitWebSocketConnection, ...rest } = (0, $5ca5f7e9fc1c3544$export$2e2bcd8739ae039)("inbox", options);
951
+ const awaitActivity = (0, $5e70f9d0635e25dd$export$2e2bcd8739ae039)(awaitWebSocketConnection, items);
902
952
  return {
903
- items: items,
904
953
  url: url,
905
- hasLiveUpdates: hasLiveUpdates,
954
+ items: items,
955
+ awaitWebSocketConnection: awaitWebSocketConnection,
906
956
  awaitActivity: awaitActivity,
907
957
  owner: identity?.id,
908
958
  ...rest
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/activitypub-components/src/index.ts","packages/activitypub-components/src/components/CommentsField/CommentsField.js","packages/activitypub-components/src/components/CommentsField/PostCommentForm.js","packages/activitypub-components/src/constants.js","packages/activitypub-components/src/hooks/useOutbox.ts","packages/activitypub-components/src/hooks/useCollection.ts","packages/activitypub-components/src/utils.ts","packages/activitypub-components/src/hooks/useAwaitActivity.ts","packages/activitypub-components/src/components/CommentsField/CustomMention.js","packages/activitypub-components/src/components/CommentsField/CommentsList.js","packages/activitypub-components/src/components/CollectionList.js","packages/activitypub-components/src/components/ReferenceCollectionField.js","packages/activitypub-components/src/hooks/useInbox.ts","packages/activitypub-components/src/hooks/useNodeinfo.ts","packages/activitypub-components/src/hooks/useWebfinger.js","packages/activitypub-components/src/hooks/useMentions/useMentions.js","packages/activitypub-components/src/hooks/useMentions/renderMentions.js","packages/activitypub-components/src/hooks/useMentions/MentionsList.js"],"sourcesContent":["// Components\nexport { default as CommentsField } from './components/CommentsField/CommentsField';\nexport { default as CollectionList } from './components/CollectionList';\nexport { default as ReferenceCollectionField } from './components/ReferenceCollectionField';\n\n// Hooks\nexport { default as useCollection } from './hooks/useCollection';\nexport { default as useInbox } from './hooks/useInbox';\nexport { default as useNodeinfo } from './hooks/useNodeinfo';\nexport { default as useOutbox } from './hooks/useOutbox';\nexport { default as useWebfinger } from './hooks/useWebfinger';\nexport { default as useMentions } from './hooks/useMentions/useMentions';\n\n// Constants\nexport { ACTIVITY_TYPES, ACTOR_TYPES, OBJECT_TYPES, PUBLIC_URI } from './constants';\n","import React from 'react';\nimport { useRecordContext } from 'react-admin';\nimport PostCommentForm from './PostCommentForm';\nimport CommentsList from './CommentsList';\nimport useCollection from '../../hooks/useCollection';\n\nconst CommentsField = ({ source, context, helperText, placeholder, userResource, mentions }) => {\n const record = useRecordContext();\n const { items: comments, loading, addItem, removeItem } = useCollection(record.replies);\n if (!userResource) throw new Error('No userResource defined for CommentsField');\n return (\n <>\n <PostCommentForm\n context={context}\n helperText={helperText}\n userResource={userResource}\n placeholder={placeholder}\n mentions={mentions}\n addItem={addItem}\n removeItem={removeItem}\n />\n <CommentsList comments={comments} loading={loading} userResource={userResource} />\n </>\n );\n};\n\nCommentsField.defaultProps = {\n label: 'Commentaires',\n placeholder: 'Commencez à taper votre commentaire...',\n source: 'id', // Ensure the field is always displayed\n context: 'id'\n};\n\nexport default CommentsField;\n","import React, { useState, useCallback } from 'react';\nimport { Form, useGetIdentity, useNotify, useRecordContext } from 'react-admin';\nimport { RichTextInput, DefaultEditorOptions } from 'ra-input-rich-text';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { Button, Box, Avatar } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport SendIcon from '@mui/icons-material/Send';\nimport { useDataModel } from '@semapps/semantic-data-provider';\nimport { AuthDialog } from '@semapps/auth-provider';\nimport { OBJECT_TYPES, PUBLIC_URI } from '../../constants';\nimport useOutbox from '../../hooks/useOutbox';\nimport CustomMention from './CustomMention';\n\nconst useStyles = makeStyles(theme => ({\n form: {\n marginTop: -12 // Negative margin to keep the form close to the label\n },\n container: {\n paddingLeft: 80,\n position: 'relative'\n },\n avatar: {\n position: 'absolute',\n top: 16,\n left: 0,\n bottom: 0,\n width: 64,\n height: 64\n },\n editorContent: {\n '& > div': {\n backgroundColor: 'rgba(0, 0, 0, 0.09)',\n padding: '2px 12px',\n borderWidth: '0px !important',\n borderRadius: 0,\n borderBottom: '1px solid #FFF',\n minHeight: 60,\n outline: 'unset !important'\n },\n '& > div > p': {\n marginTop: 12,\n marginBottom: 12,\n fontFamily: theme.typography.body1.fontFamily,\n marginBlockStart: '0.5em',\n marginBlockEnd: '0.5em'\n },\n '& > div > p.is-editor-empty:first-child::before': {\n color: 'grey',\n content: 'attr(data-placeholder)',\n float: 'left',\n height: 0,\n pointerEvents: 'none'\n }\n },\n button: {\n marginTop: -10, // To go over helper text block\n marginBottom: 15\n }\n}));\n\nconst EmptyToolbar = () => null;\n\nconst PostCommentForm = ({ context, placeholder, helperText, mentions, userResource, addItem, removeItem }) => {\n const record = useRecordContext();\n const { data: identity, isLoading } = useGetIdentity();\n const userDataModel = useDataModel(userResource);\n const classes = useStyles();\n const notify = useNotify();\n const outbox = useOutbox();\n const [expanded, setExpanded] = useState(false);\n const [openAuth, setOpenAuth] = useState(false);\n\n const onSubmit = useCallback(\n async values => {\n const document = new DOMParser().parseFromString(values.comment, 'text/html');\n const mentions = Array.from(document.body.getElementsByClassName('mention'));\n const mentionedUsersUris = [];\n\n mentions.forEach(node => {\n const userUri = node.attributes['data-mention-id'].value;\n const userLabel = node.attributes['data-mention-label'].value;\n const link = document.createElement('a');\n link.setAttribute(\n 'href',\n `${new URL(window.location.href).origin}/${userResource}/${encodeURIComponent(userUri)}/show`\n );\n link.textContent = `@${userLabel}`;\n node.parentNode.replaceChild(link, node);\n mentionedUsersUris.push(userUri);\n });\n\n if (document.body.innerHTML === 'undefined') {\n notify('Votre commentaire est vide', { type: 'error' });\n } else {\n const tempId = Date.now();\n\n const note = {\n type: OBJECT_TYPES.NOTE,\n attributedTo: outbox.owner,\n content: document.body.innerHTML,\n inReplyTo: record[context],\n published: new Date().toISOString()\n };\n\n try {\n addItem({ id: tempId, ...note });\n // TODO reset the form\n setExpanded(false);\n await outbox.post({ ...note, to: [...mentionedUsersUris, PUBLIC_URI] });\n notify('Commentaire posté avec succès', { type: 'success' });\n } catch (e) {\n console.error(e);\n removeItem(tempId);\n notify(e.message, { type: 'error' });\n }\n }\n },\n [outbox, notify, setExpanded, addItem, removeItem]\n );\n\n const openAuthIfDisconnected = useCallback(() => {\n if (!identity?.id) {\n setOpenAuth(true);\n }\n }, [identity, setOpenAuth]);\n\n // Don't init the editor options until mentions and identity are loaded, as they can only be initialized once\n if ((mentions && !mentions.items) || isLoading) return null;\n\n return (\n <>\n <Form onSubmit={onSubmit} className={classes.form}>\n <Box className={classes.container} onClick={openAuthIfDisconnected}>\n <Avatar\n src={\n identity?.webIdData?.[userDataModel?.fieldsMapping?.image] ||\n identity?.profileData?.[userDataModel?.fieldsMapping?.image]\n }\n className={classes.avatar}\n />\n <RichTextInput\n source=\"comment\"\n label=\" \"\n toolbar={<EmptyToolbar />}\n fullWidth\n classes={{ editorContent: classes.editorContent }}\n editorOptions={{\n ...DefaultEditorOptions,\n onFocus() {\n setExpanded(true);\n },\n extensions: [\n ...DefaultEditorOptions.extensions,\n placeholder ? Placeholder.configure({ placeholder }) : null,\n mentions\n ? CustomMention.configure({\n HTMLAttributes: {\n class: 'mention'\n },\n suggestion: mentions\n })\n : null\n ],\n // Disable editor if user is not connected\n editable: !!identity?.id\n }}\n helperText={helperText}\n />\n {expanded && (\n <Button\n type=\"submit\"\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n endIcon={<SendIcon />}\n className={classes.button}\n >\n Envoyer\n </Button>\n )}\n </Box>\n </Form>\n <AuthDialog\n open={openAuth}\n onClose={() => setOpenAuth(false)}\n message=\"Pour poster un commentaire, vous devez être connecté.\"\n />\n </>\n );\n};\n\nexport default PostCommentForm;\n","export const ACTIVITY_TYPES = {\n ACCEPT: 'Accept',\n ADD: 'Add',\n ANNOUNCE: 'Announce',\n ARRIVE: 'Arrive',\n BLOCK: 'Block',\n CREATE: 'Create',\n DELETE: 'Delete',\n DISLIKE: 'Dislike',\n FLAG: 'Flag',\n FOLLOW: 'Follow',\n IGNORE: 'Ignore',\n INVITE: 'Invite',\n JOIN: 'Join',\n LEAVE: 'Leave',\n LIKE: 'Like',\n LISTEN: 'Listen',\n MOVE: 'Move',\n OFFER: 'Offer',\n QUESTION: 'Question',\n REJECT: 'Reject',\n READ: 'Read',\n REMOVE: 'Remove',\n TENTATIVE_REJECT: 'TentativeReject',\n TENTATIVE_ACCEPT: 'TentativeAccept',\n TRAVEL: 'Travel',\n UNDO: 'Undo',\n UPDATE: 'Update',\n VIEW: 'View'\n};\n\nexport const ACTOR_TYPES = {\n APPLICATION: 'Application',\n GROUP: 'Group',\n ORGANIZATION: 'Organization',\n PERSON: 'Person',\n SERVICE: 'Service'\n};\n\nexport const OBJECT_TYPES = {\n ARTICLE: 'Article',\n AUDIO: 'Audio',\n DOCUMENT: 'Document',\n EVENT: 'Event',\n IMAGE: 'Image',\n NOTE: 'Note',\n PAGE: 'Page',\n PLACE: 'Place',\n PROFILE: 'Profile',\n RELATIONSHIP: 'Relationship',\n TOMBSTONE: 'Tombstone',\n VIDEO: 'Video'\n};\n\nexport const PUBLIC_URI = 'https://www.w3.org/ns/activitystreams#Public';\n","import { useCallback } from 'react';\nimport { useDataProvider, useGetIdentity } from 'react-admin';\nimport { SemanticDataProvider } from '@semapps/semantic-data-provider';\nimport useCollection from './useCollection';\nimport useAwaitActivity from './useAwaitActivity';\nimport type { UseCollectionOptions } from '../types';\n\n/**\n * Hook to fetch and post to the outbox of the logged user.\n * Returns the same data as the useCollection hooks, plus:\n * - `post`: a function to post a new activity in the user's outbox\n * - `awaitActivity`: a function to wait for a certain activity to be posted\n * - `owner`: the WebID of the outbox's owner\n * See https://semapps.org/docs/frontend/activitypub-components#useoutbox for usage\n * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: true }`\n */\nconst useOutbox = (options: UseCollectionOptions = {}) => {\n const dataProvider = useDataProvider<SemanticDataProvider>();\n const { data: identity } = useGetIdentity();\n const { url, hasLiveUpdates, items, ...rest } = useCollection('outbox', options);\n const awaitActivity = useAwaitActivity(hasLiveUpdates.webSocket, items);\n\n // Post an activity to the logged user's outbox and return its URI\n const post = useCallback(\n async (activity: object) => {\n if (!url) {\n throw new Error(\n 'Cannot post to outbox before user identity is loaded. Please use the isLoading argument of useOutbox'\n );\n }\n const { headers } = await dataProvider.fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n '@context': 'https://www.w3.org/ns/activitystreams',\n ...activity\n })\n });\n return headers.get('Location');\n },\n [url, dataProvider]\n );\n\n return { url, hasLiveUpdates, items, post, awaitActivity, owner: identity?.id, ...rest };\n};\n\nexport default useOutbox;\n","import { useCallback, useMemo, useState, useEffect } from 'react';\nimport { useGetIdentity, useDataProvider } from 'react-admin';\nimport { QueryFunction, useInfiniteQuery, useQueries, useQueryClient } from 'react-query';\nimport { getOrCreateWsChannel, SemanticDataProvider } from '@semapps/semantic-data-provider';\nimport { arrayOf } from '../utils';\nimport type { UseCollectionOptions, SolidNotification } from '../types';\n\nconst useItemsFromPages = (pages: any[], dereferenceItems: boolean) => {\n const dataProvider = useDataProvider<SemanticDataProvider>();\n const items = useMemo(() => pages.flatMap(p => arrayOf(p.orderedItems || p.items)), [pages]);\n\n // We will force dereference, if some items are not URI string references.\n const shouldDereference = useMemo(() => {\n return dereferenceItems || items.some(item => typeof item !== 'string');\n }, [dereferenceItems, items]);\n\n // Dereference all items, if necessary (even if shouldDereference is false, the hook needs to be called).\n const itemQueries = useQueries(\n !shouldDereference\n ? []\n : items\n .filter(item => typeof item === 'string')\n .map(itemUri => ({\n queryKey: ['resource', itemUri],\n queryFn: async () => (await dataProvider.fetch(itemUri)).json,\n staleTime: Infinity\n }))\n );\n\n if (!shouldDereference) {\n return { loadedItems: items, isLoading: false, isFetching: false };\n }\n\n // Put all loaded items together (might be dereferenced already, so concatenate).\n const loadedItems = items\n .filter(item => typeof item !== 'string')\n .concat(\n itemQueries.flatMap(itemQuery => {\n return (itemQuery.isSuccess && itemQuery.data) || [];\n })\n );\n\n const errors = itemQueries.filter(q => q.error);\n return {\n loadedItems,\n isLoading: itemQueries.some(q => q.isLoading),\n isFetching: itemQueries.some(q => q.isFetching),\n errors: errors.length > 0 ? errors : undefined\n };\n};\n\n/**\n * Subscribe a collection. Supports pagination.\n * @param predicateOrUrl The collection URI or the predicate to get the collection URI from the identity (webId).\n * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: true }`\n */\nconst useCollection = (predicateOrUrl: string, options: UseCollectionOptions = {}) => {\n const { dereferenceItems = false, liveUpdates = true } = options;\n const { data: identity } = useGetIdentity();\n const [totalItems, setTotalItems] = useState<number>();\n const queryClient = useQueryClient();\n const [hasLiveUpdates, setHasLiveUpdates] = useState<{ status: string; error?: any; webSocket?: WebSocket }>({\n status: 'connecting'\n });\n const dataProvider = useDataProvider<SemanticDataProvider>();\n\n // Get collectionUrl from webId predicate or URL.\n const collectionUrl = useMemo(() => {\n if (predicateOrUrl) {\n if (predicateOrUrl.startsWith('http')) {\n return predicateOrUrl;\n }\n if (identity?.webIdData) {\n return identity?.webIdData?.[predicateOrUrl];\n }\n }\n return undefined;\n // throw new Error(`No URL available for useCollection: ${predicateOrUrl}.`);\n }, [identity, predicateOrUrl]);\n\n // Fetch page of collection item references (if pageParam provided)\n // or default to `collectionUrl` (which should give you the first page).\n const fetchCollection: QueryFunction = useCallback(\n async ({ pageParam: nextPageUrl }) => {\n // Fetch page or first page (collectionUrl)\n let { json } = await dataProvider.fetch(nextPageUrl || collectionUrl);\n if (json.totalItems) setTotalItems(json.totalItems);\n\n // If first page, handle this here.\n if ((json.type === 'OrderedCollection' || json.type === 'Collection') && json.first) {\n if (json.first?.items) {\n if (json.first?.items.length === 0 && json.first?.next) {\n // Special case where the first property is an object without items\n ({ json } = await dataProvider.fetch(json.first?.next));\n } else {\n json = json.first;\n }\n } else {\n // Fetch the first page\n ({ json } = await dataProvider.fetch(json.first));\n }\n }\n\n return json;\n },\n [dataProvider, collectionUrl, identity, setTotalItems]\n );\n\n // Use infiniteQuery to handle pagination, fetching, etc.\n const {\n data: pageData,\n error: collectionError,\n fetchNextPage,\n refetch,\n hasNextPage,\n isLoading: isLoadingPage,\n isFetching: isFetchingPage,\n isFetchingNextPage\n } = useInfiniteQuery(['collection', { collectionUrl }], fetchCollection, {\n enabled: !!(collectionUrl && identity?.id),\n getNextPageParam: (lastPage: any) => lastPage.next,\n getPreviousPageParam: (firstPage: any) => firstPage.prev\n });\n\n // Put all items together in a list (and dereference, if required).\n const {\n loadedItems: items,\n isLoading: isLoadingItems,\n isFetching: isFetchingItems,\n errors: itemErrors\n } = useItemsFromPages(pageData?.pages ?? [], dereferenceItems);\n\n const allErrors = arrayOf(collectionError).concat(arrayOf(itemErrors));\n\n const addItem = useCallback(\n (item: string | any, shouldRefetch: boolean | number = true) => {\n queryClient.setQueryData(['collection', { collectionUrl }], (oldData: any) => {\n if (!oldData) return oldData;\n setTotalItems(totalItems && totalItems + 1);\n\n // Destructure, so react knows, it needs to re-render the pages.\n const pages = [...oldData.pages];\n const firstPageItems: any[] = pages?.[0]?.orderedItems || pages?.[0]?.items || [];\n firstPageItems.unshift(item);\n\n oldData.pages = pages;\n return oldData;\n });\n if (shouldRefetch) {\n setTimeout(\n () =>\n queryClient.refetchQueries(['collection', { collectionUrl }], {\n active: true,\n exact: true\n }),\n typeof shouldRefetch === 'number' ? shouldRefetch : 2000\n );\n }\n },\n [queryClient, collectionUrl]\n );\n\n const removeItem = useCallback(\n (item: string | any, shouldRefetch: boolean = true) => {\n queryClient.setQueryData(['collection', { collectionUrl }], (oldData: any) => {\n if (!oldData) return oldData;\n setTotalItems(totalItems && totalItems - 1);\n\n // Destructure, so react knows, it needs to re-render the pages array.\n const pages = [...oldData.pages];\n // Find the item in all pages and remove the item to be removed (either item.id or just item)\n pages.forEach(page => {\n if (page.orderedItems) {\n page.orderedItems = page.orderedItems.filter((i: any) => (i.id || i) !== (item.id || item));\n } else if (page.items) {\n page.items = page.items.filter((i: any) => (i.id || i) !== (item?.id || item));\n }\n });\n\n oldData.pages = pages;\n return oldData;\n });\n if (shouldRefetch) {\n setTimeout(\n () =>\n queryClient.refetchQueries(['collection', { collectionUrl }], {\n active: true,\n exact: true\n }),\n typeof shouldRefetch === 'number' ? shouldRefetch : 2000\n );\n }\n },\n [queryClient, collectionUrl]\n );\n\n // Live Updates\n useEffect(() => {\n if (liveUpdates && collectionUrl) {\n // Create ws that listens to collectionUri changes\n getOrCreateWsChannel(dataProvider.fetch, collectionUrl)\n .then(webSocket => {\n webSocket.addEventListener('message', e => {\n const data: SolidNotification = JSON.parse(e.data);\n if (data.type === 'Add') {\n addItem(data.object, true);\n } else if (data.type === 'Remove') {\n removeItem(data.object, true);\n }\n });\n webSocket.addEventListener('error', e => {\n setHasLiveUpdates({ status: 'error', error: e });\n // TODO: Retry after a while\n });\n webSocket.addEventListener('close', e => {\n if (!hasLiveUpdates.error) {\n setHasLiveUpdates({ ...hasLiveUpdates, status: 'closed' });\n }\n });\n setHasLiveUpdates({ status: 'connected', webSocket });\n })\n .catch(() => {}); // If it fails, we won't receive live updates. But that's okay.\n }\n }, [collectionUrl, liveUpdates, dataProvider]);\n\n return {\n items,\n totalItems,\n error: allErrors.length > 0 && allErrors,\n refetch,\n fetchNextPage,\n addItem,\n removeItem,\n hasNextPage,\n isLoading: isLoadingPage || isLoadingItems,\n isFetching: isFetchingPage || isFetchingItems,\n isFetchingNextPage,\n url: collectionUrl,\n hasLiveUpdates\n };\n};\n\nexport default useCollection;\n","export const arrayOf = <T>(value: T | T[]) => {\n // If the field is null-ish, we suppose there are no values.\n if (value === null || value === undefined) {\n return [];\n }\n // Return as is.\n if (Array.isArray(value)) {\n return value;\n }\n // Single value is made an array.\n return [value];\n};\n\nexport default {\n arrayOf\n};\n\nexport const filterDuplicates = <T>(iterable: T[], predicate: (item: T) => string) => {\n const seen = new Set<string>();\n return iterable.filter(item => {\n const key = predicate(item);\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n};\n","import { useCallback } from 'react';\nimport { useDataProvider } from 'react-admin';\nimport { SemanticDataProvider } from '@semapps/semantic-data-provider';\nimport { SolidNotification, AwaitActivityOptions } from '../types';\n\n/**\n * Hook used internally by useInbox and useOutbox. This is not exported.\n * @param webSocket WebSocket which allow to listen to the inbox or outbox\n * @param existingActivities Partial list of activities already received in the inbox and outbox\n */\nconst useAwaitActivity = (webSocket?: WebSocket, existingActivities?: Array<object | string>) => {\n const dataProvider = useDataProvider<SemanticDataProvider>();\n\n // TODO Allow to pass an object, and automatically dereference it if required, like on the @semapps/activitypub matchActivity util\n return useCallback(\n (matchActivity: (activity: object) => boolean, options: AwaitActivityOptions = {}) => {\n const { timeout = 30000, checkExistingActivities = false } = options;\n return new Promise((resolve, reject) => {\n if (webSocket) {\n const onMessage = (event: MessageEvent<string>) => {\n const data: SolidNotification = JSON.parse(event.data);\n if (data.type === 'Add') {\n dataProvider.fetch(data.object).then(({ json }) => {\n if (matchActivity(json)) {\n webSocket.removeEventListener('message', onMessage);\n return resolve(json);\n }\n });\n }\n };\n\n webSocket.addEventListener('message', onMessage);\n\n // TODO reconnect if connection closed\n webSocket.addEventListener('error', e => {\n reject(e);\n });\n webSocket.addEventListener('close', e => {\n reject(new Error(`${e.reason} (Code: ${e.code})`));\n });\n\n // If a list of activities is already loaded, verify if there is a match\n if (existingActivities && checkExistingActivities) {\n for (const a of existingActivities) {\n if (typeof a !== 'string') {\n if (matchActivity(a)) {\n webSocket.removeEventListener('message', onMessage);\n return resolve(a);\n }\n }\n }\n }\n\n setTimeout(() => {\n webSocket.removeEventListener('message', onMessage);\n reject(new Error('Timeout'));\n }, timeout);\n } else {\n throw new Error('WebSocket is not initialized !');\n }\n });\n },\n [webSocket, existingActivities, dataProvider]\n );\n};\n\nexport default useAwaitActivity;\n","import { mergeAttributes } from '@tiptap/core';\nimport Mention from '@tiptap/extension-mention';\n\n// Fix a bug in the current version of the mention extension\n// (The { id, label } object is located inside the id property)\n// See https://github.com/ueberdosis/tiptap/pull/1322\nconst CustomMention = Mention.extend({\n renderHTML({ node, HTMLAttributes }) {\n return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), `@${node.attrs.id.label}`];\n },\n addAttributes() {\n return {\n label: {\n default: null,\n parseHTML: element => {\n return {\n label: element.getAttribute('data-mention-label')\n };\n },\n renderHTML: attributes => {\n if (!attributes.id.label) {\n return {};\n }\n return {\n 'data-mention-label': attributes.id.label\n };\n }\n },\n id: {\n default: null,\n parseHTML: element => {\n return {\n id: element.getAttribute('data-mention-id')\n };\n },\n renderHTML: attributes => {\n if (!attributes.id.id) {\n return {};\n }\n return {\n 'data-mention-id': attributes.id.id\n };\n }\n }\n };\n }\n});\n\nexport default CustomMention;\n","import React from 'react';\nimport { TextField, RichTextField, DateField } from 'react-admin';\nimport { Box, Typography, CircularProgress } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport { useDataModel } from '@semapps/semantic-data-provider';\nimport { AvatarWithLabelField, ReferenceField } from '@semapps/field-components';\n\nconst useStyles = makeStyles(() => ({\n container: {\n paddingLeft: 80,\n marginTop: 8,\n minHeight: 80,\n position: 'relative'\n },\n avatar: {\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n width: 64,\n height: 64\n },\n text: {\n paddingTop: 2,\n paddingBottom: 8\n },\n label: {\n fontWeight: 'bold'\n },\n content: {\n '& p': {\n marginBlockStart: '0.5em',\n marginBlockEnd: '0.5em'\n }\n },\n loading: {\n zIndex: 1000,\n backgroundColor: 'white',\n opacity: 0.5,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n marginTop: 5\n }\n}));\n\nconst CommentsList = ({ comments, userResource, loading }) => {\n const classes = useStyles();\n const userDataModel = useDataModel(userResource);\n return (\n <Box position=\"relative\">\n {comments &&\n comments\n .sort((a, b) => new Date(b.published) - new Date(a.published))\n .map(comment => (\n <Box className={classes.container} key={comment.id}>\n <Box className={classes.avatar}>\n <ReferenceField record={comment} reference={userResource} source=\"attributedTo\" linkType=\"show\">\n <AvatarWithLabelField image={userDataModel?.fieldsMapping?.image} />\n </ReferenceField>\n </Box>\n <Box className={classes.text}>\n <Typography variant=\"body2\">\n <ReferenceField record={comment} reference={userResource} source=\"attributedTo\" linkType=\"show\">\n <TextField variant=\"body2\" source={userDataModel?.fieldsMapping?.title} className={classes.label} />\n </ReferenceField>\n &nbsp;•&nbsp;\n <DateField record={comment} variant=\"body2\" source=\"published\" showTime />\n </Typography>\n <RichTextField record={comment} variant=\"body1\" source=\"content\" className={classes.content} />\n </Box>\n </Box>\n ))}\n {loading && (\n <Box minHeight={200}>\n <Box alignItems=\"center\" className={classes.loading}>\n <CircularProgress size={60} thickness={6} />\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n\nexport default CommentsList;\n","import React from 'react';\nimport { useList, ListContextProvider, useGetMany } from 'react-admin';\nimport useCollection from '../hooks/useCollection';\n\nconst CollectionList = ({ collectionUrl, resource, children }) => {\n if (React.Children.count(children) !== 1) {\n throw new Error('<CollectionList> only accepts a single child');\n }\n\n const { items: actorsUris } = useCollection(collectionUrl);\n\n const { data, isLoading, isFetching } = useGetMany(\n resource,\n { ids: Array.isArray(actorsUris) ? actorsUris : [actorsUris] },\n { enabled: !!actorsUris }\n );\n\n const listContext = useList({ data, isLoading, isFetching });\n\n return <ListContextProvider value={listContext}>{children}</ListContextProvider>;\n};\n\nexport default CollectionList;\n","import React from 'react';\nimport { useRecordContext } from 'react-admin';\nimport CollectionList from './CollectionList';\n\nconst ReferenceCollectionField = ({ source, reference, children, ...rest }) => {\n const record = useRecordContext();\n\n if (React.Children.count(children) !== 1) {\n throw new Error('<ReferenceCollectionField> only accepts a single child');\n }\n\n if (!record || !record[source]) return null;\n\n return (\n <CollectionList resource={reference} collectionUrl={record[source]} {...rest}>\n {children}\n </CollectionList>\n );\n};\n\nexport default ReferenceCollectionField;\n","import { useGetIdentity } from 'react-admin';\nimport useCollection from './useCollection';\nimport useAwaitActivity from './useAwaitActivity';\nimport type { UseCollectionOptions } from '../types';\n\n/**\n * Hook to fetch the inbox of the logged user.\n * Returns the same data as the useCollection hooks, plus:\n * - `awaitActivity`: a function to wait for a certain activity to be received\n * - `owner`: the WebID of the inbox's owner\n * See https://semapps.org/docs/frontend/activitypub-components#useinbox for usage\n * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: true }`\n */\nconst useInbox = (options: UseCollectionOptions = {}) => {\n const { data: identity } = useGetIdentity();\n const { items, url, hasLiveUpdates, ...rest } = useCollection('inbox', options);\n const awaitActivity = useAwaitActivity(hasLiveUpdates.webSocket);\n return { items, url, hasLiveUpdates, awaitActivity, owner: identity?.id, ...rest };\n};\n\nexport default useInbox;\n","import { useEffect, useState } from 'react';\nimport { fetchUtils } from 'react-admin';\nimport type { NodeInfo, NodeInfoLinks } from '../types';\n\nconst useNodeinfo = (host : string, rel = 'http://nodeinfo.diaspora.software/ns/schema/2.1') => {\n const [schema, setSchema] = useState<NodeInfo>();\n\n useEffect(() => {\n (async () => {\n if (host && rel) {\n const protocol = host.includes(':') ? 'http' : 'https'; // If the host has a port, we are likely on HTTP\n const nodeinfoUrl = `${protocol}://${host}/.well-known/nodeinfo`;\n \n try {\n const { json: links } : { json: NodeInfoLinks } = await fetchUtils.fetchJson(nodeinfoUrl);\n \n // Accept any version of the nodeinfo protocol\n const link = links?.links?.find(l => l.rel === rel);\n \n if (link) {\n const { json } : { json: NodeInfo } = await fetchUtils.fetchJson(link.href);\n \n setSchema(json);\n }\n } catch (e) {\n // Do nothing if nodeinfo can't be fetched\n }\n }\n })();\n }, [host, setSchema, rel]);\n\n return schema;\n};\n\nexport default useNodeinfo;\n","import { useCallback } from 'react';\nimport { fetchUtils } from 'react-admin';\n\nconst useWebfinger = () => {\n // Post an activity to the logged user's outbox and return its URI\n const fetch = useCallback(async id => {\n // eslint-disable-next-line\n const [_, username, host] = id.split('@');\n if (host) {\n const protocol = host.includes(':') ? 'http' : 'https'; // If the host has a port, we are most likely on localhost\n const webfingerUrl = `${protocol}://${host}/.well-known/webfinger?resource=acct:${username}@${host}`;\n\n try {\n const { json } = await fetchUtils.fetchJson(webfingerUrl);\n\n const link = json.links.find(l => l.type === 'application/activity+json');\n\n return link ? link.href : null;\n } catch (e) {\n return null;\n }\n } else {\n return null;\n }\n }, []);\n\n return { fetch };\n};\n\nexport default useWebfinger;\n","import { useMemo } from 'react';\nimport { useGetList } from 'react-admin';\nimport { useDataModel } from '@semapps/semantic-data-provider';\nimport renderMentions from './renderMentions';\n\nconst useMentions = userResource => {\n const userDataModel = useDataModel(userResource);\n\n const { data } = useGetList(\n userResource,\n {\n filter: {\n _predicates: [userDataModel?.fieldsMapping?.title],\n blankNodes: []\n }\n },\n {\n enabled: !!userDataModel?.fieldsMapping?.title\n }\n );\n\n const availableMentions = useMemo(() => {\n if (data) {\n return data.map(item => ({ id: item.id, label: item[userDataModel?.fieldsMapping?.title] }));\n }\n }, [data]);\n\n const items = useMemo(() => {\n if (availableMentions) {\n return ({ query }) => {\n return availableMentions.filter(({ label }) => label.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5);\n };\n }\n }, [availableMentions]);\n\n return {\n items,\n render: renderMentions\n };\n};\n\nexport default useMentions;\n","import { ReactRenderer } from '@tiptap/react';\nimport tippy from 'tippy.js';\nimport MentionsList from './MentionsList';\n\nconst renderMentions = () => {\n let component;\n let popup;\n\n return {\n onStart: props => {\n component = new ReactRenderer(MentionsList, {\n props,\n editor: props.editor\n });\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start'\n });\n },\n\n onUpdate(props) {\n component.updateProps(props);\n\n popup[0].setProps({\n getReferenceClientRect: props.clientRect\n });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n popup[0].hide();\n\n return true;\n }\n\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n popup[0].destroy();\n component.destroy();\n }\n };\n};\n\nexport default renderMentions;\n","import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react';\nimport makeStyles from '@mui/styles/makeStyles';\n\nconst useStyles = makeStyles(theme => ({\n items: {\n background: '#fff',\n borderRadius: '0.5rem',\n boxShadow: '0 0 0 1px rgba(0, 0, 0, 0.05), 0px 10px 20px rgba(0, 0, 0, 0.1)',\n color: 'rgba(0, 0, 0, 0.8)',\n fontSize: '0.9rem',\n overflow: 'hidden',\n padding: '0.2rem',\n position: 'relative'\n },\n item: {\n background: 'transparent',\n border: '1px solid transparent',\n borderRadius: '0.4rem',\n display: 'block',\n margin: 0,\n padding: '0.2rem 0.4rem',\n textAlign: 'left',\n width: '100%',\n '&.selected': {\n borderColor: '#000'\n }\n }\n}));\n\nexport default forwardRef((props, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const classes = useStyles();\n\n const selectItem = index => {\n const item = props.items[index];\n\n if (item) {\n props.command({ id: item });\n }\n };\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length);\n };\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % props.items.length);\n };\n\n const enterHandler = () => {\n selectItem(selectedIndex);\n };\n\n useEffect(() => setSelectedIndex(0), [props.items]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }) => {\n if (event.key === 'ArrowUp') {\n upHandler();\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n downHandler();\n return true;\n }\n\n if (event.key === 'Enter') {\n enterHandler();\n return true;\n }\n\n return false;\n }\n }));\n\n return (\n <div className={classes.items}>\n {props.items.length ? (\n props.items.map((item, index) => (\n <button\n className={classes.item + (index === selectedIndex ? ' selected' : '')}\n key={index}\n onClick={() => selectItem(index)}\n >\n {item.label}\n </button>\n ))\n ) : (\n <div className={classes.item}>Aucun résultat</div>\n )}\n </div>\n );\n});\n"],"names":[],"version":3,"file":"index.cjs.js.map"}
1
+ {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,aAAa;;;;;;;;;;;;;;AGAN,MAAM,4CAAiB;IAC5B,QAAQ;IACR,KAAK;IACL,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,OAAO;IACP,UAAU;IACV,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,kBAAkB;IAClB,kBAAkB;IAClB,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;AACR;AAEO,MAAM,4CAAc;IACzB,aAAa;IACb,OAAO;IACP,cAAc;IACd,QAAQ;IACR,SAAS;AACX;AAEO,MAAM,4CAAe;IAC1B,SAAS;IACT,OAAO;IACP,UAAU;IACV,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,cAAc;IACd,WAAW;IACX,OAAO;AACT;AAEO,MAAM,4CAAa;;;;;;;;;AGtDnB,MAAM,4CAAU,CAAI;IACzB,4DAA4D;IAC5D,IAAI,UAAU,QAAQ,UAAU,WAC9B,OAAO,EAAE;IAEX,gBAAgB;IAChB,IAAI,MAAM,OAAO,CAAC,QAChB,OAAO;IAET,iCAAiC;IACjC,OAAO;QAAC;KAAM;AAChB;IAEA,2CAAe;aACb;AACF;AAEO,MAAM,4CAAmB,CAAI,UAAe;IACjD,MAAM,OAAO,IAAI;IACjB,OAAO,SAAS,MAAM,CAAC,CAAA;QACrB,MAAM,MAAM,UAAU;QACtB,IAAI,KAAK,GAAG,CAAC,MACX,OAAO;QAET,KAAK,GAAG,CAAC;QACT,OAAO;IACT;AACF;;;ADpBA,2BAA2B;AAC3B,MAAM,mCAAsB,EAAE;AAE9B,MAAM,0CAAoB,CAAC,OAAc;IACvC,MAAM,eAAe,CAAA,GAAA,iCAAc;IACnC,MAAM,QAAQ,CAAA,GAAA,oBAAM,EAAE,IAAM,MAAM,OAAO,CAAC,CAAA,IAAK,CAAA,GAAA,yCAAM,EAAE,EAAE,YAAY,IAAI,EAAE,KAAK,IAAI;QAAC;KAAM;IAE3F,0EAA0E;IAC1E,MAAM,oBAAoB,CAAA,GAAA,oBAAM,EAAE;QAChC,OAAO,oBAAoB,MAAM,IAAI,CAAC,CAAA,OAAQ,OAAO,SAAS;IAChE,GAAG;QAAC;QAAkB;KAAM;IAE5B,yGAAyG;IACzG,MAAM,cAAc,CAAA,GAAA,4BAAS,EAC3B,CAAC,oBACG,mCACA,MACG,MAAM,CAAC,CAAA,OAAQ,OAAO,SAAS,UAC/B,GAAG,CAAC,CAAA,UAAY,CAAA;YACf,UAAU;gBAAC;gBAAY;aAAQ;YAC/B,SAAS,UAAY,AAAC,CAAA,MAAM,aAAa,KAAK,CAAC,QAAO,EAAG,IAAI;YAC7D,WAAW;QACb,CAAA;IAGR,IAAI,CAAC,mBACH,OAAO;QAAE,aAAa;QAAO,WAAW;QAAO,YAAY;IAAM;IAGnE,iFAAiF;IACjF,MAAM,cAAc,MACjB,MAAM,CAAC,CAAA,OAAQ,OAAO,SAAS,UAC/B,MAAM,CACL,YAAY,OAAO,CAAC,CAAA;QAClB,OAAO,AAAC,UAAU,SAAS,IAAI,UAAU,IAAI,IAAK,EAAE;IACtD;IAGJ,MAAM,SAAS,YAAY,MAAM,CAAC,CAAA,IAAK,EAAE,KAAK;IAC9C,OAAO;qBACL;QACA,WAAW,YAAY,IAAI,CAAC,CAAA,IAAK,EAAE,SAAS;QAC5C,YAAY,YAAY,IAAI,CAAC,CAAA,IAAK,EAAE,UAAU;QAC9C,QAAQ,OAAO,MAAM,GAAG,IAAI,SAAS;IACvC;AACF;AAEA;;;;CAIC,GACD,MAAM,sCAAgB,CAAC,gBAAwB,UAAgC,CAAC,CAAC;IAC/E,MAAM,oBAAE,mBAAmB,oBAAO,cAAc,OAAO,GAAG;IAC1D,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,CAAA,GAAA,gCAAa;IACxC,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,qBAAO,EAAU;IACrD,MAAM,cAAc,CAAA,GAAA,gCAAa;IACjC,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,qBAAO,EAAmC;QACpF,QAAQ;IACV;IACA,MAAM,eAAe,CAAA,GAAA,iCAAc;IACnC,MAAM,eAAe,CAAA,GAAA,mBAAK,EAAoB;IAE9C,iDAAiD;IACjD,MAAM,gBAAgB,CAAA,GAAA,oBAAM,EAAE;QAC5B,IAAI,gBAAgB;YAClB,IAAI,eAAe,UAAU,CAAC,SAC5B,OAAO;YAET,IAAI,UAAU,WACZ,OAAO,UAAU,WAAW,CAAC,eAAe;QAEhD;QACA,OAAO;IACP,6EAA6E;IAC/E,GAAG;QAAC;QAAU;KAAe;IAE7B,mEAAmE;IACnE,yEAAyE;IACzE,MAAM,kBAAiC,CAAA,GAAA,wBAAU,EAC/C,OAAO,EAAE,WAAW,WAAW,EAAE;QAC/B,2CAA2C;QAC3C,IAAI,QAAE,IAAI,EAAE,GAAG,MAAM,aAAa,KAAK,CAAC,eAAe;QACvD,IAAI,KAAK,UAAU,EAAE,cAAc,KAAK,UAAU;QAElD,mCAAmC;QACnC,IAAI,AAAC,CAAA,KAAK,IAAI,KAAK,uBAAuB,KAAK,IAAI,KAAK,YAAW,KAAM,KAAK,KAAK;YACjF,IAAI,KAAK,KAAK,EAAE;gBACd,IAAI,KAAK,KAAK,EAAE,MAAM,WAAW,KAAK,KAAK,KAAK,EAAE,MAChD,mEAAmE;gBAClE,CAAA,QAAE,IAAI,EAAE,GAAG,MAAM,aAAa,KAAK,CAAC,KAAK,KAAK,EAAE,KAAI;qBAErD,OAAO,KAAK,KAAK;mBAGnB,uBAAuB;YACtB,CAAA,QAAE,IAAI,EAAE,GAAG,MAAM,aAAa,KAAK,CAAC,KAAK,KAAK,CAAA;;QAInD,OAAO;IACT,GACA;QAAC;QAAc;QAAe;QAAU;KAAc;IAGxD,yDAAyD;IACzD,MAAM,EACJ,MAAM,QAAQ,EACd,OAAO,eAAe,iBACtB,aAAa,WACb,OAAO,eACP,WAAW,EACX,WAAW,aAAa,EACxB,YAAY,cAAc,sBAC1B,kBAAkB,EACnB,GAAG,CAAA,GAAA,kCAAe,EAAE;QAAC;QAAc;2BAAE;QAAc;KAAE,EAAE,iBAAiB;QACvE,SAAS,CAAC,CAAE,CAAA,iBAAiB,UAAU,EAAC;QACxC,kBAAkB,CAAC,WAAkB,SAAS,IAAI;QAClD,sBAAsB,CAAC,YAAmB,UAAU,IAAI;IAC1D;IAEA,mEAAmE;IACnE,MAAM,EACJ,aAAa,KAAK,EAClB,WAAW,cAAc,EACzB,YAAY,eAAe,EAC3B,QAAQ,UAAU,EACnB,GAAG,wCAAkB,UAAU,SAAS,kCAAY;IAErD,MAAM,YAAY,CAAA,GAAA,yCAAM,EAAE,iBAAiB,MAAM,CAAC,CAAA,GAAA,yCAAM,EAAE;IAE1D,MAAM,UAAU,CAAA,GAAA,wBAAU,EACxB,CAAC,MAAoB,gBAAkC,IAAI;QACzD,YAAY,YAAY,CAAC;YAAC;YAAc;+BAAE;YAAc;SAAE,EAAE,CAAC;YAC3D,IAAI,CAAC,SAAS,OAAO;YACrB,cAAc,CAAA,aAAc,aAAa;YAEzC,gEAAgE;YAChE,MAAM,QAAQ;mBAAI,QAAQ,KAAK;aAAC;YAEhC,IAAI,OAAO,CAAC,EAAE,EAAE,cACd,KAAK,CAAC,EAAE,CAAC,YAAY,GAAG;gBAAC;mBAAS,CAAA,GAAA,yCAAM,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY;aAAE;iBAC5D,IAAI,OAAO,CAAC,EAAE,EAAE,OACrB,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG;gBAAC;mBAAS,CAAA,GAAA,yCAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK;aAAE;YAGrD,QAAQ,KAAK,GAAG;YAChB,OAAO;QACT;QACA,IAAI,eACF,WACE,IACE,YAAY,cAAc,CAAC;gBAAC;gBAAc;mCAAE;gBAAc;aAAE,EAAE;gBAC5D,QAAQ;gBACR,OAAO;YACT,IACF,OAAO,kBAAkB,WAAW,gBAAgB;IAG1D,GACA;QAAC;QAAa;QAAe;KAAc;IAG7C,MAAM,aAAa,CAAA,GAAA,wBAAU,EAC3B,CAAC,MAAoB,gBAAyB,IAAI;QAChD,YAAY,YAAY,CAAC;YAAC;YAAc;+BAAE;YAAc;SAAE,EAAE,CAAC;YAC3D,IAAI,CAAC,SAAS,OAAO;YACrB,cAAc,CAAA,aAAc,aAAa;YAEzC,sEAAsE;YACtE,MAAM,QAAQ;mBAAI,QAAQ,KAAK;aAAC;YAChC,6FAA6F;YAC7F,MAAM,OAAO,CAAC,CAAA;gBACZ,IAAI,KAAK,YAAY,EACnB,KAAK,YAAY,GAAG,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC,IAAW,AAAC,CAAA,EAAE,EAAE,IAAI,CAAA,MAAQ,CAAA,KAAK,EAAE,IAAI,IAAG;qBACnF,IAAI,KAAK,KAAK,EACnB,KAAK,KAAK,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,IAAW,AAAC,CAAA,EAAE,EAAE,IAAI,CAAA,MAAQ,CAAA,MAAM,MAAM,IAAG;YAE/E;YAEA,QAAQ,KAAK,GAAG;YAChB,OAAO;QACT;QACA,IAAI,eACF,WACE,IACE,YAAY,cAAc,CAAC;gBAAC;gBAAc;mCAAE;gBAAc;aAAE,EAAE;gBAC5D,QAAQ;gBACR,OAAO;YACT,IACF,OAAO,kBAAkB,WAAW,gBAAgB;IAG1D,GACA;QAAC;QAAa;QAAe;KAAc;IAG7C,eAAe;IACf,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,eAAe,eACjB,kDAAkD;QAClD,CAAA,GAAA,uDAAmB,EAAE,aAAa,KAAK,EAAE,eACtC,IAAI,CAAC,CAAA;YACJ,aAAa,OAAO,GAAG,IAAI,+DAA+D;YAC1F,aAAa,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAA;gBAC/C,MAAM,OAA0B,KAAK,KAAK,CAAC,EAAE,IAAI;gBACjD,IAAI,KAAK,IAAI,KAAK,OAChB,QAAQ,KAAK,MAAM,EAAE;qBAChB,IAAI,KAAK,IAAI,KAAK,UACvB,WAAW,KAAK,MAAM,EAAE;YAE5B;YACA,aAAa,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAA;gBAC7C,kBAAkB;oBAAE,QAAQ;oBAAS,OAAO;gBAAE;YAC9C,4BAA4B;YAC9B;YACA,aAAa,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAA;gBAC7C,IAAI,CAAC,eAAe,KAAK,EACvB,kBAAkB;oBAAE,GAAG,cAAc;oBAAE,QAAQ;gBAAS;YAE5D;YACA,kBAAkB;gBAAE,QAAQ;YAAY;QAC1C,GACC,KAAK,CAAC,KAAO,IAAI,+DAA+D;IAEvF,GAAG;QAAC;QAAe;QAAa;QAAc;QAAc;QAAS;QAAY;KAAkB;IAEnG,MAAM,2BAA2B,CAAA,GAAA,wBAAU,EACzC,CAAC,UAAgC,CAAC,CAAC;QACjC,MAAM,WAAE,UAAU,OAAO,GAAG;QAC5B,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,CAAC,mFAAmF,CAAC;QACvG,OAAO,IAAI,QAAQ,CAAC,SAAS;YAC3B,IAAI,cAAc,SAChB,QAAQ;iBACH;gBACL,MAAM,YAAY,WAAW;oBAC3B,OAAO,CAAC,qCAAqC,EAAE,KAAK,KAAK,CAAC,UAAU,MAAM,CAAC,CAAC;gBAC9E,GAAG;gBACH,MAAM,aAAa,YAAY;oBAC7B,IAAI,cAAc,SAAS;wBACzB,cAAc;wBACd,aAAa;wBACb,QAAQ;oBACV,OACE,QAAQ,GAAG,CAAC;gBAEhB,GAAG;YACL;QACF;IACF,GACA;QAAC;QAAc;KAAY;IAG7B,OAAO;eACL;oBACA;QACA,OAAO,UAAU,MAAM,GAAG,KAAK;iBAC/B;uBACA;iBACA;oBACA;qBACA;QACA,WAAW,iBAAiB;QAC5B,YAAY,kBAAkB;4BAC9B;QACA,KAAK;wBACL;kCACA;sBACA;IACF;AACF;IAEA,2CAAe;;;;;AEnRf;;;;CAIC,GACD,MAAM,yCAAmB,CACvB,0BACA;IAEA,MAAM,eAAe,CAAA,GAAA,iCAAc;IAEnC,mIAAmI;IACnI,OAAO,CAAA,GAAA,wBAAU,EACf,CAAC,eAA8C,UAAgC,CAAC,CAAC;QAC/E,MAAM,WAAE,UAAU,gCAAO,0BAA0B,OAAO,GAAG;QAC7D,OAAO,IAAI,QAAQ,CAAC,SAAS;YAC3B,2BACG,IAAI,CAAC,CAAA;gBACJ,MAAM,YAAY,CAAC;oBACjB,MAAM,OAA0B,KAAK,KAAK,CAAC,MAAM,IAAI;oBACrD,IAAI,KAAK,IAAI,KAAK,OAChB,aAAa,KAAK,CAAC,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,QAAE,IAAI,EAAE;wBAC5C,IAAI,cAAc,OAAO;4BACvB;4BACA,OAAO,QAAQ;wBACjB;oBACF;gBAEJ;gBACA,MAAM,UAAU,CAAC;oBACf,sCAAsC;oBACtC;oBACA,OAAO;gBACT;gBACA,MAAM,UAAU,CAAC;oBACf;oBACA,OAAO,IAAI,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBAClD;gBAEA,MAAM,kBAAkB;oBACtB,aAAa,OAAO,EAAE,oBAAoB,WAAW;oBACrD,aAAa,OAAO,EAAE,oBAAoB,SAAS;oBACnD,aAAa,OAAO,EAAE,oBAAoB,SAAS;gBACrD;gBAEA,aAAa,OAAO,EAAE,iBAAiB,WAAW;gBAClD,aAAa,OAAO,EAAE,iBAAiB,SAAS;gBAChD,aAAa,OAAO,EAAE,iBAAiB,SAAS;gBAEhD,wEAAwE;gBACxE,IAAI,sBAAsB,yBACxB,KAAK,MAAM,KAAK,mBAAoB;oBAClC,IAAI,OAAO,MAAM,UACf;wBAAA,IAAI,cAAc,IAAI;4BACpB;4BACA,OAAO,QAAQ;wBACjB;oBAAA;gBAEJ;gBAGF,WAAW;oBACT;oBACA,OAAO,IAAI,MAAM;gBACnB,GAAG;YACL,GACC,KAAK,CAAC,CAAA;gBACL,OAAO;YACT;QACJ;IACF,GACA;QAAC;QAA0B;QAAoB;KAAa;AAEhE;IAEA,2CAAe;;;AHzEf;;;;;;;;CAQC,GACD,MAAM,kCAAY,CAAC,UAAgC,CAAC,CAAC;IACnD,MAAM,eAAe,CAAA,GAAA,iCAAc;IACnC,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,CAAA,GAAA,gCAAa;IACxC,MAAM,OAAE,GAAG,SAAE,KAAK,4BAAE,wBAAwB,EAAE,GAAG,MAAM,GAAG,CAAA,GAAA,wCAAY,EAAE,UAAU;IAClF,MAAM,gBAAgB,CAAA,GAAA,wCAAe,EAAE,0BAA0B;IAEjE,kEAAkE;IAClE,MAAM,OAAO,CAAA,GAAA,wBAAU,EACrB,OAAO;QACL,IAAI,CAAC,KACH,MAAM,IAAI,MACR;QAGJ,MAAM,WAAE,OAAO,EAAE,GAAG,MAAM,aAAa,KAAK,CAAC,KAAK;YAChD,QAAQ;YACR,MAAM,KAAK,SAAS,CAAC;gBACnB,YAAY;gBACZ,GAAG,QAAQ;YACb;QACF;QACA,OAAO,QAAQ,GAAG,CAAC;IACrB,GACA;QAAC;QAAK;KAAa;IAGrB,OAAO;aAAE;eAAK;kCAAO;cAA0B;uBAAM;QAAe,OAAO,UAAU;QAAI,GAAG,IAAI;IAAC;AACnG;IAEA,2CAAe;;;;;AI1Cf,4DAA4D;AAC5D,+DAA+D;AAC/D,qDAAqD;AACrD,MAAM,sCAAgB,CAAA,GAAA,uDAAM,EAAE,MAAM,CAAC;IACnC,YAAW,QAAE,IAAI,kBAAE,cAAc,EAAE;QACjC,OAAO;YAAC;YAAQ,CAAA,GAAA,iCAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YAAiB,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;SAAC;IAC1G;IACA;QACE,OAAO;YACL,OAAO;gBACL,SAAS;gBACT,WAAW,CAAA;oBACT,OAAO;wBACL,OAAO,QAAQ,YAAY,CAAC;oBAC9B;gBACF;gBACA,YAAY,CAAA;oBACV,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,EACtB,OAAO,CAAC;oBAEV,OAAO;wBACL,sBAAsB,WAAW,EAAE,CAAC,KAAK;oBAC3C;gBACF;YACF;YACA,IAAI;gBACF,SAAS;gBACT,WAAW,CAAA;oBACT,OAAO;wBACL,IAAI,QAAQ,YAAY,CAAC;oBAC3B;gBACF;gBACA,YAAY,CAAA;oBACV,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,EACnB,OAAO,CAAC;oBAEV,OAAO;wBACL,mBAAmB,WAAW,EAAE,CAAC,EAAE;oBACrC;gBACF;YACF;QACF;IACF;AACF;IAEA,2CAAe;;;ANnCf,MAAM,kCAAY,CAAA,GAAA,oDAAS,EAAE,CAAA,QAAU,CAAA;QACrC,MAAM;YACJ,WAAW,IAAI,sDAAsD;QACvE;QACA,WAAW;YACT,aAAa;YACb,UAAU;QACZ;QACA,QAAQ;YACN,UAAU;YACV,KAAK;YACL,MAAM;YACN,QAAQ;YACR,OAAO;YACP,QAAQ;QACV;QACA,eAAe;YACb,WAAW;gBACT,iBAAiB;gBACjB,SAAS;gBACT,aAAa;gBACb,cAAc;gBACd,cAAc;gBACd,WAAW;gBACX,SAAS;YACX;YACA,eAAe;gBACb,WAAW;gBACX,cAAc;gBACd,YAAY,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU;gBAC7C,kBAAkB;gBAClB,gBAAgB;YAClB;YACA,mDAAmD;gBACjD,OAAO;gBACP,SAAS;gBACT,OAAO;gBACP,QAAQ;gBACR,eAAe;YACjB;QACF;QACA,QAAQ;YACN,WAAW;YACX,cAAc;QAChB;IACF,CAAA;AAEA,MAAM,qCAAe,IAAM;AAE3B,MAAM,wCAAkB,CAAC,WAAE,OAAO,eAAE,WAAW,cAAE,UAAU,YAAE,QAAQ,gBAAE,YAAY,WAAE,OAAO,cAAE,UAAU,EAAE;IACxG,MAAM,SAAS,CAAA,GAAA,kCAAe;IAC9B,MAAM,EAAE,MAAM,QAAQ,aAAE,SAAS,EAAE,GAAG,CAAA,GAAA,gCAAa;IACnD,MAAM,gBAAgB,CAAA,GAAA,+CAAW,EAAE;IACnC,MAAM,UAAU;IAChB,MAAM,SAAS,CAAA,GAAA,2BAAQ;IACvB,MAAM,SAAS,CAAA,GAAA,wCAAQ;IACvB,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,qBAAO,EAAE;IACzC,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,qBAAO,EAAE;IAEzC,MAAM,WAAW,CAAA,GAAA,wBAAU,EACzB,OAAM;QACJ,MAAM,WAAW,IAAI,YAAY,eAAe,CAAC,OAAO,OAAO,EAAE;QACjE,MAAM,WAAW,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,sBAAsB,CAAC;QACjE,MAAM,qBAAqB,EAAE;QAE7B,SAAS,OAAO,CAAC,CAAA;YACf,MAAM,UAAU,KAAK,UAAU,CAAC,kBAAkB,CAAC,KAAK;YACxD,MAAM,YAAY,KAAK,UAAU,CAAC,qBAAqB,CAAC,KAAK;YAC7D,MAAM,OAAO,SAAS,aAAa,CAAC;YACpC,KAAK,YAAY,CACf,QACA,CAAC,EAAE,IAAI,IAAI,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,mBAAmB,SAAS,KAAK,CAAC;YAE/F,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;YAClC,KAAK,UAAU,CAAC,YAAY,CAAC,MAAM;YACnC,mBAAmB,IAAI,CAAC;QAC1B;QAEA,IAAI,SAAS,IAAI,CAAC,SAAS,KAAK,aAC9B,OAAO,8BAA8B;YAAE,MAAM;QAAQ;aAChD;YACL,MAAM,SAAS,KAAK,GAAG;YAEvB,MAAM,OAAO;gBACX,MAAM,CAAA,GAAA,yCAAW,EAAE,IAAI;gBACvB,cAAc,OAAO,KAAK;gBAC1B,SAAS,SAAS,IAAI,CAAC,SAAS;gBAChC,WAAW,MAAM,CAAC,QAAQ;gBAC1B,WAAW,IAAI,OAAO,WAAW;YACnC;YAEA,IAAI;gBACF,QAAQ;oBAAE,IAAI;oBAAQ,GAAG,IAAI;gBAAC;gBAC9B,sBAAsB;gBACtB,YAAY;gBACZ,MAAM,OAAO,IAAI,CAAC;oBAAE,GAAG,IAAI;oBAAE,IAAI;2BAAI;wBAAoB,CAAA,GAAA,yCAAS;qBAAE;gBAAC;gBACrE,OAAO,uCAAiC;oBAAE,MAAM;gBAAU;YAC5D,EAAE,OAAO,GAAG;gBACV,QAAQ,KAAK,CAAC;gBACd,WAAW;gBACX,OAAO,EAAE,OAAO,EAAE;oBAAE,MAAM;gBAAQ;YACpC;QACF;IACF,GACA;QAAC;QAAQ;QAAQ;QAAa;QAAS;KAAW;IAGpD,MAAM,yBAAyB,CAAA,GAAA,wBAAU,EAAE;QACzC,IAAI,CAAC,UAAU,IACb,YAAY;IAEhB,GAAG;QAAC;QAAU;KAAY;IAE1B,6GAA6G;IAC7G,IAAI,AAAC,YAAY,CAAC,SAAS,KAAK,IAAK,WAAW,OAAO;IAEvD,qBACE;;0BACE,gCAAC,CAAA,GAAA,sBAAG;gBAAE,UAAU;gBAAU,WAAW,QAAQ,IAAI;0BAC/C,cAAA,iCAAC,CAAA,GAAA,sBAAE;oBAAE,WAAW,QAAQ,SAAS;oBAAE,SAAS;;sCAC1C,gCAAC,CAAA,GAAA,yBAAK;4BACJ,KACE,UAAU,WAAW,CAAC,eAAe,eAAe,MAAM,IAC1D,UAAU,aAAa,CAAC,eAAe,eAAe,MAAM;4BAE9D,WAAW,QAAQ,MAAM;;sCAE3B,gCAAC,CAAA,GAAA,oCAAY;4BACX,QAAO;4BACP,OAAM;4BACN,uBAAS,gCAAC;4BACV,SAAS;4BACT,SAAS;gCAAE,eAAe,QAAQ,aAAa;4BAAC;4BAChD,eAAe;gCACb,GAAG,CAAA,GAAA,2CAAmB,CAAC;gCACvB;oCACE,YAAY;gCACd;gCACA,YAAY;uCACP,CAAA,GAAA,2CAAmB,EAAE,UAAU;oCAClC,cAAc,CAAA,GAAA,2DAAU,EAAE,SAAS,CAAC;qDAAE;oCAAY,KAAK;oCACvD,WACI,CAAA,GAAA,wCAAY,EAAE,SAAS,CAAC;wCACtB,gBAAgB;4CACd,OAAO;wCACT;wCACA,YAAY;oCACd,KACA;iCACL;gCACD,0CAA0C;gCAC1C,UAAU,CAAC,CAAC,UAAU;4BACxB;4BACA,YAAY;;wBAEb,0BACC,gCAAC,CAAA,GAAA,yBAAK;4BACJ,MAAK;4BACL,MAAK;4BACL,SAAQ;4BACR,OAAM;4BACN,uBAAS,gCAAC,CAAA,GAAA,qDAAO;4BACjB,WAAW,QAAQ,MAAM;sCAC1B;;;;;0BAMP,gCAAC,CAAA,GAAA,qCAAS;gBACR,MAAM;gBACN,SAAS,IAAM,YAAY;gBAC3B,SAAQ;;;;AAIhB;IAEA,2CAAe;;;;;;;;;;AOxLf,MAAM,kCAAY,CAAA,GAAA,oDAAS,EAAE,IAAO,CAAA;QAClC,WAAW;YACT,aAAa;YACb,WAAW;YACX,WAAW;YACX,UAAU;QACZ;QACA,QAAQ;YACN,UAAU;YACV,KAAK;YACL,MAAM;YACN,QAAQ;YACR,OAAO;YACP,QAAQ;QACV;QACA,MAAM;YACJ,YAAY;YACZ,eAAe;QACjB;QACA,OAAO;YACL,YAAY;QACd;QACA,SAAS;YACP,OAAO;gBACL,kBAAkB;gBAClB,gBAAgB;YAClB;QACF;QACA,SAAS;YACP,QAAQ;YACR,iBAAiB;YACjB,SAAS;YACT,UAAU;YACV,KAAK;YACL,MAAM;YACN,OAAO;YACP,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,gBAAgB;YAChB,WAAW;YACX,WAAW;QACb;IACF,CAAA;AAEA,MAAM,qCAAe,CAAC,YAAE,QAAQ,gBAAE,YAAY,WAAE,OAAO,EAAE;IACvD,MAAM,UAAU;IAChB,MAAM,gBAAgB,CAAA,GAAA,+CAAW,EAAE;IACnC,qBACE,iCAAC,CAAA,GAAA,sBAAE;QAAE,UAAS;;YACX,YACC,SACG,IAAI,CAAC,CAAC,GAAG,IAAM,IAAI,KAAK,EAAE,SAAS,IAAI,IAAI,KAAK,EAAE,SAAS,GAC3D,GAAG,CAAC,CAAA,wBACH,iCAAC,CAAA,GAAA,sBAAE;oBAAE,WAAW,QAAQ,SAAS;;sCAC/B,gCAAC,CAAA,GAAA,sBAAE;4BAAE,WAAW,QAAQ,MAAM;sCAC5B,cAAA,gCAAC,CAAA,GAAA,4CAAa;gCAAE,QAAQ;gCAAS,WAAW;gCAAc,QAAO;gCAAe,UAAS;0CACvF,cAAA,gCAAC,CAAA,GAAA,kDAAmB;oCAAE,OAAO,eAAe,eAAe;;;;sCAG/D,iCAAC,CAAA,GAAA,sBAAE;4BAAE,WAAW,QAAQ,IAAI;;8CAC1B,iCAAC,CAAA,GAAA,6BAAS;oCAAE,SAAQ;;sDAClB,gCAAC,CAAA,GAAA,4CAAa;4CAAE,QAAQ;4CAAS,WAAW;4CAAc,QAAO;4CAAe,UAAS;sDACvF,cAAA,gCAAC,CAAA,GAAA,2BAAQ;gDAAE,SAAQ;gDAAQ,QAAQ,eAAe,eAAe;gDAAO,WAAW,QAAQ,KAAK;;;wCACjF;sDAEjB,gCAAC,CAAA,GAAA,2BAAQ;4CAAE,QAAQ;4CAAS,SAAQ;4CAAQ,QAAO;4CAAY,QAAQ;;;;8CAEzE,gCAAC,CAAA,GAAA,+BAAY;oCAAE,QAAQ;oCAAS,SAAQ;oCAAQ,QAAO;oCAAU,WAAW,QAAQ,OAAO;;;;;mBAdvD,QAAQ,EAAE;YAkBvD,yBACC,gCAAC,CAAA,GAAA,sBAAE;gBAAE,WAAW;0BACd,cAAA,gCAAC,CAAA,GAAA,sBAAE;oBAAE,YAAW;oBAAS,WAAW,QAAQ,OAAO;8BACjD,cAAA,gCAAC,CAAA,GAAA,mCAAe;wBAAE,MAAM;wBAAI,WAAW;;;;;;AAMnD;IAEA,2CAAe;;;;ARpFf,MAAM,sCAAgB,CAAC,UAAE,MAAM,WAAE,OAAO,cAAE,UAAU,eAAE,WAAW,gBAAE,YAAY,YAAE,QAAQ,EAAE;IACzF,MAAM,SAAS,CAAA,GAAA,kCAAe;IAC9B,MAAM,EAAE,OAAO,QAAQ,WAAE,OAAO,WAAE,OAAO,cAAE,UAAU,EAAE,GAAG,CAAA,GAAA,wCAAY,EAAE,OAAO,OAAO;IACtF,IAAI,CAAC,cAAc,MAAM,IAAI,MAAM;IACnC,qBACE;;0BACE,gCAAC,CAAA,GAAA,wCAAc;gBACb,SAAS;gBACT,YAAY;gBACZ,cAAc;gBACd,aAAa;gBACb,UAAU;gBACV,SAAS;gBACT,YAAY;;0BAEd,gCAAC,CAAA,GAAA,wCAAW;gBAAE,UAAU;gBAAU,SAAS;gBAAS,cAAc;;;;AAGxE;AAEA,oCAAc,YAAY,GAAG;IAC3B,OAAO;IACP,aAAa;IACb,QAAQ;IACR,SAAS;AACX;IAEA,2CAAe;;;;;;;AS7Bf,MAAM,uCAAiB,CAAC,iBAAE,aAAa,YAAE,QAAQ,YAAE,QAAQ,EAAE;IAC3D,IAAI,CAAA,GAAA,sCAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc,GACrC,MAAM,IAAI,MAAM;IAGlB,MAAM,EAAE,OAAO,UAAU,EAAE,GAAG,CAAA,GAAA,wCAAY,EAAE;IAE5C,MAAM,QAAE,IAAI,aAAE,SAAS,cAAE,UAAU,EAAE,GAAG,CAAA,GAAA,4BAAS,EAC/C,UACA;QAAE,KAAK,MAAM,OAAO,CAAC,cAAc,aAAa;YAAC;SAAW;IAAC,GAC7D;QAAE,SAAS,CAAC,CAAC;IAAW;IAG1B,MAAM,cAAc,CAAA,GAAA,yBAAM,EAAE;cAAE;mBAAM;oBAAW;IAAW;IAE1D,qBAAO,gCAAC,CAAA,GAAA,qCAAkB;QAAE,OAAO;kBAAc;;AACnD;IAEA,2CAAe;;;;;;;AClBf,MAAM,iDAA2B,CAAC,UAAE,MAAM,aAAE,SAAS,YAAE,QAAQ,EAAE,GAAG,MAAM;IACxE,MAAM,SAAS,CAAA,GAAA,kCAAe;IAE9B,IAAI,CAAA,GAAA,sCAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc,GACrC,MAAM,IAAI,MAAM;IAGlB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO;IAEvC,qBACE,gCAAC,CAAA,GAAA,wCAAa;QAAE,UAAU;QAAW,eAAe,MAAM,CAAC,OAAO;QAAG,GAAG,IAAI;kBACzE;;AAGP;IAEA,2CAAe;;;;;;;ACff;;;;;;;CAOC,GACD,MAAM,iCAAW,CAAC,UAAgC,CAAC,CAAC;IAClD,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,CAAA,GAAA,gCAAa;IACxC,MAAM,OAAE,GAAG,SAAE,KAAK,4BAAE,wBAAwB,EAAE,GAAG,MAAM,GAAG,CAAA,GAAA,wCAAY,EAAE,SAAS;IACjF,MAAM,gBAAgB,CAAA,GAAA,wCAAe,EAAE,0BAA0B;IACjE,OAAO;aAAE;eAAK;kCAAO;uBAA0B;QAAe,OAAO,UAAU;QAAI,GAAG,IAAI;IAAC;AAC7F;IAEA,2CAAe;;;;;AChBf,MAAM,oCAAc,CAAC,MAAe,MAAM,iDAAiD;IACzF,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,qBAAO;IAEnC,CAAA,GAAA,sBAAQ,EAAE;QACP,CAAA;YACC,IAAI,QAAQ,KAAK;gBACf,MAAM,WAAW,KAAK,QAAQ,CAAC,OAAO,SAAS,SAAS,gDAAgD;gBACxG,MAAM,cAAc,CAAC,EAAE,SAAS,GAAG,EAAE,KAAK,qBAAqB,CAAC;gBAEhE,IAAI;oBACF,MAAM,EAAE,MAAM,KAAK,EAAE,GAA4B,MAAM,CAAA,GAAA,4BAAS,EAAE,SAAS,CAAC;oBAE5E,8CAA8C;oBAC9C,MAAM,OAAO,OAAO,OAAO,KAAK,CAAA,IAAK,EAAE,GAAG,KAAK;oBAE/C,IAAI,MAAM;wBACR,MAAM,QAAE,IAAI,EAAE,GAAuB,MAAM,CAAA,GAAA,4BAAS,EAAE,SAAS,CAAC,KAAK,IAAI;wBAEzE,UAAU;oBACZ;gBACF,EAAE,OAAO,GAAG;gBACV,0CAA0C;gBAC5C;YACF;QACF,CAAA;IACF,GAAG;QAAC;QAAM;QAAW;KAAI;IAEzB,OAAO;AACT;IAEA,2CAAe;;;;;;AC/Bf,MAAM,qCAAe;IACnB,kEAAkE;IAClE,MAAM,QAAQ,CAAA,GAAA,wBAAU,EAAE,OAAM;QAC9B,2BAA2B;QAC3B,MAAM,CAAC,GAAG,UAAU,KAAK,GAAG,GAAG,KAAK,CAAC;QACrC,IAAI,MAAM;YACR,MAAM,WAAW,KAAK,QAAQ,CAAC,OAAO,SAAS,SAAS,0DAA0D;YAClH,MAAM,eAAe,CAAC,EAAE,SAAS,GAAG,EAAE,KAAK,qCAAqC,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC;YAEpG,IAAI;gBACF,MAAM,QAAE,IAAI,EAAE,GAAG,MAAM,CAAA,GAAA,4BAAS,EAAE,SAAS,CAAC;gBAE5C,MAAM,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA,IAAK,EAAE,IAAI,KAAK;gBAE7C,OAAO,OAAO,KAAK,IAAI,GAAG;YAC5B,EAAE,OAAO,GAAG;gBACV,OAAO;YACT;QACF,OACE,OAAO;IAEX,GAAG,EAAE;IAEL,OAAO;eAAE;IAAM;AACjB;IAEA,2CAAe;;;;;;;;;;;AG1Bf,MAAM,kCAAY,CAAA,GAAA,oDAAS,EAAE,CAAA,QAAU,CAAA;QACrC,OAAO;YACL,YAAY;YACZ,cAAc;YACd,WAAW;YACX,OAAO;YACP,UAAU;YACV,UAAU;YACV,SAAS;YACT,UAAU;QACZ;QACA,MAAM;YACJ,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,SAAS;YACT,QAAQ;YACR,SAAS;YACT,WAAW;YACX,OAAO;YACP,cAAc;gBACZ,aAAa;YACf;QACF;IACF,CAAA;IAEA,yDAAe,CAAA,GAAA,uBAAS,EAAE,CAAC,OAAO;IAChC,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,qBAAO,EAAE;IACnD,MAAM,UAAU;IAEhB,MAAM,aAAa,CAAA;QACjB,MAAM,OAAO,MAAM,KAAK,CAAC,MAAM;QAE/B,IAAI,MACF,MAAM,OAAO,CAAC;YAAE,IAAI;QAAK;IAE7B;IAEA,MAAM,YAAY;QAChB,iBAAiB,AAAC,CAAA,gBAAgB,MAAM,KAAK,CAAC,MAAM,GAAG,CAAA,IAAK,MAAM,KAAK,CAAC,MAAM;IAChF;IAEA,MAAM,cAAc;QAClB,iBAAiB,AAAC,CAAA,gBAAgB,CAAA,IAAK,MAAM,KAAK,CAAC,MAAM;IAC3D;IAEA,MAAM,eAAe;QACnB,WAAW;IACb;IAEA,CAAA,GAAA,sBAAQ,EAAE,IAAM,iBAAiB,IAAI;QAAC,MAAM,KAAK;KAAC;IAElD,CAAA,GAAA,gCAAkB,EAAE,KAAK,IAAO,CAAA;YAC9B,WAAW,CAAC,SAAE,KAAK,EAAE;gBACnB,IAAI,MAAM,GAAG,KAAK,WAAW;oBAC3B;oBACA,OAAO;gBACT;gBAEA,IAAI,MAAM,GAAG,KAAK,aAAa;oBAC7B;oBACA,OAAO;gBACT;gBAEA,IAAI,MAAM,GAAG,KAAK,SAAS;oBACzB;oBACA,OAAO;gBACT;gBAEA,OAAO;YACT;QACF,CAAA;IAEA,qBACE,gCAAC;QAAI,WAAW,QAAQ,KAAK;kBAC1B,MAAM,KAAK,CAAC,MAAM,GACjB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,sBACrB,gCAAC;gBACC,WAAW,QAAQ,IAAI,GAAI,CAAA,UAAU,gBAAgB,cAAc,EAAC;gBAEpE,SAAS,IAAM,WAAW;0BAEzB,KAAK,KAAK;eAHN,wBAOT,gCAAC;YAAI,WAAW,QAAQ,IAAI;sBAAE;;;AAItC;;;ADzFA,MAAM,uCAAiB;IACrB,IAAI;IACJ,IAAI;IAEJ,OAAO;QACL,SAAS,CAAA;YACP,YAAY,IAAI,CAAA,GAAA,gCAAY,EAAE,CAAA,GAAA,wCAAW,GAAG;uBAC1C;gBACA,QAAQ,MAAM,MAAM;YACtB;YAEA,QAAQ,CAAA,GAAA,wCAAI,EAAE,QAAQ;gBACpB,wBAAwB,MAAM,UAAU;gBACxC,UAAU,IAAM,SAAS,IAAI;gBAC7B,SAAS,UAAU,OAAO;gBAC1B,cAAc;gBACd,aAAa;gBACb,SAAS;gBACT,WAAW;YACb;QACF;QAEA,UAAS,KAAK;YACZ,UAAU,WAAW,CAAC;YAEtB,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC;gBAChB,wBAAwB,MAAM,UAAU;YAC1C;QACF;QAEA,WAAU,KAAK;YACb,IAAI,MAAM,KAAK,CAAC,GAAG,KAAK,UAAU;gBAChC,KAAK,CAAC,EAAE,CAAC,IAAI;gBAEb,OAAO;YACT;YAEA,OAAO,UAAU,GAAG,EAAE,UAAU;QAClC;QAEA;YACE,KAAK,CAAC,EAAE,CAAC,OAAO;YAChB,UAAU,OAAO;QACnB;IACF;AACF;IAEA,2CAAe;;;AD9Cf,MAAM,oCAAc,CAAA;IAClB,MAAM,gBAAgB,CAAA,GAAA,+CAAW,EAAE;IAEnC,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,4BAAS,EACxB,cACA;QACE,QAAQ;YACN,aAAa;gBAAC,eAAe,eAAe;aAAM;YAClD,YAAY,EAAE;QAChB;IACF,GACA;QACE,SAAS,CAAC,CAAC,eAAe,eAAe;IAC3C;IAGF,MAAM,oBAAoB,CAAA,GAAA,oBAAM,EAAE;QAChC,IAAI,MACF,OAAO,KAAK,GAAG,CAAC,CAAA,OAAS,CAAA;gBAAE,IAAI,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC,eAAe,eAAe,MAAM;YAAC,CAAA;IAE7F,GAAG;QAAC;KAAK;IAET,MAAM,QAAQ,CAAA,GAAA,oBAAM,EAAE;QACpB,IAAI,mBACF,OAAO,CAAC,SAAE,KAAK,EAAE;YACf,OAAO,kBAAkB,MAAM,CAAC,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,WAAW,KAAK,KAAK,CAAC,GAAG;QAC/G;IAEJ,GAAG;QAAC;KAAkB;IAEtB,OAAO;eACL;QACA,QAAQ,CAAA,GAAA,wCAAa;IACvB;AACF;IAEA,2CAAe;","sources":["packages/activitypub-components/src/index.ts","packages/activitypub-components/src/components/CommentsField/CommentsField.js","packages/activitypub-components/src/components/CommentsField/PostCommentForm.js","packages/activitypub-components/src/constants.js","packages/activitypub-components/src/hooks/useOutbox.ts","packages/activitypub-components/src/hooks/useCollection.ts","packages/activitypub-components/src/utils.ts","packages/activitypub-components/src/hooks/useAwaitActivity.ts","packages/activitypub-components/src/components/CommentsField/CustomMention.js","packages/activitypub-components/src/components/CommentsField/CommentsList.js","packages/activitypub-components/src/components/CollectionList.js","packages/activitypub-components/src/components/ReferenceCollectionField.js","packages/activitypub-components/src/hooks/useInbox.ts","packages/activitypub-components/src/hooks/useNodeinfo.ts","packages/activitypub-components/src/hooks/useWebfinger.js","packages/activitypub-components/src/hooks/useMentions/useMentions.js","packages/activitypub-components/src/hooks/useMentions/renderMentions.js","packages/activitypub-components/src/hooks/useMentions/MentionsList.js"],"sourcesContent":["// Components\nexport { default as CommentsField } from './components/CommentsField/CommentsField';\nexport { default as CollectionList } from './components/CollectionList';\nexport { default as ReferenceCollectionField } from './components/ReferenceCollectionField';\n\n// Hooks\nexport { default as useCollection } from './hooks/useCollection';\nexport { default as useInbox } from './hooks/useInbox';\nexport { default as useNodeinfo } from './hooks/useNodeinfo';\nexport { default as useOutbox } from './hooks/useOutbox';\nexport { default as useWebfinger } from './hooks/useWebfinger';\nexport { default as useMentions } from './hooks/useMentions/useMentions';\n\n// Constants\nexport { ACTIVITY_TYPES, ACTOR_TYPES, OBJECT_TYPES, PUBLIC_URI } from './constants';\n","import React from 'react';\nimport { useRecordContext } from 'react-admin';\nimport PostCommentForm from './PostCommentForm';\nimport CommentsList from './CommentsList';\nimport useCollection from '../../hooks/useCollection';\n\nconst CommentsField = ({ source, context, helperText, placeholder, userResource, mentions }) => {\n const record = useRecordContext();\n const { items: comments, loading, addItem, removeItem } = useCollection(record.replies);\n if (!userResource) throw new Error('No userResource defined for CommentsField');\n return (\n <>\n <PostCommentForm\n context={context}\n helperText={helperText}\n userResource={userResource}\n placeholder={placeholder}\n mentions={mentions}\n addItem={addItem}\n removeItem={removeItem}\n />\n <CommentsList comments={comments} loading={loading} userResource={userResource} />\n </>\n );\n};\n\nCommentsField.defaultProps = {\n label: 'Commentaires',\n placeholder: 'Commencez à taper votre commentaire...',\n source: 'id', // Ensure the field is always displayed\n context: 'id'\n};\n\nexport default CommentsField;\n","import React, { useState, useCallback } from 'react';\nimport { Form, useGetIdentity, useNotify, useRecordContext } from 'react-admin';\nimport { RichTextInput, DefaultEditorOptions } from 'ra-input-rich-text';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { Button, Box, Avatar } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport SendIcon from '@mui/icons-material/Send';\nimport { useDataModel } from '@semapps/semantic-data-provider';\nimport { AuthDialog } from '@semapps/auth-provider';\nimport { OBJECT_TYPES, PUBLIC_URI } from '../../constants';\nimport useOutbox from '../../hooks/useOutbox';\nimport CustomMention from './CustomMention';\n\nconst useStyles = makeStyles(theme => ({\n form: {\n marginTop: -12 // Negative margin to keep the form close to the label\n },\n container: {\n paddingLeft: 80,\n position: 'relative'\n },\n avatar: {\n position: 'absolute',\n top: 16,\n left: 0,\n bottom: 0,\n width: 64,\n height: 64\n },\n editorContent: {\n '& > div': {\n backgroundColor: 'rgba(0, 0, 0, 0.09)',\n padding: '2px 12px',\n borderWidth: '0px !important',\n borderRadius: 0,\n borderBottom: '1px solid #FFF',\n minHeight: 60,\n outline: 'unset !important'\n },\n '& > div > p': {\n marginTop: 12,\n marginBottom: 12,\n fontFamily: theme.typography.body1.fontFamily,\n marginBlockStart: '0.5em',\n marginBlockEnd: '0.5em'\n },\n '& > div > p.is-editor-empty:first-child::before': {\n color: 'grey',\n content: 'attr(data-placeholder)',\n float: 'left',\n height: 0,\n pointerEvents: 'none'\n }\n },\n button: {\n marginTop: -10, // To go over helper text block\n marginBottom: 15\n }\n}));\n\nconst EmptyToolbar = () => null;\n\nconst PostCommentForm = ({ context, placeholder, helperText, mentions, userResource, addItem, removeItem }) => {\n const record = useRecordContext();\n const { data: identity, isLoading } = useGetIdentity();\n const userDataModel = useDataModel(userResource);\n const classes = useStyles();\n const notify = useNotify();\n const outbox = useOutbox();\n const [expanded, setExpanded] = useState(false);\n const [openAuth, setOpenAuth] = useState(false);\n\n const onSubmit = useCallback(\n async values => {\n const document = new DOMParser().parseFromString(values.comment, 'text/html');\n const mentions = Array.from(document.body.getElementsByClassName('mention'));\n const mentionedUsersUris = [];\n\n mentions.forEach(node => {\n const userUri = node.attributes['data-mention-id'].value;\n const userLabel = node.attributes['data-mention-label'].value;\n const link = document.createElement('a');\n link.setAttribute(\n 'href',\n `${new URL(window.location.href).origin}/${userResource}/${encodeURIComponent(userUri)}/show`\n );\n link.textContent = `@${userLabel}`;\n node.parentNode.replaceChild(link, node);\n mentionedUsersUris.push(userUri);\n });\n\n if (document.body.innerHTML === 'undefined') {\n notify('Votre commentaire est vide', { type: 'error' });\n } else {\n const tempId = Date.now();\n\n const note = {\n type: OBJECT_TYPES.NOTE,\n attributedTo: outbox.owner,\n content: document.body.innerHTML,\n inReplyTo: record[context],\n published: new Date().toISOString()\n };\n\n try {\n addItem({ id: tempId, ...note });\n // TODO reset the form\n setExpanded(false);\n await outbox.post({ ...note, to: [...mentionedUsersUris, PUBLIC_URI] });\n notify('Commentaire posté avec succès', { type: 'success' });\n } catch (e) {\n console.error(e);\n removeItem(tempId);\n notify(e.message, { type: 'error' });\n }\n }\n },\n [outbox, notify, setExpanded, addItem, removeItem]\n );\n\n const openAuthIfDisconnected = useCallback(() => {\n if (!identity?.id) {\n setOpenAuth(true);\n }\n }, [identity, setOpenAuth]);\n\n // Don't init the editor options until mentions and identity are loaded, as they can only be initialized once\n if ((mentions && !mentions.items) || isLoading) return null;\n\n return (\n <>\n <Form onSubmit={onSubmit} className={classes.form}>\n <Box className={classes.container} onClick={openAuthIfDisconnected}>\n <Avatar\n src={\n identity?.webIdData?.[userDataModel?.fieldsMapping?.image] ||\n identity?.profileData?.[userDataModel?.fieldsMapping?.image]\n }\n className={classes.avatar}\n />\n <RichTextInput\n source=\"comment\"\n label=\" \"\n toolbar={<EmptyToolbar />}\n fullWidth\n classes={{ editorContent: classes.editorContent }}\n editorOptions={{\n ...DefaultEditorOptions,\n onFocus() {\n setExpanded(true);\n },\n extensions: [\n ...DefaultEditorOptions.extensions,\n placeholder ? Placeholder.configure({ placeholder }) : null,\n mentions\n ? CustomMention.configure({\n HTMLAttributes: {\n class: 'mention'\n },\n suggestion: mentions\n })\n : null\n ],\n // Disable editor if user is not connected\n editable: !!identity?.id\n }}\n helperText={helperText}\n />\n {expanded && (\n <Button\n type=\"submit\"\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n endIcon={<SendIcon />}\n className={classes.button}\n >\n Envoyer\n </Button>\n )}\n </Box>\n </Form>\n <AuthDialog\n open={openAuth}\n onClose={() => setOpenAuth(false)}\n message=\"Pour poster un commentaire, vous devez être connecté.\"\n />\n </>\n );\n};\n\nexport default PostCommentForm;\n","export const ACTIVITY_TYPES = {\n ACCEPT: 'Accept',\n ADD: 'Add',\n ANNOUNCE: 'Announce',\n ARRIVE: 'Arrive',\n BLOCK: 'Block',\n CREATE: 'Create',\n DELETE: 'Delete',\n DISLIKE: 'Dislike',\n FLAG: 'Flag',\n FOLLOW: 'Follow',\n IGNORE: 'Ignore',\n INVITE: 'Invite',\n JOIN: 'Join',\n LEAVE: 'Leave',\n LIKE: 'Like',\n LISTEN: 'Listen',\n MOVE: 'Move',\n OFFER: 'Offer',\n QUESTION: 'Question',\n REJECT: 'Reject',\n READ: 'Read',\n REMOVE: 'Remove',\n TENTATIVE_REJECT: 'TentativeReject',\n TENTATIVE_ACCEPT: 'TentativeAccept',\n TRAVEL: 'Travel',\n UNDO: 'Undo',\n UPDATE: 'Update',\n VIEW: 'View'\n};\n\nexport const ACTOR_TYPES = {\n APPLICATION: 'Application',\n GROUP: 'Group',\n ORGANIZATION: 'Organization',\n PERSON: 'Person',\n SERVICE: 'Service'\n};\n\nexport const OBJECT_TYPES = {\n ARTICLE: 'Article',\n AUDIO: 'Audio',\n DOCUMENT: 'Document',\n EVENT: 'Event',\n IMAGE: 'Image',\n NOTE: 'Note',\n PAGE: 'Page',\n PLACE: 'Place',\n PROFILE: 'Profile',\n RELATIONSHIP: 'Relationship',\n TOMBSTONE: 'Tombstone',\n VIDEO: 'Video'\n};\n\nexport const PUBLIC_URI = 'https://www.w3.org/ns/activitystreams#Public';\n","import { useCallback } from 'react';\nimport { useDataProvider, useGetIdentity } from 'react-admin';\nimport { SemanticDataProvider } from '@semapps/semantic-data-provider';\nimport useCollection from './useCollection';\nimport useAwaitActivity from './useAwaitActivity';\nimport type { UseCollectionOptions } from '../types';\n\n/**\n * Hook to fetch and post to the outbox of the logged user.\n * Returns the same data as the useCollection hooks, plus:\n * - `post`: a function to post a new activity in the user's outbox\n * - `awaitActivity`: a function to wait for a certain activity to be posted\n * - `owner`: the WebID of the outbox's owner\n * See https://semapps.org/docs/frontend/activitypub-components#useoutbox for usage\n * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: false }`\n */\nconst useOutbox = (options: UseCollectionOptions = {}) => {\n const dataProvider = useDataProvider<SemanticDataProvider>();\n const { data: identity } = useGetIdentity();\n const { url, items, awaitWebSocketConnection, ...rest } = useCollection('outbox', options);\n const awaitActivity = useAwaitActivity(awaitWebSocketConnection, items);\n\n // Post an activity to the logged user's outbox and return its URI\n const post = useCallback(\n async (activity: object) => {\n if (!url) {\n throw new Error(\n 'Cannot post to outbox before user identity is loaded. Please use the isLoading argument of useOutbox'\n );\n }\n const { headers } = await dataProvider.fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n '@context': 'https://www.w3.org/ns/activitystreams',\n ...activity\n })\n });\n return headers.get('Location');\n },\n [url, dataProvider]\n );\n\n return { url, items, awaitWebSocketConnection, post, awaitActivity, owner: identity?.id, ...rest };\n};\n\nexport default useOutbox;\n","import { useCallback, useMemo, useState, useEffect, useRef, RefObject } from 'react';\nimport { useGetIdentity, useDataProvider } from 'react-admin';\nimport { QueryFunction, useInfiniteQuery, useQueries, useQueryClient } from 'react-query';\nimport { getOrCreateWsChannel, SemanticDataProvider } from '@semapps/semantic-data-provider';\nimport { arrayOf } from '../utils';\nimport type { UseCollectionOptions, SolidNotification, AwaitActivityOptions } from '../types';\n\n// Used to avoid re-renders\nconst emptyArray: never[] = [];\n\nconst useItemsFromPages = (pages: any[], dereferenceItems: boolean) => {\n const dataProvider = useDataProvider<SemanticDataProvider>();\n const items = useMemo(() => pages.flatMap(p => arrayOf(p.orderedItems || p.items)), [pages]);\n\n // We will force dereference, if some items are not URI string references.\n const shouldDereference = useMemo(() => {\n return dereferenceItems || items.some(item => typeof item !== 'string');\n }, [dereferenceItems, items]);\n\n // Dereference all items, if necessary (even if shouldDereference is false, the hook needs to be called).\n const itemQueries = useQueries(\n !shouldDereference\n ? emptyArray\n : items\n .filter(item => typeof item === 'string')\n .map(itemUri => ({\n queryKey: ['resource', itemUri],\n queryFn: async () => (await dataProvider.fetch(itemUri)).json,\n staleTime: Infinity\n }))\n );\n\n if (!shouldDereference) {\n return { loadedItems: items, isLoading: false, isFetching: false };\n }\n\n // Put all loaded items together (might be dereferenced already, so concatenate).\n const loadedItems = items\n .filter(item => typeof item !== 'string')\n .concat(\n itemQueries.flatMap(itemQuery => {\n return (itemQuery.isSuccess && itemQuery.data) || [];\n })\n );\n\n const errors = itemQueries.filter(q => q.error);\n return {\n loadedItems,\n isLoading: itemQueries.some(q => q.isLoading),\n isFetching: itemQueries.some(q => q.isFetching),\n errors: errors.length > 0 ? errors : undefined\n };\n};\n\n/**\n * Subscribe a collection. Supports pagination.\n * @param predicateOrUrl The collection URI or the predicate to get the collection URI from the identity (webId).\n * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: false }`\n */\nconst useCollection = (predicateOrUrl: string, options: UseCollectionOptions = {}) => {\n const { dereferenceItems = false, liveUpdates = false } = options;\n const { data: identity } = useGetIdentity();\n const [totalItems, setTotalItems] = useState<number>(0);\n const queryClient = useQueryClient();\n const [hasLiveUpdates, setHasLiveUpdates] = useState<{ status: string; error?: any }>({\n status: 'connecting'\n });\n const dataProvider = useDataProvider<SemanticDataProvider>();\n const webSocketRef = useRef<WebSocket | null>(null);\n\n // Get collectionUrl from webId predicate or URL.\n const collectionUrl = useMemo(() => {\n if (predicateOrUrl) {\n if (predicateOrUrl.startsWith('http')) {\n return predicateOrUrl;\n }\n if (identity?.webIdData) {\n return identity?.webIdData?.[predicateOrUrl];\n }\n }\n return undefined;\n // throw new Error(`No URL available for useCollection: ${predicateOrUrl}.`);\n }, [identity, predicateOrUrl]);\n\n // Fetch page of collection item references (if pageParam provided)\n // or default to `collectionUrl` (which should give you the first page).\n const fetchCollection: QueryFunction = useCallback(\n async ({ pageParam: nextPageUrl }) => {\n // Fetch page or first page (collectionUrl)\n let { json } = await dataProvider.fetch(nextPageUrl || collectionUrl);\n if (json.totalItems) setTotalItems(json.totalItems);\n\n // If first page, handle this here.\n if ((json.type === 'OrderedCollection' || json.type === 'Collection') && json.first) {\n if (json.first?.items) {\n if (json.first?.items.length === 0 && json.first?.next) {\n // Special case where the first property is an object without items\n ({ json } = await dataProvider.fetch(json.first?.next));\n } else {\n json = json.first;\n }\n } else {\n // Fetch the first page\n ({ json } = await dataProvider.fetch(json.first));\n }\n }\n\n return json;\n },\n [dataProvider, collectionUrl, identity, setTotalItems]\n );\n\n // Use infiniteQuery to handle pagination, fetching, etc.\n const {\n data: pageData,\n error: collectionError,\n fetchNextPage,\n refetch,\n hasNextPage,\n isLoading: isLoadingPage,\n isFetching: isFetchingPage,\n isFetchingNextPage\n } = useInfiniteQuery(['collection', { collectionUrl }], fetchCollection, {\n enabled: !!(collectionUrl && identity?.id),\n getNextPageParam: (lastPage: any) => lastPage.next,\n getPreviousPageParam: (firstPage: any) => firstPage.prev\n });\n\n // Put all items together in a list (and dereference, if required).\n const {\n loadedItems: items,\n isLoading: isLoadingItems,\n isFetching: isFetchingItems,\n errors: itemErrors\n } = useItemsFromPages(pageData?.pages ?? emptyArray, dereferenceItems);\n\n const allErrors = arrayOf(collectionError).concat(arrayOf(itemErrors));\n\n const addItem = useCallback(\n (item: string | any, shouldRefetch: boolean | number = true) => {\n queryClient.setQueryData(['collection', { collectionUrl }], (oldData: any) => {\n if (!oldData) return oldData;\n setTotalItems(totalItems => totalItems + 1);\n\n // Destructure, so react knows, it needs to re-render the pages.\n const pages = [...oldData.pages];\n\n if (pages?.[0]?.orderedItems) {\n pages[0].orderedItems = [item, ...arrayOf(pages[0].orderedItems)];\n } else if (pages?.[0]?.items) {\n pages[0].items = [item, ...arrayOf(pages[0].items)];\n }\n\n oldData.pages = pages;\n return oldData;\n });\n if (shouldRefetch) {\n setTimeout(\n () =>\n queryClient.refetchQueries(['collection', { collectionUrl }], {\n active: true,\n exact: true\n }),\n typeof shouldRefetch === 'number' ? shouldRefetch : 2000\n );\n }\n },\n [queryClient, collectionUrl, setTotalItems]\n );\n\n const removeItem = useCallback(\n (item: string | any, shouldRefetch: boolean = true) => {\n queryClient.setQueryData(['collection', { collectionUrl }], (oldData: any) => {\n if (!oldData) return oldData;\n setTotalItems(totalItems => totalItems - 1);\n\n // Destructure, so react knows, it needs to re-render the pages array.\n const pages = [...oldData.pages];\n // Find the item in all pages and remove the item to be removed (either item.id or just item)\n pages.forEach(page => {\n if (page.orderedItems) {\n page.orderedItems = page.orderedItems.filter((i: any) => (i.id || i) !== (item.id || item));\n } else if (page.items) {\n page.items = page.items.filter((i: any) => (i.id || i) !== (item?.id || item));\n }\n });\n\n oldData.pages = pages;\n return oldData;\n });\n if (shouldRefetch) {\n setTimeout(\n () =>\n queryClient.refetchQueries(['collection', { collectionUrl }], {\n active: true,\n exact: true\n }),\n typeof shouldRefetch === 'number' ? shouldRefetch : 2000\n );\n }\n },\n [queryClient, collectionUrl, setTotalItems]\n );\n\n // Live Updates\n useEffect(() => {\n if (liveUpdates && collectionUrl) {\n // Create ws that listens to collectionUri changes\n getOrCreateWsChannel(dataProvider.fetch, collectionUrl)\n .then(ws => {\n webSocketRef.current = ws; // Keep a ref to the webSocket so that it can be used elsewhere\n webSocketRef.current.addEventListener('message', e => {\n const data: SolidNotification = JSON.parse(e.data);\n if (data.type === 'Add') {\n addItem(data.object, true);\n } else if (data.type === 'Remove') {\n removeItem(data.object, true);\n }\n });\n webSocketRef.current.addEventListener('error', e => {\n setHasLiveUpdates({ status: 'error', error: e });\n // TODO: Retry after a while\n });\n webSocketRef.current.addEventListener('close', e => {\n if (!hasLiveUpdates.error) {\n setHasLiveUpdates({ ...hasLiveUpdates, status: 'closed' });\n }\n });\n setHasLiveUpdates({ status: 'connected' });\n })\n .catch(() => {}); // If it fails, we won't receive live updates. But that's okay.\n }\n }, [collectionUrl, liveUpdates, dataProvider, webSocketRef, addItem, removeItem, setHasLiveUpdates]);\n\n const awaitWebSocketConnection = useCallback(\n (options: AwaitActivityOptions = {}): Promise<RefObject<WebSocket>> => {\n const { timeout = 30000 } = options;\n if (!liveUpdates)\n throw new Error(`Cannot call awaitWebSocketConnection because the liveUpdates option is set to false`);\n return new Promise((resolve, reject) => {\n if (webSocketRef?.current) {\n resolve(webSocketRef);\n } else {\n const timeoutId = setTimeout(() => {\n reject(`No WebSocket connection found within ${Math.round(timeout / 1000)}s`);\n }, timeout);\n const intervalId = setInterval(() => {\n if (webSocketRef?.current) {\n clearInterval(intervalId);\n clearTimeout(timeoutId);\n resolve(webSocketRef);\n } else {\n console.log('WebSocket is not initialized yet, waiting...');\n }\n }, 100);\n }\n });\n },\n [webSocketRef, liveUpdates]\n );\n\n return {\n items,\n totalItems,\n error: allErrors.length > 0 && allErrors,\n refetch,\n fetchNextPage,\n addItem,\n removeItem,\n hasNextPage,\n isLoading: isLoadingPage || isLoadingItems,\n isFetching: isFetchingPage || isFetchingItems,\n isFetchingNextPage,\n url: collectionUrl,\n hasLiveUpdates,\n awaitWebSocketConnection,\n webSocketRef\n };\n};\n\nexport default useCollection;\n","export const arrayOf = <T>(value: T | T[]) => {\n // If the field is null-ish, we suppose there are no values.\n if (value === null || value === undefined) {\n return [];\n }\n // Return as is.\n if (Array.isArray(value)) {\n return value;\n }\n // Single value is made an array.\n return [value];\n};\n\nexport default {\n arrayOf\n};\n\nexport const filterDuplicates = <T>(iterable: T[], predicate: (item: T) => string) => {\n const seen = new Set<string>();\n return iterable.filter(item => {\n const key = predicate(item);\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n};\n","import { RefObject, useCallback } from 'react';\nimport { useDataProvider } from 'react-admin';\nimport { SemanticDataProvider } from '@semapps/semantic-data-provider';\nimport { SolidNotification, AwaitActivityOptions, AwaitWebSocketConnectionOptions } from '../types';\n\n/**\n * Hook used internally by useInbox and useOutbox. This is not exported.\n * @param awaitWebSocketConnection Promise returning the WebSocket which allow to listen to the inbox or outbox\n * @param existingActivities Partial list of activities already received in the inbox and outbox\n */\nconst useAwaitActivity = (\n awaitWebSocketConnection: (options?: AwaitWebSocketConnectionOptions) => Promise<RefObject<WebSocket>>,\n existingActivities?: Array<object | string>\n) => {\n const dataProvider = useDataProvider<SemanticDataProvider>();\n\n // TODO Allow to pass an object, and automatically dereference it if required, like on the @semapps/activitypub matchActivity util\n return useCallback(\n (matchActivity: (activity: object) => boolean, options: AwaitActivityOptions = {}) => {\n const { timeout = 30000, checkExistingActivities = false } = options;\n return new Promise((resolve, reject) => {\n awaitWebSocketConnection()\n .then(webSocketRef => {\n const onMessage = (event: MessageEvent<string>) => {\n const data: SolidNotification = JSON.parse(event.data);\n if (data.type === 'Add') {\n dataProvider.fetch(data.object).then(({ json }) => {\n if (matchActivity(json)) {\n removeListeners();\n return resolve(json);\n }\n });\n }\n };\n const onError = (e: Event) => {\n // TODO reconnect if connection closed\n removeListeners();\n reject(e);\n };\n const onClose = (e: CloseEvent) => {\n removeListeners();\n reject(new Error(`${e.reason} (Code: ${e.code})`));\n };\n\n const removeListeners = () => {\n webSocketRef.current?.removeEventListener('message', onMessage);\n webSocketRef.current?.removeEventListener('error', onError);\n webSocketRef.current?.removeEventListener('close', onClose);\n };\n\n webSocketRef.current?.addEventListener('message', onMessage);\n webSocketRef.current?.addEventListener('error', onError);\n webSocketRef.current?.addEventListener('close', onClose);\n\n // If a list of activities is already loaded, verify if there is a match\n if (existingActivities && checkExistingActivities) {\n for (const a of existingActivities) {\n if (typeof a !== 'string') {\n if (matchActivity(a)) {\n removeListeners();\n return resolve(a);\n }\n }\n }\n }\n\n setTimeout(() => {\n removeListeners();\n reject(new Error('Timeout'));\n }, timeout);\n })\n .catch(e => {\n reject(e);\n });\n });\n },\n [awaitWebSocketConnection, existingActivities, dataProvider]\n );\n};\n\nexport default useAwaitActivity;\n","import { mergeAttributes } from '@tiptap/core';\nimport Mention from '@tiptap/extension-mention';\n\n// Fix a bug in the current version of the mention extension\n// (The { id, label } object is located inside the id property)\n// See https://github.com/ueberdosis/tiptap/pull/1322\nconst CustomMention = Mention.extend({\n renderHTML({ node, HTMLAttributes }) {\n return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), `@${node.attrs.id.label}`];\n },\n addAttributes() {\n return {\n label: {\n default: null,\n parseHTML: element => {\n return {\n label: element.getAttribute('data-mention-label')\n };\n },\n renderHTML: attributes => {\n if (!attributes.id.label) {\n return {};\n }\n return {\n 'data-mention-label': attributes.id.label\n };\n }\n },\n id: {\n default: null,\n parseHTML: element => {\n return {\n id: element.getAttribute('data-mention-id')\n };\n },\n renderHTML: attributes => {\n if (!attributes.id.id) {\n return {};\n }\n return {\n 'data-mention-id': attributes.id.id\n };\n }\n }\n };\n }\n});\n\nexport default CustomMention;\n","import React from 'react';\nimport { TextField, RichTextField, DateField } from 'react-admin';\nimport { Box, Typography, CircularProgress } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport { useDataModel } from '@semapps/semantic-data-provider';\nimport { AvatarWithLabelField, ReferenceField } from '@semapps/field-components';\n\nconst useStyles = makeStyles(() => ({\n container: {\n paddingLeft: 80,\n marginTop: 8,\n minHeight: 80,\n position: 'relative'\n },\n avatar: {\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n width: 64,\n height: 64\n },\n text: {\n paddingTop: 2,\n paddingBottom: 8\n },\n label: {\n fontWeight: 'bold'\n },\n content: {\n '& p': {\n marginBlockStart: '0.5em',\n marginBlockEnd: '0.5em'\n }\n },\n loading: {\n zIndex: 1000,\n backgroundColor: 'white',\n opacity: 0.5,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n marginTop: 5\n }\n}));\n\nconst CommentsList = ({ comments, userResource, loading }) => {\n const classes = useStyles();\n const userDataModel = useDataModel(userResource);\n return (\n <Box position=\"relative\">\n {comments &&\n comments\n .sort((a, b) => new Date(b.published) - new Date(a.published))\n .map(comment => (\n <Box className={classes.container} key={comment.id}>\n <Box className={classes.avatar}>\n <ReferenceField record={comment} reference={userResource} source=\"attributedTo\" linkType=\"show\">\n <AvatarWithLabelField image={userDataModel?.fieldsMapping?.image} />\n </ReferenceField>\n </Box>\n <Box className={classes.text}>\n <Typography variant=\"body2\">\n <ReferenceField record={comment} reference={userResource} source=\"attributedTo\" linkType=\"show\">\n <TextField variant=\"body2\" source={userDataModel?.fieldsMapping?.title} className={classes.label} />\n </ReferenceField>\n &nbsp;•&nbsp;\n <DateField record={comment} variant=\"body2\" source=\"published\" showTime />\n </Typography>\n <RichTextField record={comment} variant=\"body1\" source=\"content\" className={classes.content} />\n </Box>\n </Box>\n ))}\n {loading && (\n <Box minHeight={200}>\n <Box alignItems=\"center\" className={classes.loading}>\n <CircularProgress size={60} thickness={6} />\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n\nexport default CommentsList;\n","import React from 'react';\nimport { useList, ListContextProvider, useGetMany } from 'react-admin';\nimport useCollection from '../hooks/useCollection';\n\nconst CollectionList = ({ collectionUrl, resource, children }) => {\n if (React.Children.count(children) !== 1) {\n throw new Error('<CollectionList> only accepts a single child');\n }\n\n const { items: actorsUris } = useCollection(collectionUrl);\n\n const { data, isLoading, isFetching } = useGetMany(\n resource,\n { ids: Array.isArray(actorsUris) ? actorsUris : [actorsUris] },\n { enabled: !!actorsUris }\n );\n\n const listContext = useList({ data, isLoading, isFetching });\n\n return <ListContextProvider value={listContext}>{children}</ListContextProvider>;\n};\n\nexport default CollectionList;\n","import React from 'react';\nimport { useRecordContext } from 'react-admin';\nimport CollectionList from './CollectionList';\n\nconst ReferenceCollectionField = ({ source, reference, children, ...rest }) => {\n const record = useRecordContext();\n\n if (React.Children.count(children) !== 1) {\n throw new Error('<ReferenceCollectionField> only accepts a single child');\n }\n\n if (!record || !record[source]) return null;\n\n return (\n <CollectionList resource={reference} collectionUrl={record[source]} {...rest}>\n {children}\n </CollectionList>\n );\n};\n\nexport default ReferenceCollectionField;\n","import { useGetIdentity } from 'react-admin';\nimport useCollection from './useCollection';\nimport useAwaitActivity from './useAwaitActivity';\nimport type { UseCollectionOptions } from '../types';\n\n/**\n * Hook to fetch the inbox of the logged user.\n * Returns the same data as the useCollection hooks, plus:\n * - `awaitActivity`: a function to wait for a certain activity to be received\n * - `owner`: the WebID of the inbox's owner\n * See https://semapps.org/docs/frontend/activitypub-components#useinbox for usage\n * @param {UseCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: false }`\n */\nconst useInbox = (options: UseCollectionOptions = {}) => {\n const { data: identity } = useGetIdentity();\n const { url, items, awaitWebSocketConnection, ...rest } = useCollection('inbox', options);\n const awaitActivity = useAwaitActivity(awaitWebSocketConnection, items);\n return { url, items, awaitWebSocketConnection, awaitActivity, owner: identity?.id, ...rest };\n};\n\nexport default useInbox;\n","import { useEffect, useState } from 'react';\nimport { fetchUtils } from 'react-admin';\nimport type { NodeInfo, NodeInfoLinks } from '../types';\n\nconst useNodeinfo = (host?: string, rel = 'http://nodeinfo.diaspora.software/ns/schema/2.1') => {\n const [schema, setSchema] = useState<NodeInfo>();\n\n useEffect(() => {\n (async () => {\n if (host && rel) {\n const protocol = host.includes(':') ? 'http' : 'https'; // If the host has a port, we are likely on HTTP\n const nodeinfoUrl = `${protocol}://${host}/.well-known/nodeinfo`;\n\n try {\n const { json: links }: { json: NodeInfoLinks } = await fetchUtils.fetchJson(nodeinfoUrl);\n\n // Accept any version of the nodeinfo protocol\n const link = links?.links?.find(l => l.rel === rel);\n\n if (link) {\n const { json }: { json: NodeInfo } = await fetchUtils.fetchJson(link.href);\n\n setSchema(json);\n }\n } catch (e) {\n // Do nothing if nodeinfo can't be fetched\n }\n }\n })();\n }, [host, setSchema, rel]);\n\n return schema;\n};\n\nexport default useNodeinfo;\n","import { useCallback } from 'react';\nimport { fetchUtils } from 'react-admin';\n\nconst useWebfinger = () => {\n // Post an activity to the logged user's outbox and return its URI\n const fetch = useCallback(async id => {\n // eslint-disable-next-line\n const [_, username, host] = id.split('@');\n if (host) {\n const protocol = host.includes(':') ? 'http' : 'https'; // If the host has a port, we are most likely on localhost\n const webfingerUrl = `${protocol}://${host}/.well-known/webfinger?resource=acct:${username}@${host}`;\n\n try {\n const { json } = await fetchUtils.fetchJson(webfingerUrl);\n\n const link = json.links.find(l => l.type === 'application/activity+json');\n\n return link ? link.href : null;\n } catch (e) {\n return null;\n }\n } else {\n return null;\n }\n }, []);\n\n return { fetch };\n};\n\nexport default useWebfinger;\n","import { useMemo } from 'react';\nimport { useGetList } from 'react-admin';\nimport { useDataModel } from '@semapps/semantic-data-provider';\nimport renderMentions from './renderMentions';\n\nconst useMentions = userResource => {\n const userDataModel = useDataModel(userResource);\n\n const { data } = useGetList(\n userResource,\n {\n filter: {\n _predicates: [userDataModel?.fieldsMapping?.title],\n blankNodes: []\n }\n },\n {\n enabled: !!userDataModel?.fieldsMapping?.title\n }\n );\n\n const availableMentions = useMemo(() => {\n if (data) {\n return data.map(item => ({ id: item.id, label: item[userDataModel?.fieldsMapping?.title] }));\n }\n }, [data]);\n\n const items = useMemo(() => {\n if (availableMentions) {\n return ({ query }) => {\n return availableMentions.filter(({ label }) => label.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5);\n };\n }\n }, [availableMentions]);\n\n return {\n items,\n render: renderMentions\n };\n};\n\nexport default useMentions;\n","import { ReactRenderer } from '@tiptap/react';\nimport tippy from 'tippy.js';\nimport MentionsList from './MentionsList';\n\nconst renderMentions = () => {\n let component;\n let popup;\n\n return {\n onStart: props => {\n component = new ReactRenderer(MentionsList, {\n props,\n editor: props.editor\n });\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start'\n });\n },\n\n onUpdate(props) {\n component.updateProps(props);\n\n popup[0].setProps({\n getReferenceClientRect: props.clientRect\n });\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n popup[0].hide();\n\n return true;\n }\n\n return component.ref?.onKeyDown(props);\n },\n\n onExit() {\n popup[0].destroy();\n component.destroy();\n }\n };\n};\n\nexport default renderMentions;\n","import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react';\nimport makeStyles from '@mui/styles/makeStyles';\n\nconst useStyles = makeStyles(theme => ({\n items: {\n background: '#fff',\n borderRadius: '0.5rem',\n boxShadow: '0 0 0 1px rgba(0, 0, 0, 0.05), 0px 10px 20px rgba(0, 0, 0, 0.1)',\n color: 'rgba(0, 0, 0, 0.8)',\n fontSize: '0.9rem',\n overflow: 'hidden',\n padding: '0.2rem',\n position: 'relative'\n },\n item: {\n background: 'transparent',\n border: '1px solid transparent',\n borderRadius: '0.4rem',\n display: 'block',\n margin: 0,\n padding: '0.2rem 0.4rem',\n textAlign: 'left',\n width: '100%',\n '&.selected': {\n borderColor: '#000'\n }\n }\n}));\n\nexport default forwardRef((props, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const classes = useStyles();\n\n const selectItem = index => {\n const item = props.items[index];\n\n if (item) {\n props.command({ id: item });\n }\n };\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length);\n };\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % props.items.length);\n };\n\n const enterHandler = () => {\n selectItem(selectedIndex);\n };\n\n useEffect(() => setSelectedIndex(0), [props.items]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }) => {\n if (event.key === 'ArrowUp') {\n upHandler();\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n downHandler();\n return true;\n }\n\n if (event.key === 'Enter') {\n enterHandler();\n return true;\n }\n\n return false;\n }\n }));\n\n return (\n <div className={classes.items}>\n {props.items.length ? (\n props.items.map((item, index) => (\n <button\n className={classes.item + (index === selectedIndex ? ' selected' : '')}\n key={index}\n onClick={() => selectItem(index)}\n >\n {item.label}\n </button>\n ))\n ) : (\n <div className={classes.item}>Aucun résultat</div>\n )}\n </div>\n );\n});\n"],"names":[],"version":3,"file":"index.cjs.js.map"}