@drodil/backstage-plugin-qeta-react 3.56.0 → 3.57.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.
Files changed (63) hide show
  1. package/dist/components/CollectionsContainer/CollectionsContainer.esm.js +2 -1
  2. package/dist/components/CollectionsContainer/CollectionsContainer.esm.js.map +1 -1
  3. package/dist/components/FaviconItem/FaviconItem.esm.js +20 -13
  4. package/dist/components/FaviconItem/FaviconItem.esm.js.map +1 -1
  5. package/dist/components/FollowedLists/FollowedCollectionsList.esm.js +60 -18
  6. package/dist/components/FollowedLists/FollowedCollectionsList.esm.js.map +1 -1
  7. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js +46 -18
  8. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js.map +1 -1
  9. package/dist/components/FollowedLists/FollowedTagsList.esm.js +44 -18
  10. package/dist/components/FollowedLists/FollowedTagsList.esm.js.map +1 -1
  11. package/dist/components/FollowedLists/FollowedUsersList.esm.js +56 -26
  12. package/dist/components/FollowedLists/FollowedUsersList.esm.js.map +1 -1
  13. package/dist/components/Links/Links.esm.js +27 -18
  14. package/dist/components/Links/Links.esm.js.map +1 -1
  15. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js +4 -2
  16. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +1 -1
  17. package/dist/components/PostHighlightList/PostHighlightList.esm.js +23 -144
  18. package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -1
  19. package/dist/components/PostsContainer/PostsGridItem.esm.js +6 -11
  20. package/dist/components/PostsContainer/PostsGridItem.esm.js.map +1 -1
  21. package/dist/components/TagsAndEntities/EntityChip.esm.js +42 -109
  22. package/dist/components/TagsAndEntities/EntityChip.esm.js.map +1 -1
  23. package/dist/components/TagsAndEntities/TagChip.esm.js +56 -118
  24. package/dist/components/TagsAndEntities/TagChip.esm.js.map +1 -1
  25. package/dist/components/TagsContainer/EditTagModal.esm.js.map +1 -1
  26. package/dist/components/TagsContainer/TagsContainer.esm.js +2 -1
  27. package/dist/components/TagsContainer/TagsContainer.esm.js.map +1 -1
  28. package/dist/components/Timeline/TimelineItem.esm.js +54 -2
  29. package/dist/components/Timeline/TimelineItem.esm.js.map +1 -1
  30. package/dist/components/Tooltips/CollectionTooltip.esm.js +151 -0
  31. package/dist/components/Tooltips/CollectionTooltip.esm.js.map +1 -0
  32. package/dist/components/Tooltips/EntityTooltip.esm.js +188 -0
  33. package/dist/components/Tooltips/EntityTooltip.esm.js.map +1 -0
  34. package/dist/components/Tooltips/PostTooltip.esm.js +257 -0
  35. package/dist/components/Tooltips/PostTooltip.esm.js.map +1 -0
  36. package/dist/components/Tooltips/TagTooltip.esm.js +199 -0
  37. package/dist/components/Tooltips/TagTooltip.esm.js.map +1 -0
  38. package/dist/components/Tooltips/UserTooltip.esm.js +259 -0
  39. package/dist/components/Tooltips/UserTooltip.esm.js.map +1 -0
  40. package/dist/components/UsersContainer/UserListItem.esm.js +1 -0
  41. package/dist/components/UsersContainer/UserListItem.esm.js.map +1 -1
  42. package/dist/components/UsersContainer/UsersGridItem.esm.js +1 -0
  43. package/dist/components/UsersContainer/UsersGridItem.esm.js.map +1 -1
  44. package/dist/hooks/useCollectionsFollow.esm.js +21 -45
  45. package/dist/hooks/useCollectionsFollow.esm.js.map +1 -1
  46. package/dist/hooks/useEntityAuthor.esm.js +3 -5
  47. package/dist/hooks/useEntityAuthor.esm.js.map +1 -1
  48. package/dist/hooks/useEntityFollow.esm.js +25 -36
  49. package/dist/hooks/useEntityFollow.esm.js.map +1 -1
  50. package/dist/hooks/useFavicon.esm.js +52 -0
  51. package/dist/hooks/useFavicon.esm.js.map +1 -0
  52. package/dist/hooks/useFollow.esm.js +62 -0
  53. package/dist/hooks/useFollow.esm.js.map +1 -0
  54. package/dist/hooks/useTagsFollow.esm.js +22 -39
  55. package/dist/hooks/useTagsFollow.esm.js.map +1 -1
  56. package/dist/hooks/useUserFollow.esm.js +22 -39
  57. package/dist/hooks/useUserFollow.esm.js.map +1 -1
  58. package/dist/index.d.ts +29 -13
  59. package/dist/index.esm.js +2 -0
  60. package/dist/index.esm.js.map +1 -1
  61. package/package.json +3 -3
  62. package/dist/components/TagsAndEntities/UserChip.esm.js +0 -87
  63. package/dist/components/TagsAndEntities/UserChip.esm.js.map +0 -1
@@ -14,13 +14,31 @@ import 'react-use/lib/useAsync';
14
14
  import '@backstage/plugin-permission-react';
15
15
  import '@drodil/backstage-plugin-qeta-common';
16
16
  import '@backstage/plugin-permission-common';
17
- import { Tooltip } from '@material-ui/core';
17
+ import '@material-ui/core';
18
18
  import 'react-router-dom';
19
19
  import 'react-use/lib/useDebounce';
20
20
  import '../FilterPanel/FilterPanel.esm.js';
21
21
  import '../QetaContext/QetaContext.esm.js';
22
- import { UserTooltip } from '../TagsAndEntities/UserChip.esm.js';
23
- import { useTooltipStyles } from '../../hooks/useTooltipStyles.esm.js';
22
+ import 'dataloader';
23
+ import '../MarkdownRenderer/MarkdownRenderer.esm.js';
24
+ import '@material-ui/lab';
25
+ import '@material-ui/icons/VisibilityOff';
26
+ import '@material-ui/icons/Visibility';
27
+ import '@material-ui/icons/LoyaltyOutlined';
28
+ import '@material-ui/icons/HelpOutline';
29
+ import '@material-ui/icons/DescriptionOutlined';
30
+ import '@material-ui/icons/PeopleAltOutlined';
31
+ import '../../hooks/useTooltipStyles.esm.js';
32
+ import '@backstage/catalog-model';
33
+ import '@backstage/plugin-catalog-react';
34
+ import '@material-ui/icons/LibraryBooksOutlined';
35
+ import { UserTooltip } from '../Tooltips/UserTooltip.esm.js';
36
+ import 'react-relative-time';
37
+ import '@material-ui/icons/ThumbUpOutlined';
38
+ import '@material-ui/icons/VisibilityOutlined';
39
+ import '@material-ui/icons/QuestionAnswerOutlined';
40
+ import '@material-ui/icons/ChatBubbleOutline';
41
+ import '@material-ui/icons/CheckCircleOutline';
24
42
 
25
43
  const UserLink = (props) => {
26
44
  const { entityRef, linkProps, anonymous, noLink } = props;
@@ -29,37 +47,28 @@ const UserLink = (props) => {
29
47
  entityRef,
30
48
  anonymous ?? entityRef === "anonymous"
31
49
  );
32
- const classes = useTooltipStyles();
33
50
  if (anonymous && !isCurrentUser) {
34
51
  return /* @__PURE__ */ jsx("span", { children: name });
35
52
  }
36
53
  if (noLink) {
37
54
  return /* @__PURE__ */ jsx(
38
- Tooltip,
55
+ UserTooltip,
39
56
  {
40
- arrow: true,
41
- title: /* @__PURE__ */ jsx(UserTooltip, { entityRef, anonymous }),
57
+ entityRef,
58
+ anonymous,
42
59
  enterDelay: 400,
43
60
  interactive: true,
44
- classes: {
45
- tooltip: classes.tooltip,
46
- arrow: classes.tooltipArrow
47
- },
48
61
  children: /* @__PURE__ */ jsx("span", { children: name })
49
62
  }
50
63
  );
51
64
  }
52
65
  return /* @__PURE__ */ jsx(
53
- Tooltip,
66
+ UserTooltip,
54
67
  {
55
- arrow: true,
56
- title: /* @__PURE__ */ jsx(UserTooltip, { entityRef, anonymous }),
68
+ entityRef,
69
+ anonymous,
57
70
  enterDelay: 400,
58
71
  interactive: true,
59
- classes: {
60
- tooltip: classes.tooltip,
61
- arrow: classes.tooltipArrow
62
- },
63
72
  children: /* @__PURE__ */ jsx(Link, { to: `${userRoute()}/${entityRef}`, ...linkProps, children: name })
64
73
  }
65
74
  );
@@ -1 +1 @@
1
- {"version":3,"file":"Links.esm.js","sources":["../../../src/components/Links/Links.tsx"],"sourcesContent":["import { useRouteRef } from '@backstage/core-plugin-api';\nimport { Link, LinkProps } from '@backstage/core-components';\nimport { userRouteRef } from '../../routes';\nimport { Answer, Comment, Post } from '@drodil/backstage-plugin-qeta-common';\nimport { useUserInfo } from '../../hooks';\nimport { UserTooltip } from '../TagsAndEntities/UserChip';\nimport { Tooltip } from '@material-ui/core';\nimport { useTooltipStyles } from '../../hooks/useTooltipStyles';\n\nexport const UserLink = (props: {\n entityRef: string;\n anonymous?: boolean;\n linkProps?: LinkProps;\n noLink?: boolean;\n}) => {\n const { entityRef, linkProps, anonymous, noLink } = props;\n const userRoute = useRouteRef(userRouteRef);\n const { name, isCurrentUser } = useUserInfo(\n entityRef,\n anonymous ?? entityRef === 'anonymous',\n );\n const classes = useTooltipStyles();\n\n if (anonymous && !isCurrentUser) {\n return <span>{name}</span>;\n }\n\n if (noLink) {\n return (\n <Tooltip\n arrow\n title={<UserTooltip entityRef={entityRef} anonymous={anonymous} />}\n enterDelay={400}\n interactive\n classes={{\n tooltip: classes.tooltip,\n arrow: classes.tooltipArrow,\n }}\n >\n <span>{name}</span>\n </Tooltip>\n );\n }\n\n return (\n <Tooltip\n arrow\n title={<UserTooltip entityRef={entityRef} anonymous={anonymous} />}\n enterDelay={400}\n interactive\n classes={{\n tooltip: classes.tooltip,\n arrow: classes.tooltipArrow,\n }}\n >\n <Link to={`${userRoute()}/${entityRef}`} {...linkProps}>\n {name}\n </Link>\n </Tooltip>\n );\n};\n\nexport const AuthorLink = (props: {\n entity: Post | Answer | Comment;\n linkProps?: LinkProps;\n}) => {\n const { entity, linkProps } = props;\n return (\n <UserLink\n entityRef={entity.author}\n linkProps={linkProps}\n anonymous={'anonymous' in entity ? entity.anonymous : undefined}\n />\n );\n};\n\nexport const UpdatedByLink = (props: {\n entity: Post | Answer | Comment;\n linkProps?: LinkProps;\n}) => {\n const { entity, linkProps } = props;\n if (!entity.updatedBy) {\n return null;\n }\n return (\n <UserLink\n entityRef={entity.updatedBy}\n linkProps={linkProps}\n anonymous={'anonymous' in entity ? entity.anonymous : undefined}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AASa,MAAA,QAAA,GAAW,CAAC,KAKnB,KAAA;AACJ,EAAA,MAAM,EAAE,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,QAAW,GAAA,KAAA;AACpD,EAAM,MAAA,SAAA,GAAY,YAAY,YAAY,CAAA;AAC1C,EAAM,MAAA,EAAE,IAAM,EAAA,aAAA,EAAkB,GAAA,WAAA;AAAA,IAC9B,SAAA;AAAA,IACA,aAAa,SAAc,KAAA;AAAA,GAC7B;AACA,EAAA,MAAM,UAAU,gBAAiB,EAAA;AAEjC,EAAI,IAAA,SAAA,IAAa,CAAC,aAAe,EAAA;AAC/B,IAAO,uBAAA,GAAA,CAAC,UAAM,QAAK,EAAA,IAAA,EAAA,CAAA;AAAA;AAGrB,EAAA,IAAI,MAAQ,EAAA;AACV,IACE,uBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAK,EAAA,IAAA;AAAA,QACL,KAAO,kBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAsB,SAAsB,EAAA,CAAA;AAAA,QAChE,UAAY,EAAA,GAAA;AAAA,QACZ,WAAW,EAAA,IAAA;AAAA,QACX,OAAS,EAAA;AAAA,UACP,SAAS,OAAQ,CAAA,OAAA;AAAA,UACjB,OAAO,OAAQ,CAAA;AAAA,SACjB;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,UAAM,QAAK,EAAA,IAAA,EAAA;AAAA;AAAA,KACd;AAAA;AAIJ,EACE,uBAAA,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,KAAK,EAAA,IAAA;AAAA,MACL,KAAO,kBAAA,GAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAsB,SAAsB,EAAA,CAAA;AAAA,MAChE,UAAY,EAAA,GAAA;AAAA,MACZ,WAAW,EAAA,IAAA;AAAA,MACX,OAAS,EAAA;AAAA,QACP,SAAS,OAAQ,CAAA,OAAA;AAAA,QACjB,OAAO,OAAQ,CAAA;AAAA,OACjB;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,EAAA,EAAI,CAAG,EAAA,SAAA,EAAW,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAK,GAAG,SAAA,EAC1C,QACH,EAAA,IAAA,EAAA;AAAA;AAAA,GACF;AAEJ;AAEa,MAAA,UAAA,GAAa,CAAC,KAGrB,KAAA;AACJ,EAAM,MAAA,EAAE,MAAQ,EAAA,SAAA,EAAc,GAAA,KAAA;AAC9B,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAO,CAAA,MAAA;AAAA,MAClB,SAAA;AAAA,MACA,SAAW,EAAA,WAAA,IAAe,MAAS,GAAA,MAAA,CAAO,SAAY,GAAA,KAAA;AAAA;AAAA,GACxD;AAEJ;AAEa,MAAA,aAAA,GAAgB,CAAC,KAGxB,KAAA;AACJ,EAAM,MAAA,EAAE,MAAQ,EAAA,SAAA,EAAc,GAAA,KAAA;AAC9B,EAAI,IAAA,CAAC,OAAO,SAAW,EAAA;AACrB,IAAO,OAAA,IAAA;AAAA;AAET,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAO,CAAA,SAAA;AAAA,MAClB,SAAA;AAAA,MACA,SAAW,EAAA,WAAA,IAAe,MAAS,GAAA,MAAA,CAAO,SAAY,GAAA,KAAA;AAAA;AAAA,GACxD;AAEJ;;;;"}
1
+ {"version":3,"file":"Links.esm.js","sources":["../../../src/components/Links/Links.tsx"],"sourcesContent":["import { useRouteRef } from '@backstage/core-plugin-api';\nimport { Link, LinkProps } from '@backstage/core-components';\nimport { userRouteRef } from '../../routes';\nimport { Answer, Comment, Post } from '@drodil/backstage-plugin-qeta-common';\nimport { useUserInfo } from '../../hooks';\nimport { UserTooltip } from '../Tooltips';\n\nexport const UserLink = (props: {\n entityRef: string;\n anonymous?: boolean;\n linkProps?: LinkProps;\n noLink?: boolean;\n}) => {\n const { entityRef, linkProps, anonymous, noLink } = props;\n const userRoute = useRouteRef(userRouteRef);\n const { name, isCurrentUser } = useUserInfo(\n entityRef,\n anonymous ?? entityRef === 'anonymous',\n );\n if (anonymous && !isCurrentUser) {\n return <span>{name}</span>;\n }\n\n if (noLink) {\n return (\n <UserTooltip\n entityRef={entityRef}\n anonymous={anonymous}\n enterDelay={400}\n interactive\n >\n <span>{name}</span>\n </UserTooltip>\n );\n }\n\n return (\n <UserTooltip\n entityRef={entityRef}\n anonymous={anonymous}\n enterDelay={400}\n interactive\n >\n <Link to={`${userRoute()}/${entityRef}`} {...linkProps}>\n {name}\n </Link>\n </UserTooltip>\n );\n};\n\nexport const AuthorLink = (props: {\n entity: Post | Answer | Comment;\n linkProps?: LinkProps;\n}) => {\n const { entity, linkProps } = props;\n return (\n <UserLink\n entityRef={entity.author}\n linkProps={linkProps}\n anonymous={'anonymous' in entity ? entity.anonymous : undefined}\n />\n );\n};\n\nexport const UpdatedByLink = (props: {\n entity: Post | Answer | Comment;\n linkProps?: LinkProps;\n}) => {\n const { entity, linkProps } = props;\n if (!entity.updatedBy) {\n return null;\n }\n return (\n <UserLink\n entityRef={entity.updatedBy}\n linkProps={linkProps}\n anonymous={'anonymous' in entity ? entity.anonymous : undefined}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOa,MAAA,QAAA,GAAW,CAAC,KAKnB,KAAA;AACJ,EAAA,MAAM,EAAE,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,QAAW,GAAA,KAAA;AACpD,EAAM,MAAA,SAAA,GAAY,YAAY,YAAY,CAAA;AAC1C,EAAM,MAAA,EAAE,IAAM,EAAA,aAAA,EAAkB,GAAA,WAAA;AAAA,IAC9B,SAAA;AAAA,IACA,aAAa,SAAc,KAAA;AAAA,GAC7B;AACA,EAAI,IAAA,SAAA,IAAa,CAAC,aAAe,EAAA;AAC/B,IAAO,uBAAA,GAAA,CAAC,UAAM,QAAK,EAAA,IAAA,EAAA,CAAA;AAAA;AAGrB,EAAA,IAAI,MAAQ,EAAA;AACV,IACE,uBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAY,EAAA,GAAA;AAAA,QACZ,WAAW,EAAA,IAAA;AAAA,QAEX,QAAA,kBAAA,GAAA,CAAC,UAAM,QAAK,EAAA,IAAA,EAAA;AAAA;AAAA,KACd;AAAA;AAIJ,EACE,uBAAA,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAY,EAAA,GAAA;AAAA,MACZ,WAAW,EAAA,IAAA;AAAA,MAEX,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,EAAA,EAAI,CAAG,EAAA,SAAA,EAAW,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAK,GAAG,SAAA,EAC1C,QACH,EAAA,IAAA,EAAA;AAAA;AAAA,GACF;AAEJ;AAEa,MAAA,UAAA,GAAa,CAAC,KAGrB,KAAA;AACJ,EAAM,MAAA,EAAE,MAAQ,EAAA,SAAA,EAAc,GAAA,KAAA;AAC9B,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAO,CAAA,MAAA;AAAA,MAClB,SAAA;AAAA,MACA,SAAW,EAAA,WAAA,IAAe,MAAS,GAAA,MAAA,CAAO,SAAY,GAAA,KAAA;AAAA;AAAA,GACxD;AAEJ;AAEa,MAAA,aAAA,GAAgB,CAAC,KAGxB,KAAA;AACJ,EAAM,MAAA,EAAE,MAAQ,EAAA,SAAA,EAAc,GAAA,KAAA;AAC9B,EAAI,IAAA,CAAC,OAAO,SAAW,EAAA;AACrB,IAAO,OAAA,IAAA;AAAA;AAET,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAO,CAAA,SAAA;AAAA,MAClB,SAAA;AAAA,MACA,SAAW,EAAA,WAAA,IAAe,MAAS,GAAA,MAAA,CAAO,SAAY,GAAA,KAAA;AAAA;AAAA,GACxD;AAEJ;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { useEffect, Children, createElement } from 'react';
2
+ import { lazy, useEffect, Children, createElement } from 'react';
3
3
  import SyntaxHighlighter from 'react-syntax-highlighter';
4
4
  import { MarkdownHooks } from 'react-markdown';
5
5
  import { a11yDark, a11yLight } from 'react-syntax-highlighter/dist/esm/styles/hljs';
@@ -17,9 +17,11 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
17
17
  import { qetaTranslationRef } from '../../translation.esm.js';
18
18
  import GithubSlugger from 'github-slugger';
19
19
  import { find } from 'unist-util-find';
20
- import { TagChip } from '../TagsAndEntities/TagChip.esm.js';
21
20
  import { useQetaContext } from '../QetaContext/QetaContext.esm.js';
22
21
 
22
+ const TagChip = lazy(
23
+ () => import('../TagsAndEntities/TagChip.esm.js').then((m) => ({ default: m.TagChip }))
24
+ );
23
25
  const slugger = new GithubSlugger();
24
26
  const useStyles = makeStyles(
25
27
  (theme) => {
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRenderer.esm.js","sources":["../../../src/components/MarkdownRenderer/MarkdownRenderer.tsx"],"sourcesContent":["import { Children, createElement, PropsWithChildren, useEffect } from 'react';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport { MarkdownHooks } from 'react-markdown';\nimport {\n a11yDark,\n a11yLight,\n} from 'react-syntax-highlighter/dist/esm/styles/hljs';\nimport { IconButton, makeStyles, Tooltip, Typography } from '@material-ui/core';\nimport {\n findEntityMentions,\n findTagMentions,\n} from '@drodil/backstage-plugin-qeta-common';\nimport gfm from 'remark-gfm';\nimport rehypeSlug from 'rehype-slug';\nimport rehypeToc, { HeadingNode, TextNode } from '@jsdevtools/rehype-toc';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useIsDarkTheme } from '../../hooks/useIsDarkTheme';\nimport { BackstageOverrides } from '@backstage/core-components';\nimport LinkIcon from '@material-ui/icons/Link';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { Variant } from '@material-ui/core/styles/createTypography';\nimport GithubSlugger from 'github-slugger';\nimport { HtmlElementNode } from '@jsdevtools/rehype-toc/lib/types';\nimport { find } from 'unist-util-find';\nimport { TagChip } from '../TagsAndEntities/TagChip';\nimport { useQetaContext } from '../QetaContext';\n\nconst slugger = new GithubSlugger();\n\nexport type QetaMarkdownContentClassKey =\n | 'markdown'\n | 'header'\n | 'tocHeader'\n | 'toc'\n | 'tocList'\n | 'tocListItem'\n | 'tocLink';\n\nconst useStyles = makeStyles(\n theme => {\n const overrides = theme.overrides as BackstageOverrides;\n return {\n markdown: {\n lineHeight: 1.75,\n '& p': {\n ...theme.typography?.body1,\n margin: '0 0 1em 0',\n wordBreak: 'break-word',\n },\n '& h1': {\n ...theme.typography?.h1,\n marginBottom: 2,\n marginTop: '1.5em',\n },\n '& h2': {\n ...theme.typography?.h2,\n marginBottom: 2,\n marginTop: '1.2em',\n },\n '& h3': {\n ...theme.typography?.h3,\n marginBottom: 2,\n marginTop: '1em',\n },\n '& h4': {\n ...theme.typography?.h4,\n marginBottom: 2,\n marginTop: '0.8em',\n },\n '& h5': {\n ...theme.typography?.h5,\n marginBottom: 2,\n marginTop: '0.7em',\n },\n '& h6': {\n ...theme.typography?.h6,\n marginBottom: 2,\n marginTop: '0.6em',\n },\n '& table': {\n borderCollapse: 'collapse',\n border: `1px solid ${theme.palette.border}`,\n },\n '& th, & td': {\n border: `1px solid ${theme.palette.border}`,\n padding: theme.spacing(1),\n },\n '& td': {\n wordBreak: 'break-word',\n overflow: 'hidden',\n verticalAlign: 'middle',\n lineHeight: '1',\n margin: 0,\n padding: theme.spacing(3, 2, 3, 2.5),\n borderBottom: 0,\n },\n '& th': {\n backgroundColor: theme.palette.background.paper,\n },\n '& tr': {\n backgroundColor: theme.palette.background.paper,\n },\n '& tr:nth-child(odd)': {\n backgroundColor: theme.palette.background.default,\n },\n '& a': {\n color: theme.palette.link,\n },\n '& img': {\n maxWidth: '100%',\n },\n '& code': {\n fontFamily: 'Courier New,Courier,monospace',\n fontStyle: 'normal',\n display: 'block',\n width: '100%',\n overflowX: 'auto',\n borderRadius: 4,\n padding: '0.2em 0.4em',\n },\n '& em': {\n fontStyle: 'italic !important',\n },\n '& ol': {\n listStyle: 'decimal',\n marginLeft: '2em',\n marginBottom: '1em',\n marginTop: '1em',\n },\n '& ul': {\n listStyle: 'disc',\n marginLeft: '2em',\n marginBottom: '1em',\n marginTop: '1em',\n },\n '& blockquote': {\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n padding: '1em 1.5em',\n margin: '1.5em 0',\n color: theme.palette.text.secondary,\n borderLeft: `4px solid ${theme.palette.divider}`,\n },\n '& li': {\n marginTop: '0.5em',\n },\n '& *:first-child': {\n marginTop: 0,\n },\n '& *:last-child': {\n marginBottom: 0,\n },\n '& path': {\n stroke: `${theme.palette.text.primary} !important`,\n },\n ...(overrides?.BackstageMarkdownContent ?? {}),\n },\n codeBlockContainer: {\n position: 'relative',\n '& .copyCodeButton': {\n opacity: 0,\n pointerEvents: 'none',\n transition: 'opacity 0.2s',\n },\n '&:hover .copyCodeButton': {\n opacity: 1,\n pointerEvents: 'auto',\n },\n },\n header: {\n '& .anchor-link': {\n display: 'none',\n marginLeft: '0.5em',\n },\n '&:hover .anchor-link': {\n display: 'inline-block',\n },\n },\n tocHeader: {\n marginTop: '0.5em',\n marginBottom: 0,\n },\n toc: {\n marginTop: '0.5em',\n marginLeft: '0.2em',\n paddingBottom: '1em',\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n tocList: {\n marginLeft: '0 !important',\n marginTop: '0.5em !important',\n paddingInlineStart: '1em',\n counterReset: 'item',\n },\n tocListItem: {\n display: 'block',\n '&:before': {\n content: 'counters(item, \".\") \" \"',\n counterIncrement: 'item',\n },\n },\n tocLink: {\n color: theme.palette.link,\n },\n };\n },\n { name: 'QetaMarkdownContent' },\n);\n\nconst flatten = (text: string, child: any): string => {\n if (!child) return text;\n\n return typeof child === 'string'\n ? text + child\n : Children.toArray(child.props.children).reduce(flatten, text);\n};\n\nexport const MarkdownRenderer = (props: {\n content: string;\n className?: string;\n showToc?: boolean;\n useBlankLinks?: boolean;\n}) => {\n const { content, className: mainClassName, showToc, useBlankLinks } = props;\n const darkTheme = useIsDarkTheme();\n const { t } = useTranslationRef(qetaTranslationRef);\n const classes = useStyles();\n const alertApi = useApi(alertApiRef);\n slugger.reset();\n\n const copyToClipboard = (slug: string) => {\n const url = new URL(window.location.href);\n url.hash = `#${slug}`;\n window.navigator.clipboard.writeText(url.toString());\n alertApi.post({\n message: t('link.copied'),\n severity: 'info',\n display: 'transient',\n });\n };\n\n const copyCodeToClipboard = (code: string) => {\n window.navigator.clipboard.writeText(code);\n alertApi.post({\n message: t('code.copied'),\n severity: 'info',\n display: 'transient',\n });\n };\n\n const headingRenderer = (\n hProps: PropsWithChildren<{ node: { tagName: string } }>,\n ) => {\n const { node, children } = hProps;\n const childrenArray = Children.toArray(children);\n const text = childrenArray.reduce(flatten, '');\n const slug = slugger.slug(text);\n const link = (\n <Tooltip title={t('link.aria')}>\n <IconButton\n aria-label={t('link.aria')}\n onClick={() => copyToClipboard(slug)}\n size=\"small\"\n className=\"anchor-link\"\n >\n <LinkIcon />\n </IconButton>\n </Tooltip>\n );\n return (\n <>\n {createElement(\n Typography,\n {\n variant: node.tagName as Variant,\n id: slug,\n className: classes.header,\n },\n [children, link],\n )}\n </>\n );\n };\n\n useEffect(() => {\n if (!window.location.hash) {\n return;\n }\n\n const id = window.location.hash.slice(1);\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }, []);\n\n const extensions = useQetaContext();\n\n const rehypePlugins: import('unified').PluggableList = [[rehypeSlug]];\n if (showToc) {\n rehypePlugins.push([\n rehypeToc,\n {\n cssClasses: {\n toc: classes.toc,\n list: classes.tocList,\n listItem: classes.tocListItem,\n link: classes.tocLink,\n },\n customizeTOC: (toc: HtmlElementNode) => {\n const listItems = find(toc, { tagName: 'li' });\n if (!toc.children || !listItems) {\n return false;\n }\n const tocHeader: TextNode = {\n type: 'text',\n value: t('markdown.toc'),\n };\n const heading: HeadingNode = {\n type: 'element',\n tagName: 'h3',\n properties: {},\n children: [tocHeader],\n };\n\n toc.children.unshift(heading);\n return toc;\n },\n },\n ]);\n }\n\n return (\n <div className={`${classes.markdown} ${mainClassName ?? ''}`.trim()}>\n <MarkdownHooks\n remarkPlugins={[gfm, ...(extensions.remarkPlugins ?? [])]}\n rehypePlugins={[...rehypePlugins, ...(extensions.rehypePlugins ?? [])]}\n components={{\n h1: (p: any) => headingRenderer(p),\n h2: (p: any) => headingRenderer(p),\n h3: (p: any) => headingRenderer(p),\n h4: (p: any) => headingRenderer(p),\n h5: (p: any) => headingRenderer(p),\n h6: (p: any) => headingRenderer(p),\n p: (p: any) => {\n const { children } = p;\n const arr = Children.toArray(children);\n const formatted = arr.map((child: any) => {\n if (typeof child !== 'string') {\n return child;\n }\n const userMentions = findEntityMentions(child);\n const tagMentions = findTagMentions(child);\n if (userMentions.length === 0 && tagMentions.length === 0) {\n return child;\n }\n\n return child.split(' ').map((word: string) => {\n const userMention = userMentions.find(m => word === m);\n if (userMention) {\n return (\n <>\n <EntityRefLink\n entityRef={userMention.slice(1)}\n hideIcon\n target={useBlankLinks ? '_blank' : undefined}\n />{' '}\n </>\n );\n }\n\n const tagMention = tagMentions.find(m => word === m);\n if (tagMention) {\n return (\n <TagChip\n tag={tagMention.slice(1)}\n style={{ marginBottom: 0 }}\n useHref={useBlankLinks}\n key={tagMention}\n />\n );\n }\n\n return <>{word} </>;\n });\n });\n\n return <p>{formatted}</p>;\n },\n code(p: any) {\n const { children, className, node, ...rest } = p;\n const match = /language-(\\w+)/.exec(className || '');\n const codeString = String(children).replace(/\\n$/, '');\n return match ? (\n <div className={classes.codeBlockContainer}>\n <SyntaxHighlighter\n {...rest}\n PreTag=\"div\"\n language={match[1]}\n style={darkTheme ? a11yDark : a11yLight}\n showLineNumbers\n >\n {codeString}\n </SyntaxHighlighter>\n <Tooltip title={t('code.aria')}>\n <IconButton\n aria-label={t('code.aria')}\n size=\"small\"\n className=\"copyCodeButton\"\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 2,\n }}\n onClick={() => copyCodeToClipboard(codeString)}\n >\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </div>\n ) : (\n <code {...rest} className={className}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </MarkdownHooks>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAM,OAAA,GAAU,IAAI,aAAc,EAAA;AAWlC,MAAM,SAAY,GAAA,UAAA;AAAA,EAChB,CAAS,KAAA,KAAA;AACP,IAAA,MAAM,YAAY,KAAM,CAAA,SAAA;AACxB,IAAO,OAAA;AAAA,MACL,QAAU,EAAA;AAAA,QACR,UAAY,EAAA,IAAA;AAAA,QACZ,KAAO,EAAA;AAAA,UACL,GAAG,MAAM,UAAY,EAAA,KAAA;AAAA,UACrB,MAAQ,EAAA,WAAA;AAAA,UACR,SAAW,EAAA;AAAA,SACb;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,GAAG,MAAM,UAAY,EAAA,EAAA;AAAA,UACrB,YAAc,EAAA,CAAA;AAAA,UACd,SAAW,EAAA;AAAA,SACb;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,GAAG,MAAM,UAAY,EAAA,EAAA;AAAA,UACrB,YAAc,EAAA,CAAA;AAAA,UACd,SAAW,EAAA;AAAA,SACb;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,GAAG,MAAM,UAAY,EAAA,EAAA;AAAA,UACrB,YAAc,EAAA,CAAA;AAAA,UACd,SAAW,EAAA;AAAA,SACb;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,GAAG,MAAM,UAAY,EAAA,EAAA;AAAA,UACrB,YAAc,EAAA,CAAA;AAAA,UACd,SAAW,EAAA;AAAA,SACb;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,GAAG,MAAM,UAAY,EAAA,EAAA;AAAA,UACrB,YAAc,EAAA,CAAA;AAAA,UACd,SAAW,EAAA;AAAA,SACb;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,GAAG,MAAM,UAAY,EAAA,EAAA;AAAA,UACrB,YAAc,EAAA,CAAA;AAAA,UACd,SAAW,EAAA;AAAA,SACb;AAAA,QACA,SAAW,EAAA;AAAA,UACT,cAAgB,EAAA,UAAA;AAAA,UAChB,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,SAC3C;AAAA,QACA,YAAc,EAAA;AAAA,UACZ,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,UACzC,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,SAC1B;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,SAAW,EAAA,YAAA;AAAA,UACX,QAAU,EAAA,QAAA;AAAA,UACV,aAAe,EAAA,QAAA;AAAA,UACf,UAAY,EAAA,GAAA;AAAA,UACZ,MAAQ,EAAA,CAAA;AAAA,UACR,SAAS,KAAM,CAAA,OAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,UACnC,YAAc,EAAA;AAAA,SAChB;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA;AAAA,SAC5C;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA;AAAA,SAC5C;AAAA,QACA,qBAAuB,EAAA;AAAA,UACrB,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA;AAAA,SAC5C;AAAA,QACA,KAAO,EAAA;AAAA,UACL,KAAA,EAAO,MAAM,OAAQ,CAAA;AAAA,SACvB;AAAA,QACA,OAAS,EAAA;AAAA,UACP,QAAU,EAAA;AAAA,SACZ;AAAA,QACA,QAAU,EAAA;AAAA,UACR,UAAY,EAAA,+BAAA;AAAA,UACZ,SAAW,EAAA,QAAA;AAAA,UACX,OAAS,EAAA,OAAA;AAAA,UACT,KAAO,EAAA,MAAA;AAAA,UACP,SAAW,EAAA,MAAA;AAAA,UACX,YAAc,EAAA,CAAA;AAAA,UACd,OAAS,EAAA;AAAA,SACX;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,SAAW,EAAA;AAAA,SACb;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,SAAW,EAAA,SAAA;AAAA,UACX,UAAY,EAAA,KAAA;AAAA,UACZ,YAAc,EAAA,KAAA;AAAA,UACd,SAAW,EAAA;AAAA,SACb;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,SAAW,EAAA,MAAA;AAAA,UACX,UAAY,EAAA,KAAA;AAAA,UACZ,YAAc,EAAA,KAAA;AAAA,UACd,SAAW,EAAA;AAAA,SACb;AAAA,QACA,cAAgB,EAAA;AAAA,UACd,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,UAC1C,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,UAC1C,OAAS,EAAA,WAAA;AAAA,UACT,MAAQ,EAAA,SAAA;AAAA,UACR,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,SAAA;AAAA,UAC1B,UAAY,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,SAChD;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,SAAW,EAAA;AAAA,SACb;AAAA,QACA,iBAAmB,EAAA;AAAA,UACjB,SAAW,EAAA;AAAA,SACb;AAAA,QACA,gBAAkB,EAAA;AAAA,UAChB,YAAc,EAAA;AAAA,SAChB;AAAA,QACA,QAAU,EAAA;AAAA,UACR,MAAQ,EAAA,CAAA,EAAG,KAAM,CAAA,OAAA,CAAQ,KAAK,OAAO,CAAA,WAAA;AAAA,SACvC;AAAA,QACA,GAAI,SAAW,EAAA,wBAAA,IAA4B;AAAC,OAC9C;AAAA,MACA,kBAAoB,EAAA;AAAA,QAClB,QAAU,EAAA,UAAA;AAAA,QACV,mBAAqB,EAAA;AAAA,UACnB,OAAS,EAAA,CAAA;AAAA,UACT,aAAe,EAAA,MAAA;AAAA,UACf,UAAY,EAAA;AAAA,SACd;AAAA,QACA,yBAA2B,EAAA;AAAA,UACzB,OAAS,EAAA,CAAA;AAAA,UACT,aAAe,EAAA;AAAA;AACjB,OACF;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,gBAAkB,EAAA;AAAA,UAChB,OAAS,EAAA,MAAA;AAAA,UACT,UAAY,EAAA;AAAA,SACd;AAAA,QACA,sBAAwB,EAAA;AAAA,UACtB,OAAS,EAAA;AAAA;AACX,OACF;AAAA,MACA,SAAW,EAAA;AAAA,QACT,SAAW,EAAA,OAAA;AAAA,QACX,YAAc,EAAA;AAAA,OAChB;AAAA,MACA,GAAK,EAAA;AAAA,QACH,SAAW,EAAA,OAAA;AAAA,QACX,UAAY,EAAA,OAAA;AAAA,QACZ,aAAe,EAAA,KAAA;AAAA,QACf,YAAc,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,OAClD;AAAA,MACA,OAAS,EAAA;AAAA,QACP,UAAY,EAAA,cAAA;AAAA,QACZ,SAAW,EAAA,kBAAA;AAAA,QACX,kBAAoB,EAAA,KAAA;AAAA,QACpB,YAAc,EAAA;AAAA,OAChB;AAAA,MACA,WAAa,EAAA;AAAA,QACX,OAAS,EAAA,OAAA;AAAA,QACT,UAAY,EAAA;AAAA,UACV,OAAS,EAAA,yBAAA;AAAA,UACT,gBAAkB,EAAA;AAAA;AACpB,OACF;AAAA,MACA,OAAS,EAAA;AAAA,QACP,KAAA,EAAO,MAAM,OAAQ,CAAA;AAAA;AACvB,KACF;AAAA,GACF;AAAA,EACA,EAAE,MAAM,qBAAsB;AAChC,CAAA;AAEA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,KAAuB,KAAA;AACpD,EAAI,IAAA,CAAC,OAAc,OAAA,IAAA;AAEnB,EAAA,OAAO,OAAO,KAAA,KAAU,QACpB,GAAA,IAAA,GAAO,KACP,GAAA,QAAA,CAAS,OAAQ,CAAA,KAAA,CAAM,KAAM,CAAA,QAAQ,CAAE,CAAA,MAAA,CAAO,SAAS,IAAI,CAAA;AACjE,CAAA;AAEa,MAAA,gBAAA,GAAmB,CAAC,KAK3B,KAAA;AACJ,EAAA,MAAM,EAAE,OAAS,EAAA,SAAA,EAAW,aAAe,EAAA,OAAA,EAAS,eAAkB,GAAA,KAAA;AACtE,EAAA,MAAM,YAAY,cAAe,EAAA;AACjC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,OAAA,CAAQ,KAAM,EAAA;AAEd,EAAM,MAAA,eAAA,GAAkB,CAAC,IAAiB,KAAA;AACxC,IAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,SAAS,IAAI,CAAA;AACxC,IAAI,GAAA,CAAA,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AACnB,IAAA,MAAA,CAAO,SAAU,CAAA,SAAA,CAAU,SAAU,CAAA,GAAA,CAAI,UAAU,CAAA;AACnD,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACZ,OAAA,EAAS,EAAE,aAAa,CAAA;AAAA,MACxB,QAAU,EAAA,MAAA;AAAA,MACV,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,mBAAA,GAAsB,CAAC,IAAiB,KAAA;AAC5C,IAAO,MAAA,CAAA,SAAA,CAAU,SAAU,CAAA,SAAA,CAAU,IAAI,CAAA;AACzC,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACZ,OAAA,EAAS,EAAE,aAAa,CAAA;AAAA,MACxB,QAAU,EAAA,MAAA;AAAA,MACV,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,eAAA,GAAkB,CACtB,MACG,KAAA;AACH,IAAM,MAAA,EAAE,IAAM,EAAA,QAAA,EAAa,GAAA,MAAA;AAC3B,IAAM,MAAA,aAAA,GAAgB,QAAS,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAC/C,IAAA,MAAM,IAAO,GAAA,aAAA,CAAc,MAAO,CAAA,OAAA,EAAS,EAAE,CAAA;AAC7C,IAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,MAAM,uBACH,GAAA,CAAA,OAAA,EAAA,EAAQ,KAAO,EAAA,CAAA,CAAE,WAAW,CAC3B,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAY,EAAE,WAAW,CAAA;AAAA,QACzB,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,QACnC,IAAK,EAAA,OAAA;AAAA,QACL,SAAU,EAAA,aAAA;AAAA,QAEV,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,KAEd,EAAA,CAAA;AAEF,IAAA,uBAEK,GAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA,aAAA;AAAA,MACC,UAAA;AAAA,MACA;AAAA,QACE,SAAS,IAAK,CAAA,OAAA;AAAA,QACd,EAAI,EAAA,IAAA;AAAA,QACJ,WAAW,OAAQ,CAAA;AAAA,OACrB;AAAA,MACA,CAAC,UAAU,IAAI;AAAA,KAEnB,EAAA,CAAA;AAAA,GAEJ;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,MAAO,CAAA,QAAA,CAAS,IAAM,EAAA;AACzB,MAAA;AAAA;AAGF,IAAA,MAAM,EAAK,GAAA,MAAA,CAAO,QAAS,CAAA,IAAA,CAAK,MAAM,CAAC,CAAA;AACvC,IAAM,MAAA,OAAA,GAAU,QAAS,CAAA,cAAA,CAAe,EAAE,CAAA;AAC1C,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,OAAA,CAAQ,eAAe,EAAE,QAAA,EAAU,MAAQ,EAAA,KAAA,EAAO,SAAS,CAAA;AAAA;AAC7D,GACF,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAa,cAAe,EAAA;AAElC,EAAA,MAAM,aAAiD,GAAA,CAAC,CAAC,UAAU,CAAC,CAAA;AACpE,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,aAAA,CAAc,IAAK,CAAA;AAAA,MACjB,SAAA;AAAA,MACA;AAAA,QACE,UAAY,EAAA;AAAA,UACV,KAAK,OAAQ,CAAA,GAAA;AAAA,UACb,MAAM,OAAQ,CAAA,OAAA;AAAA,UACd,UAAU,OAAQ,CAAA,WAAA;AAAA,UAClB,MAAM,OAAQ,CAAA;AAAA,SAChB;AAAA,QACA,YAAA,EAAc,CAAC,GAAyB,KAAA;AACtC,UAAA,MAAM,YAAY,IAAK,CAAA,GAAA,EAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7C,UAAA,IAAI,CAAC,GAAA,CAAI,QAAY,IAAA,CAAC,SAAW,EAAA;AAC/B,YAAO,OAAA,KAAA;AAAA;AAET,UAAA,MAAM,SAAsB,GAAA;AAAA,YAC1B,IAAM,EAAA,MAAA;AAAA,YACN,KAAA,EAAO,EAAE,cAAc;AAAA,WACzB;AACA,UAAA,MAAM,OAAuB,GAAA;AAAA,YAC3B,IAAM,EAAA,SAAA;AAAA,YACN,OAAS,EAAA,IAAA;AAAA,YACT,YAAY,EAAC;AAAA,YACb,QAAA,EAAU,CAAC,SAAS;AAAA,WACtB;AAEA,UAAI,GAAA,CAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AAC5B,UAAO,OAAA,GAAA;AAAA;AACT;AACF,KACD,CAAA;AAAA;AAGH,EACE,uBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAI,aAAiB,IAAA,EAAE,CAAG,CAAA,CAAA,IAAA,EAC3D,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,eAAe,CAAC,GAAA,EAAK,GAAI,UAAW,CAAA,aAAA,IAAiB,EAAG,CAAA;AAAA,MACxD,aAAA,EAAe,CAAC,GAAG,aAAA,EAAe,GAAI,UAAW,CAAA,aAAA,IAAiB,EAAG,CAAA;AAAA,MACrE,UAAY,EAAA;AAAA,QACV,EAAI,EAAA,CAAC,CAAW,KAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,QACjC,EAAI,EAAA,CAAC,CAAW,KAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,QACjC,EAAI,EAAA,CAAC,CAAW,KAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,QACjC,EAAI,EAAA,CAAC,CAAW,KAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,QACjC,EAAI,EAAA,CAAC,CAAW,KAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,QACjC,EAAI,EAAA,CAAC,CAAW,KAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,QACjC,CAAA,EAAG,CAAC,CAAW,KAAA;AACb,UAAM,MAAA,EAAE,UAAa,GAAA,CAAA;AACrB,UAAM,MAAA,GAAA,GAAM,QAAS,CAAA,OAAA,CAAQ,QAAQ,CAAA;AACrC,UAAA,MAAM,SAAY,GAAA,GAAA,CAAI,GAAI,CAAA,CAAC,KAAe,KAAA;AACxC,YAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,cAAO,OAAA,KAAA;AAAA;AAET,YAAM,MAAA,YAAA,GAAe,mBAAmB,KAAK,CAAA;AAC7C,YAAM,MAAA,WAAA,GAAc,gBAAgB,KAAK,CAAA;AACzC,YAAA,IAAI,YAAa,CAAA,MAAA,KAAW,CAAK,IAAA,WAAA,CAAY,WAAW,CAAG,EAAA;AACzD,cAAO,OAAA,KAAA;AAAA;AAGT,YAAA,OAAO,MAAM,KAAM,CAAA,GAAG,CAAE,CAAA,GAAA,CAAI,CAAC,IAAiB,KAAA;AAC5C,cAAA,MAAM,WAAc,GAAA,YAAA,CAAa,IAAK,CAAA,CAAA,CAAA,KAAK,SAAS,CAAC,CAAA;AACrD,cAAA,IAAI,WAAa,EAAA;AACf,gBAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,kCAAA,GAAA;AAAA,oBAAC,aAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,WAAY,CAAA,KAAA,CAAM,CAAC,CAAA;AAAA,sBAC9B,QAAQ,EAAA,IAAA;AAAA,sBACR,MAAA,EAAQ,gBAAgB,QAAW,GAAA,KAAA;AAAA;AAAA,mBACrC;AAAA,kBAAG;AAAA,iBACL,EAAA,CAAA;AAAA;AAIJ,cAAA,MAAM,UAAa,GAAA,WAAA,CAAY,IAAK,CAAA,CAAA,CAAA,KAAK,SAAS,CAAC,CAAA;AACnD,cAAA,IAAI,UAAY,EAAA;AACd,gBACE,uBAAA,GAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,UAAW,CAAA,KAAA,CAAM,CAAC,CAAA;AAAA,oBACvB,KAAA,EAAO,EAAE,YAAA,EAAc,CAAE,EAAA;AAAA,oBACzB,OAAS,EAAA;AAAA,mBAAA;AAAA,kBACJ;AAAA,iBACP;AAAA;AAIJ,cAAA,uBAAU,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,gBAAA,IAAA;AAAA,gBAAK;AAAA,eAAC,EAAA,CAAA;AAAA,aACjB,CAAA;AAAA,WACF,CAAA;AAED,UAAO,uBAAA,GAAA,CAAC,OAAG,QAAU,EAAA,SAAA,EAAA,CAAA;AAAA,SACvB;AAAA,QACA,KAAK,CAAQ,EAAA;AACX,UAAA,MAAM,EAAE,QAAU,EAAA,SAAA,EAAW,IAAM,EAAA,GAAG,MAAS,GAAA,CAAA;AAC/C,UAAA,MAAM,KAAQ,GAAA,gBAAA,CAAiB,IAAK,CAAA,SAAA,IAAa,EAAE,CAAA;AACnD,UAAA,MAAM,aAAa,MAAO,CAAA,QAAQ,CAAE,CAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACrD,UAAA,OAAO,KACL,mBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,QAAQ,kBACtB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACE,GAAG,IAAA;AAAA,gBACJ,MAAO,EAAA,KAAA;AAAA,gBACP,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,gBACjB,KAAA,EAAO,YAAY,QAAW,GAAA,SAAA;AAAA,gBAC9B,eAAe,EAAA,IAAA;AAAA,gBAEd,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,4BACC,GAAA,CAAA,OAAA,EAAA,EAAQ,KAAO,EAAA,CAAA,CAAE,WAAW,CAC3B,EAAA,QAAA,kBAAA,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,YAAA,EAAY,EAAE,WAAW,CAAA;AAAA,gBACzB,IAAK,EAAA,OAAA;AAAA,gBACL,SAAU,EAAA,gBAAA;AAAA,gBACV,KAAO,EAAA;AAAA,kBACL,QAAU,EAAA,UAAA;AAAA,kBACV,GAAK,EAAA,CAAA;AAAA,kBACL,KAAO,EAAA,CAAA;AAAA,kBACP,MAAQ,EAAA;AAAA,iBACV;AAAA,gBACA,OAAA,EAAS,MAAM,mBAAA,CAAoB,UAAU,CAAA;AAAA,gBAE7C,QAAA,kBAAA,GAAA,CAAC,YAAa,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA;AAAA;AAAA,aAEnC,EAAA;AAAA,WAAA,EACF,oBAEC,GAAA,CAAA,MAAA,EAAA,EAAM,GAAG,IAAA,EAAM,WACb,QACH,EAAA,CAAA;AAAA;AAEJ,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GAEL,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"MarkdownRenderer.esm.js","sources":["../../../src/components/MarkdownRenderer/MarkdownRenderer.tsx"],"sourcesContent":["import {\n Children,\n createElement,\n lazy,\n PropsWithChildren,\n useEffect,\n} from 'react';\nimport SyntaxHighlighter from 'react-syntax-highlighter';\nimport { MarkdownHooks } from 'react-markdown';\nimport {\n a11yDark,\n a11yLight,\n} from 'react-syntax-highlighter/dist/esm/styles/hljs';\nimport { IconButton, makeStyles, Tooltip, Typography } from '@material-ui/core';\nimport {\n findEntityMentions,\n findTagMentions,\n} from '@drodil/backstage-plugin-qeta-common';\nimport gfm from 'remark-gfm';\nimport rehypeSlug from 'rehype-slug';\nimport rehypeToc, { HeadingNode, TextNode } from '@jsdevtools/rehype-toc';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { useIsDarkTheme } from '../../hooks/useIsDarkTheme';\nimport { BackstageOverrides } from '@backstage/core-components';\nimport LinkIcon from '@material-ui/icons/Link';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { qetaTranslationRef } from '../../translation';\nimport { Variant } from '@material-ui/core/styles/createTypography';\nimport GithubSlugger from 'github-slugger';\nimport { HtmlElementNode } from '@jsdevtools/rehype-toc/lib/types';\nimport { find } from 'unist-util-find';\nimport { useQetaContext } from '../QetaContext';\n\nconst TagChip = lazy(() =>\n import('../TagsAndEntities/TagChip').then(m => ({ default: m.TagChip })),\n);\n\nconst slugger = new GithubSlugger();\n\nexport type QetaMarkdownContentClassKey =\n | 'markdown'\n | 'header'\n | 'tocHeader'\n | 'toc'\n | 'tocList'\n | 'tocListItem'\n | 'tocLink';\n\nconst useStyles = makeStyles(\n theme => {\n const overrides = theme.overrides as BackstageOverrides;\n return {\n markdown: {\n lineHeight: 1.75,\n '& p': {\n ...theme.typography?.body1,\n margin: '0 0 1em 0',\n wordBreak: 'break-word',\n },\n '& h1': {\n ...theme.typography?.h1,\n marginBottom: 2,\n marginTop: '1.5em',\n },\n '& h2': {\n ...theme.typography?.h2,\n marginBottom: 2,\n marginTop: '1.2em',\n },\n '& h3': {\n ...theme.typography?.h3,\n marginBottom: 2,\n marginTop: '1em',\n },\n '& h4': {\n ...theme.typography?.h4,\n marginBottom: 2,\n marginTop: '0.8em',\n },\n '& h5': {\n ...theme.typography?.h5,\n marginBottom: 2,\n marginTop: '0.7em',\n },\n '& h6': {\n ...theme.typography?.h6,\n marginBottom: 2,\n marginTop: '0.6em',\n },\n '& table': {\n borderCollapse: 'collapse',\n border: `1px solid ${theme.palette.border}`,\n },\n '& th, & td': {\n border: `1px solid ${theme.palette.border}`,\n padding: theme.spacing(1),\n },\n '& td': {\n wordBreak: 'break-word',\n overflow: 'hidden',\n verticalAlign: 'middle',\n lineHeight: '1',\n margin: 0,\n padding: theme.spacing(3, 2, 3, 2.5),\n borderBottom: 0,\n },\n '& th': {\n backgroundColor: theme.palette.background.paper,\n },\n '& tr': {\n backgroundColor: theme.palette.background.paper,\n },\n '& tr:nth-child(odd)': {\n backgroundColor: theme.palette.background.default,\n },\n '& a': {\n color: theme.palette.link,\n },\n '& img': {\n maxWidth: '100%',\n },\n '& code': {\n fontFamily: 'Courier New,Courier,monospace',\n fontStyle: 'normal',\n display: 'block',\n width: '100%',\n overflowX: 'auto',\n borderRadius: 4,\n padding: '0.2em 0.4em',\n },\n '& em': {\n fontStyle: 'italic !important',\n },\n '& ol': {\n listStyle: 'decimal',\n marginLeft: '2em',\n marginBottom: '1em',\n marginTop: '1em',\n },\n '& ul': {\n listStyle: 'disc',\n marginLeft: '2em',\n marginBottom: '1em',\n marginTop: '1em',\n },\n '& blockquote': {\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n padding: '1em 1.5em',\n margin: '1.5em 0',\n color: theme.palette.text.secondary,\n borderLeft: `4px solid ${theme.palette.divider}`,\n },\n '& li': {\n marginTop: '0.5em',\n },\n '& *:first-child': {\n marginTop: 0,\n },\n '& *:last-child': {\n marginBottom: 0,\n },\n '& path': {\n stroke: `${theme.palette.text.primary} !important`,\n },\n ...(overrides?.BackstageMarkdownContent ?? {}),\n },\n codeBlockContainer: {\n position: 'relative',\n '& .copyCodeButton': {\n opacity: 0,\n pointerEvents: 'none',\n transition: 'opacity 0.2s',\n },\n '&:hover .copyCodeButton': {\n opacity: 1,\n pointerEvents: 'auto',\n },\n },\n header: {\n '& .anchor-link': {\n display: 'none',\n marginLeft: '0.5em',\n },\n '&:hover .anchor-link': {\n display: 'inline-block',\n },\n },\n tocHeader: {\n marginTop: '0.5em',\n marginBottom: 0,\n },\n toc: {\n marginTop: '0.5em',\n marginLeft: '0.2em',\n paddingBottom: '1em',\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n tocList: {\n marginLeft: '0 !important',\n marginTop: '0.5em !important',\n paddingInlineStart: '1em',\n counterReset: 'item',\n },\n tocListItem: {\n display: 'block',\n '&:before': {\n content: 'counters(item, \".\") \" \"',\n counterIncrement: 'item',\n },\n },\n tocLink: {\n color: theme.palette.link,\n },\n };\n },\n { name: 'QetaMarkdownContent' },\n);\n\nconst flatten = (text: string, child: any): string => {\n if (!child) return text;\n\n return typeof child === 'string'\n ? text + child\n : Children.toArray(child.props.children).reduce(flatten, text);\n};\n\nexport const MarkdownRenderer = (props: {\n content: string;\n className?: string;\n showToc?: boolean;\n useBlankLinks?: boolean;\n}) => {\n const { content, className: mainClassName, showToc, useBlankLinks } = props;\n const darkTheme = useIsDarkTheme();\n const { t } = useTranslationRef(qetaTranslationRef);\n const classes = useStyles();\n const alertApi = useApi(alertApiRef);\n slugger.reset();\n\n const copyToClipboard = (slug: string) => {\n const url = new URL(window.location.href);\n url.hash = `#${slug}`;\n window.navigator.clipboard.writeText(url.toString());\n alertApi.post({\n message: t('link.copied'),\n severity: 'info',\n display: 'transient',\n });\n };\n\n const copyCodeToClipboard = (code: string) => {\n window.navigator.clipboard.writeText(code);\n alertApi.post({\n message: t('code.copied'),\n severity: 'info',\n display: 'transient',\n });\n };\n\n const headingRenderer = (\n hProps: PropsWithChildren<{ node: { tagName: string } }>,\n ) => {\n const { node, children } = hProps;\n const childrenArray = Children.toArray(children);\n const text = childrenArray.reduce(flatten, '');\n const slug = slugger.slug(text);\n const link = (\n <Tooltip title={t('link.aria')}>\n <IconButton\n aria-label={t('link.aria')}\n onClick={() => copyToClipboard(slug)}\n size=\"small\"\n className=\"anchor-link\"\n >\n <LinkIcon />\n </IconButton>\n </Tooltip>\n );\n return (\n <>\n {createElement(\n Typography,\n {\n variant: node.tagName as Variant,\n id: slug,\n className: classes.header,\n },\n [children, link],\n )}\n </>\n );\n };\n\n useEffect(() => {\n if (!window.location.hash) {\n return;\n }\n\n const id = window.location.hash.slice(1);\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }, []);\n\n const extensions = useQetaContext();\n\n const rehypePlugins: import('unified').PluggableList = [[rehypeSlug]];\n if (showToc) {\n rehypePlugins.push([\n rehypeToc,\n {\n cssClasses: {\n toc: classes.toc,\n list: classes.tocList,\n listItem: classes.tocListItem,\n link: classes.tocLink,\n },\n customizeTOC: (toc: HtmlElementNode) => {\n const listItems = find(toc, { tagName: 'li' });\n if (!toc.children || !listItems) {\n return false;\n }\n const tocHeader: TextNode = {\n type: 'text',\n value: t('markdown.toc'),\n };\n const heading: HeadingNode = {\n type: 'element',\n tagName: 'h3',\n properties: {},\n children: [tocHeader],\n };\n\n toc.children.unshift(heading);\n return toc;\n },\n },\n ]);\n }\n\n return (\n <div className={`${classes.markdown} ${mainClassName ?? ''}`.trim()}>\n <MarkdownHooks\n remarkPlugins={[gfm, ...(extensions.remarkPlugins ?? [])]}\n rehypePlugins={[...rehypePlugins, ...(extensions.rehypePlugins ?? [])]}\n components={{\n h1: (p: any) => headingRenderer(p),\n h2: (p: any) => headingRenderer(p),\n h3: (p: any) => headingRenderer(p),\n h4: (p: any) => headingRenderer(p),\n h5: (p: any) => headingRenderer(p),\n h6: (p: any) => headingRenderer(p),\n p: (p: any) => {\n const { children } = p;\n const arr = Children.toArray(children);\n const formatted = arr.map((child: any) => {\n if (typeof child !== 'string') {\n return child;\n }\n const userMentions = findEntityMentions(child);\n const tagMentions = findTagMentions(child);\n if (userMentions.length === 0 && tagMentions.length === 0) {\n return child;\n }\n\n return child.split(' ').map((word: string) => {\n const userMention = userMentions.find(m => word === m);\n if (userMention) {\n return (\n <>\n <EntityRefLink\n entityRef={userMention.slice(1)}\n hideIcon\n target={useBlankLinks ? '_blank' : undefined}\n />{' '}\n </>\n );\n }\n\n const tagMention = tagMentions.find(m => word === m);\n if (tagMention) {\n return (\n <TagChip\n tag={tagMention.slice(1)}\n style={{ marginBottom: 0 }}\n useHref={useBlankLinks}\n key={tagMention}\n />\n );\n }\n\n return <>{word} </>;\n });\n });\n\n return <p>{formatted}</p>;\n },\n code(p: any) {\n const { children, className, node, ...rest } = p;\n const match = /language-(\\w+)/.exec(className || '');\n const codeString = String(children).replace(/\\n$/, '');\n return match ? (\n <div className={classes.codeBlockContainer}>\n <SyntaxHighlighter\n {...rest}\n PreTag=\"div\"\n language={match[1]}\n style={darkTheme ? a11yDark : a11yLight}\n showLineNumbers\n >\n {codeString}\n </SyntaxHighlighter>\n <Tooltip title={t('code.aria')}>\n <IconButton\n aria-label={t('code.aria')}\n size=\"small\"\n className=\"copyCodeButton\"\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 2,\n }}\n onClick={() => copyCodeToClipboard(codeString)}\n >\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </div>\n ) : (\n <code {...rest} className={className}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </MarkdownHooks>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Fragment } from 'react';
3
- import { selectByPostType, truncate, removeMarkdownFormatting } from '@drodil/backstage-plugin-qeta-common';
3
+ import { selectByPostType } from '@drodil/backstage-plugin-qeta-common';
4
4
  import { useQetaApi } from '../../hooks/useQetaApi.esm.js';
5
5
  import { useRouteRef } from '@backstage/core-plugin-api';
6
6
  import '../../api.esm.js';
@@ -8,26 +8,34 @@ import '@backstage/plugin-signals-react';
8
8
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
9
9
  import { qetaTranslationRef } from '../../translation.esm.js';
10
10
  import '../../hooks/useListItemStyles.esm.js';
11
- import { useUserInfo } from '../../hooks/useEntityAuthor.esm.js';
11
+ import '@backstage/catalog-model';
12
+ import 'dataloader';
13
+ import '@backstage/plugin-catalog-react';
12
14
  import 'react-use/lib/useAsync';
13
15
  import '@backstage/plugin-permission-react';
14
16
  import '@backstage/plugin-permission-common';
15
- import { makeStyles, ListItem, Box, ListItemText, Tooltip, Grid, Typography, Avatar } from '@material-ui/core';
17
+ import { makeStyles, ListItem, Box, ListItemText } from '@material-ui/core';
16
18
  import { Link } from 'react-router-dom';
17
19
  import 'react-use/lib/useDebounce';
18
20
  import '../FilterPanel/FilterPanel.esm.js';
19
21
  import '../QetaContext/QetaContext.esm.js';
20
- import { useTooltipStyles } from '../../hooks/useTooltipStyles.esm.js';
21
22
  import { RightListContainer, RightList } from '../Utility/RightList.esm.js';
22
23
  import { Skeleton } from '@material-ui/lab';
23
24
  import { questionRouteRef, articleRouteRef, linkRouteRef } from '../../routes.esm.js';
24
25
  import numeral from 'numeral';
25
- import QuestionAnswerOutlined from '@material-ui/icons/QuestionAnswerOutlined';
26
- import ChatBubbleOutline from '@material-ui/icons/ChatBubbleOutline';
27
- import VisibilityOutlined from '@material-ui/icons/VisibilityOutlined';
28
- import ThumbUpOutlined from '@material-ui/icons/ThumbUpOutlined';
29
- import CheckCircleOutline from '@material-ui/icons/CheckCircleOutline';
30
- import { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js';
26
+ import '../MarkdownRenderer/MarkdownRenderer.esm.js';
27
+ import '@material-ui/icons/VisibilityOff';
28
+ import '@material-ui/icons/Visibility';
29
+ import '@material-ui/icons/LoyaltyOutlined';
30
+ import '@material-ui/icons/HelpOutline';
31
+ import '@material-ui/icons/DescriptionOutlined';
32
+ import '@material-ui/icons/PeopleAltOutlined';
33
+ import '../../hooks/useTooltipStyles.esm.js';
34
+ import '@material-ui/icons/LibraryBooksOutlined';
35
+ import '@material-ui/icons/QuestionAnswerOutlined';
36
+ import '@material-ui/icons/Stars';
37
+ import '@material-ui/icons/CheckCircleOutline';
38
+ import { PostTooltip } from '../Tooltips/PostTooltip.esm.js';
31
39
 
32
40
  const useStyles = makeStyles((theme) => ({
33
41
  listItem: {
@@ -81,137 +89,9 @@ const useStyles = makeStyles((theme) => ({
81
89
  function formatShortNumber(num) {
82
90
  return num >= 1e3 ? numeral(num).format("0.0 a") : num.toString();
83
91
  }
84
- const PostTooltip = (props) => {
85
- const { post } = props;
86
- const { t } = useTranslationRef(qetaTranslationRef);
87
- const { name, initials, user } = useUserInfo(
88
- post.author,
89
- post.anonymous ?? false
90
- );
91
- return /* @__PURE__ */ jsxs(Grid, { container: true, style: { padding: "0.5em" }, spacing: 1, children: [
92
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
93
- Typography,
94
- {
95
- variant: "subtitle1",
96
- style: {
97
- fontWeight: 600,
98
- marginBottom: "0.5em"
99
- },
100
- children: post.title
101
- }
102
- ) }),
103
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(
104
- Box,
105
- {
106
- style: {
107
- display: "flex",
108
- alignItems: "center",
109
- marginBottom: "0.5em"
110
- },
111
- children: [
112
- /* @__PURE__ */ jsx(
113
- Avatar,
114
- {
115
- src: user?.spec?.profile?.picture,
116
- alt: name,
117
- variant: "rounded",
118
- style: { width: "20px", height: "20px", marginRight: "0.5em" },
119
- children: initials
120
- }
121
- ),
122
- /* @__PURE__ */ jsx(Typography, { variant: "body2", style: { marginRight: "0.5em" }, children: name }),
123
- /* @__PURE__ */ jsx(
124
- Typography,
125
- {
126
- variant: "caption",
127
- color: "textSecondary",
128
- style: { marginTop: "0.5em" },
129
- children: /* @__PURE__ */ jsx(RelativeTimeWithTooltip, { value: post.created })
130
- }
131
- )
132
- ]
133
- }
134
- ) }),
135
- post.tags && post.tags.length > 0 && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: post.tags.map((tag) => `#${tag}`).join(" ") }) }),
136
- post.content && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: truncate(removeMarkdownFormatting(post.content), 150) }) }),
137
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(
138
- Box,
139
- {
140
- display: "flex",
141
- alignItems: "center",
142
- flexWrap: "wrap",
143
- style: { gap: "1em" },
144
- children: [
145
- /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
146
- /* @__PURE__ */ jsx(
147
- ThumbUpOutlined,
148
- {
149
- style: { fontSize: "0.875rem", marginRight: "0.25em" }
150
- }
151
- ),
152
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", children: [
153
- post.score,
154
- " ",
155
- t("common.votes", {})
156
- ] })
157
- ] }),
158
- /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
159
- /* @__PURE__ */ jsx(
160
- VisibilityOutlined,
161
- {
162
- style: { fontSize: "0.875rem", marginRight: "0.25em" }
163
- }
164
- ),
165
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", children: [
166
- post.views,
167
- " ",
168
- t("common.views", {})
169
- ] })
170
- ] }),
171
- post.type === "question" && /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
172
- /* @__PURE__ */ jsx(
173
- QuestionAnswerOutlined,
174
- {
175
- style: { fontSize: "0.875rem", marginRight: "0.25em" }
176
- }
177
- ),
178
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", children: [
179
- post.answersCount,
180
- " ",
181
- t("common.answers", {})
182
- ] })
183
- ] }),
184
- /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
185
- /* @__PURE__ */ jsx(
186
- ChatBubbleOutline,
187
- {
188
- style: { fontSize: "0.875rem", marginRight: "0.25em" }
189
- }
190
- ),
191
- /* @__PURE__ */ jsxs(Typography, { variant: "caption", children: [
192
- post.commentsCount,
193
- " ",
194
- t("common.comments", {})
195
- ] })
196
- ] }),
197
- post.correctAnswer && /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", color: "success.main", children: [
198
- /* @__PURE__ */ jsx(
199
- CheckCircleOutline,
200
- {
201
- style: { fontSize: "0.875rem", marginRight: "0.25em" }
202
- }
203
- ),
204
- /* @__PURE__ */ jsx(Typography, { variant: "caption", children: t("questionPage.correctAnswer", {}) })
205
- ] })
206
- ]
207
- }
208
- ) })
209
- ] });
210
- };
211
92
  const PostHighlightListContent = (props) => {
212
93
  const { loading, error, posts, title, icon, noPostsLabel, disableLoading } = props;
213
94
  const classes = useStyles();
214
- const tooltipClasses = useTooltipStyles();
215
95
  const { t } = useTranslationRef(qetaTranslationRef);
216
96
  const questionRoute = useRouteRef(questionRouteRef);
217
97
  const articleRoute = useRouteRef(articleRouteRef);
@@ -251,15 +131,14 @@ const PostHighlightListContent = (props) => {
251
131
  voteBoxClass = `${classes.voteBox} ${classes.voteBoxNegative}`;
252
132
  }
253
133
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
254
- Tooltip,
134
+ PostTooltip,
255
135
  {
136
+ post: q,
256
137
  arrow: true,
257
- title: /* @__PURE__ */ jsx(PostTooltip, { post: q }),
258
138
  enterDelay: 400,
259
- classes: {
260
- tooltip: tooltipClasses.tooltip,
261
- arrow: tooltipClasses.tooltipArrow
262
- },
139
+ enterNextDelay: 400,
140
+ placement: "left",
141
+ interactive: false,
263
142
  children: /* @__PURE__ */ jsxs(
264
143
  ListItem,
265
144
  {
@@ -1 +1 @@
1
- {"version":3,"file":"PostHighlightList.esm.js","sources":["../../../src/components/PostHighlightList/PostHighlightList.tsx"],"sourcesContent":["import { Fragment, ReactNode } from 'react';\nimport {\n Post,\n PostsQuery,\n PostType,\n removeMarkdownFormatting,\n selectByPostType,\n truncate,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi, useUserInfo } from '../../hooks';\nimport { useTooltipStyles } from '../../hooks/useTooltipStyles';\nimport { Link } from 'react-router-dom';\nimport { RightList, RightListContainer } from '../Utility/RightList';\nimport {\n Avatar,\n Box,\n Grid,\n ListItem,\n ListItemText,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport { qetaTranslationRef } from '../../translation.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n articleRouteRef,\n linkRouteRef,\n questionRouteRef,\n} from '../../routes.ts';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport numeral from 'numeral';\nimport QuestionAnswerOutlined from '@material-ui/icons/QuestionAnswerOutlined';\nimport ChatBubbleOutline from '@material-ui/icons/ChatBubbleOutline';\nimport VisibilityOutlined from '@material-ui/icons/VisibilityOutlined';\nimport ThumbUpOutlined from '@material-ui/icons/ThumbUpOutlined';\nimport CheckCircleOutline from '@material-ui/icons/CheckCircleOutline';\nimport { RelativeTimeWithTooltip } from '../RelativeTimeWithTooltip';\n\nconst useStyles = makeStyles(theme => ({\n listItem: {\n display: 'flex',\n alignItems: 'center',\n padding: '0 4px',\n minHeight: 28,\n cursor: 'pointer',\n transition: 'background 0.2s',\n textDecoration: 'none',\n color: 'inherit',\n '&:hover': {\n background: theme.palette.action.hover,\n },\n },\n emptyItem: {\n padding: '0 0 0 0.6rem',\n },\n voteBox: {\n minWidth: 28,\n maxWidth: 28,\n height: 24,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n fontWeight: 600,\n marginRight: theme.spacing(1),\n marginLeft: theme.spacing(0.5),\n background: theme.palette.background.paper,\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n },\n voteBoxPositive: {\n background: theme.palette.success.main,\n color: theme.palette.getContrastText(theme.palette.success.main),\n },\n voteBoxNegative: {\n background: theme.palette.error.main,\n color: theme.palette.getContrastText(theme.palette.error.main),\n },\n listItemText: {\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flex: 1,\n },\n}));\nfunction formatShortNumber(num: number): string {\n return num >= 1000 ? numeral(num).format('0.0 a') : num.toString();\n}\n\nconst PostTooltip = (props: { post: Post }) => {\n const { post } = props;\n const { t } = useTranslationRef(qetaTranslationRef);\n const { name, initials, user } = useUserInfo(\n post.author,\n post.anonymous ?? false,\n );\n\n return (\n <Grid container style={{ padding: '0.5em' }} spacing={1}>\n <Grid item xs={12}>\n <Typography\n variant=\"subtitle1\"\n style={{\n fontWeight: 600,\n marginBottom: '0.5em',\n }}\n >\n {post.title}\n </Typography>\n </Grid>\n\n <Grid item xs={12}>\n <Box\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '0.5em',\n }}\n >\n <Avatar\n src={user?.spec?.profile?.picture}\n alt={name}\n variant=\"rounded\"\n style={{ width: '20px', height: '20px', marginRight: '0.5em' }}\n >\n {initials}\n </Avatar>\n <Typography variant=\"body2\" style={{ marginRight: '0.5em' }}>\n {name}\n </Typography>\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: '0.5em' }}\n >\n <RelativeTimeWithTooltip value={post.created} />\n </Typography>\n </Box>\n </Grid>\n\n {post.tags && post.tags.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {post.tags.map(tag => `#${tag}`).join(' ')}\n </Typography>\n </Grid>\n )}\n\n {post.content && (\n <Grid item xs={12}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {truncate(removeMarkdownFormatting(post.content), 150)}\n </Typography>\n </Grid>\n )}\n\n <Grid item xs={12}>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n style={{ gap: '1em' }}\n >\n <Box display=\"flex\" alignItems=\"center\">\n <ThumbUpOutlined\n style={{ fontSize: '0.875rem', marginRight: '0.25em' }}\n />\n <Typography variant=\"caption\">\n {post.score} {t('common.votes', {})}\n </Typography>\n </Box>\n\n <Box display=\"flex\" alignItems=\"center\">\n <VisibilityOutlined\n style={{ fontSize: '0.875rem', marginRight: '0.25em' }}\n />\n <Typography variant=\"caption\">\n {post.views} {t('common.views', {})}\n </Typography>\n </Box>\n\n {post.type === 'question' && (\n <Box display=\"flex\" alignItems=\"center\">\n <QuestionAnswerOutlined\n style={{ fontSize: '0.875rem', marginRight: '0.25em' }}\n />\n <Typography variant=\"caption\">\n {post.answersCount} {t('common.answers', {})}\n </Typography>\n </Box>\n )}\n\n <Box display=\"flex\" alignItems=\"center\">\n <ChatBubbleOutline\n style={{ fontSize: '0.875rem', marginRight: '0.25em' }}\n />\n <Typography variant=\"caption\">\n {post.commentsCount} {t('common.comments', {})}\n </Typography>\n </Box>\n\n {post.correctAnswer && (\n <Box display=\"flex\" alignItems=\"center\" color=\"success.main\">\n <CheckCircleOutline\n style={{ fontSize: '0.875rem', marginRight: '0.25em' }}\n />\n <Typography variant=\"caption\">\n {t('questionPage.correctAnswer', {})}\n </Typography>\n </Box>\n )}\n </Box>\n </Grid>\n </Grid>\n );\n};\n\nexport const PostHighlightListContent = (props: {\n loading?: boolean;\n error?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n posts: Post[];\n title: string;\n icon?: ReactNode;\n noPostsLabel?: string;\n disableLoading?: boolean;\n}) => {\n const { loading, error, posts, title, icon, noPostsLabel, disableLoading } =\n props;\n const classes = useStyles();\n const tooltipClasses = useTooltipStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const linkRoute = useRouteRef(linkRouteRef);\n\n return (\n <RightListContainer>\n <RightList title={title} icon={icon}>\n {loading &&\n !disableLoading &&\n Array.from({ length: 5 }).map((_, i) => (\n <ListItem className={classes.listItem} dense key={`skeleton-${i}`}>\n <Box className={classes.voteBox}>\n <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />\n </Box>\n <Skeleton variant=\"text\" width=\"80%\" />\n </ListItem>\n ))}\n {error && (\n <ListItem className={classes.emptyItem} dense>\n <ListItemText\n primary={t('highlights.loadError')}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n )}\n {!error && !loading && posts.length === 0 && noPostsLabel && (\n <ListItem className={classes.emptyItem} dense>\n <ListItemText\n primary={noPostsLabel}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n )}\n {!error &&\n posts.map(q => {\n const route = selectByPostType(\n q.type,\n questionRoute,\n articleRoute,\n linkRoute,\n );\n const href = route({ id: q.id.toString(10) });\n const vote = formatShortNumber(q.score);\n let voteBoxClass = classes.voteBox;\n if (q.correctAnswer) {\n voteBoxClass = `${classes.voteBox} ${classes.voteBoxPositive}`;\n } else if (q.score < 0) {\n voteBoxClass = `${classes.voteBox} ${classes.voteBoxNegative}`;\n }\n return (\n <Fragment key={q.id}>\n <Tooltip\n arrow\n title={<PostTooltip post={q} />}\n enterDelay={400}\n classes={{\n tooltip: tooltipClasses.tooltip,\n arrow: tooltipClasses.tooltipArrow,\n }}\n >\n <ListItem\n dense\n button\n className={classes.listItem}\n component={Link}\n to={href}\n aria-label={q.title}\n >\n <Box className={voteBoxClass}>{vote}</Box>\n <ListItemText\n primary={q.title}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n </Tooltip>\n </Fragment>\n );\n })}\n </RightList>\n </RightListContainer>\n );\n};\nexport const PostHighlightList = (props: {\n type: string;\n title: string;\n noQuestionsLabel: string;\n icon?: ReactNode;\n options?: PostsQuery;\n postType?: PostType;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getPostsList(props.type, {\n limit: 5,\n type: props.postType,\n includeTags: false,\n includeAttachments: false,\n includeComments: false,\n includeAnswers: false,\n includeVotes: false,\n includeEntities: false,\n includeExperts: false,\n ...props.options,\n }),\n [],\n );\n\n const posts = response?.posts ?? [];\n\n return (\n <PostHighlightListContent\n posts={posts}\n loading={loading}\n error={error}\n title={props.title}\n icon={props.icon}\n noPostsLabel={props.noQuestionsLabel}\n />\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PostHighlightList.esm.js","sources":["../../../src/components/PostHighlightList/PostHighlightList.tsx"],"sourcesContent":["import { Fragment, ReactNode } from 'react';\nimport {\n Post,\n PostsQuery,\n PostType,\n selectByPostType,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi } from '../../hooks';\nimport { Link } from 'react-router-dom';\nimport { RightList, RightListContainer } from '../Utility/RightList';\nimport { Box, ListItem, ListItemText, makeStyles } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\nimport { qetaTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { articleRouteRef, linkRouteRef, questionRouteRef } from '../../routes';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport numeral from 'numeral';\nimport { PostTooltip } from '../Tooltips';\n\nconst useStyles = makeStyles(theme => ({\n listItem: {\n display: 'flex',\n alignItems: 'center',\n padding: '0 4px',\n minHeight: 28,\n cursor: 'pointer',\n transition: 'background 0.2s',\n textDecoration: 'none',\n color: 'inherit',\n '&:hover': {\n background: theme.palette.action.hover,\n },\n },\n emptyItem: {\n padding: '0 0 0 0.6rem',\n },\n voteBox: {\n minWidth: 28,\n maxWidth: 28,\n height: 24,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n fontWeight: 600,\n marginRight: theme.spacing(1),\n marginLeft: theme.spacing(0.5),\n background: theme.palette.background.paper,\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n },\n voteBoxPositive: {\n background: theme.palette.success.main,\n color: theme.palette.getContrastText(theme.palette.success.main),\n },\n voteBoxNegative: {\n background: theme.palette.error.main,\n color: theme.palette.getContrastText(theme.palette.error.main),\n },\n listItemText: {\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flex: 1,\n },\n}));\nfunction formatShortNumber(num: number): string {\n return num >= 1000 ? numeral(num).format('0.0 a') : num.toString();\n}\n\nexport const PostHighlightListContent = (props: {\n loading?: boolean;\n error?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n posts: Post[];\n title: string;\n icon?: ReactNode;\n noPostsLabel?: string;\n disableLoading?: boolean;\n}) => {\n const { loading, error, posts, title, icon, noPostsLabel, disableLoading } =\n props;\n const classes = useStyles();\n const { t } = useTranslationRef(qetaTranslationRef);\n const questionRoute = useRouteRef(questionRouteRef);\n const articleRoute = useRouteRef(articleRouteRef);\n const linkRoute = useRouteRef(linkRouteRef);\n\n return (\n <RightListContainer>\n <RightList title={title} icon={icon}>\n {loading &&\n !disableLoading &&\n Array.from({ length: 5 }).map((_, i) => (\n <ListItem className={classes.listItem} dense key={`skeleton-${i}`}>\n <Box className={classes.voteBox}>\n <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />\n </Box>\n <Skeleton variant=\"text\" width=\"80%\" />\n </ListItem>\n ))}\n {error && (\n <ListItem className={classes.emptyItem} dense>\n <ListItemText\n primary={t('highlights.loadError')}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n )}\n {!error && !loading && posts.length === 0 && noPostsLabel && (\n <ListItem className={classes.emptyItem} dense>\n <ListItemText\n primary={noPostsLabel}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n )}\n {!error &&\n posts.map(q => {\n const route = selectByPostType(\n q.type,\n questionRoute,\n articleRoute,\n linkRoute,\n );\n const href = route({ id: q.id.toString(10) });\n const vote = formatShortNumber(q.score);\n let voteBoxClass = classes.voteBox;\n if (q.correctAnswer) {\n voteBoxClass = `${classes.voteBox} ${classes.voteBoxPositive}`;\n } else if (q.score < 0) {\n voteBoxClass = `${classes.voteBox} ${classes.voteBoxNegative}`;\n }\n return (\n <Fragment key={q.id}>\n <PostTooltip\n post={q}\n arrow\n enterDelay={400}\n enterNextDelay={400}\n placement=\"left\"\n interactive={false}\n >\n <ListItem\n dense\n button\n className={classes.listItem}\n component={Link}\n to={href}\n aria-label={q.title}\n >\n <Box className={voteBoxClass}>{vote}</Box>\n <ListItemText\n primary={q.title}\n classes={{ primary: classes.listItemText }}\n />\n </ListItem>\n </PostTooltip>\n </Fragment>\n );\n })}\n </RightList>\n </RightListContainer>\n );\n};\nexport const PostHighlightList = (props: {\n type: string;\n title: string;\n noQuestionsLabel: string;\n icon?: ReactNode;\n options?: PostsQuery;\n postType?: PostType;\n}) => {\n const {\n value: response,\n loading,\n error,\n } = useQetaApi(\n api =>\n api.getPostsList(props.type, {\n limit: 5,\n type: props.postType,\n includeTags: false,\n includeAttachments: false,\n includeComments: false,\n includeAnswers: false,\n includeVotes: false,\n includeEntities: false,\n includeExperts: false,\n ...props.options,\n }),\n [],\n );\n\n const posts = response?.posts ?? [];\n\n return (\n <PostHighlightListContent\n posts={posts}\n loading={loading}\n error={error}\n title={props.title}\n icon={props.icon}\n noPostsLabel={props.noQuestionsLabel}\n />\n );\n};\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { selectByPostType, truncate, removeMarkdownFormatting } from '@drodil/backstage-plugin-qeta-common';
3
3
  import { useState, useEffect } from 'react';
4
4
  import { useSignal } from '@backstage/plugin-signals-react';
5
- import { useApi, useRouteRef } from '@backstage/core-plugin-api';
5
+ import { useRouteRef } from '@backstage/core-plugin-api';
6
6
  import { questionRouteRef, articleRouteRef, linkRouteRef } from '../../routes.esm.js';
7
7
  import { makeStyles, Card, Box, Tooltip, CardActionArea, CardContent, Typography, CardMedia } from '@material-ui/core';
8
8
  import DOMPurify from 'dompurify';
@@ -11,7 +11,6 @@ import { TagsAndEntities } from '../TagsAndEntities/TagsAndEntities.esm.js';
11
11
  import { AuthorBox } from '../AuthorBox/AuthorBox.esm.js';
12
12
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
13
13
  import { qetaTranslationRef } from '../../translation.esm.js';
14
- import { qetaApiRef } from '../../api.esm.js';
15
14
  import CollectionsBookmarkIcon from '@material-ui/icons/CollectionsBookmark';
16
15
  import LinkIcon from '@material-ui/icons/Link';
17
16
  import StarIcon from '@material-ui/icons/Star';
@@ -27,6 +26,7 @@ import '@backstage/plugin-permission-common';
27
26
  import '@backstage/core-components';
28
27
  import '@material-ui/icons/Visibility';
29
28
  import '@material-ui/icons/VisibilityOff';
29
+ import '../../api.esm.js';
30
30
  import 'react-use';
31
31
  import '../../hooks/useListItemStyles.esm.js';
32
32
  import '@backstage/catalog-model';
@@ -36,6 +36,7 @@ import 'react-use/lib/useAsync';
36
36
  import 'react-use/lib/useDebounce';
37
37
  import '../FilterPanel/FilterPanel.esm.js';
38
38
  import '../QetaContext/QetaContext.esm.js';
39
+ import { useFavicon } from '../../hooks/useFavicon.esm.js';
39
40
  import '@material-ui/icons/Create';
40
41
  import '@material-ui/icons/PlaylistAdd';
41
42
  import '@material-ui/icons/AddCircle';
@@ -181,9 +182,11 @@ const PostsGridItem = (props) => {
181
182
  const [correctAnswer, setCorrectAnswer] = useState(post.correctAnswer);
182
183
  const [answersCount, setAnswersCount] = useState(post.answersCount);
183
184
  const [commentsCount, setCommentsCount] = useState(post.commentsCount);
184
- const qetaApi = useApi(qetaApiRef);
185
185
  const { t } = useTranslationRef(qetaTranslationRef);
186
186
  const classes = useStyles();
187
+ const favicon = useFavicon(
188
+ post.type === "link" && !post.headerImage ? post.url : void 0
189
+ );
187
190
  const { lastSignal } = useSignal(`qeta:post_${post.id}`);
188
191
  useEffect(() => {
189
192
  if (lastSignal?.type === "post_stats") {
@@ -194,14 +197,6 @@ const PostsGridItem = (props) => {
194
197
  setCommentsCount(lastSignal.commentsCount);
195
198
  }
196
199
  }, [lastSignal]);
197
- const [favicon, setFavicon] = useState(void 0);
198
- useEffect(() => {
199
- if (post.type === "link" && !post.headerImage && post.url) {
200
- qetaApi.fetchURLMetadata({ url: post.url }).then((res) => {
201
- if (res.favicon) setFavicon(res.favicon);
202
- });
203
- }
204
- }, [post.type, post.headerImage, post.url, qetaApi]);
205
200
  const questionRoute = useRouteRef(questionRouteRef);
206
201
  const articleRoute = useRouteRef(articleRouteRef);
207
202
  const linkRoute = useRouteRef(linkRouteRef);