@semapps/activitypub-components 1.1.4 → 1.2.0
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 +544 -155
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +938 -364
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +534 -146
- package/dist/index.es.js.map +1 -1
- package/package.json +39 -13
package/dist/index.es.js.map
CHANGED
|
@@ -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/utils/shaclValidation.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';\nimport { getShaclValidator, validateItems } from '../utils/shaclValidation';\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 // Activities are immutable, so no need to refetch..\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, shaclShapeUri = '' } = options;\n const { data: identity } = useGetIdentity();\n const [totalItems, setTotalItems] = useState<number>(0);\n const [isPaginated, setIsPaginated] = useState<boolean>(false); // true if the collection is paginated\n const [yieldsTotalItems, setYieldsTotalItems] = useState<boolean>(false); // true if the collection server yields totalItems\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 // If there is a nextPageUrl, we are fetching a page, otherwise we are fetching the first page or the collection\n const fetchingPage: boolean = !!nextPageUrl;\n // Fetch page or first page (collectionUrl)\n let { json } = await dataProvider.fetch(nextPageUrl || collectionUrl);\n\n // If first page, handle this here.\n if ((json.type === 'OrderedCollection' || json.type === 'Collection') && json.first) {\n const firstItems = json.first?.items || json.first?.orderedItems;\n if (firstItems) {\n if (firstItems.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 // Add the @context to the json, so that it can be used to expand the items\n // That is necessary for the validation of the items\n json = { '@context': json['@context'], ...json.first };\n }\n } else {\n // Fetch the first page\n ({ json } = await dataProvider.fetch(json.first));\n }\n }\n const itemsKey = json.orderedItems ? 'orderedItems' : 'items';\n\n // If we are fetching the first page or the collection, we can workout some information\n if (!fetchingPage) {\n const localIsPaginated = !!json.first || !!json.next;\n setIsPaginated(localIsPaginated);\n\n // If the server yields totalItems, we can use it\n if (json.totalItems) {\n setTotalItems(json.totalItems);\n setYieldsTotalItems(true);\n } else if (!localIsPaginated) {\n // If the collection is not paginated, we can count items\n const items = arrayOf(json[itemsKey]);\n if (items) setTotalItems(items.length);\n }\n }\n\n // Validate the json with the SHACL shape\n if (shaclShapeUri !== '' && json[itemsKey] && json[itemsKey].length > 0) {\n try {\n if (!json['@context']) {\n throw new Error(\n `No context returned by the server.\\nA context is required to expand the collection's items and validate them.`\n );\n }\n const shaclValidator = await getShaclValidator(shaclShapeUri);\n const validatedResults = await validateItems(arrayOf(json[itemsKey]), shaclValidator, json['@context']);\n\n // Keep only the valid item in the collection\n json[itemsKey] = validatedResults.filter(result => result.isValid).map(result => result.item);\n } catch (error) {\n console.warn(\n `Filtering of the collection's items using SHACL validation wasn't possible.\\n${collectionUrl}`,\n error\n );\n }\n }\n\n return json;\n },\n [dataProvider, collectionUrl, identity, setTotalItems, setIsPaginated, setYieldsTotalItems, shaclShapeUri]\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, shaclShapeUri }], 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\n // Only update totalItems if collection is not paginated or if the server yields totalItems\n if (yieldsTotalItems || !isPaginated) {\n setTotalItems(totalItems => totalItems + 1);\n }\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, isPaginated, yieldsTotalItems]\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\n // Only update totalItems if collection is not paginated or if the server yields totalItems\n if (yieldsTotalItems || !isPaginated) {\n setTotalItems(totalItems => totalItems - 1);\n }\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 = arrayOf(page.orderedItems).filter((i: any) => (i.id || i) !== (item.id || item));\n } else if (page.items) {\n page.items = arrayOf(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, isPaginated, yieldsTotalItems]\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 // Construct return object conditionally\n const returnObject = {\n items,\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 // Only include totalItems if the server yields totalItems or for non-paginated collections\n if (yieldsTotalItems || !isPaginated) {\n return { ...returnObject, totalItems };\n }\n\n return returnObject;\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 SHACLValidator from 'rdf-validate-shacl';\nimport rdf from 'rdf-ext';\nimport JsonLdParser from '@rdfjs/parser-jsonld';\nimport { ReadableWebToNodeStream } from 'readable-web-to-node-stream';\nimport ParserN3 from '@rdfjs/parser-n3';\n\n// Cache of SHACL validators\nconst validatorCache: Record<string, SHACLValidator> = {};\n\n// Helper function to convert a string to a Node.js Readable stream\nconst stringToStream = (str: string): ReadableWebToNodeStream => {\n // Create a TextEncoder to convert string to Uint8Array\n const encoder: TextEncoder = new TextEncoder();\n const uint8Array: Uint8Array = encoder.encode(str);\n\n // Create a ReadableStream from the Uint8Array\n const readableStream: ReadableStream = new ReadableStream({\n start(controller: ReadableStreamDefaultController) {\n controller.enqueue(uint8Array);\n controller.close();\n }\n });\n\n // Convert the web ReadableStream to a Node.js Readable stream\n return new ReadableWebToNodeStream(readableStream);\n};\n\n// Helper function to parse JSON-LD and convert to RDF-ext quads\nconst parseJsonLd = async (jsonLdObj: object, context: string | string[] | Record<string, string>) => {\n try {\n // Add context to the JSON-LD object if needed\n const jsonLdWithContext = {\n ...jsonLdObj,\n '@context': context\n };\n\n // Convert JSON-LD object to string\n const jsonString: string = JSON.stringify(jsonLdWithContext);\n\n // Convert string to stream using the helper function\n const textStream: ReadableWebToNodeStream = stringToStream(jsonString);\n\n // Use the JsonLdParser that outputs rdf-ext compatible quads directly\n const parser: JsonLdParser = new JsonLdParser({ factory: rdf });\n const quadStream: any = parser.import(textStream);\n\n // Collect quads into a dataset\n const dataset: any = rdf.dataset();\n for await (const quad of quadStream) {\n dataset.add(quad);\n }\n\n return dataset;\n } catch (error) {\n console.error('Error parsing JSON-LD:', error);\n throw error;\n }\n};\n\n// Helper function to load a SHACL shape and return a validator\nconst getShaclValidator = async (shapeUri: string): Promise<SHACLValidator> => {\n // Check if the validator is already cached\n if (validatorCache[shapeUri]) {\n return validatorCache[shapeUri];\n }\n\n const response = await fetch(shapeUri, {\n headers: {\n Accept: 'text/turtle'\n }\n });\n if (!response.ok) {\n throw new Error(`Failed to load shape: ${response.status} ${response.statusText}`);\n }\n\n // Get the Turtle data as text\n const turtleData: string = await response.text();\n\n // Convert text to stream using the helper function\n const textStream: ReadableWebToNodeStream = stringToStream(turtleData);\n\n // Use ParserN3 which outputs rdf-ext compatible quads directly\n const parser: ParserN3 = new ParserN3({ factory: rdf });\n const quadStream: any = parser.import(textStream);\n\n // Collect quads into a dataset\n const shapeDataset = rdf.dataset();\n for await (const quad of quadStream) {\n shapeDataset.add(quad);\n }\n\n // Create and cache the SHACL validator using the dataset\n validatorCache[shapeUri] = new SHACLValidator(shapeDataset, { factory: rdf });\n return validatorCache[shapeUri];\n};\n\nconst validateItems = async (\n items: Array<object>,\n shaclValidator: SHACLValidator,\n context: string | string[] | Record<string, string>\n): Promise<Array<{ item: object; isValid: boolean }>> => {\n if (!shaclValidator) {\n throw new Error('validateItems: shaclValidator is required');\n }\n if (!context) {\n throw new Error('validateItems: context is required');\n }\n return Promise.all(\n items.map(async (item: any) => {\n try {\n // Create a dataset from the item's JSON-LD\n const itemDataset = await parseJsonLd(item, context);\n\n // Validate against the SHACL shape\n const report = shaclValidator?.validate(itemDataset);\n\n return {\n item: item,\n isValid: report?.conforms\n };\n } catch (error) {\n console.error(`Error validating item ${item.id}:`, error);\n return {\n item: item,\n isValid: false\n };\n }\n })\n );\n};\n\nexport { getShaclValidator, validateItems, parseJsonLd };\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 • \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.es.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;;;;;;;;;;;;;AGhDnB,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;AAEO,MAAM,4CAAc,OAAO;IAChC,2CAA2C;IAC3C,MAAM,SAAS,MAAM,CAAA,GAAA,aAAK,EAAE,KAAK,CAAC,cAAc;QAAE,QAAQ;IAAsB;IAEhF,uCAAuC;IACvC,MAAM,SAAS,IAAI,CAAA,GAAA,oBAAO;IAC1B,MAAM,aAAa,OAAO,MAAM,CAAC,CAAA,GAAA,eAAO,EAAE,IAAI,CAAC;QAAC;KAAO;IAEvD,MAAM,UAAU,MAAM,CAAA,GAAA,aAAE,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3C,OAAO;AACT;AAEO,MAAM,4CAAqB,OAAO;IACvC,2CAA2C;IAC3C,MAAM,SAAS,MAAM,CAAA,GAAA,aAAK,EAAE,KAAK,CAAC,cAAc;QAAE,QAAQ;IAAsB;IAEhF,uCAAuC;IACvC,MAAM,SAAS,IAAI,CAAA,GAAA,oBAAO;IAC1B,MAAM,aAAa,OAAO,MAAM,CAAC,CAAA,GAAA,eAAO,EAAE,IAAI,CAAC;QAAC;KAAO;IACvD,+CAA+C;IAC/C,MAAM,QAAe,EAAE;IACvB,WAAW,EAAE,CAAC,QAAQ,CAAC;QACrB,MAAM,IAAI,CAAC;IACb;IACA,OAAO,IAAI,QAAQ,CAAC,SAAS;QAC3B,WAAW,EAAE,CAAC,OAAO;YACnB,QAAQ;QACV;QACA,WAAW,EAAE,CAAC,SAAS,CAAC;YACtB,OAAO;QACT;IACF;AACF;;;;;;;;;;AE9DA,mEAAmE;AACnE,MAAM,4CAAiB,CAAC;IACtB,uDAAuD;IACvD,MAAM,UAAuB,IAAI;IACjC,MAAM,aAAyB,QAAQ,MAAM,CAAC;IAE9C,8CAA8C;IAC9C,MAAM,iBAAiC,IAAI,eAAe;QACxD,OAAM,UAA2C;YAC/C,WAAW,OAAO,CAAC;YACnB,WAAW,KAAK;QAClB;IACF;IAEA,8DAA8D;IAC9D,OAAO,IAAI,CAAA,GAAA,8BAAsB,EAAE;AACrC;AACA,MAAM,4CAAc,OAAO;IACzB,kCAAkC;IAClC,MAAM,aAAa,0CAAe;IAElC,+DAA+D;IAC/D,MAAM,SAAmB,IAAI,CAAA,GAAA,oBAAO,EAAE;QAAE,SAAS,CAAA,GAAA,aAAE;IAAE;IACrD,MAAM,aAAa,OAAO,MAAM,CAAC;IACjC,MAAM,UAAU,MAAM,CAAA,GAAA,aAAE,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3C,OAAO;AACT;;;ADxBA,MAAM,wCAAkB,CAAA,GAAA,cAAK,EAAE,eAAe;AAE9C,4BAA4B;AAC5B,MAAM,uCAA4C,CAAC;AAEnD;;;;;;;;CAQC,GACD,MAAM,4CAA8B;IAClC,2CAA2C;IAC3C,IAAI,qCAAe,eAAe,EAChC,OAAO,qCAAe,eAAe;IAGvC,IAAI;QACF,MAAM,eAAe,MAAM,CAAA,GAAA,yCAAU,EAAE;QAEvC,yDAAyD;QACzD,qCAAe,eAAe,GAAG,IAAI,CAAA,GAAA,gBAAQ,EAAE,cAAc;YAAE,SAAS,CAAA,GAAA,aAAE;YAAG,OAAO;QAAK;QAEzF,OAAO,qCAAe,eAAe;IACvC,EAAE,OAAO,OAAO;QACd,MAAM,IAAI,MACR,CAAC,4CAA4C,EAAE,iBAAiB,QAAQ,MAAM,OAAO,GAAG,iBAAiB;IAE7G;IAEA,MAAM,eAAe,MAAM,CAAA,GAAA,yCAAU,EAAE;IAEvC,yDAAyD;IACzD,qCAAe,eAAe,GAAG,IAAI,CAAA,GAAA,gBAAQ,EAAE,cAAc;QAAE,SAAS,CAAA,GAAA,aAAE;QAAG,OAAO;IAAK;IAEzF,OAAO,qCAAe,eAAe;AACvC;AAEA,+DAA+D;AAC/D,MAAM,4CAAoB,OAAO;IAC/B,2CAA2C;IAC3C,IAAI,oCAAc,CAAC,SAAS,EAC1B,OAAO,oCAAc,CAAC,SAAS;IAGjC,IAAI;QACF,MAAM,WAAW,MAAM,MAAM,UAAU;YACrC,SAAS;gBACP,QAAQ;YACV;QACF;QACA,IAAI,CAAC,SAAS,EAAE,EACd,MAAM,IAAI,MAAM,CAAC,sBAAsB,EAAE,SAAS,MAAM,CAAC,CAAC,EAAE,SAAS,UAAU,EAAE;QAGnF,8BAA8B;QAC9B,MAAM,aAAqB,MAAM,SAAS,IAAI;QAC9C,MAAM,eAAe,MAAM,CAAA,GAAA,yCAAU,EAAE;QAEvC,yDAAyD;QACzD,oCAAc,CAAC,SAAS,GAAG,IAAI,CAAA,GAAA,gBAAQ,EAAE,cAAc;YAAE,SAAS,CAAA,GAAA,aAAE;QAAE;QACtE,OAAO,oCAAc,CAAC,SAAS;IACjC,EAAE,OAAO,OAAO;QACd,MAAM,IAAI,MACR,CAAC,qCAAqC,EAAE,SAAS,EAAE,EAAE,iBAAiB,QAAQ,MAAM,OAAO,GAAG,iBAAiB;IAEnH;AACF;AAEA;;;;;;;;CAQC,GACD,MAAM,4CAAgB,OACpB,OACA,gBACA;IAEA,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM;IAElB,OAAO,QAAQ,GAAG,CAChB,MAAM,GAAG,CAAC,OAAO;QACf,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG;YAC1C,2CAA2C;YAC3C,MAAM,cAAc,MAAM,CAAA,GAAA,yCAAU,EAAE;YAEtC,mCAAmC;YACnC,MAAM,SAAS,eAAe,QAAQ,CAAC;gBAAE,SAAS;YAAY;YAE9D,OAAO;gBACL,MAAM;gBACN,SAAS,OAAO,QAAQ;YAC1B;QACF,EAAE,OAAO,OAAO;YACd,OAAO;sBACL;gBACA,SAAS;uBACT;YACF;QACF;IACF;AAEJ;AAEA;;;;;;;;;CASC,GACD,MAAM,4CAA2B,OAC/B,YACA,SACA,YACA;IAEA,MAAM,mBAAmB,MAAM,UAAU,QAAQ,CAC/C,4FAA4F;IAC5F;QAAE,SAAS;QAAS,OAAO;YAAC,CAAA,GAAA,aAAE,EAAE,SAAS,CAAC;SAAY;IAAC,GACvD,oDAAoD;IACpD;QAAE,OAAO,WAAW,GAAG,CAAC,CAAA,YAAa,CAAA,GAAA,aAAE,EAAE,SAAS,CAAC,UAAU,KAAK;IAAG;IAGvE,IAAI,CAAC,iBAAiB,QAAQ,EAAE,OAAO;IACvC,MAAM,WAAE,OAAO,EAAE,GAAG;IAEpB,8DAA8D;IAC9D,MAAM,YAAY,WAAW,IAAI,CAAC,CAAA,KAChC,QAAQ,IAAI,CAAC,CAAC,MAAa,IAAI,SAAS,KAAK,cAAc,IAAI,KAAK,KAAK,GAAG,KAAK;IAGnF,IAAI,CAAC,WAAW,OAAO;IAEvB,MAAM,YAAY,QAAQ,SAAS,CAAC,WAAW,WAAW,CAAC;IAC3D,OAAO;AACT;;;AFpJA,2BAA2B;AAC3B,MAAM,mCAAsB,EAAE;AAE9B,MAAM,0CAAoB,CAAC,OAAc;IACvC,MAAM,eAAe,CAAA,GAAA,sBAAc;IACnC,MAAM,QAAQ,CAAA,GAAA,cAAM,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,cAAM,EAAE;QAChC,OAAO,oBAAoB,MAAM,IAAI,CAAC,CAAA,OAAQ,OAAO,SAAS;IAChE,GAAG;QAAC;QAAkB;KAAM;IAE5B,yGAAyG;IACzG,MAAM,cAAc,CAAA,GAAA,iBAAS,EAAE;QAC7B,SAAS,CAAC,oBACN,mCACA,MACG,MAAM,CAAC,CAAA,OAAQ,OAAO,SAAS,UAC/B,GAAG,CAAC,CAAA,UAAY,CAAA;gBACf,UAAU;oBAAC;oBAAY;iBAAQ;gBAC/B,SAAS,UAAY,AAAC,CAAA,MAAM,aAAa,KAAK,CAAC,QAAO,EAAG,IAAI;gBAC7D,oEAAoE;gBACpE,WAAW,SAAS,oDAAoD;YAC1E,CAAA;IACR;IAEA,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,sBAAO,gBAAgB,IAAI,GAAG;IAC9E,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,CAAA,GAAA,qBAAa;IACxC,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAU;IACrD,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAAW,QAAQ,sCAAsC;IACtG,MAAM,CAAC,kBAAkB,oBAAoB,GAAG,CAAA,GAAA,eAAO,EAAW,QAAQ,kDAAkD;IAC5H,MAAM,cAAc,CAAA,GAAA,qBAAa;IACjC,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,eAAO,EAAmC;QACpF,QAAQ;IACV;IACA,MAAM,eAAe,CAAA,GAAA,sBAAc;IACnC,MAAM,eAAe,CAAA,GAAA,aAAK,EAAoB;IAE9C,iDAAiD;IACjD,MAAM,gBAAgB,CAAA,GAAA,cAAM,EAAE;QAC5B,IAAI,gBAAgB;YAClB,IAAI,eAAe,UAAU,CAAC,WAAW,eAAe,UAAU,CAAC,YACjE,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,kBAAU,EAC/C,OAAO,EAAE,WAAW,WAAW,EAAE;QAC/B,gHAAgH;QAChH,MAAM,eAAwB,CAAC,CAAC;QAChC,2CAA2C;QAC3C,IAAI,QAAE,IAAI,EAAE,GAAG,MAAM,aAAa,KAAK,CAAC,eAAe;QAEvD,mCAAmC;QACnC,IAAI,AAAC,CAAA,KAAK,IAAI,KAAK,uBAAuB,KAAK,IAAI,KAAK,YAAW,KAAM,KAAK,KAAK,EAAE;YACnF,MAAM,aAAa,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE;YACpD,IAAI;gBACF,IAAI,WAAW,MAAM,KAAK,KAAK,KAAK,KAAK,EAAE,MACzC,mEAAmE;gBAClE,CAAA,QAAE,IAAI,EAAE,GAAG,MAAM,aAAa,KAAK,CAAC,KAAK,KAAK,EAAE,KAAI;qBAErD,2EAA2E;gBAC3E,oDAAoD;gBACpD,OAAO;oBAAE,YAAY,IAAI,CAAC,WAAW;oBAAE,GAAG,KAAK,KAAK;gBAAC;mBAGvD,uBAAuB;YACtB,CAAA,QAAE,IAAI,EAAE,GAAG,MAAM,aAAa,KAAK,CAAC,KAAK,KAAK,CAAA;QAEnD;QACA,MAAM,WAAW,KAAK,YAAY,GAAG,iBAAiB;QAEtD,uFAAuF;QACvF,IAAI,CAAC,cAAc;YACjB,MAAM,mBAAmB,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI;YACpD,eAAe;YAEf,iDAAiD;YACjD,IAAI,KAAK,UAAU,EAAE;gBACnB,cAAc,KAAK,UAAU;gBAC7B,oBAAoB;YACtB,OAAO,IAAI,CAAC,kBAAkB;gBAC5B,yDAAyD;gBACzD,MAAM,QAAQ,CAAA,GAAA,yCAAM,EAAE,IAAI,CAAC,SAAS;gBACpC,IAAI,OAAO,cAAc,MAAM,MAAM;YACvC;QACF;QAEA,yCAAyC;QACzC,IAAI,kBAAkB,MAAM,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,GACpE,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,WAAW,EACnB,MAAM,IAAI,MACR,CAAC,6GAA6G,CAAC;YAGnH,sEAAsE;YACtE,oEAAoE;YACpE,MAAM,iBAAiB,MAAM,CAAA,GAAA,yCAAgB,EAAE;YAC/C,MAAM,mBAAmB,MAAM,CAAA,GAAA,yCAAY,EAAE,CAAA,GAAA,yCAAM,EAAE,IAAI,CAAC,SAAS,GAAG,gBAAgB,IAAI,CAAC,WAAW;YAEtG,6CAA6C;YAC7C,IAAI,CAAC,SAAS,GAAG,iBAAiB,MAAM,CAAC,CAAA,SAAU,OAAO,OAAO,EAAE,GAAG,CAAC,CAAA,SAAU,OAAO,IAAI;QAC9F,EAAE,OAAO,OAAO;YACd,QAAQ,IAAI,CACV,CAAC,6EAA6E,EAAE,eAAe,EAC/F;QAEJ;QAGF,OAAO;IACT,GACA;QAAC;QAAc;QAAe;QAAU;QAAe;QAAgB;QAAqB;KAAc;IAG5G,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,uBAAe,EAAE;QACnB,UAAU;YAAC;YAAc;+BAAE;+BAAe;YAAc;SAAE;QAC1D,SAAS,CAAC,CAAE,CAAA,iBAAiB,UAAU,EAAC;QACxC,kBAAkB;QAClB,kBAAkB,CAAC,WAAkB,SAAS,IAAI;QAClD,sBAAsB,CAAC,YAAmB,UAAU,IAAI;QACxD,SAAS;IACX;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,kBAAU,EACxB,CAAC,MAAoB,gBAAkC,IAAI;QACzD,YAAY,YAAY,CAAC;YAAC;YAAc;+BAAE;YAAc;SAAE,EAAE,CAAC;YAC3D,IAAI,CAAC,SAAS,OAAO;YAErB,2FAA2F;YAC3F,IAAI,oBAAoB,CAAC,aACvB,cAAc,CAAA,aAAc,aAAa;YAG3C,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,UACE,YAAY,cAAc,CAAC;gBACzB,UAAU;oBAAC;oBAAc;uCAAE;oBAAc;iBAAE;gBAC3C,MAAM;gBACN,OAAO;YACT,IACF,OAAO,kBAAkB,WAAW,gBAAgB;IAG1D,GACA;QAAC;QAAa;QAAe;QAAe;QAAa;KAAiB;IAG5E,MAAM,aAAa,CAAA,GAAA,kBAAU,EAC3B,CAAC,MAAoB,gBAAyB,IAAI;QAChD,YAAY,YAAY,CAAC;YAAC;YAAc;+BAAE;YAAc;SAAE,EAAE,CAAC;YAC3D,IAAI,CAAC,SAAS,OAAO;YAErB,2FAA2F;YAC3F,IAAI,oBAAoB,CAAC,aACvB,cAAc,CAAA,aAAc,aAAa;YAG3C,sEAAsE;YACtE,MAAM,QAAQ;mBAAI,QAAQ,KAAK;aAAC;YAChC,6FAA6F;YAC7F,MAAM,OAAO,CAAC,CAAA;gBACZ,IAAI,KAAK,YAAY,EACnB,KAAK,YAAY,GAAG,CAAA,GAAA,yCAAM,EAAE,KAAK,YAAY,EAAE,MAAM,CAAC,CAAC,IAAW,AAAC,CAAA,EAAE,EAAE,IAAI,CAAA,MAAQ,CAAA,KAAK,EAAE,IAAI,IAAG;qBAC5F,IAAI,KAAK,KAAK,EACnB,KAAK,KAAK,GAAG,CAAA,GAAA,yCAAM,EAAE,KAAK,KAAK,EAAE,MAAM,CAAC,CAAC,IAAW,AAAC,CAAA,EAAE,EAAE,IAAI,CAAA,MAAQ,CAAA,MAAM,MAAM,IAAG;YAExF;YAEA,QAAQ,KAAK,GAAG;YAChB,OAAO;QACT;QACA,IAAI,eACF,WACE,IACE,YAAY,cAAc,CAAC;gBACzB,UAAU;oBAAC;oBAAc;uCAAE;oBAAc;iBAAE;gBAC3C,MAAM;gBACN,OAAO;YACT,IACF,OAAO,kBAAkB,WAAW,gBAAgB;IAG1D,GACA;QAAC;QAAa;QAAe;QAAe;QAAa;KAAiB;IAG5E,eAAe;IACf,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,eAAe,eACjB,kDAAkD;QAClD,CAAA,GAAA,2BAAmB,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,kBAAU,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,wCAAwC;IACxC,MAAM,eAAe;eACnB;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;IAEA,2FAA2F;IAC3F,IAAI,oBAAoB,CAAC,aACvB,OAAO;QAAE,GAAG,YAAY;oBAAE;IAAW;IAGvC,OAAO;AACT;IAEA,2CAAe;;;;;AIvVf;;;;CAIC,GACD,MAAM,yCAAmB,CACvB,0BACA;IAEA,MAAM,eAAe,CAAA,GAAA,sBAAc;IAEnC,mIAAmI;IACnI,OAAO,CAAA,GAAA,kBAAU,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,GAAG,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;;;ALzEf;;;;;;;;CAQC,GACD,MAAM,kCAAY,CAAC,UAAgC,CAAC,CAAC;IACnD,MAAM,eAAe,CAAA,GAAA,sBAAc;IACnC,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,CAAA,GAAA,qBAAa;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,kBAAU,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;;;;;AM1Cf,4DAA4D;AAC5D,+DAA+D;AAC/D,qDAAqD;AACrD,MAAM,sCAAgB,CAAA,GAAA,6BAAM,EAAE,MAAM,CAAC;IACnC,YAAW,QAAE,IAAI,kBAAE,cAAc,EAAE;QACjC,OAAO;YAAC;YAAQ,CAAA,GAAA,sBAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YAAiB,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE;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;;;ARnCf,MAAM,kCAAY,CAAA,GAAA,iBAAS,IAAI,CAAA,QAAU,CAAA;QACvC,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,EAAO;IAC7G,MAAM,SAAS,CAAA,GAAA,uBAAe;IAC9B,MAAM,EAAE,MAAM,QAAQ,aAAE,SAAS,EAAE,GAAG,CAAA,GAAA,qBAAa;IACnD,MAAM,gBAAgB,CAAA,GAAA,mBAAW,EAAE;IACnC,MAAM,WAAE,OAAO,EAAE,GAAG;IACpB,MAAM,SAAS,CAAA,GAAA,gBAAQ;IACvB,MAAM,SAAS,CAAA,GAAA,wCAAQ;IACvB,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,eAAO,EAAE;IACzC,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,eAAO,EAAE;IAEzC,MAAM,WAAW,CAAA,GAAA,kBAAU,EACzB,OAAO;QACL,MAAM,WAAW,IAAI,YAAY,eAAe,CAAC,OAAO,OAAO,EAAE;QACjE,MAAM,WAAW,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,sBAAsB,CAAC;QACjE,MAAM,qBAA0B,EAAE;QAElC,SAAS,OAAO,CAAC,CAAA;YACf,qIAAqI;YACrI,MAAM,UAAU,KAAK,UAAU,CAAC,kBAAkB,CAAC,KAAK;YACxD,qIAAqI;YACrI,MAAM,YAAY,KAAK,UAAU,CAAC,qBAAqB,CAAC,KAAK;YAC7D,MAAM,OAAO,SAAS,aAAa,CAAC;YACpC,KAAK,YAAY,CACf,QACA,GAAG,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,WAAW;YAClC,wDAAwD;YACxD,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,QAAQ,CAAC,QAAQ;gBAC5B,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,kBAAU,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,gBAAC,CAAA,GAAA,WAAG;gBAAE,UAAU;gBAAU,WAAW,QAAQ,IAAI;0BAC/C,cAAA,iBAAC,CAAA,GAAA,UAAE;oBAAE,WAAW,QAAQ,SAAS;oBAAE,SAAS;;sCAC1C,gBAAC,CAAA,GAAA,aAAK;4BACJ,KACE,qIAAqI;4BACrI,UAAU,WAAW,CAAC,eAAe,eAAe,MAAM,IAC1D,qIAAqI;4BACrI,UAAU,aAAa,CAAC,eAAe,eAAe,MAAM;4BAE9D,WAAW,QAAQ,MAAM;;sCAE3B,gBAAC,CAAA,GAAA,oBAAY;4BACX,QAAO;4BACP,OAAM;4BACN,uBAAS,gBAAC;4BACV,SAAS;4BACT,SAAS;gCAAE,eAAe,QAAQ,aAAa;4BAAC;4BAChD,eAAe;gCACb,GAAG,CAAA,GAAA,2BAAmB,CAAC;gCACvB;oCACE,YAAY;gCACd;gCACA,YAAY;oCACV,qIAAqI;uCAClI,CAAA,GAAA,2BAAmB,EAAE,UAAU;oCAClC,cAAc,CAAA,GAAA,iCAAU,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,gBAAC,CAAA,GAAA,aAAK;4BACJ,MAAK;4BACL,MAAK;4BACL,SAAQ;4BACR,OAAM;4BACN,uBAAS,gBAAC,CAAA,GAAA,2BAAO;4BACjB,WAAW,QAAQ,MAAM;sCAC1B;;;;;0BAMP,gBAAC,CAAA,GAAA,iBAAS;gBACR,MAAM;gBACN,SAAS,IAAM,YAAY;gBAC3B,SAAQ;;;;AAIhB;IAEA,2CAAe;;;;;;;;;;AS9Lf,MAAM,kCAAY,CAAA,GAAA,iBAAS,IAAI,IAAO,CAAA;QACpC,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,EAAO;IAC5D,MAAM,WAAE,OAAO,EAAE,GAAG;IACpB,MAAM,gBAAgB,CAAA,GAAA,mBAAW,EAAE;IAEnC,qBACE,iBAAC,CAAA,GAAA,UAAE;QAAE,UAAS;;YACX,YACC,SACG,IAAI,CAAC,CAAC,GAAQ,IAAW,IAAI,KAAK,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,KAAK,EAAE,SAAS,EAAE,OAAO,IACxF,GAAG,CAAC,CAAC,wBACJ,iBAAC,CAAA,GAAA,UAAE;oBAAE,WAAW,QAAQ,SAAS;;sCAC/B,gBAAC,CAAA,GAAA,UAAE;4BAAE,WAAW,QAAQ,MAAM;sCAC5B,cAAA,gBAAC,CAAA,GAAA,qBAAa;gCAAE,QAAQ;gCAAS,WAAW;gCAAc,QAAO;gCAAe,UAAS;0CACvF,cAAA,gBAAC,CAAA,GAAA,2BAAmB;oCAAE,OAAO,eAAe,eAAe;;;;sCAG/D,iBAAC,CAAA,GAAA,UAAE;4BAAE,WAAW,QAAQ,IAAI;;8CAC1B,iBAAC,CAAA,GAAA,iBAAS;oCAAE,SAAQ;;sDAClB,gBAAC,CAAA,GAAA,qBAAa;4CAAE,QAAQ;4CAAS,WAAW;4CAAc,QAAO;4CAAe,UAAS;sDACvF,cAAA,gBAAC,CAAA,GAAA,gBAAQ;gDACP,SAAQ;gDACR,QAAQ,eAAe,eAAe,SAAS;gDAC/C,WAAW,QAAQ,KAAK;;;wCAEX;sDAEjB,gBAAC,CAAA,GAAA,gBAAQ;4CAAE,QAAQ;4CAAS,SAAQ;4CAAQ,QAAO;4CAAY,QAAQ;;;;8CAEzE,gBAAC,CAAA,GAAA,oBAAY;oCAAE,QAAQ;oCAAS,SAAQ;oCAAQ,QAAO;oCAAU,WAAW,QAAQ,OAAO;;;;;mBAlBvD,QAAQ,EAAE;YAsBvD,yBACC,gBAAC,CAAA,GAAA,UAAE;gBAAE,WAAW;0BACd,cAAA,gBAAC,CAAA,GAAA,UAAE;oBAAE,YAAW;oBAAS,WAAW,QAAQ,OAAO;8BACjD,cAAA,gBAAC,CAAA,GAAA,uBAAe;wBAAE,MAAM;wBAAI,WAAW;;;;;;AAMnD;IAEA,2CAAe;;;;AVzFf,MAAM,sCAAgB,CAAC,UACrB,SAAS,eACT,UAAU,kBACV,UAAU,eACV,cAAc,2DACd,YAAY,YACZ,QAAQ,EACJ;IACJ,MAAM,SAAS,CAAA,GAAA,uBAAe;IAC9B,MAAM,EAAE,OAAO,QAAQ,aAAE,SAAS,WAAE,OAAO,cAAE,UAAU,EAAE,GAAG,CAAA,GAAA,wCAAY,EAAE,QAAQ,SAAS;QAAE,aAAa;IAAK;IAC/G,IAAI,CAAC,cAAc,MAAM,IAAI,MAAM;IACnC,qBACE;;0BACE,gBAAC,CAAA,GAAA,wCAAc;gBACb,SAAS;gBACT,YAAY;gBACZ,cAAc;gBACd,aAAa;gBACb,UAAU;gBACV,SAAS;gBACT,YAAY;;0BAEd,gBAAC,CAAA,GAAA,wCAAW;gBAAE,UAAU;gBAAU,SAAS;gBAAW,cAAc;;;;AAG1E;IAEA,2CAAe;;;;;;;AW7Bf,MAAM,uCAAiB,CAAC,iBACtB,aAAa,YACb,QAAQ,YACR,QAAQ,EACJ;IACJ,IAAI,CAAA,GAAA,YAAI,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,iBAAS,EAC/C,UACA;QAAE,KAAK,MAAM,OAAO,CAAC,cAAc,aAAa;YAAC;SAAW;IAAC,GAC7D;QAAE,SAAS,CAAC,CAAC;IAAW;IAG1B,MAAM,cAAc,CAAA,GAAA,cAAM,EAAE;cAAE;mBAAM;oBAAW;IAAW;IAE1D,qBAAO,gBAAC,CAAA,GAAA,0BAAkB;QAAE,OAAO;kBAAc;;AACnD;IAEA,2CAAe;;;;;;;ACtBf,MAAM,iDAA2B,CAAC,UAChC,MAAM,aACN,SAAS,YACT,QAAQ,EACR,GAAG,MACC;IACJ,MAAM,SAAS,CAAA,GAAA,uBAAe;IAE9B,IAAI,CAAA,GAAA,YAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,cAAc,GACrC,MAAM,IAAI,MAAM;IAGlB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO;IAEvC,qBACE,gBAAC,CAAA,GAAA,wCAAa;QAAE,UAAU;QAAW,eAAe,MAAM,CAAC,OAAO;QAAG,GAAG,IAAI;kBACzE;;AAGP;IAEA,2CAAe;;;;;;;;;;;;;;ACJf;;;;CAIC,GACD,MAAM,2CAAqB,CACzB,eACA;IAEA,MAAM,YAAE,WAAW,IAAI,aAAa,qBAAqB,KAAK,cAAE,UAAU,EAAE,GAAG;IAC/E,IAAI,CAAC,WAAW,MAAM,EAAE,MAAM,IAAI,MAAM;IAExC,0BAA0B;IAC1B,MAAM,kBAAkB,iDAA2B;IAEnD,MAAM,cAAE,UAAU,eAAE,WAAW,EAAE,GAAG,6CAAuB,gBAAgB,IAAI;IAE/E,8EAA8E;IAC9E,MAAM,gBAAgB,gDAA0B,gBAAgB,IAAI,EAAE;IAEtE,wDAAwD;IACxD,MAAM,oBAAoB,4CAAsB;QAC9C,KAAK;QACL,SAAS;QACT,WAAW,CAAA;YACT,2FAA2F;YAC3F,gBAAgB,OAAO;QACzB;QACA,cAAc,CAAA;YACZ,8CAAwB,KAAK;QAC/B;IACF;IAEA,uBAAuB;IAEvB,MAAM,CAAC,oBAAoB,sBAAsB,GAAG,CAAA,GAAA,eAAO,EAAE;IAC7D,MAAM,CAAC,oBAAoB,sBAAsB,GAAG,CAAA,GAAA,eAAO,EAAE;IAE7D,8DAA8D;IAC9D,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,qBAAqB,cAAc,MAAM,IAAI,gBAAgB,WAAW,IAAI,CAAC,gBAAgB,SAAS,EACxG,gBAAgB,aAAa;IAEjC,GAAG;QAAC;QAAoB,cAAc,MAAM;QAAE,gBAAgB,WAAW;QAAE,gBAAgB,SAAS;KAAC;IACrG,kEAAkE;IAClE,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,qBAAqB,cAAc,MAAM,IAAI,gBAAgB,eAAe,IAAI,CAAC,gBAAgB,SAAS,EAC5G,gBAAgB,iBAAiB;IAErC,GAAG;QAAC;QAAoB,cAAc,MAAM;QAAE,gBAAgB,eAAe;QAAE,gBAAgB,SAAS;KAAC;IAEzG,mCAAmC,GACnC,MAAM,YAAY,CAAA,GAAA,kBAAU,EAC1B,CAAC,UAAkB,QAAQ;QACzB,sBAAsB,cAAc,MAAM,GAAG;IAC/C,GACA;QAAC,cAAc,MAAM;QAAE;KAAS;IAElC,uCAAuC,GACvC,MAAM,gBAAgB,CAAA,GAAA,kBAAU,EAC9B,CAAC,UAAkB,QAAQ;QACzB,sBAAsB,cAAc,MAAM,GAAG;IAC/C,GACA;QAAC,cAAc,MAAM;QAAE;KAAS;IAGlC,OAAO;QACL,uEAAuE;QACvE,GAAG,eAAe;QAClB,OAAO;2BACP;mBACA;uBACA;oBACA;qBACA;IACF;AACF;IAEA,2CAAe;AAEf,MAAM,8CAAwB,CAAC,OAC7B,GAAG,WACH,UAAU,iBACV,SAAS,gBACT,YAAY,EAMb;IACC,MAAM,EAAE,OAAO,OAAO,EAAE,GAAG,CAAA,GAAA,sBAAc;IACzC,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,eAAO,EAGhC;QACD,QAAQ,UAAU,eAAe;IACnC;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,eAAe,CAAA,GAAA,aAAK,EAAoB;QAE9C,iDAAiD;QACjD,IAAI,CAAC,WAAW,CAAC,KAAK,OAAO,KAAO;QAEpC,kDAAkD;QAClD,CAAA,GAAA,2BAAmB,EAAE,SAAS,KAC3B,IAAI,CAAC,CAAA;YACJ,aAAa,OAAO,GAAG,IAAI,+DAA+D;YAC1F,aAAa,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAA;gBAC/C,yBAAyB;gBACzB,MAAM,OAA0B,KAAK,KAAK,CAAC,MAAM,IAAI;gBACrD,IAAI,KAAK,IAAI,KAAK,OAChB,UAAU,KAAK,MAAM;qBAChB,IAAI,KAAK,IAAI,KAAK,UACvB,aAAa,KAAK,MAAM;YAE5B;YACA,aAAa,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAA;gBAC7C,UAAU;oBAAE,OAAO;oBAAO,QAAQ;gBAAQ;YAC1C,gDAAgD;YAClD;YACA,aAAa,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAA;gBAC7C,IAAI,CAAC,OAAO,KAAK,EACf,UAAU;oBAAE,QAAQ;gBAAS;YAEjC;QACF,GACC,KAAK,CAAC,CAAA;YACL,UAAU;gBAAE,QAAQ;uBAAS;YAAM;QACrC;QAEF,gCAAgC;QAChC,OAAO;YACL,aAAa,OAAO,EAAE;QACxB;IACF,GAAG;QAAC;QAAK;QAAS;QAAW;KAAa;IAE1C,OAAO;AACT;AAEA,MAAM,mDAA6B,CAAC;IAClC,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,CAAA,GAAA,qBAAa;IACxC,MAAM,eAAe,CAAA,GAAA,sBAAc;IACnC,MAAM,EAAE,OAAO,OAAO,EAAE,GAAG;IAE3B,MAAM,oBAAoB,CAAA,GAAA,uBAAe,EAAE;QACzC,UAAU;YAAC;YAAc;gBAAE,KAAK;YAAc;SAAE;QAChD,SAAS,6CAAuB;QAChC,kBAAkB;QAClB,SAAS,CAAC,CAAE,CAAA,iBAAiB,UAAU,EAAC;QACxC,kBAAkB,CAAA,UAAW,QAAQ,IAAI,EAAE;QAC3C,sBAAsB,CAAA,UAAW,QAAQ,IAAI,EAAE;IACjD;IAEA,OAAO;AACT;AAEA,MAAM,+CAAyB,CAAC,UAC7B,OAAO,EAAE,WAAW,OAAO,EAAE;QAC5B,+FAA+F;QAC/F,MAAM,WAAW,MAAM,AAAC,CAAA,MAAM,QAAQ,QAAO,EAAG,IAAI;QACpD,IAAI,CAAC,YAAY,OAAO,aAAa,UACnC,MAAM,IAAI,MAAM,CAAC,qBAAqB,EAAE,QAAQ,sBAAsB,CAAC;QAGzE,MAAM,WAAW,kBAAkB,WAAW,iBAAiB;QAE/D,IAAI,CAAA,GAAA,yCAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,KAAK,GACzC,oBAAoB;QACpB,OAAO;YAAE,SAAS,EAAE;YAAE,SAAS;YAAM,MAAM;QAAK;QAGlD,+EAA+E;QAC/E,MAAM,UAAoB,CAAA,GAAA,yCAAM,EAAE,QAAQ,CAAC,SAAS,EACjD,GAAG,CAAC,CAAC,WAAkB,UAAU,CAAC,MAAM,IAAI,UAAU,MAAM,UAC5D,MAAM,CAAC,CAAA,OAAQ,OAAO,gCAAgC;QAEzD,iCAAiC;QACjC,+BAA+B;QAC/B,MAAM,UAAU,CAAA,GAAA,gCAAwB,EAAE;YAAC,CAAA,GAAA,2BAAmB;SAAE;QAChE,QAAQ,UAAU,CAAC,SAAS;YAAE,OAAO;QAAQ;QAC7C,QAAQ,MAAM,CAAC,MAAM,CAAA,GAAA,yCAAiB,EAAE;QAExC,MAAM,WAAW,QAAQ,WAAW,CAAC;QACrC,IAAI,SAAS,IAAI,KAAK,6BACpB,OAAO;qBAAE;YAAS,SAAS;qBAAM;YAAS,MAAM;QAAK;QAGvD,MAAM,aAAa,QAAQ,SAAS,CAAC,CAAA,GAAA,qCAA6B;QAElE,oGAAoG;QACpG,MAAM,WACH,cAAc,CAAC,UAAU,SAAS;YACjC,OAAO;YACP,cAAc;QAChB,GACC,GAAG,CAAC;YAAE,QAAQ;QAAM;QAEvB,OAAO;qBAAE;qBAAS;qBAAS;YAAS,MAAM,WAAW,WAAW,CAAC;QAAS;IAC5E;AAEF,MAAM,+CAAyB,CAC7B;IAEA,IAAI,CAAC,WAAW,MAAM,QAAQ,OAAO;QAAE,aAAa;QAAW,YAAY;IAAU;IACrF,MAAM,SAAE,KAAK,EAAE,GAAG;IAElB,kIAAkI;IAClI,MAAM,cACJ,MAAM,MAAM,KAAK,IACb,YACA,CAAC,CAAC,MAAM,IAAI,CACV,CAAA,OACE,KAAK,IAAI,IAAK,CAAA,WAAW,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,AAAD;IAGhH,sFAAsF;IACtF,MAAM,6BAA6B,MAAM,IAAI,CAAC,CAAA,OAAQ,gBAAgB,OAAO,MAAM;IACnF,IAAI,4BAA4B,OAAO;QAAE,YAAY;qBAA4B;IAAY;IAE7F,8FAA8F;IAC9F,IAAI,CAAC,aACH,OAAO;QAAE,YAAY,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM;qBAAE;IAAY;IAG5D,8EAA8E;IAE9E,MAAM,YAAY,MAAM,IAAI,CAAC,CAAA,OAAQ,KAAK,IAAI,EAAE,QAAQ,MAAM;IAC9D,MAAM,WAAW,MAAM,IAAI,CAAC,CAAA,OAAQ,KAAK,IAAI,EAAE,OAAO,MAAM;IAE5D,+EAA+E;IAC/E,wCAAwC;IACxC,IAAI,aAAa,UACf,OAAO;qBACL;QACA,YAAY,KACV,qBAAqB;SACpB,GAAG,CAAC,CAAA,OAAQ,KAAK,IAAI,EAAE,cAAc,QAAQ,KAAK,IAAI,EAAE,OAAO,QAAQ,EACxE,8BAA8B;SAC7B,MAAM,CAAC,CAAC,MAAc,UAAoB,OAAO;IACtD;IAEF,iDAAiD;IACjD,OAAO;QAAE,YAAY;qBAAW;IAAY;AAC9C;AAEA,MAAM,kDAA4B,CAChC,WACA;IAEA,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAO,EAAE;IAE1D,MAAM,cAAc,CAAA,GAAA,kBAAU,EAAE;QAC9B,yEAAyE;QACzE,MAAM,YAAY,MAAM,CAAA,GAAA,yCAA0B;QAElD,MAAM,QAAQ,WAAW;QAEzB,IAAI,CAAC,SAAS,MAAM,MAAM,KAAK,GAAG;YAChC,iBAAiB,EAAE;YACnB;QACF;QACA,MAAM,iBAAiB,MAAM,QAAQ,GAAG,CACtC,sBAAsB;QACtB,UAAU,KAAK,CAAC,GAAG,CAAC,OAAM;YACxB,MAAM,QAAa,MAAM,QAAQ,GAAG,CAClC,kCAAkC;YAClC,KAAK,OAAO,CAAC,GAAG,CACd,OAAM,SACJ,uGAAuG;gBACvG,KAAK,OAAO,IAAI,CAAA,GAAA,yCAAuB,EAAE,QAAQ,KAAK,OAAO,EAAE,YAAY,aAE/E,IAAI,CAAC,CAAA,UAAW,QAAQ,MAAM,CAAC,CAAA,OAAQ,CAAC,CAAC,QAAQ,yBAAyB;YAE5E,OAAO;QACT,IACA,IAAI,CAAC,CAAA,UAAW,QAAQ,IAAI;QAE9B,4BAA4B;QAE5B,iBAAiB;IACjB,0FAA0F;IAC5F,GAAG;QAAC,WAAW;QAAO;KAAW;IAEjC,CAAA,GAAA,gBAAQ,EAAE;QACR;IACF,GAAG;QAAC;KAAY;IAEhB,OAAO;AACT;AAEA,gFAAgF,GAChF,MAAM,gDAA0B,CAAC,SAAiB;IAChD,2DAA2D;IAC3D,gBAAgB,IAAI,EAAE,MAAM,QAAQ,CAAA;QAClC,IAAI,CAAC,KAAK,OAAO,EAAE;QACnB,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA,GAAA,aAAE,EAAE,SAAS,CAAC;QAEzC,6EAA6E;QAC7E,IAAI,KAAK,IAAI,CAAC,UAAU,IAAI,OAAO,SAAS,CAAC,KAAK,IAAI,CAAC,UAAU,GAC/D,6CAA6C;QAC7C,KAAK,IAAI,CAAC,UAAU,IAAI;IAE5B;AACF,GAEA,iBAAiB;CACjB,0KAA0K;CAC1K,2PAA2P;;;;;;ACrU3P;;;;;;;CAOC,GACD,MAAM,iCAAW,CAAC,UAAgC,CAAC,CAAC;IAClD,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,CAAA,GAAA,qBAAa;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,eAAO;IAEnC,CAAA,GAAA,gBAAQ,EAAE;QACP,CAAA;YACC,IAAI,QAAQ,KAAK;gBACf,MAAM,WAAW,KAAK,QAAQ,CAAC,OAAO,SAAS,SAAS,gDAAgD;gBACxG,MAAM,cAAc,GAAG,SAAS,GAAG,EAAE,KAAK,qBAAqB,CAAC;gBAEhE,IAAI;oBACF,MAAM,EAAE,MAAM,KAAK,EAAE,GAA4B,MAAM,CAAA,GAAA,iBAAS,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,iBAAS,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,kBAAU,EAAE,OAAO;QAC/B,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,GAAG,SAAS,GAAG,EAAE,KAAK,qCAAqC,EAAE,SAAS,CAAC,EAAE,MAAM;YAEpG,IAAI;gBACF,MAAM,QAAE,IAAI,EAAE,GAAG,MAAM,CAAA,GAAA,iBAAS,EAAE,SAAS,CAAC;gBAE5C,MAAM,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAW,EAAE,IAAI,KAAK;gBAEpD,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,iBAAS,IAAI,CAAA,QAAU,CAAA;QACvC,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,iBAAS,EAAE,CAAC,OAAO;IAChC,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAE;IACnD,MAAM,WAAE,OAAO,EAAE,GAAG;IAEpB,MAAM,aAAa,CAAC;QAClB,2EAA2E;QAC3E,MAAM,OAAO,MAAM,KAAK,CAAC,MAAM;QAE/B,IAAI,MACF,6EAA6E;QAC7E,MAAM,OAAO,CAAC;YAAE,IAAI;QAAK;IAE7B;IAEA,MAAM,YAAY;QAChB,2EAA2E;QAC3E,iBAAiB,AAAC,CAAA,gBAAgB,MAAM,KAAK,CAAC,MAAM,GAAG,CAAA,IAAK,MAAM,KAAK,CAAC,MAAM;IAChF;IAEA,MAAM,cAAc;QAClB,2EAA2E;QAC3E,iBAAiB,AAAC,CAAA,gBAAgB,CAAA,IAAK,MAAM,KAAK,CAAC,MAAM;IAC3D;IAEA,MAAM,eAAe;QACnB,WAAW;IACb;IAEA,2EAA2E;IAC3E,CAAA,GAAA,gBAAQ,EAAE,IAAM,iBAAiB,IAAI;QAAC,MAAM,KAAK;KAAC;IAElD,CAAA,GAAA,0BAAkB,EAAE,KAAK,IAAO,CAAA;YAC9B,WAAW,CAAC,SAAE,KAAK,EAAO;gBACxB,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,gBAAC;QAAI,WAAW,QAAQ,KAAK;kBAC1B,MAAM,KAAK,CAAC,MAAM,GACjB,2EAA2E;QAC3E,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,MAAW,sBAC1B,gBAAC;gBACC,WAAW,QAAQ,IAAI,GAAI,CAAA,UAAU,gBAAgB,cAAc,EAAC;gBAEpE,SAAS,IAAM,WAAW;0BAEzB,KAAK,KAAK;eAHN,wBAOT,gBAAC;YAAI,WAAW,QAAQ,IAAI;sBAAE;;;AAItC;;;AD/FA,MAAM,uCAAiB;IACrB,IAAI;IACJ,IAAI;IAEJ,OAAO;QACL,SAAS,CAAC;YACR,YAAY,IAAI,CAAA,GAAA,oBAAY,EAAE,CAAA,GAAA,wCAAW,GAAG;uBAC1C;gBACA,QAAQ,MAAM,MAAM;YACtB;YAEA,QAAQ,CAAA,GAAA,cAAI,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;QACA,UAAS,KAAU;YACjB,UAAU,WAAW,CAAC;YAEtB,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC;gBAChB,wBAAwB,MAAM,UAAU;YAC1C;QACF;QACA,WAAU,KAAU;YAClB,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;;;AD5Cf,MAAM,oCAAc,CAAC;IACnB,MAAM,gBAAgB,CAAA,GAAA,mBAAW,EAAE;IAEnC,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,iBAAS,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,cAAM,EAAE;QAChC,IAAI,MACF,OAAO,KAAK,GAAG,CAAC,CAAA,OAAS,CAAA;gBAAE,IAAI,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC,eAAe,eAAe,SAAS,GAAG;YAAC,CAAA;IAEnG,GAAG;QAAC;KAAK;IAET,MAAM,QAAQ,CAAA,GAAA,cAAM,EAAE;QACpB,IAAI,mBACF,OAAO,CAAC,SAAE,KAAK,EAAO;YACpB,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.tsx","packages/activitypub-components/src/components/CommentsField/PostCommentForm.tsx","packages/activitypub-components/src/constants.ts","packages/activitypub-components/src/hooks/useOutbox.ts","packages/activitypub-components/src/hooks/useCollection.ts","packages/activitypub-components/src/utils.ts","packages/activitypub-components/src/utils/shaclValidation.ts","packages/activitypub-components/src/utils/streamUtils.ts","packages/activitypub-components/src/hooks/useAwaitActivity.ts","packages/activitypub-components/src/components/CommentsField/CustomMention.ts","packages/activitypub-components/src/components/CommentsField/CommentsList.tsx","packages/activitypub-components/src/components/CollectionList.tsx","packages/activitypub-components/src/components/ReferenceCollectionField.tsx","packages/activitypub-components/src/hooks/useTypedCollection.ts","packages/activitypub-components/src/hooks/useInbox.ts","packages/activitypub-components/src/hooks/useNodeinfo.ts","packages/activitypub-components/src/hooks/useWebfinger.ts","packages/activitypub-components/src/hooks/useMentions/useMentions.ts","packages/activitypub-components/src/hooks/useMentions/renderMentions.ts","packages/activitypub-components/src/hooks/useMentions/MentionsList.tsx"],"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 useTypedCollection } from './hooks/useTypedCollection';\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 = ({\n source = 'id',\n context = 'id',\n helperText,\n placeholder = 'Commencez à taper votre commentaire...',\n userResource,\n mentions\n}: any) => {\n const record = useRecordContext();\n const { items: comments, isLoading, addItem, removeItem } = useCollection(record?.replies, { liveUpdates: true });\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={isLoading} userResource={userResource} />\n </>\n );\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 'tss-react/mui';\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 }: any) => {\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: any) => {\n const document = new DOMParser().parseFromString(values.comment, 'text/html');\n const mentions = Array.from(document.body.getElementsByClassName('mention'));\n const mentionedUsersUris: any = [];\n\n mentions.forEach(node => {\n // @ts-expect-error TS(7015): Element implicitly has an 'any' type because index... Remove this comment to see the full error message\n const userUri = node.attributes['data-mention-id'].value;\n // @ts-expect-error TS(7015): Element implicitly has an 'any' type because index... Remove this comment to see the full error message\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 // @ts-expect-error TS(2531): Object is possibly 'null'.\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 // @ts-expect-error TS(2339): Property 'image' does not exist on type '{ title: ... Remove this comment to see the full error message\n identity?.webIdData?.[userDataModel?.fieldsMapping?.image] ||\n // @ts-expect-error TS(2339): Property 'image' does not exist on type '{ title: ... Remove this comment to see the full error message\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 // @ts-expect-error TS(2461): Type 'Extensions | undefined' is not an array type... Remove this comment to see the full error message\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 '@tanstack/react-query';\nimport { getOrCreateWsChannel, SemanticDataProvider } from '@semapps/semantic-data-provider';\nimport { arrayOf } from '../utils';\nimport type { UseCollectionOptions, SolidNotification, AwaitActivityOptions } from '../types';\nimport { getShaclValidator, validateItems } from '../utils/shaclValidation';\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 queries: !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 // TODO: Collections don't have to contain activities only, do they?\n staleTime: Infinity // Activities are immutable, so no need to refetch..\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 toa 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, shaclShapeUri = '' } = options;\n const { data: identity } = useGetIdentity();\n const [totalItems, setTotalItems] = useState<number>(0);\n const [isPaginated, setIsPaginated] = useState<boolean>(false); // true if the collection is paginated\n const [yieldsTotalItems, setYieldsTotalItems] = useState<boolean>(false); // true if the collection server yields totalItems\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') || predicateOrUrl.startsWith('did:ng:')) {\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 // If there is a nextPageUrl, we are fetching a page, otherwise we are fetching the first page or the collection\n const fetchingPage: boolean = !!nextPageUrl;\n // Fetch page or first page (collectionUrl)\n let { json } = await dataProvider.fetch(nextPageUrl || collectionUrl);\n\n // If first page, handle this here.\n if ((json.type === 'OrderedCollection' || json.type === 'Collection') && json.first) {\n const firstItems = json.first?.items || json.first?.orderedItems;\n if (firstItems) {\n if (firstItems.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 // Add the @context to the json, so that it can be used to expand the items\n // That is necessary for the validation of the items\n json = { '@context': json['@context'], ...json.first };\n }\n } else {\n // Fetch the first page\n ({ json } = await dataProvider.fetch(json.first));\n }\n }\n const itemsKey = json.orderedItems ? 'orderedItems' : 'items';\n\n // If we are fetching the first page or the collection, we can workout some information\n if (!fetchingPage) {\n const localIsPaginated = !!json.first || !!json.next;\n setIsPaginated(localIsPaginated);\n\n // If the server yields totalItems, we can use it\n if (json.totalItems) {\n setTotalItems(json.totalItems);\n setYieldsTotalItems(true);\n } else if (!localIsPaginated) {\n // If the collection is not paginated, we can count items\n const items = arrayOf(json[itemsKey]);\n if (items) setTotalItems(items.length);\n }\n }\n\n // Validate the json with the SHACL shape\n if (shaclShapeUri !== '' && json[itemsKey] && json[itemsKey].length > 0) {\n try {\n if (!json['@context']) {\n throw new Error(\n `No context returned by the server.\\nA context is required to expand the collection's items and validate them.`\n );\n }\n // TODO: Research: Is this used with the multi-purpose viewer already?\n // How can multiple shapes be validated? Can we get this typed here?\n const shaclValidator = await getShaclValidator(shaclShapeUri);\n const validatedResults = await validateItems(arrayOf(json[itemsKey]), shaclValidator, json['@context']);\n\n // Keep only the valid item in the collection\n json[itemsKey] = validatedResults.filter(result => result.isValid).map(result => result.item);\n } catch (error) {\n console.warn(\n `Filtering of the collection's items using SHACL validation wasn't possible.\\n${collectionUrl}`,\n error\n );\n }\n }\n\n return json;\n },\n [dataProvider, collectionUrl, identity, setTotalItems, setIsPaginated, setYieldsTotalItems, shaclShapeUri]\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({\n queryKey: ['collection', { collectionUrl, shaclShapeUri }],\n enabled: !!(collectionUrl && identity?.id),\n initialPageParam: collectionUrl,\n getNextPageParam: (lastPage: any) => lastPage.next,\n getPreviousPageParam: (firstPage: any) => firstPage.prev,\n queryFn: fetchCollection\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\n // Only update totalItems if collection is not paginated or if the server yields totalItems\n if (yieldsTotalItems || !isPaginated) {\n setTotalItems(totalItems => totalItems + 1);\n }\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 async () =>\n queryClient.refetchQueries({\n queryKey: ['collection', { collectionUrl }],\n type: 'active',\n exact: true\n }),\n typeof shouldRefetch === 'number' ? shouldRefetch : 2000\n );\n }\n },\n [queryClient, collectionUrl, setTotalItems, isPaginated, yieldsTotalItems]\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\n // Only update totalItems if collection is not paginated or if the server yields totalItems\n if (yieldsTotalItems || !isPaginated) {\n setTotalItems(totalItems => totalItems - 1);\n }\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 = arrayOf(page.orderedItems).filter((i: any) => (i.id || i) !== (item.id || item));\n } else if (page.items) {\n page.items = arrayOf(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({\n queryKey: ['collection', { collectionUrl }],\n type: 'active',\n exact: true\n }),\n typeof shouldRefetch === 'number' ? shouldRefetch : 2000\n );\n }\n },\n [queryClient, collectionUrl, setTotalItems, isPaginated, yieldsTotalItems]\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 // Construct return object conditionally\n const returnObject = {\n items,\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 // Only include totalItems if the server yields totalItems or for non-paginated collections\n if (yieldsTotalItems || !isPaginated) {\n return { ...returnObject, totalItems };\n }\n\n return returnObject;\n};\n\nexport default useCollection;\n","import jsonld from 'jsonld';\nimport rdf from 'rdf-ext';\nimport ParserN3 from '@rdfjs/parser-n3';\nimport { Readable } from 'readable-stream';\nimport { Quad } from '@rdfjs/types';\n\nexport 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\nexport const parseJsonLd = async (jsonLdObject: object) => {\n // Convert JSON-LD object to N-Quads string\n const nquads = await jsonld.toRDF(jsonLdObject, { format: 'application/n-quads' });\n\n // Parse N-Quads string to RDF/JS quads\n const parser = new ParserN3();\n const quadStream = parser.import(Readable.from([nquads]));\n\n const dataset = await rdf.dataset().import(quadStream);\n return dataset;\n};\n\nexport const parseJsonLdToQuads = async (jsonLdObject: object): Promise<Quad[]> => {\n // Convert JSON-LD object to N-Quads string\n const nquads = await jsonld.toRDF(jsonLdObject, { format: 'application/n-quads' });\n\n // Parse N-Quads string to RDF/JS quads\n const parser = new ParserN3();\n const quadStream = parser.import(Readable.from([nquads]));\n // Convert the quad stream to an array of quads\n const quads: any[] = [];\n quadStream.on('data', (quad: any) => {\n quads.push(quad);\n });\n return new Promise((resolve, reject) => {\n quadStream.on('end', () => {\n resolve(quads);\n });\n quadStream.on('error', (error: any) => {\n reject(error);\n });\n });\n};\n","import rdf from 'rdf-ext';\nimport { Validator } from 'shacl-engine';\nimport { jsonld } from '@activitypods/shape-definitions';\nimport { LdoBase, LdoDataset, ShapeType } from '@ldo/ldo';\nimport { parseJsonLd } from '../utils';\nimport { parseTurtle } from './streamUtils';\n\nconst activitystreams = jsonld.activitystreams;\n\n// Cache of SHACL validators\nconst validatorCache: Record<string, Validator> = {};\n\n/**\n * Returns a SHACL validator for ActivityStreams shapes.\n *\n * This function creates a SHACL validator for ActivityStreams shapes using the\n * `@activitypods/shape-definitions` package. It caches the validator to avoid\n * creating it multiple times.\n *\n * @returns A Promise that resolves to a SHACL Validator instance.\n */\nconst getActivityStreamsValidator = async (): Promise<Validator> => {\n // Check if the validator is already cached\n if (validatorCache.activityStreams) {\n return validatorCache.activityStreams;\n }\n\n try {\n const shapeDataset = await parseTurtle(activitystreams);\n\n // Create and cache the SHACL validator using the dataset\n validatorCache.activityStreams = new Validator(shapeDataset, { factory: rdf, debug: true });\n\n return validatorCache.activityStreams;\n } catch (error) {\n throw new Error(\n `Failed to create ActivityStreams validator: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n\n const shapeDataset = await parseTurtle(activitystreams);\n\n // Create and cache the SHACL validator using the dataset\n validatorCache.activityStreams = new Validator(shapeDataset, { factory: rdf, debug: true });\n\n return validatorCache.activitystreams;\n};\n\n// Helper function to load a SHACL shape and return a validator\nconst getShaclValidator = async (shapeUri: string): Promise<Validator> => {\n // Check if the validator is already cached\n if (validatorCache[shapeUri]) {\n return validatorCache[shapeUri];\n }\n\n try {\n const response = await fetch(shapeUri, {\n headers: {\n Accept: 'text/turtle'\n }\n });\n if (!response.ok) {\n throw new Error(`Failed to load shape: ${response.status} ${response.statusText}`);\n }\n\n // Get the Turtle data as text\n const turtleData: string = await response.text();\n const shapeDataset = await parseTurtle(turtleData);\n\n // Create and cache the SHACL validator using the dataset\n validatorCache[shapeUri] = new Validator(shapeDataset, { factory: rdf });\n return validatorCache[shapeUri];\n } catch (error) {\n throw new Error(\n `Failed to create SHACL validator for ${shapeUri}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n};\n\n/**\n * Validates an array of items against a SHACL shape and returns the validation results.\n *\n * @param items The items to validate\n * @param shaclValidator The SHACL validator to use\n * @param context The context to use for the items\n *\n * @returns An array of objects containing the item and its validation result\n */\nconst validateItems = async (\n items: Array<object>,\n shaclValidator: Validator,\n context: string | string[] | Record<string, string>\n): Promise<Array<{ item: object; isValid: boolean }>> => {\n if (!shaclValidator) {\n throw new Error('validateItems: shaclValidator is required');\n }\n return Promise.all(\n items.map(async (item: any) => {\n try {\n if (!item['@context']) item['@context'] = context;\n // Create a dataset from the item's JSON-LD\n const itemDataset = await parseJsonLd(item);\n\n // Validate against the SHACL shape\n const report = shaclValidator.validate({ dataset: itemDataset });\n\n return {\n item: item,\n isValid: report.conforms\n };\n } catch (error) {\n return {\n item,\n isValid: false,\n error\n };\n }\n })\n );\n};\n\n/**\n * Validates a subject against a set of SHACL shapes and returns the typed item if valid.\n *\n * @param subjectUri The subject to validate\n * @param dataset The dataset containing the subject\n * @param shapeTypes The shape types to validate against\n * @param validator The SHACL validator to use\n *\n * @returns A typed item if valid, or null if not valid\n */\nconst getAndValidateLdoSubject = async <T extends LdoBase>(\n subjectUri: string,\n dataset: LdoDataset,\n shapeTypes: ShapeType<T>[],\n validator: Validator\n): Promise<T | null> => {\n const validationReport = await validator.validate(\n // Terms means the entry point from which should be validated, in our case the current item.\n { dataset: dataset, terms: [rdf.namedNode(subjectUri)] },\n // Here, terms means the shapes to validate against.\n { terms: shapeTypes.map(shapeType => rdf.namedNode(shapeType.shape)) }\n );\n\n if (!validationReport.conforms) return null;\n const { results } = validationReport;\n\n // Find the shape that matched the item in the report results.\n const shapeType = shapeTypes.find(st =>\n results.find((res: any) => res.focusNode === subjectUri && res.shape === st.shape)\n );\n\n if (!shapeType) return null;\n\n const typedItem = dataset.usingType(shapeType).fromSubject(subjectUri);\n return typedItem;\n};\n\nexport { getShaclValidator, validateItems, getActivityStreamsValidator, getAndValidateLdoSubject };\n","import ParserN3 from '@rdfjs/parser-n3';\nimport DatasetExt from 'rdf-ext/lib/Dataset';\nimport { ReadableWebToNodeStream } from 'readable-web-to-node-stream';\nimport rdf from 'rdf-ext';\n\n// Helper function to convert a string to a Node.js Readable stream\nconst stringToStream = (str: string): ReadableWebToNodeStream => {\n // Create a TextEncoder to convert string to Uint8Array\n const encoder: TextEncoder = new TextEncoder();\n const uint8Array: Uint8Array = encoder.encode(str);\n\n // Create a ReadableStream from the Uint8Array\n const readableStream: ReadableStream = new ReadableStream({\n start(controller: ReadableStreamDefaultController) {\n controller.enqueue(uint8Array);\n controller.close();\n }\n });\n\n // Convert the web ReadableStream to a Node.js Readable stream\n return new ReadableWebToNodeStream(readableStream);\n};\nconst parseTurtle = async (turtleData: string): Promise<DatasetExt> => {\n // Convert Turtle data to a stream\n const textStream = stringToStream(turtleData);\n\n // Use ParserN3 which outputs rdf-ext compatible quads directly\n const parser: ParserN3 = new ParserN3({ factory: rdf });\n const quadStream = parser.import(textStream);\n const dataset = await rdf.dataset().import(quadStream);\n return dataset;\n};\n\nexport { parseTurtle, stringToStream };\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 'tss-react/mui';\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 }: any) => {\n const { classes } = useStyles();\n const userDataModel = useDataModel(userResource);\n\n return (\n <Box position=\"relative\">\n {comments &&\n comments\n .sort((a: any, b: any) => new Date(b.published).getTime() - new Date(a.published).getTime())\n .map((comment: any) => (\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\n variant=\"body2\"\n source={userDataModel?.fieldsMapping?.title || ''}\n className={classes.label}\n />\n </ReferenceField>\n • \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 = ({\n collectionUrl,\n resource,\n children\n}: any) => {\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 = ({\n source,\n reference,\n children,\n ...rest\n}: any) => {\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 { useCallback, useState, useEffect, useRef } from 'react';\nimport { useGetIdentity, useDataProvider } from 'react-admin';\nimport { getOrCreateWsChannel, SemanticDataProvider } from '@semapps/semantic-data-provider';\nimport { LdoBase, ShapeType } from '@ldo/ldo';\nimport { createConnectedLdoDataset } from '@ldo/connected';\nimport { solidConnectedPlugin } from '@ldo/connected-solid';\nimport { useInfiniteQuery, QueryFunction } from '@tanstack/react-query';\nimport { OrderedCollectionPageShapeType } from '@activitypods/ldo-shapes';\nimport rdf from 'rdf-ext';\nimport type { UseCollectionOptions, SolidNotification } from '../types';\nimport { arrayOf, parseJsonLdToQuads } from '../utils';\nimport {\n getActivityStreamsValidator,\n getAndValidateLdoSubject as validateAndGetLdoSubject\n} from '../utils/shaclValidation';\n\ninterface UseTypedCollectionOptions<ItemType extends LdoBase> {\n shapeTypes: ShapeType<ItemType>[]; // TODO: Needs extended shape type?\n pageSize: number;\n}\n\n/**\n * Subscribe to a collection. Supports pagination.\n * @param collectionUri The collection URI or the predicate to get the collection URI from the identity (webId).\n * @param {UseCollectionOptions & UseTypedCollectionOptions} options Defaults to `{ dereferenceItems: false, liveUpdates: false, pageSize: 10 }` and requires at least one ldo @see {ShapeType}.\n */\nconst useTypedCollection = <ItemType extends LdoBase>(\n collectionUri: string,\n options: UseCollectionOptions & UseTypedCollectionOptions<ItemType>\n) => {\n const { pageSize = 10, liveUpdates: subscribeToUpdates = false, shapeTypes } = options;\n if (!shapeTypes.length) throw new Error('At least one ShapeType is required to filter the collection by.');\n\n // 1. Fetch the collection\n const collectionQuery = useInfiniteCollectionQuery(collectionUri);\n\n const { totalItems, isPaginated } = useTotalItemsFromPages(collectionQuery.data);\n\n // 2. Filter items from the collection pages that match the given shape types.\n const filteredItems = useFilteredItemsFromPages(collectionQuery.data, shapeTypes);\n\n // 3. Set up notifications for live updates, if enabled.\n const liveUpdatesStatus = useSubscribeToUpdates({\n uri: collectionUri,\n enabled: subscribeToUpdates,\n onAddItem: _item => {\n // Since we don't know where the item was added, we refetch the whole collection ¯\\_(ツ)_/¯.\n collectionQuery.refetch();\n },\n onRemoveItem: uri => {\n removeItemFromQueryData(uri, collectionQuery);\n }\n });\n\n // 4. Pagination logic.\n\n const [requestedNextItems, setRequestedNextItems] = useState(pageSize);\n const [requestedPrevItems, setRequestedPrevItems] = useState(0);\n\n // Automatically fetch next page, if more items are requested.\n useEffect(() => {\n if (requestedNextItems > filteredItems.length && collectionQuery.hasNextPage && !collectionQuery.isLoading) {\n collectionQuery.fetchNextPage();\n }\n }, [requestedNextItems, filteredItems.length, collectionQuery.hasNextPage, collectionQuery.isLoading]);\n // Automatically fetch previous page, if more items are requested.\n useEffect(() => {\n if (requestedPrevItems > filteredItems.length && collectionQuery.hasPreviousPage && !collectionQuery.isLoading) {\n collectionQuery.fetchPreviousPage();\n }\n }, [requestedPrevItems, filteredItems.length, collectionQuery.hasPreviousPage, collectionQuery.isLoading]);\n\n /** Fetch next n (filtered) items. */\n const fetchNext = useCallback(\n (noItems: number = pageSize) => {\n setRequestedNextItems(filteredItems.length + noItems);\n },\n [filteredItems.length, pageSize]\n );\n /** Fetch previous n (filtered) items. */\n const fetchPrevious = useCallback(\n (noItems: number = pageSize) => {\n setRequestedPrevItems(filteredItems.length + noItems);\n },\n [filteredItems.length, pageSize]\n );\n\n return {\n // TODO: Do we want to expose all properties from the collection query?\n ...collectionQuery,\n items: filteredItems,\n liveUpdatesStatus,\n fetchNext,\n fetchPrevious,\n totalItems,\n isPaginated\n };\n};\n\nexport default useTypedCollection;\n\nconst useSubscribeToUpdates = ({\n uri,\n enabled = true,\n onAddItem,\n onRemoveItem\n}: {\n uri: string;\n enabled: boolean;\n onAddItem: (item: LdoBase | string) => void;\n onRemoveItem: (itemUri: string) => void;\n}) => {\n const { fetch: fetchFn } = useDataProvider<SemanticDataProvider>();\n const [status, setStatus] = useState<{\n error?: any;\n status: 'error' | 'closed' | 'connected' | 'connecting' | 'disabled';\n }>({\n status: enabled ? 'connecting' : 'disabled'\n });\n\n useEffect(() => {\n const webSocketRef = useRef<WebSocket | null>(null);\n\n // Nothing to do, return empty clean up function.\n if (!enabled || !uri) return () => {};\n\n // Create ws that listens to collectionUri changes\n getOrCreateWsChannel(fetchFn, uri)\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', event => {\n // TODO: correct ldo type\n const data: SolidNotification = JSON.parse(event.data as string);\n if (data.type === 'Add') {\n onAddItem(data.object);\n } else if (data.type === 'Remove') {\n onRemoveItem(data.object);\n }\n });\n webSocketRef.current.addEventListener('error', event => {\n setStatus({ error: event, status: 'error' });\n // TODO: Retry after a while (use react query?).\n });\n webSocketRef.current.addEventListener('close', _event => {\n if (!status.error) {\n setStatus({ status: 'closed' });\n }\n });\n })\n .catch(error => {\n setStatus({ status: 'error', error });\n });\n\n // Clean up, i.e. close channel.\n return () => {\n webSocketRef.current?.close();\n };\n }, [uri, enabled, onAddItem, onRemoveItem]);\n\n return status;\n};\n\nconst useInfiniteCollectionQuery = (collectionUri: string) => {\n const { data: identity } = useGetIdentity();\n const dataProvider = useDataProvider<SemanticDataProvider>();\n const { fetch: fetchFn } = dataProvider;\n\n const infiniteQueryData = useInfiniteQuery({\n queryKey: ['collection', { uri: collectionUri }],\n queryFn: getFetchCollectionPage(fetchFn),\n initialPageParam: collectionUri, // This could be the place to use as page param, whe collection is different. Probably not such an important thing at all.\n enabled: !!(collectionUri && identity?.id),\n getNextPageParam: current => current.data?.next,\n getPreviousPageParam: current => current.data?.prev\n });\n\n return infiniteQueryData;\n};\n\nconst getFetchCollectionPage = (fetchFn: typeof fetch) =>\n (async ({ pageParam: pageUri }) => {\n // Note, page is not necessarily of type OrderedCollectionPage but it is a partial in any case.\n const jsonPage = await (await fetchFn(pageUri)).json();\n if (!jsonPage || typeof jsonPage !== 'object') {\n throw new Error(`Could not fetch page ${pageUri}. Response is invalid.`);\n }\n\n const itemsKey = 'orderedItems' in jsonPage ? 'orderedItems' : 'items';\n\n if (arrayOf(jsonPage[itemsKey]).length === 0) {\n // No items in page.\n return { itemIds: [], dataset: null, data: null };\n }\n\n // Keep track of item ids in this order (in the rdf dataset the order is lost).\n const itemIds: string[] = arrayOf(jsonPage[itemsKey])\n .map((itemOrId: any) => itemOrId?.['@id'] || itemOrId?.id || itemOrId)\n .filter(item => item); // Ensure item is not undefined.\n\n // Parse the page into a dataset.\n // TODO: Move to data provider.\n const dataset = createConnectedLdoDataset([solidConnectedPlugin]);\n dataset.setContext('solid', { fetch: fetchFn });\n dataset.addAll(await parseJsonLdToQuads(jsonPage));\n\n const resource = dataset.getResource(pageUri);\n if (resource.type === 'InvalidIdentifierResource') {\n return { itemIds, dataset: null, pageUri, data: null };\n }\n\n const ldoBuilder = dataset.usingType(OrderedCollectionPageShapeType);\n\n // Run a link query to ensure that all items are dereferenced (the results are kept in the dataset).\n await ldoBuilder\n .startLinkQuery(resource, pageUri, {\n items: true,\n orderedItems: true\n })\n .run({ reload: false });\n\n return { dataset, itemIds, pageUri, data: ldoBuilder.fromSubject(pageUri) };\n }) satisfies QueryFunction<object, unknown[], string>;\n\nconst useTotalItemsFromPages = (\n queryData: ReturnType<typeof useInfiniteCollectionQuery>['data']\n): { totalItems: number | undefined; isPaginated: boolean | undefined } => {\n if (!queryData?.pages.length) return { isPaginated: undefined, totalItems: undefined };\n const { pages } = queryData;\n\n // Check if collection is paginated. We assume that the collection is paginated if there are pages with first, last, prev or next.\n const isPaginated =\n pages.length === 0\n ? undefined\n : !!pages.find(\n page =>\n page.data && ('first' in page.data || 'next' in page.data || 'last' in page.data || 'prev' in page.data)\n );\n\n // Approach 1: Get total items info by checking if the page has a totalItems property.\n const totalItemsByCollectionInfo = pages.find(page => 'totalItems' in page)?.data?.totalItems;\n if (totalItemsByCollectionInfo) return { totalItems: totalItemsByCollectionInfo, isPaginated };\n\n // Approach 2: If collection is not paginated, we count the number of items in the collection.\n if (!isPaginated) {\n return { totalItems: pages[0].itemIds.length, isPaginated };\n }\n\n // Approach 3: If we have the whole collection loaded, we can count the items.\n\n const firstPage = pages.find(page => page.data?.first)?.data?.first;\n const lastPage = pages.find(page => page.data?.last)?.data?.last;\n\n // We assume that all pages are loaded if the first and last page is available.\n // In that case, count all pages' items.\n if (firstPage && lastPage)\n return {\n isPaginated,\n totalItems: pages\n // Get length of page\n .map(page => page.data?.orderedItems?.size || page.data?.items?.size || 0)\n // Sum all page length counts.\n .reduce((prev: number, current: number) => prev + current)\n };\n\n // If no approach succeeded, we return undefined.\n return { totalItems: undefined, isPaginated };\n};\n\nconst useFilteredItemsFromPages = <T extends LdoBase>(\n queryData: ReturnType<typeof useInfiniteCollectionQuery>['data'],\n shapeTypes: ShapeType<T>[]\n) => {\n const [filteredItems, setFilteredItems] = useState<T[]>([]);\n\n const filterItems = useCallback(async () => {\n // We need to load the shacl resources and match them to the shape types.\n const validator = await getActivityStreamsValidator();\n\n const pages = queryData?.pages;\n\n if (!pages || pages.length === 0) {\n setFilteredItems([]);\n return;\n }\n const validatedItems = await Promise.all(\n // For every page, ...\n queryData.pages.map(async page => {\n const items: T[] = await Promise.all(\n // For every item in the page, ...\n page.itemIds.map(\n async itemId =>\n // Validate item against the shape types and return the ldo object of the correct type, if it is valid.\n page.dataset && validateAndGetLdoSubject(itemId, page.dataset, shapeTypes, validator)\n )\n ).then(results => results.filter(item => !!item)); // Filter out null items.\n\n return items;\n })\n ).then(results => results.flat());\n\n // TODO: Order items by ids.\n\n setFilteredItems(validatedItems);\n // TODO: Cache filtered items by page, so that we don't have to re-filter them every time?\n }, [queryData?.pages, shapeTypes]);\n\n useEffect(() => {\n filterItems();\n }, [filterItems]);\n\n return filteredItems;\n};\n\n/** A somewhat hacky way to remove an item from the useInfiniteCollectionQuery. */\nconst removeItemFromQueryData = (itemUri: string, collectionQuery: ReturnType<typeof useInfiniteCollectionQuery>) => {\n // Manipulate data about total items. Sorry, a bit hacky...\n collectionQuery.data?.pages.forEach(page => {\n if (!page.dataset) return;\n page.dataset.deleteMatches(rdf.namedNode(itemUri));\n\n // There might be a totalItems property in the page, so we need to update it.\n if (page.data.totalItems && Number.isInteger(page.data.totalItems)) {\n // eslint-disable-next-line no-param-reassign\n page.data.totalItems -= 1;\n }\n });\n};\n\n// Open Question:\n// - Use one dataset? It has the benefit of only having to define a single solid connected dataset and makes ng switching easier -> no need to create a connected dataset.\n// - On the other hand (the only downside I can think of rn): Either you have to remove expired items from the dataset or you don't care about old data that is not used by react admin anymore. At a refetch all old data would have to be removed though.\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: any) => {\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: any) => 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: any) => {\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 }: any) => {\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: any;\n let popup: any;\n\n return {\n onStart: (props: any) => {\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 onUpdate(props: any) {\n component.updateProps(props);\n\n popup[0].setProps({\n getReferenceClientRect: props.clientRect\n });\n },\n onKeyDown(props: any) {\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 'tss-react/mui';\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: any) => {\n // @ts-expect-error TS(2339): Property 'items' does not exist on type '{}'.\n const item = props.items[index];\n\n if (item) {\n // @ts-expect-error TS(2339): Property 'command' does not exist on type '{}'.\n props.command({ id: item });\n }\n };\n\n const upHandler = () => {\n // @ts-expect-error TS(2339): Property 'items' does not exist on type '{}'.\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length);\n };\n\n const downHandler = () => {\n // @ts-expect-error TS(2339): Property 'items' does not exist on type '{}'.\n setSelectedIndex((selectedIndex + 1) % props.items.length);\n };\n\n const enterHandler = () => {\n selectItem(selectedIndex);\n };\n\n // @ts-expect-error TS(2339): Property 'items' does not exist on type '{}'.\n useEffect(() => setSelectedIndex(0), [props.items]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: any) => {\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 // @ts-expect-error TS(2339): Property 'items' does not exist on type '{}'.\n props.items.map((item: any, index: any) => (\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.es.js.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semapps/activitypub-components",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "React-Admin components for ActivityPub display",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Virtual Assembly",
|
|
@@ -12,43 +12,69 @@
|
|
|
12
12
|
"dist"
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
|
-
"build": "parcel build && yalc publish --push --changed",
|
|
15
|
+
"build": "parcel build --no-cache && yalc publish --push --changed",
|
|
16
16
|
"watch": "nodemon --ext ts,tsx,js --watch src --exec 'yarn build'"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
+
"@activitypods/ldo-shapes": "^0.2.0",
|
|
20
|
+
"@activitypods/shape-definitions": "^0.2.1",
|
|
21
|
+
"@ldo/connected": "^1.0.0-alpha.30",
|
|
22
|
+
"@ldo/connected-solid": "^1.0.0-alpha.30",
|
|
23
|
+
"@ldo/ldo": "^1.0.0-alpha.30",
|
|
24
|
+
"@ldo/solid-react": "^1.0.0-alpha.30",
|
|
25
|
+
"@rdfjs/data-model": "2.1.1",
|
|
19
26
|
"@rdfjs/dataset": "^2.0.2",
|
|
20
27
|
"@rdfjs/parser-jsonld": "^2.1.3",
|
|
21
28
|
"@rdfjs/parser-n3": "^2.1.0",
|
|
22
|
-
"@
|
|
23
|
-
"@semapps/
|
|
24
|
-
"@semapps/
|
|
29
|
+
"@rdfjs/types": "^2.0.1",
|
|
30
|
+
"@semapps/auth-provider": "1.2.0",
|
|
31
|
+
"@semapps/field-components": "1.2.0",
|
|
32
|
+
"@semapps/semantic-data-provider": "1.2.0",
|
|
33
|
+
"@tanstack/react-query": "^5.79.0",
|
|
25
34
|
"@tiptap/core": "^2.0.0-beta.95",
|
|
26
35
|
"@tiptap/extension-mention": "^2.0.0-beta.95",
|
|
27
36
|
"@tiptap/extension-placeholder": "^2.0.0-beta.95",
|
|
28
37
|
"@tiptap/react": "^2.0.0-beta.95",
|
|
29
38
|
"@tiptap/suggestion": "^2.0.0-beta.95",
|
|
39
|
+
"jsonld": "^8.3.3",
|
|
30
40
|
"ra-input-rich-text": "^4.11.0",
|
|
41
|
+
"rdf-dereference-store": "^1.3.2",
|
|
31
42
|
"rdf-ext": "^2.5.2",
|
|
32
43
|
"rdf-validate-shacl": "^0.5.6",
|
|
33
44
|
"rdflib": "^2.2.37",
|
|
34
|
-
"react-
|
|
45
|
+
"react-router": "^7.8.0",
|
|
46
|
+
"readable-stream": "^4.7.0",
|
|
35
47
|
"readable-web-to-node-stream": "^5.0.0",
|
|
36
|
-
"
|
|
48
|
+
"shacl-engine": "^1.0.2",
|
|
49
|
+
"tippy.js": "^6.3.7",
|
|
50
|
+
"tss-react": "^4.9.19"
|
|
37
51
|
},
|
|
38
52
|
"peerDependencies": {
|
|
39
|
-
"@mui/icons-material": "^
|
|
40
|
-
"@mui/material": "^
|
|
41
|
-
"@
|
|
53
|
+
"@mui/icons-material": "^7.1.0",
|
|
54
|
+
"@mui/material": "^7.1.0",
|
|
55
|
+
"@tanstack/react-query": "^5.79.0",
|
|
42
56
|
"react": "^18.2.0",
|
|
43
|
-
"react-
|
|
57
|
+
"react-admin": "^5.10.1",
|
|
58
|
+
"react-dom": "^18.2.0"
|
|
44
59
|
},
|
|
45
60
|
"publishConfig": {
|
|
46
61
|
"access": "public"
|
|
47
62
|
},
|
|
48
63
|
"devDependencies": {
|
|
64
|
+
"@mui/icons-material": "^7.1.0",
|
|
65
|
+
"@mui/material": "^7.1.0",
|
|
66
|
+
"@tanstack/react-query": "^5.79.0",
|
|
49
67
|
"@types/rdf-ext": "^2.5.2",
|
|
50
68
|
"@types/rdf-validate-shacl": "^0.4.9",
|
|
51
|
-
"@types/
|
|
69
|
+
"@types/rdfjs__data-model": "^2.0.9",
|
|
70
|
+
"@types/rdfjs__parser-jsonld": "^2.1.7",
|
|
71
|
+
"@types/rdfjs__parser-n3": "^2.0.6",
|
|
72
|
+
"react": "^18.2.0",
|
|
73
|
+
"react-admin": "^5.10.1",
|
|
74
|
+
"react-dom": "^18.2.0"
|
|
75
|
+
},
|
|
76
|
+
"resolutions": {
|
|
77
|
+
"@mui/material": "^7.1.0"
|
|
52
78
|
},
|
|
53
|
-
"gitHead": "
|
|
79
|
+
"gitHead": "b2d4edd4ace7346c2452cc8831cb30888afda3a9"
|
|
54
80
|
}
|