@pega/cosmos-react-social 8.0.0-build.9.0 → 8.0.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 (212) hide show
  1. package/lib/components/Autopilot/Autopilot.d.ts.map +1 -1
  2. package/lib/components/Autopilot/Autopilot.js +2 -2
  3. package/lib/components/Autopilot/Autopilot.js.map +1 -1
  4. package/lib/components/Chat/Chat.d.ts +3 -3
  5. package/lib/components/Chat/Chat.d.ts.map +1 -1
  6. package/lib/components/Chat/Chat.js +1 -2
  7. package/lib/components/Chat/Chat.js.map +1 -1
  8. package/lib/components/Chat/Chat.types.d.ts +3 -1
  9. package/lib/components/Chat/Chat.types.d.ts.map +1 -1
  10. package/lib/components/Chat/Chat.types.js.map +1 -1
  11. package/lib/components/Chat/ChatBody.d.ts +2 -3
  12. package/lib/components/Chat/ChatBody.d.ts.map +1 -1
  13. package/lib/components/Chat/ChatBody.js +6 -8
  14. package/lib/components/Chat/ChatBody.js.map +1 -1
  15. package/lib/components/Chat/ChatComposer.d.ts +4 -4
  16. package/lib/components/Chat/ChatComposer.d.ts.map +1 -1
  17. package/lib/components/Chat/ChatComposer.js +15 -25
  18. package/lib/components/Chat/ChatComposer.js.map +1 -1
  19. package/lib/components/Chat/ChatHeader.d.ts +4 -3
  20. package/lib/components/Chat/ChatHeader.d.ts.map +1 -1
  21. package/lib/components/Chat/ChatHeader.js +3 -4
  22. package/lib/components/Chat/ChatHeader.js.map +1 -1
  23. package/lib/components/Chat/ChatSettingsPanel.styles.d.ts.map +1 -1
  24. package/lib/components/Chat/ChatSettingsPanel.styles.js +5 -2
  25. package/lib/components/Chat/ChatSettingsPanel.styles.js.map +1 -1
  26. package/lib/components/Chat/Message.d.ts +2 -3
  27. package/lib/components/Chat/Message.d.ts.map +1 -1
  28. package/lib/components/Chat/Message.js +6 -5
  29. package/lib/components/Chat/Message.js.map +1 -1
  30. package/lib/components/Chat/Message.styles.d.ts +2 -2
  31. package/lib/components/Chat/Message.styles.d.ts.map +1 -1
  32. package/lib/components/Chat/Message.styles.js +11 -3
  33. package/lib/components/Chat/Message.styles.js.map +1 -1
  34. package/lib/components/Chat/SuggestedReplyPicker.d.ts +3 -3
  35. package/lib/components/Chat/SuggestedReplyPicker.d.ts.map +1 -1
  36. package/lib/components/Chat/SuggestedReplyPicker.js +3 -3
  37. package/lib/components/Chat/SuggestedReplyPicker.js.map +1 -1
  38. package/lib/components/Chat/SystemMessage.d.ts +2 -3
  39. package/lib/components/Chat/SystemMessage.d.ts.map +1 -1
  40. package/lib/components/Chat/SystemMessage.js +1 -2
  41. package/lib/components/Chat/SystemMessage.js.map +1 -1
  42. package/lib/components/Chat/TypeIndicator.d.ts +2 -3
  43. package/lib/components/Chat/TypeIndicator.d.ts.map +1 -1
  44. package/lib/components/Chat/TypeIndicator.js +1 -2
  45. package/lib/components/Chat/TypeIndicator.js.map +1 -1
  46. package/lib/components/Email/ContextMenuPopover.d.ts +1 -2
  47. package/lib/components/Email/ContextMenuPopover.d.ts.map +1 -1
  48. package/lib/components/Email/ContextMenuPopover.js.map +1 -1
  49. package/lib/components/Email/Email.d.ts +2 -3
  50. package/lib/components/Email/Email.d.ts.map +1 -1
  51. package/lib/components/Email/Email.js +11 -4
  52. package/lib/components/Email/Email.js.map +1 -1
  53. package/lib/components/Email/Email.styles.d.ts +4 -4
  54. package/lib/components/Email/Email.styles.d.ts.map +1 -1
  55. package/lib/components/Email/Email.styles.js +6 -3
  56. package/lib/components/Email/Email.styles.js.map +1 -1
  57. package/lib/components/Email/Email.types.d.ts +16 -17
  58. package/lib/components/Email/Email.types.d.ts.map +1 -1
  59. package/lib/components/Email/Email.types.js.map +1 -1
  60. package/lib/components/Email/EmailCaseView.js +1 -1
  61. package/lib/components/Email/EmailCaseView.js.map +1 -1
  62. package/lib/components/Email/EmailComposer.d.ts +3 -4
  63. package/lib/components/Email/EmailComposer.d.ts.map +1 -1
  64. package/lib/components/Email/EmailComposer.js +29 -8
  65. package/lib/components/Email/EmailComposer.js.map +1 -1
  66. package/lib/components/Email/EmailConversation.d.ts +6 -7
  67. package/lib/components/Email/EmailConversation.d.ts.map +1 -1
  68. package/lib/components/Email/EmailConversation.js +2 -2
  69. package/lib/components/Email/EmailConversation.js.map +1 -1
  70. package/lib/components/Email/EmailEntity.d.ts +2 -3
  71. package/lib/components/Email/EmailEntity.d.ts.map +1 -1
  72. package/lib/components/Email/EmailEntity.js.map +1 -1
  73. package/lib/components/Email/EmailSelector.d.ts +6 -2
  74. package/lib/components/Email/EmailSelector.d.ts.map +1 -1
  75. package/lib/components/Email/EmailSelector.js +25 -29
  76. package/lib/components/Email/EmailSelector.js.map +1 -1
  77. package/lib/components/Email/EmailShell.d.ts +2 -3
  78. package/lib/components/Email/EmailShell.d.ts.map +1 -1
  79. package/lib/components/Email/EmailShell.js +1 -1
  80. package/lib/components/Email/EmailShell.js.map +1 -1
  81. package/lib/components/Email/EmailSummaryItem.d.ts +3 -7
  82. package/lib/components/Email/EmailSummaryItem.d.ts.map +1 -1
  83. package/lib/components/Email/EmailSummaryItem.js +26 -26
  84. package/lib/components/Email/EmailSummaryItem.js.map +1 -1
  85. package/lib/components/Email/EmailSummaryList.d.ts +2 -3
  86. package/lib/components/Email/EmailSummaryList.d.ts.map +1 -1
  87. package/lib/components/Email/EmailSummaryList.js +17 -9
  88. package/lib/components/Email/EmailSummaryList.js.map +1 -1
  89. package/lib/components/Email/EntityList.d.ts +1 -3
  90. package/lib/components/Email/EntityList.d.ts.map +1 -1
  91. package/lib/components/Email/EntityList.js.map +1 -1
  92. package/lib/components/Email/utils/EntityHighlighter.d.ts.map +1 -1
  93. package/lib/components/Email/utils/EntityHighlighter.js +3 -5
  94. package/lib/components/Email/utils/EntityHighlighter.js.map +1 -1
  95. package/lib/components/Feed/Feed.context.d.ts +4 -49
  96. package/lib/components/Feed/Feed.context.d.ts.map +1 -1
  97. package/lib/components/Feed/Feed.context.js +1 -5
  98. package/lib/components/Feed/Feed.context.js.map +1 -1
  99. package/lib/components/Feed/Feed.d.ts +1 -3
  100. package/lib/components/Feed/Feed.d.ts.map +1 -1
  101. package/lib/components/Feed/Feed.js +15 -23
  102. package/lib/components/Feed/Feed.js.map +1 -1
  103. package/lib/components/Feed/Feed.types.d.ts +190 -252
  104. package/lib/components/Feed/Feed.types.d.ts.map +1 -1
  105. package/lib/components/Feed/Feed.types.js.map +1 -1
  106. package/lib/components/Feed/FeedAttachments.d.ts +2 -3
  107. package/lib/components/Feed/FeedAttachments.d.ts.map +1 -1
  108. package/lib/components/Feed/FeedAttachments.js +12 -19
  109. package/lib/components/Feed/FeedAttachments.js.map +1 -1
  110. package/lib/components/Feed/FeedContent.d.ts +2 -3
  111. package/lib/components/Feed/FeedContent.d.ts.map +1 -1
  112. package/lib/components/Feed/FeedContent.js +5 -43
  113. package/lib/components/Feed/FeedContent.js.map +1 -1
  114. package/lib/components/Feed/FeedContentFooter.d.ts.map +1 -1
  115. package/lib/components/Feed/FeedContentFooter.js +2 -15
  116. package/lib/components/Feed/FeedContentFooter.js.map +1 -1
  117. package/lib/components/Feed/FeedContentHeader.d.ts.map +1 -1
  118. package/lib/components/Feed/FeedContentHeader.js +76 -44
  119. package/lib/components/Feed/FeedContentHeader.js.map +1 -1
  120. package/lib/components/Feed/FeedCustomEditRegion.d.ts +6 -0
  121. package/lib/components/Feed/FeedCustomEditRegion.d.ts.map +1 -0
  122. package/lib/components/Feed/FeedCustomEditRegion.js +20 -0
  123. package/lib/components/Feed/FeedCustomEditRegion.js.map +1 -0
  124. package/lib/components/Feed/FeedCustomInputRegion.d.ts +6 -0
  125. package/lib/components/Feed/FeedCustomInputRegion.d.ts.map +1 -0
  126. package/lib/components/Feed/FeedCustomInputRegion.js +38 -0
  127. package/lib/components/Feed/FeedCustomInputRegion.js.map +1 -0
  128. package/lib/components/Feed/FeedEditRegion.d.ts +1 -2
  129. package/lib/components/Feed/FeedEditRegion.d.ts.map +1 -1
  130. package/lib/components/Feed/FeedEditRegion.js +41 -14
  131. package/lib/components/Feed/FeedEditRegion.js.map +1 -1
  132. package/lib/components/Feed/FeedInputRegion.d.ts +0 -1
  133. package/lib/components/Feed/FeedInputRegion.d.ts.map +1 -1
  134. package/lib/components/Feed/FeedInputRegion.js +53 -40
  135. package/lib/components/Feed/FeedInputRegion.js.map +1 -1
  136. package/lib/components/Feed/FeedLikeButton.d.ts +2 -2
  137. package/lib/components/Feed/FeedLikeButton.d.ts.map +1 -1
  138. package/lib/components/Feed/FeedLikeButton.js +5 -5
  139. package/lib/components/Feed/FeedLikeButton.js.map +1 -1
  140. package/lib/components/Feed/FeedModalList.d.ts.map +1 -1
  141. package/lib/components/Feed/FeedModalList.js +6 -7
  142. package/lib/components/Feed/FeedModalList.js.map +1 -1
  143. package/lib/components/Feed/FeedNewPost.d.ts +1 -2
  144. package/lib/components/Feed/FeedNewPost.d.ts.map +1 -1
  145. package/lib/components/Feed/FeedNewPost.js +44 -14
  146. package/lib/components/Feed/FeedNewPost.js.map +1 -1
  147. package/lib/components/Feed/FeedPost.d.ts +2 -3
  148. package/lib/components/Feed/FeedPost.d.ts.map +1 -1
  149. package/lib/components/Feed/FeedPost.js +50 -28
  150. package/lib/components/Feed/FeedPost.js.map +1 -1
  151. package/lib/components/Feed/FeedReply.d.ts +1 -2
  152. package/lib/components/Feed/FeedReply.d.ts.map +1 -1
  153. package/lib/components/Feed/FeedReply.js +24 -5
  154. package/lib/components/Feed/FeedReply.js.map +1 -1
  155. package/lib/components/Feed/FeedReplyInput.d.ts +1 -2
  156. package/lib/components/Feed/FeedReplyInput.d.ts.map +1 -1
  157. package/lib/components/Feed/FeedReplyInput.js +4 -5
  158. package/lib/components/Feed/FeedReplyInput.js.map +1 -1
  159. package/lib/components/Feed/FeedRichText.d.ts +3 -3
  160. package/lib/components/Feed/FeedRichText.d.ts.map +1 -1
  161. package/lib/components/Feed/FeedRichText.js +16 -8
  162. package/lib/components/Feed/FeedRichText.js.map +1 -1
  163. package/lib/components/Feed/FeedRichTextViewer.d.ts +10 -0
  164. package/lib/components/Feed/FeedRichTextViewer.d.ts.map +1 -0
  165. package/lib/components/Feed/FeedRichTextViewer.js +38 -0
  166. package/lib/components/Feed/FeedRichTextViewer.js.map +1 -0
  167. package/lib/components/Feed/FeedVisibilityControls.d.ts +4 -0
  168. package/lib/components/Feed/FeedVisibilityControls.d.ts.map +1 -0
  169. package/lib/components/Feed/FeedVisibilityControls.js +62 -0
  170. package/lib/components/Feed/FeedVisibilityControls.js.map +1 -0
  171. package/lib/components/Feed/MarkdownSyntax.d.ts +3 -0
  172. package/lib/components/Feed/MarkdownSyntax.d.ts.map +1 -0
  173. package/lib/components/Feed/MarkdownSyntax.js +66 -0
  174. package/lib/components/Feed/MarkdownSyntax.js.map +1 -0
  175. package/lib/components/Feed/index.d.ts +3 -1
  176. package/lib/components/Feed/index.d.ts.map +1 -1
  177. package/lib/components/Feed/index.js +2 -0
  178. package/lib/components/Feed/index.js.map +1 -1
  179. package/lib/components/HashtagButton/HashtagButton.js +2 -2
  180. package/lib/components/HashtagButton/HashtagButton.js.map +1 -1
  181. package/lib/components/MentionButton/MentionButton.d.ts.map +1 -1
  182. package/lib/components/MentionButton/MentionButton.js +2 -2
  183. package/lib/components/MentionButton/MentionButton.js.map +1 -1
  184. package/lib/components/OpenGraphPreview/OpenGraphPreview.d.ts +27 -0
  185. package/lib/components/OpenGraphPreview/OpenGraphPreview.d.ts.map +1 -0
  186. package/lib/components/OpenGraphPreview/OpenGraphPreview.js +39 -0
  187. package/lib/components/OpenGraphPreview/OpenGraphPreview.js.map +1 -0
  188. package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.d.ts +13 -0
  189. package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.d.ts.map +1 -0
  190. package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.js +79 -0
  191. package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.js.map +1 -0
  192. package/lib/components/OpenGraphPreview/OpenGraphPreview.test-ids.d.ts +3 -0
  193. package/lib/components/OpenGraphPreview/OpenGraphPreview.test-ids.d.ts.map +1 -0
  194. package/lib/components/OpenGraphPreview/OpenGraphPreview.test-ids.js +4 -0
  195. package/lib/components/OpenGraphPreview/OpenGraphPreview.test-ids.js.map +1 -0
  196. package/lib/components/OpenGraphPreview/index.d.ts +3 -0
  197. package/lib/components/OpenGraphPreview/index.d.ts.map +1 -0
  198. package/lib/components/OpenGraphPreview/index.js +2 -0
  199. package/lib/components/OpenGraphPreview/index.js.map +1 -0
  200. package/lib/index.d.ts +2 -0
  201. package/lib/index.d.ts.map +1 -1
  202. package/lib/index.js +2 -0
  203. package/lib/index.js.map +1 -1
  204. package/package.json +10 -10
  205. package/lib/components/Feed/FeedAnnouncer.d.ts +0 -6
  206. package/lib/components/Feed/FeedAnnouncer.d.ts.map +0 -1
  207. package/lib/components/Feed/FeedAnnouncer.js +0 -11
  208. package/lib/components/Feed/FeedAnnouncer.js.map +0 -1
  209. package/lib/components/Feed/FeedNewPostTypeMenu.d.ts +0 -5
  210. package/lib/components/Feed/FeedNewPostTypeMenu.d.ts.map +0 -1
  211. package/lib/components/Feed/FeedNewPostTypeMenu.js +0 -375
  212. package/lib/components/Feed/FeedNewPostTypeMenu.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { parse, serialize } from 'parse5';
2
+ import { escapeRegExp } from '@pega/cosmos-react-core';
2
3
  const isParentNode = (node) => !!node &&
3
4
  node.nodeName !== '#text' &&
4
5
  node.nodeName !== '#comment' &&
@@ -118,11 +119,8 @@ const highlightEntitiesInTextNode = (textNode, entityMapping) => {
118
119
  const matches = [];
119
120
  // Find all matches
120
121
  entityMapping?.forEach(mapping => {
121
- const escapedValue = mapping.value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
122
- // TODO - look-behind is not supported in safari at this point
123
- // So we miss the use case of matching entities staring with non word characters like .5
124
- // The best regex for webkit browsers is (?<=\\W|^)${escapedValue}(?=(\\W|$))
125
- const regExp = new RegExp(`\\b${escapedValue}(?=(\\W|$))`, 'ig');
122
+ const escapedValue = escapeRegExp(mapping.value);
123
+ const regExp = new RegExp(`(?<=\\W|^)${escapedValue}(?=(\\W|$))`, 'ig');
126
124
  let res;
127
125
  // eslint-disable-next-line no-cond-assign
128
126
  while ((res = regExp.exec(textNode.value)) !== null) {
@@ -1 +1 @@
1
- {"version":3,"file":"EntityHighlighter.js","sourceRoot":"","sources":["../../../../src/components/Email/utils/EntityHighlighter.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse, serialize } from 'parse5';\nimport type { TextNode, Element, Node, ParentNode, Document } from 'parse5';\n\nimport type { EmailProps, EntityMatch, MatchRange } from '../Email.types';\n\nconst isParentNode = (node: Node | undefined): node is ParentNode =>\n !!node &&\n node.nodeName !== '#text' &&\n node.nodeName !== '#comment' &&\n node.nodeName !== '#documentType';\n\n/**\n * Function to check if there is nesting in the given ranges\n * @param {MatchRange} range1\n * @param {MatchRange} range2\n * @returns {boolean}\n */\nconst isNesting = (range1: MatchRange, range2: MatchRange): boolean => {\n return (\n (range1.start >= range2.start && range1.end <= range2.end) ||\n (range2.start >= range1.start && range2.end <= range1.end)\n );\n};\n\n/**\n * Function to check if there is an intersection in the ranges\n * @param {MatchRange} range1\n * @param {MatchRange} range2\n * @returns {boolean}\n */\nconst isIntersecting = (range1: MatchRange, range2: MatchRange): boolean => {\n return (\n (range1.start > range2.start && range1.start <= range2.end && range1.end > range2.end) ||\n (range2.start > range1.start && range2.start <= range1.end && range2.end > range1.end)\n );\n};\n\n/**\n * Callback function to sort ranges\n * @param {MatchRange} range1\n * @param {MatchRange} range2\n * @returns {number}\n */\nconst matchSorter = (range1: MatchRange, range2: MatchRange): number => {\n if (range1.start === range2.start) {\n return range2.end - range1.end;\n }\n\n return range1.start - range2.start;\n};\n\n/**\n * Recursive function to generate nested matches structure by inserting it at the right place\n * @param {EntityMatch} match\n * @param {EntityMatch[]} nestedMatches\n * @returns {EntityMatch[]}\n */\nconst insertIntoNestedMatches: (\n match: EntityMatch,\n nestedMatches: EntityMatch[]\n) => EntityMatch[] = (match: EntityMatch, nestedMatches: EntityMatch[]): EntityMatch[] => {\n const updatedNestedMatches = [...nestedMatches];\n let isInserted = false;\n\n for (let index = 0; index < nestedMatches.length; index += 1) {\n const matchInArr = nestedMatches[index];\n\n if (isNesting(match, matchInArr)) {\n if (match.end - match.start <= matchInArr.end - matchInArr.start) {\n // The range of existing match in array is either larger or equal, so new match can be a child.\n if (matchInArr.children && matchInArr.children.length > 0) {\n // Recursive call\n const updatedChildren = insertIntoNestedMatches(match, matchInArr.children);\n // Update matchInArr in the newOverlapsArray\n matchInArr.children = updatedChildren;\n } else {\n matchInArr.children = [match];\n }\n updatedNestedMatches.splice(index, 1, matchInArr);\n isInserted = true;\n break;\n } else {\n // Replace the existing match and make it the child of current match\n updatedNestedMatches.splice(index, 1, { ...match, children: [matchInArr] });\n isInserted = true;\n break;\n }\n }\n\n if (isIntersecting(match, matchInArr)) {\n // Intersection\n // We are only keeping the first match and discarding the following match\n if (match.start < matchInArr.start) {\n updatedNestedMatches.splice(index, 1, match);\n isInserted = true;\n } else {\n isInserted = true;\n }\n break;\n }\n }\n\n if (!isInserted) {\n // Not nesting or intersecting\n updatedNestedMatches.push(match);\n }\n\n return updatedNestedMatches;\n};\n\nconst getConsolidatedDescription = (match: EntityMatch) => {\n const consolidatedDescription: { [name: string]: Set<string> } = {};\n\n match.names?.forEach(name => {\n if (!consolidatedDescription[name]) {\n consolidatedDescription[name] = new Set();\n }\n consolidatedDescription[name].add(match.matchedText);\n });\n\n if (match.children && match.children.length > 0) {\n match.children.forEach(nestedMatch => {\n const nestMatchDesc = getConsolidatedDescription(nestedMatch);\n Object.keys(nestMatchDesc).forEach(key => {\n if (consolidatedDescription[key]) {\n consolidatedDescription[key] = new Set([\n ...consolidatedDescription[key],\n ...nestMatchDesc[key]\n ]);\n } else {\n consolidatedDescription[key] = nestMatchDesc[key];\n }\n });\n });\n }\n\n return consolidatedDescription;\n};\n\nconst highlightEntitiesInTextNode = (\n textNode: TextNode,\n entityMapping: EmailProps['entityHighlightMapping']\n) => {\n const matches: EntityMatch[] = [];\n // Find all matches\n entityMapping?.forEach(mapping => {\n const escapedValue = mapping.value.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n // TODO - look-behind is not supported in safari at this point\n // So we miss the use case of matching entities staring with non word characters like .5\n // The best regex for webkit browsers is (?<=\\\\W|^)${escapedValue}(?=(\\\\W|$))\n const regExp = new RegExp(`\\\\b${escapedValue}(?=(\\\\W|$))`, 'ig');\n let res;\n // eslint-disable-next-line no-cond-assign\n while ((res = regExp.exec(textNode.value)) !== null) {\n matches.push({\n start: res.index,\n end: res.index + res[0].length,\n matchedText: res[0],\n ...mapping\n });\n }\n });\n\n if (matches.length === 0) {\n // Early exit as there are no matches\n const newSpanNode: Element = {\n nodeName: 'span',\n tagName: 'span',\n parentNode: textNode.parentNode,\n attrs: [],\n namespaceURI: '',\n childNodes: []\n };\n newSpanNode.childNodes.push(textNode);\n return newSpanNode;\n }\n\n matches.sort(matchSorter);\n\n // Handle nesting and intersections\n let nestedMatches: EntityMatch[] = [];\n matches.forEach(match => {\n nestedMatches = insertIntoNestedMatches(match, nestedMatches);\n });\n\n // Wrap matched ranges\n let lastIndex = 0;\n const updatedNodes: Node[] = [];\n nestedMatches.sort(matchSorter);\n nestedMatches.forEach(match => {\n if (match.start !== lastIndex) {\n const newSpanNode: Element = {\n nodeName: 'span',\n tagName: 'span',\n parentNode: textNode.parentNode,\n attrs: [],\n namespaceURI: '',\n childNodes: []\n };\n\n newSpanNode.childNodes.push({\n ...textNode,\n nodeName: '#text',\n value: textNode.value.substring(lastIndex, match.start),\n parentNode: newSpanNode\n });\n\n updatedNodes.push(newSpanNode);\n }\n\n const consolidatedDescription = getConsolidatedDescription(match);\n let consolidatedDescriptionArray;\n if (Object.entries(consolidatedDescription).length === 1) {\n consolidatedDescriptionArray = [`${Object.keys(consolidatedDescription)[0]}`];\n } else {\n consolidatedDescriptionArray = Object.entries(consolidatedDescription).map(([key, value]) => {\n return `${key}: ${[...value].join(', ')}`;\n });\n }\n\n const newMarkNode: Element = {\n nodeName: 'pega-email-entity',\n tagName: 'pega-email-entity',\n parentNode: textNode.parentNode,\n attrs: [\n { name: 'data-variant', value: `${match.variant}` },\n { name: 'data-entity-type', value: match.type },\n { name: 'data-description', value: JSON.stringify(consolidatedDescriptionArray) }\n ],\n namespaceURI: '',\n childNodes: []\n };\n\n newMarkNode.childNodes.push({\n nodeName: '#text',\n value: match.matchedText,\n parentNode: newMarkNode\n });\n\n updatedNodes.push(newMarkNode);\n\n lastIndex = match.end;\n });\n\n if (lastIndex !== textNode.value.length) {\n const newSpanNode: Element = {\n nodeName: 'span',\n tagName: 'span',\n parentNode: textNode.parentNode,\n attrs: [],\n namespaceURI: '',\n childNodes: []\n };\n\n newSpanNode.childNodes.push({\n ...textNode,\n nodeName: '#text',\n value: textNode.value.substring(lastIndex),\n parentNode: newSpanNode\n } as TextNode);\n\n updatedNodes.push(newSpanNode);\n }\n\n return updatedNodes;\n};\n\nconst highlightEntitiesInNode = (\n node: Node,\n entityMapping: EmailProps['entityHighlightMapping']\n) => {\n // Either call self recursively or call mark entities in text\n if (isParentNode(node) && node.childNodes?.length > 0) {\n // Iteratively mark entities to all child nodes\n let newChildNodes: Node[] = [];\n node.childNodes.forEach(childNode => {\n const res = highlightEntitiesInNode(childNode, entityMapping);\n if (Array.isArray(res)) {\n newChildNodes = [...newChildNodes, ...res];\n } else {\n newChildNodes.push(res as Node);\n }\n });\n return { ...node, childNodes: newChildNodes };\n }\n\n if (node.nodeName === '#text') {\n return highlightEntitiesInTextNode(node as TextNode, entityMapping);\n }\n\n return node;\n};\n\n/**\n * Function to highlight entities in a given html\n * @param {string} html\n * @param {EmailProps['entityHighlightMapping']} entityMapping\n * @returns {string}\n */\nconst highlightEntities = (\n html: string,\n entityMapping: EmailProps['entityHighlightMapping']\n): string => {\n const document: Document = parse(html);\n\n const markedDocument = highlightEntitiesInNode(document, entityMapping);\n\n return serialize(markedDocument as Document);\n};\n\nexport default highlightEntities;\n"]}
1
+ {"version":3,"file":"EntityHighlighter.js","sourceRoot":"","sources":["../../../../src/components/Email/utils/EntityHighlighter.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse, serialize } from 'parse5';\nimport type { TextNode, Element, Node, ParentNode, Document } from 'parse5';\n\nimport { escapeRegExp } from '@pega/cosmos-react-core';\n\nimport type { EmailProps, EntityMatch, MatchRange } from '../Email.types';\n\nconst isParentNode = (node: Node | undefined): node is ParentNode =>\n !!node &&\n node.nodeName !== '#text' &&\n node.nodeName !== '#comment' &&\n node.nodeName !== '#documentType';\n\n/**\n * Function to check if there is nesting in the given ranges\n * @param {MatchRange} range1\n * @param {MatchRange} range2\n * @returns {boolean}\n */\nconst isNesting = (range1: MatchRange, range2: MatchRange): boolean => {\n return (\n (range1.start >= range2.start && range1.end <= range2.end) ||\n (range2.start >= range1.start && range2.end <= range1.end)\n );\n};\n\n/**\n * Function to check if there is an intersection in the ranges\n * @param {MatchRange} range1\n * @param {MatchRange} range2\n * @returns {boolean}\n */\nconst isIntersecting = (range1: MatchRange, range2: MatchRange): boolean => {\n return (\n (range1.start > range2.start && range1.start <= range2.end && range1.end > range2.end) ||\n (range2.start > range1.start && range2.start <= range1.end && range2.end > range1.end)\n );\n};\n\n/**\n * Callback function to sort ranges\n * @param {MatchRange} range1\n * @param {MatchRange} range2\n * @returns {number}\n */\nconst matchSorter = (range1: MatchRange, range2: MatchRange): number => {\n if (range1.start === range2.start) {\n return range2.end - range1.end;\n }\n\n return range1.start - range2.start;\n};\n\n/**\n * Recursive function to generate nested matches structure by inserting it at the right place\n * @param {EntityMatch} match\n * @param {EntityMatch[]} nestedMatches\n * @returns {EntityMatch[]}\n */\nconst insertIntoNestedMatches: (\n match: EntityMatch,\n nestedMatches: EntityMatch[]\n) => EntityMatch[] = (match: EntityMatch, nestedMatches: EntityMatch[]): EntityMatch[] => {\n const updatedNestedMatches = [...nestedMatches];\n let isInserted = false;\n\n for (let index = 0; index < nestedMatches.length; index += 1) {\n const matchInArr = nestedMatches[index];\n\n if (isNesting(match, matchInArr)) {\n if (match.end - match.start <= matchInArr.end - matchInArr.start) {\n // The range of existing match in array is either larger or equal, so new match can be a child.\n if (matchInArr.children && matchInArr.children.length > 0) {\n // Recursive call\n const updatedChildren = insertIntoNestedMatches(match, matchInArr.children);\n // Update matchInArr in the newOverlapsArray\n matchInArr.children = updatedChildren;\n } else {\n matchInArr.children = [match];\n }\n updatedNestedMatches.splice(index, 1, matchInArr);\n isInserted = true;\n break;\n } else {\n // Replace the existing match and make it the child of current match\n updatedNestedMatches.splice(index, 1, { ...match, children: [matchInArr] });\n isInserted = true;\n break;\n }\n }\n\n if (isIntersecting(match, matchInArr)) {\n // Intersection\n // We are only keeping the first match and discarding the following match\n if (match.start < matchInArr.start) {\n updatedNestedMatches.splice(index, 1, match);\n isInserted = true;\n } else {\n isInserted = true;\n }\n break;\n }\n }\n\n if (!isInserted) {\n // Not nesting or intersecting\n updatedNestedMatches.push(match);\n }\n\n return updatedNestedMatches;\n};\n\nconst getConsolidatedDescription = (match: EntityMatch) => {\n const consolidatedDescription: { [name: string]: Set<string> } = {};\n\n match.names?.forEach(name => {\n if (!consolidatedDescription[name]) {\n consolidatedDescription[name] = new Set();\n }\n consolidatedDescription[name].add(match.matchedText);\n });\n\n if (match.children && match.children.length > 0) {\n match.children.forEach(nestedMatch => {\n const nestMatchDesc = getConsolidatedDescription(nestedMatch);\n Object.keys(nestMatchDesc).forEach(key => {\n if (consolidatedDescription[key]) {\n consolidatedDescription[key] = new Set([\n ...consolidatedDescription[key],\n ...nestMatchDesc[key]\n ]);\n } else {\n consolidatedDescription[key] = nestMatchDesc[key];\n }\n });\n });\n }\n\n return consolidatedDescription;\n};\n\nconst highlightEntitiesInTextNode = (\n textNode: TextNode,\n entityMapping: EmailProps['entityHighlightMapping']\n) => {\n const matches: EntityMatch[] = [];\n // Find all matches\n entityMapping?.forEach(mapping => {\n const escapedValue = escapeRegExp(mapping.value);\n const regExp = new RegExp(`(?<=\\\\W|^)${escapedValue}(?=(\\\\W|$))`, 'ig');\n let res;\n // eslint-disable-next-line no-cond-assign\n while ((res = regExp.exec(textNode.value)) !== null) {\n matches.push({\n start: res.index,\n end: res.index + res[0].length,\n matchedText: res[0],\n ...mapping\n });\n }\n });\n\n if (matches.length === 0) {\n // Early exit as there are no matches\n const newSpanNode: Element = {\n nodeName: 'span',\n tagName: 'span',\n parentNode: textNode.parentNode,\n attrs: [],\n namespaceURI: '',\n childNodes: []\n };\n newSpanNode.childNodes.push(textNode);\n return newSpanNode;\n }\n\n matches.sort(matchSorter);\n\n // Handle nesting and intersections\n let nestedMatches: EntityMatch[] = [];\n matches.forEach(match => {\n nestedMatches = insertIntoNestedMatches(match, nestedMatches);\n });\n\n // Wrap matched ranges\n let lastIndex = 0;\n const updatedNodes: Node[] = [];\n nestedMatches.sort(matchSorter);\n nestedMatches.forEach(match => {\n if (match.start !== lastIndex) {\n const newSpanNode: Element = {\n nodeName: 'span',\n tagName: 'span',\n parentNode: textNode.parentNode,\n attrs: [],\n namespaceURI: '',\n childNodes: []\n };\n\n newSpanNode.childNodes.push({\n ...textNode,\n nodeName: '#text',\n value: textNode.value.substring(lastIndex, match.start),\n parentNode: newSpanNode\n });\n\n updatedNodes.push(newSpanNode);\n }\n\n const consolidatedDescription = getConsolidatedDescription(match);\n let consolidatedDescriptionArray;\n if (Object.entries(consolidatedDescription).length === 1) {\n consolidatedDescriptionArray = [`${Object.keys(consolidatedDescription)[0]}`];\n } else {\n consolidatedDescriptionArray = Object.entries(consolidatedDescription).map(([key, value]) => {\n return `${key}: ${[...value].join(', ')}`;\n });\n }\n\n const newMarkNode: Element = {\n nodeName: 'pega-email-entity',\n tagName: 'pega-email-entity',\n parentNode: textNode.parentNode,\n attrs: [\n { name: 'data-variant', value: `${match.variant}` },\n { name: 'data-entity-type', value: match.type },\n { name: 'data-description', value: JSON.stringify(consolidatedDescriptionArray) }\n ],\n namespaceURI: '',\n childNodes: []\n };\n\n newMarkNode.childNodes.push({\n nodeName: '#text',\n value: match.matchedText,\n parentNode: newMarkNode\n });\n\n updatedNodes.push(newMarkNode);\n\n lastIndex = match.end;\n });\n\n if (lastIndex !== textNode.value.length) {\n const newSpanNode: Element = {\n nodeName: 'span',\n tagName: 'span',\n parentNode: textNode.parentNode,\n attrs: [],\n namespaceURI: '',\n childNodes: []\n };\n\n newSpanNode.childNodes.push({\n ...textNode,\n nodeName: '#text',\n value: textNode.value.substring(lastIndex),\n parentNode: newSpanNode\n } as TextNode);\n\n updatedNodes.push(newSpanNode);\n }\n\n return updatedNodes;\n};\n\nconst highlightEntitiesInNode = (\n node: Node,\n entityMapping: EmailProps['entityHighlightMapping']\n) => {\n // Either call self recursively or call mark entities in text\n if (isParentNode(node) && node.childNodes?.length > 0) {\n // Iteratively mark entities to all child nodes\n let newChildNodes: Node[] = [];\n node.childNodes.forEach(childNode => {\n const res = highlightEntitiesInNode(childNode, entityMapping);\n if (Array.isArray(res)) {\n newChildNodes = [...newChildNodes, ...res];\n } else {\n newChildNodes.push(res as Node);\n }\n });\n return { ...node, childNodes: newChildNodes };\n }\n\n if (node.nodeName === '#text') {\n return highlightEntitiesInTextNode(node as TextNode, entityMapping);\n }\n\n return node;\n};\n\n/**\n * Function to highlight entities in a given html\n * @param {string} html\n * @param {EmailProps['entityHighlightMapping']} entityMapping\n * @returns {string}\n */\nconst highlightEntities = (\n html: string,\n entityMapping: EmailProps['entityHighlightMapping']\n): string => {\n const document: Document = parse(html);\n\n const markedDocument = highlightEntitiesInNode(document, entityMapping);\n\n return serialize(markedDocument as Document);\n};\n\nexport default highlightEntities;\n"]}
@@ -1,56 +1,11 @@
1
1
  import type { Dispatch, RefObject, SetStateAction } from 'react';
2
- import type { InteractionRenderers, MDMap } from '@pega/cosmos-react-rte';
3
- import type { AvatarProps, MenuItemProps } from '@pega/cosmos-react-core';
4
- import type { BaseDialogProps } from '@pega/cosmos-react-core/lib/components/Dialog/Dialog.types';
5
- export interface FeedContextValue {
6
- searchTypes?: string[];
7
- onSearch?: (e: {
8
- type: 'mention' | 'tag';
9
- search: string;
10
- mentionType: string;
11
- }) => void;
12
- searchResults?: MenuItemProps[];
2
+ import type { AutopilotInfo, FeedProps } from './Feed.types';
3
+ export interface FeedContextValue extends Pick<FeedProps, 'searchTypes' | 'searchResults' | 'userInfo' | 'interactionRenderers' | 'markdownMap' | 'onAutopilotClick' | 'onMentionClick' | 'onMentionPreview' | 'onTagClick' | 'onLinkRender'> {
4
+ autopilotInfo: AutopilotInfo;
5
+ onSearch?: FeedProps['onDecoratorSearch'];
13
6
  showSearchResults?: boolean;
14
7
  setShowSearchResults?: Dispatch<SetStateAction<boolean>>;
15
- autopilotInfo: {
16
- id: string;
17
- label: string;
18
- meta?: string;
19
- description?: string;
20
- };
21
- onAutopilotClick?: (e: {
22
- target?: BaseDialogProps['target'];
23
- onDismiss?: () => void;
24
- }) => JSX.Element | undefined;
25
- onMentionClick?: (e: {
26
- id: string;
27
- text: string;
28
- type: string;
29
- target?: BaseDialogProps['target'];
30
- closeGlimpse?: () => void;
31
- }) => JSX.Element | undefined;
32
- onMentionPreview?: (e: {
33
- id: string;
34
- text: string;
35
- type: string;
36
- }) => void;
37
- onTagClick?: (tag: string) => void;
38
- interactionRenderers?: InteractionRenderers[];
39
- markdownMap?: MDMap;
40
- userInfo: {
41
- username: string;
42
- fullname: string;
43
- avatarSrc?: string;
44
- userStatus?: AvatarProps['status'];
45
- meta?: string[];
46
- timeZone?: string;
47
- };
48
- announce: (announcement: string) => ReturnType<typeof setTimeout>;
49
8
  feedRef?: RefObject<HTMLDivElement>;
50
9
  }
51
10
  export declare const FeedContext: import("react").Context<FeedContextValue>;
52
- export interface FeedReplyContextValue {
53
- onShowReplyInput?: () => void;
54
- }
55
- export declare const FeedReplyContext: import("react").Context<FeedReplyContextValue>;
56
11
  //# sourceMappingURL=Feed.context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.context.d.ts","sourceRoot":"","sources":["../../../src/components/Feed/Feed.context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4DAA4D,CAAC;AAElG,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACzF,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,aAAa,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE;QACrB,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;KACxB,KAAK,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;KAC3B,KAAK,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;IAC9B,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3E,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAClE,OAAO,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CACrC;AAED,eAAO,MAAM,WAAW,2CAUtB,CAAC;AAEH,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,eAAO,MAAM,gBAAgB,gDAA2C,CAAC"}
1
+ {"version":3,"file":"Feed.context.d.ts","sourceRoot":"","sources":["../../../src/components/Feed/Feed.context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,WAAW,gBACf,SAAQ,IAAI,CACV,SAAS,EACP,aAAa,GACb,eAAe,GACf,UAAU,GACV,sBAAsB,GACtB,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,GACZ,cAAc,CACjB;IACD,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC1C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CACrC;AAED,eAAO,MAAM,WAAW,2CAOtB,CAAC"}
@@ -5,10 +5,6 @@ export const FeedContext = createContext({
5
5
  id: 'autopilot',
6
6
  label: 'Autopilot'
7
7
  },
8
- userInfo: { username: '', fullname: '' },
9
- announce: () => {
10
- return -1;
11
- }
8
+ userInfo: { username: '', fullname: '' }
12
9
  });
13
- export const FeedReplyContext = createContext({});
14
10
  //# sourceMappingURL=Feed.context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.context.js","sourceRoot":"","sources":["../../../src/components/Feed/Feed.context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AA8CtC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAmB;IACzD,WAAW,EAAE,EAAE;IACf,aAAa,EAAE;QACb,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;KACnB;IACD,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IACxC,QAAQ,EAAE,GAAG,EAAE;QACb,OAAO,CAAC,CAAwD,CAAC;IACnE,CAAC;CACF,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAwB,EAAE,CAAC,CAAC","sourcesContent":["import { createContext } from 'react';\nimport type { Dispatch, RefObject, SetStateAction } from 'react';\n\nimport type { InteractionRenderers, MDMap } from '@pega/cosmos-react-rte';\nimport type { AvatarProps, MenuItemProps } from '@pega/cosmos-react-core';\nimport type { BaseDialogProps } from '@pega/cosmos-react-core/lib/components/Dialog/Dialog.types';\n\nexport interface FeedContextValue {\n searchTypes?: string[];\n onSearch?: (e: { type: 'mention' | 'tag'; search: string; mentionType: string }) => void;\n searchResults?: MenuItemProps[];\n showSearchResults?: boolean;\n setShowSearchResults?: Dispatch<SetStateAction<boolean>>;\n autopilotInfo: {\n id: string;\n label: string;\n meta?: string;\n description?: string;\n };\n onAutopilotClick?: (e: {\n target?: BaseDialogProps['target'];\n onDismiss?: () => void;\n }) => JSX.Element | undefined;\n onMentionClick?: (e: {\n id: string;\n text: string;\n type: string;\n target?: BaseDialogProps['target'];\n closeGlimpse?: () => void;\n }) => JSX.Element | undefined;\n onMentionPreview?: (e: { id: string; text: string; type: string }) => void;\n onTagClick?: (tag: string) => void;\n interactionRenderers?: InteractionRenderers[];\n markdownMap?: MDMap;\n userInfo: {\n username: string;\n fullname: string;\n avatarSrc?: string;\n userStatus?: AvatarProps['status'];\n meta?: string[];\n timeZone?: string;\n };\n announce: (announcement: string) => ReturnType<typeof setTimeout>;\n feedRef?: RefObject<HTMLDivElement>;\n}\n\nexport const FeedContext = createContext<FeedContextValue>({\n searchTypes: [],\n autopilotInfo: {\n id: 'autopilot',\n label: 'Autopilot'\n },\n userInfo: { username: '', fullname: '' },\n announce: () => {\n return -1 as unknown as ReturnType<FeedContextValue['announce']>;\n }\n});\n\nexport interface FeedReplyContextValue {\n onShowReplyInput?: () => void;\n}\n\nexport const FeedReplyContext = createContext<FeedReplyContextValue>({});\n"]}
1
+ {"version":3,"file":"Feed.context.js","sourceRoot":"","sources":["../../../src/components/Feed/Feed.context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AA0BtC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAmB;IACzD,WAAW,EAAE,EAAE;IACf,aAAa,EAAE;QACb,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;KACnB;IACD,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;CACzC,CAAC,CAAC","sourcesContent":["import { createContext } from 'react';\nimport type { Dispatch, RefObject, SetStateAction } from 'react';\n\nimport type { AutopilotInfo, FeedProps } from './Feed.types';\n\nexport interface FeedContextValue\n extends Pick<\n FeedProps,\n | 'searchTypes'\n | 'searchResults'\n | 'userInfo'\n | 'interactionRenderers'\n | 'markdownMap'\n | 'onAutopilotClick'\n | 'onMentionClick'\n | 'onMentionPreview'\n | 'onTagClick'\n | 'onLinkRender'\n > {\n autopilotInfo: AutopilotInfo;\n onSearch?: FeedProps['onDecoratorSearch'];\n showSearchResults?: boolean;\n setShowSearchResults?: Dispatch<SetStateAction<boolean>>;\n feedRef?: RefObject<HTMLDivElement>;\n}\n\nexport const FeedContext = createContext<FeedContextValue>({\n searchTypes: [],\n autopilotInfo: {\n id: 'autopilot',\n label: 'Autopilot'\n },\n userInfo: { username: '', fullname: '' }\n});\n"]}
@@ -1,7 +1,5 @@
1
- import type { FC } from 'react';
2
- import type { ForwardProps } from '@pega/cosmos-react-core';
3
1
  import type { FeedProps } from './Feed.types';
4
2
  export declare const StyledFilterDialog: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<Omit<import("@pega/cosmos-react-core/lib/components/Dialog/Dialog.types").DialogProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>, import("styled-components").DefaultTheme, {}, never>;
5
- declare const Feed: FC<ForwardProps & FeedProps>;
3
+ declare const Feed: import("react").ForwardRefExoticComponent<Omit<FeedProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
6
4
  export default Feed;
7
5
  //# sourceMappingURL=Feed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.d.ts","sourceRoot":"","sources":["../../../src/components/Feed/Feed.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,EAAE,EAA4C,MAAM,OAAO,CAAC;AAsBvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAgB5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAY9C,eAAO,MAAM,kBAAkB,4RAc7B,CAAC;AAyBH,QAAA,MAAM,IAAI,EAAE,EAAE,CAAC,YAAY,GAAG,SAAS,CAmNrC,CAAC;AAEH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Feed.d.ts","sourceRoot":"","sources":["../../../src/components/Feed/Feed.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAY9C,eAAO,MAAM,kBAAkB,4RAc7B,CAAC;AAyBH,QAAA,MAAM,IAAI,mHAsMT,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,15 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useRef, useEffect, useCallback, forwardRef } from 'react';
2
+ import { useState, useRef, useEffect, forwardRef } from 'react';
3
3
  import styled, { css } from 'styled-components';
4
- import { Button, Card, CardContent, CardHeader, defaultThemeProp, Flex, getFocusables, Icon, registerIcon, StyledCard, Switch, Text, Progress, usePrevious, useItemIntersection, useUID, useConsolidatedRef } from '@pega/cosmos-react-core';
5
- import { useArrows, useElement, useFocusTrap, useI18n, useOuterEvent } from '@pega/cosmos-react-core/lib/hooks';
4
+ import { Button, Card, CardContent, CardHeader, defaultThemeProp, Flex, getFocusables, Icon, registerIcon, StyledCard, Switch, Text, Progress, usePrevious, useLiveLog, useItemIntersection, useUID, useConsolidatedRef } from '@pega/cosmos-react-core';
5
+ import { useArrows, useElement, useI18n, useOuterEvent } from '@pega/cosmos-react-core/lib/hooks';
6
6
  import * as filterIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/filter.icon';
7
7
  import * as filterOnIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/filter-on.icon';
8
8
  import { StyledCardHeader } from '@pega/cosmos-react-core/lib/components/Card/CardHeader';
9
9
  import Dialog from '@pega/cosmos-react-core/lib/components/Dialog/Dialog';
10
10
  import { FeedContext } from './Feed.context';
11
11
  import FeedButton from './FeedButton';
12
- import FeedAnnouncer from './FeedAnnouncer';
13
12
  registerIcon(filterIcon, filterOnIcon);
14
13
  const StyledFeed = styled.div `
15
14
  ${StyledCardHeader}:not(${StyledCard} ${StyledCard} > ${StyledCardHeader}) {
@@ -51,10 +50,10 @@ const StyledLoadMore = styled.div(({ theme }) => {
51
50
  });
52
51
  StyledLoadMore.defaultProps = defaultThemeProp;
53
52
  const Feed = forwardRef(function Feed(props, ref) {
54
- const { loadingPosts = false, variant, children, userInfo, className, title, searchTypes, onDecoratorSearch, searchResults = [], autopilotInfo = {
53
+ const { loadingPosts = false, children, userInfo, className, title, searchTypes, onDecoratorSearch, searchResults = [], autopilotInfo = {
55
54
  id: 'autopilot',
56
55
  label: 'Autopilot'
57
- }, onAutopilotClick, onMentionClick, onMentionPreview, onTagClick, mentionContent, interactionRenderers = [], markdownMap, filters, onFilterChange, onLoadMore, newPostRegion, posts = [], ...restProps } = props;
56
+ }, onAutopilotClick, onMentionClick, onMentionPreview, onTagClick, interactionRenderers = [], markdownMap, filters, onFilterChange, onLoadMore, onLinkRender, newPostRegion, posts = [], ...restProps } = props;
58
57
  const t = useI18n();
59
58
  const dialogRef = useRef(null);
60
59
  const [buttonEl, setButtonEl] = useElement();
@@ -63,7 +62,7 @@ const Feed = forwardRef(function Feed(props, ref) {
63
62
  const [mountDialog, setMountDialog] = useState(false);
64
63
  const [showSearchResults, setShowSearchResults] = useState(false);
65
64
  const prevPosts = usePrevious(posts);
66
- const [announcementText, setAnnouncementText] = useState('');
65
+ const { announcePolite } = useLiveLog();
67
66
  const feedRef = useConsolidatedRef(ref);
68
67
  const filterRef = useRef(null);
69
68
  useArrows(filterRef);
@@ -87,27 +86,21 @@ const Feed = forwardRef(function Feed(props, ref) {
87
86
  useItemIntersection({ current: null }, posts.length - 1, () => {
88
87
  onLoadMore?.();
89
88
  }, `#${id} > article[role='none']`);
90
- const announce = useCallback((announcement) => {
91
- setAnnouncementText('');
92
- return setTimeout(() => {
93
- setAnnouncementText(announcement);
94
- }, 0);
95
- }, []);
96
89
  useEffect(() => {
97
90
  if (loadingPosts) {
98
- const timeoutId = announce(t('loading_post'));
99
- return () => clearTimeout(timeoutId);
91
+ announcePolite({ message: t('loading_post') });
100
92
  }
101
93
  }, [loadingPosts]);
102
94
  useEffect(() => {
103
95
  if (prevPosts) {
104
- let timeoutId;
105
96
  const difference = posts.length - prevPosts.length;
106
97
  if (difference < 0)
107
- announce(t('feed_post_removed'));
108
- else if (difference > 0)
109
- announce(t('feed_new_post_added', [difference], { count: difference }));
110
- return () => clearTimeout(timeoutId);
98
+ announcePolite({ message: t('feed_post_removed') });
99
+ else if (difference > 0) {
100
+ announcePolite({
101
+ message: t('feed_new_post_added', [difference], { count: difference })
102
+ });
103
+ }
111
104
  }
112
105
  }, [posts]);
113
106
  useEffect(() => {
@@ -118,7 +111,6 @@ const Feed = forwardRef(function Feed(props, ref) {
118
111
  }, 0);
119
112
  }
120
113
  }, [mountDialog]);
121
- useFocusTrap(dialogRef, true, [mountDialog]);
122
114
  return (_jsx(FeedContext.Provider
123
115
  // eslint-disable-next-line react/jsx-no-constructed-context-values
124
116
  , {
@@ -130,6 +122,7 @@ const Feed = forwardRef(function Feed(props, ref) {
130
122
  showSearchResults,
131
123
  setShowSearchResults,
132
124
  autopilotInfo,
125
+ onLinkRender,
133
126
  onAutopilotClick,
134
127
  onMentionClick,
135
128
  onMentionPreview,
@@ -137,9 +130,8 @@ const Feed = forwardRef(function Feed(props, ref) {
137
130
  interactionRenderers,
138
131
  markdownMap,
139
132
  userInfo,
140
- announce,
141
133
  feedRef
142
- }, children: _jsxs(StyledFeed, { ref: feedRef, ...restProps, children: [_jsx(FeedAnnouncer, { children: announcementText }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(Text, { variant: 'h2', children: title }), filters && filters.length > 0 && (_jsx(Button, { as: FeedButton, ref: setButtonEl, variant: 'simple', icon: true, onClick: () => setMountDialog(curr => !curr), label: t('filters'), "aria-label": `${t('filters')} - ${t('pulse')}`, "aria-expanded": !!filters && mountDialog, "aria-owns": !!filters && mountDialog && buttonEl ? dialogId : undefined, emphasized: true, children: _jsx(Icon, { name: filters?.map(filter => !!filter.on).reduce((acc, curr) => acc || curr)
134
+ }, children: _jsxs(StyledFeed, { ref: feedRef, ...restProps, children: [_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(Text, { variant: 'h2', children: title }), filters && filters.length > 0 && (_jsx(Button, { as: FeedButton, ref: setButtonEl, variant: 'simple', icon: true, onClick: () => setMountDialog(curr => !curr), label: t('filters'), "aria-label": `${t('filters')} - ${t('pulse')}`, "aria-expanded": !!filters && mountDialog, "aria-owns": !!filters && mountDialog && buttonEl ? dialogId : undefined, emphasized: true, children: _jsx(Icon, { name: filters?.map(filter => !!filter.on).reduce((acc, curr) => acc || curr)
143
135
  ? 'filter-on'
144
136
  : 'filter' }) })), !!filters && mountDialog && buttonEl && (_jsx(StyledFilterDialog, { ref: dialogRef, target: buttonEl, "aria-labelledby": headingId, id: dialogId, onKeyDown: (event) => {
145
137
  if (event.key === 'Escape') {
@@ -1 +1 @@
1
- {"version":3,"file":"Feed.js","sourceRoot":"","sources":["../../../src/components/Feed/Feed.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useRef, useEffect, useCallback, forwardRef } from 'react';\nimport type { ChangeEvent, FC, KeyboardEvent as ReactKeyboardEvent, Ref } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n defaultThemeProp,\n Flex,\n getFocusables,\n Icon,\n registerIcon,\n StyledCard,\n Switch,\n Text,\n Progress,\n usePrevious,\n useItemIntersection,\n useUID,\n useConsolidatedRef\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps } from '@pega/cosmos-react-core';\nimport {\n useArrows,\n useElement,\n useFocusTrap,\n useI18n,\n useOuterEvent\n} from '@pega/cosmos-react-core/lib/hooks';\nimport * as filterIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/filter.icon';\nimport * as filterOnIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/filter-on.icon';\nimport { StyledCardHeader } from '@pega/cosmos-react-core/lib/components/Card/CardHeader';\nimport Dialog from '@pega/cosmos-react-core/lib/components/Dialog/Dialog';\n\nimport { FeedContext } from './Feed.context';\nimport FeedButton from './FeedButton';\nimport FeedAnnouncer from './FeedAnnouncer';\nimport type { FeedProps } from './Feed.types';\n\nregisterIcon(filterIcon, filterOnIcon);\n\nconst StyledFeed = styled.div`\n ${StyledCardHeader}:not(${StyledCard} ${StyledCard} > ${StyledCardHeader}) {\n padding-bottom: 0.25rem;\n }\n`;\n\nStyledFeed.defaultProps = defaultThemeProp;\n\nexport const StyledFilterDialog = styled(Dialog)(({ theme }) => {\n return css`\n min-width: fit-content;\n fieldset {\n padding-block-end: calc(2 * ${theme.base.spacing});\n border: none;\n max-height: inherit;\n\n legend {\n padding-block-start: calc(2 * ${theme.base.spacing});\n padding-inline: calc(2 * ${theme.base.spacing});\n }\n }\n `;\n});\n\nStyledFilterDialog.defaultProps = defaultThemeProp;\n\nconst StyledFilterList = styled.ul(({ theme }) => {\n return css`\n list-style-type: none;\n min-width: ${theme.base['content-width'].xs};\n padding-inline: calc(2 * ${theme.base.spacing});\n overflow: auto;\n `;\n});\n\nStyledFilterList.defaultProps = defaultThemeProp;\n\nconst StyledLoadMore = styled.div(({ theme }) => {\n return css`\n margin-top: ${theme.base.spacing};\n min-height: 2rem;\n min-width: 2rem;\n `;\n});\n\nStyledLoadMore.defaultProps = defaultThemeProp;\n\nconst Feed: FC<ForwardProps & FeedProps> = forwardRef(function Feed(\n props: ForwardProps & FeedProps,\n ref: Ref<HTMLDivElement>\n) {\n const {\n loadingPosts = false,\n variant,\n children,\n userInfo,\n className,\n title,\n searchTypes,\n onDecoratorSearch,\n searchResults = [],\n autopilotInfo = {\n id: 'autopilot',\n label: 'Autopilot'\n },\n onAutopilotClick,\n onMentionClick,\n onMentionPreview,\n onTagClick,\n mentionContent,\n interactionRenderers = [],\n markdownMap,\n filters,\n onFilterChange,\n onLoadMore,\n newPostRegion,\n posts = [],\n ...restProps\n } = props;\n const t = useI18n();\n const dialogRef = useRef<HTMLDivElement>(null);\n const [buttonEl, setButtonEl] = useElement<HTMLButtonElement>();\n const headingId = useUID();\n const dialogId = useUID();\n const [mountDialog, setMountDialog] = useState(false);\n const [showSearchResults, setShowSearchResults] = useState(false);\n const prevPosts = usePrevious(posts);\n const [announcementText, setAnnouncementText] = useState('');\n\n const feedRef = useConsolidatedRef(ref);\n\n const filterRef = useRef(null);\n useArrows(filterRef);\n\n useOuterEvent('mousedown', [dialogRef, buttonEl], () => {\n setMountDialog(false);\n });\n\n useOuterEvent('focusin', [dialogRef, buttonEl], () => {\n setMountDialog(false);\n });\n\n const onKeydown = ({ key }: KeyboardEvent) => {\n if (key === 'Escape') setMountDialog(false);\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onKeydown);\n return () => {\n document.removeEventListener('keydown', onKeydown);\n };\n }, []);\n\n const id = useUID();\n useItemIntersection(\n { current: null },\n posts.length - 1,\n () => {\n onLoadMore?.();\n },\n `#${id} > article[role='none']`\n );\n\n const announce = useCallback((announcement: string) => {\n setAnnouncementText('');\n return setTimeout(() => {\n setAnnouncementText(announcement);\n }, 0);\n }, []);\n\n useEffect(() => {\n if (loadingPosts) {\n const timeoutId = announce(t('loading_post'));\n return () => clearTimeout(timeoutId);\n }\n }, [loadingPosts]);\n\n useEffect(() => {\n if (prevPosts) {\n let timeoutId: ReturnType<typeof setTimeout>;\n const difference = posts.length - prevPosts.length;\n if (difference < 0) announce(t('feed_post_removed'));\n else if (difference > 0)\n announce(t('feed_new_post_added', [difference], { count: difference }));\n\n return () => clearTimeout(timeoutId);\n }\n }, [posts]);\n\n useEffect(() => {\n if (mountDialog) {\n setTimeout(() => {\n const focusables = getFocusables(filterRef);\n focusables[0]?.focus();\n }, 0);\n }\n }, [mountDialog]);\n\n useFocusTrap(dialogRef, true, [mountDialog]);\n\n return (\n <FeedContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n searchTypes,\n onSearch: onDecoratorSearch,\n searchResults,\n showSearchResults,\n setShowSearchResults,\n autopilotInfo,\n onAutopilotClick,\n onMentionClick,\n onMentionPreview,\n onTagClick,\n interactionRenderers,\n markdownMap,\n userInfo,\n announce,\n feedRef\n }}\n >\n <StyledFeed ref={feedRef} {...restProps}>\n <FeedAnnouncer>{announcementText}</FeedAnnouncer>\n <Card>\n <CardHeader>\n <Text variant='h2'>{title}</Text>\n {filters && filters.length > 0 && (\n <Button\n as={FeedButton}\n ref={setButtonEl}\n variant='simple'\n icon\n onClick={() => setMountDialog(curr => !curr)}\n label={t('filters')}\n aria-label={`${t('filters')} - ${t('pulse')}`}\n aria-expanded={!!filters && mountDialog}\n aria-owns={!!filters && mountDialog && buttonEl ? dialogId : undefined}\n emphasized\n >\n <Icon\n name={\n filters?.map(filter => !!filter.on).reduce((acc, curr) => acc || curr)\n ? 'filter-on'\n : 'filter'\n }\n />\n </Button>\n )}\n\n {!!filters && mountDialog && buttonEl && (\n <StyledFilterDialog\n ref={dialogRef}\n target={buttonEl}\n aria-labelledby={headingId}\n id={dialogId}\n onKeyDown={(event: ReactKeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n buttonEl?.focus();\n }\n }}\n >\n <Flex container={{ direction: 'column', gap: 2 }} as='fieldset'>\n <Text variant='h3' as='legend' id={headingId}>\n {t('filters')}\n </Text>\n <StyledFilterList ref={filterRef}>\n {filters?.map(filter => {\n return (\n <li key={filter.id}>\n <Switch\n {...filter}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onFilterChange?.(event.target.id, event.target.checked)\n }\n />\n </li>\n );\n })}\n </StyledFilterList>\n </Flex>\n </StyledFilterDialog>\n )}\n </CardHeader>\n\n <CardContent>{newPostRegion}</CardContent>\n </Card>\n\n <div id={id}>{posts}</div>\n\n {loadingPosts && (\n <Flex container={{ justify: 'center' }} as={StyledLoadMore}>\n <Progress placement='inline' />\n </Flex>\n )}\n </StyledFeed>\n </FeedContext.Provider>\n );\n});\n\nexport default Feed;\n"]}
1
+ {"version":3,"file":"Feed.js","sourceRoot":"","sources":["../../../src/components/Feed/Feed.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useRef, useEffect, forwardRef } from 'react';\nimport type { ChangeEvent, PropsWithoutRef, KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n defaultThemeProp,\n Flex,\n getFocusables,\n Icon,\n registerIcon,\n StyledCard,\n Switch,\n Text,\n Progress,\n usePrevious,\n useLiveLog,\n useItemIntersection,\n useUID,\n useConsolidatedRef,\n type RefElement\n} from '@pega/cosmos-react-core';\nimport { useArrows, useElement, useI18n, useOuterEvent } from '@pega/cosmos-react-core/lib/hooks';\nimport * as filterIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/filter.icon';\nimport * as filterOnIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/filter-on.icon';\nimport { StyledCardHeader } from '@pega/cosmos-react-core/lib/components/Card/CardHeader';\nimport Dialog from '@pega/cosmos-react-core/lib/components/Dialog/Dialog';\n\nimport { FeedContext } from './Feed.context';\nimport FeedButton from './FeedButton';\nimport type { FeedProps } from './Feed.types';\n\nregisterIcon(filterIcon, filterOnIcon);\n\nconst StyledFeed = styled.div`\n ${StyledCardHeader}:not(${StyledCard} ${StyledCard} > ${StyledCardHeader}) {\n padding-bottom: 0.25rem;\n }\n`;\n\nStyledFeed.defaultProps = defaultThemeProp;\n\nexport const StyledFilterDialog = styled(Dialog)(({ theme }) => {\n return css`\n min-width: fit-content;\n fieldset {\n padding-block-end: calc(2 * ${theme.base.spacing});\n border: none;\n max-height: inherit;\n\n legend {\n padding-block-start: calc(2 * ${theme.base.spacing});\n padding-inline: calc(2 * ${theme.base.spacing});\n }\n }\n `;\n});\n\nStyledFilterDialog.defaultProps = defaultThemeProp;\n\nconst StyledFilterList = styled.ul(({ theme }) => {\n return css`\n list-style-type: none;\n min-width: ${theme.base['content-width'].xs};\n padding-inline: calc(2 * ${theme.base.spacing});\n overflow: auto;\n `;\n});\n\nStyledFilterList.defaultProps = defaultThemeProp;\n\nconst StyledLoadMore = styled.div(({ theme }) => {\n return css`\n margin-top: ${theme.base.spacing};\n min-height: 2rem;\n min-width: 2rem;\n `;\n});\n\nStyledLoadMore.defaultProps = defaultThemeProp;\n\nconst Feed = forwardRef<RefElement<FeedProps>, PropsWithoutRef<FeedProps>>(\n function Feed(props, ref) {\n const {\n loadingPosts = false,\n children,\n userInfo,\n className,\n title,\n searchTypes,\n onDecoratorSearch,\n searchResults = [],\n autopilotInfo = {\n id: 'autopilot',\n label: 'Autopilot'\n },\n onAutopilotClick,\n onMentionClick,\n onMentionPreview,\n onTagClick,\n interactionRenderers = [],\n markdownMap,\n filters,\n onFilterChange,\n onLoadMore,\n onLinkRender,\n newPostRegion,\n posts = [],\n ...restProps\n } = props;\n const t = useI18n();\n const dialogRef = useRef<HTMLDivElement>(null);\n const [buttonEl, setButtonEl] = useElement<HTMLButtonElement>();\n const headingId = useUID();\n const dialogId = useUID();\n const [mountDialog, setMountDialog] = useState(false);\n const [showSearchResults, setShowSearchResults] = useState(false);\n const prevPosts = usePrevious(posts);\n const { announcePolite } = useLiveLog();\n\n const feedRef = useConsolidatedRef(ref);\n\n const filterRef = useRef(null);\n useArrows(filterRef);\n\n useOuterEvent('mousedown', [dialogRef, buttonEl], () => {\n setMountDialog(false);\n });\n\n useOuterEvent('focusin', [dialogRef, buttonEl], () => {\n setMountDialog(false);\n });\n\n const onKeydown = ({ key }: KeyboardEvent) => {\n if (key === 'Escape') setMountDialog(false);\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onKeydown);\n return () => {\n document.removeEventListener('keydown', onKeydown);\n };\n }, []);\n\n const id = useUID();\n useItemIntersection(\n { current: null },\n posts.length - 1,\n () => {\n onLoadMore?.();\n },\n `#${id} > article[role='none']`\n );\n\n useEffect(() => {\n if (loadingPosts) {\n announcePolite({ message: t('loading_post') });\n }\n }, [loadingPosts]);\n\n useEffect(() => {\n if (prevPosts) {\n const difference = posts.length - prevPosts.length;\n if (difference < 0) announcePolite({ message: t('feed_post_removed') });\n else if (difference > 0) {\n announcePolite({\n message: t('feed_new_post_added', [difference], { count: difference })\n });\n }\n }\n }, [posts]);\n\n useEffect(() => {\n if (mountDialog) {\n setTimeout(() => {\n const focusables = getFocusables(filterRef);\n focusables[0]?.focus();\n }, 0);\n }\n }, [mountDialog]);\n\n return (\n <FeedContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n searchTypes,\n onSearch: onDecoratorSearch,\n searchResults,\n showSearchResults,\n setShowSearchResults,\n autopilotInfo,\n onLinkRender,\n onAutopilotClick,\n onMentionClick,\n onMentionPreview,\n onTagClick,\n interactionRenderers,\n markdownMap,\n userInfo,\n feedRef\n }}\n >\n <StyledFeed ref={feedRef} {...restProps}>\n <Card>\n <CardHeader>\n <Text variant='h2'>{title}</Text>\n {filters && filters.length > 0 && (\n <Button\n as={FeedButton}\n ref={setButtonEl}\n variant='simple'\n icon\n onClick={() => setMountDialog(curr => !curr)}\n label={t('filters')}\n aria-label={`${t('filters')} - ${t('pulse')}`}\n aria-expanded={!!filters && mountDialog}\n aria-owns={!!filters && mountDialog && buttonEl ? dialogId : undefined}\n emphasized\n >\n <Icon\n name={\n filters?.map(filter => !!filter.on).reduce((acc, curr) => acc || curr)\n ? 'filter-on'\n : 'filter'\n }\n />\n </Button>\n )}\n\n {!!filters && mountDialog && buttonEl && (\n <StyledFilterDialog\n ref={dialogRef}\n target={buttonEl}\n aria-labelledby={headingId}\n id={dialogId}\n onKeyDown={(event: ReactKeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n buttonEl?.focus();\n }\n }}\n >\n <Flex container={{ direction: 'column', gap: 2 }} as='fieldset'>\n <Text variant='h3' as='legend' id={headingId}>\n {t('filters')}\n </Text>\n <StyledFilterList ref={filterRef}>\n {filters?.map(filter => {\n return (\n <li key={filter.id}>\n <Switch\n {...filter}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onFilterChange?.(event.target.id, event.target.checked)\n }\n />\n </li>\n );\n })}\n </StyledFilterList>\n </Flex>\n </StyledFilterDialog>\n )}\n </CardHeader>\n\n <CardContent>{newPostRegion}</CardContent>\n </Card>\n\n <div id={id}>{posts}</div>\n\n {loadingPosts && (\n <Flex container={{ justify: 'center' }} as={StyledLoadMore}>\n <Progress placement='inline' />\n </Flex>\n )}\n </StyledFeed>\n </FeedContext.Provider>\n );\n }\n);\n\nexport default Feed;\n"]}