@patternfly/chatbot 2.2.0-prerelease.8 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/dist/cjs/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  2. package/dist/cjs/AttachmentEdit/AttachmentEdit.test.js +52 -0
  3. package/dist/cjs/Chatbot/Chatbot.d.ts +2 -1
  4. package/dist/cjs/Chatbot/Chatbot.js +1 -0
  5. package/dist/cjs/Chatbot/Chatbot.test.d.ts +1 -0
  6. package/dist/cjs/Chatbot/Chatbot.test.js +28 -0
  7. package/dist/cjs/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  8. package/dist/cjs/ChatbotAlert/ChatbotAlert.test.js +27 -0
  9. package/dist/cjs/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  10. package/dist/cjs/ChatbotContent/ChatbotContent.test.js +18 -0
  11. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  12. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  13. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  14. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
  15. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  16. package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  17. package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.js +29 -0
  18. package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  19. package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.js +45 -0
  20. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  21. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +18 -0
  22. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  23. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.js +87 -0
  24. package/dist/cjs/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  25. package/dist/cjs/ChatbotFooter/ChatbotFootnote.js +1 -1
  26. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  27. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.js +18 -0
  28. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  29. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.js +18 -0
  30. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
  31. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  32. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +20 -0
  33. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  34. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.js +18 -0
  35. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
  36. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  37. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +20 -0
  38. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  39. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  40. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +43 -0
  41. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
  42. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  43. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +41 -0
  44. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
  45. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
  46. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  47. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.js +55 -0
  48. package/dist/cjs/ChatbotToggle/ChatbotToggle.js +3 -1
  49. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  50. package/dist/cjs/Compare/Compare.d.ts +17 -0
  51. package/dist/cjs/Compare/Compare.js +50 -0
  52. package/dist/cjs/Compare/Compare.test.d.ts +1 -0
  53. package/dist/cjs/Compare/Compare.test.js +20 -0
  54. package/dist/cjs/Compare/index.d.ts +2 -0
  55. package/dist/cjs/Compare/index.js +23 -0
  56. package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
  57. package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +26 -0
  58. package/dist/cjs/Message/ImageMessage/ImageMessage.d.ts +4 -0
  59. package/dist/cjs/Message/ImageMessage/ImageMessage.js +25 -0
  60. package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +4 -0
  61. package/dist/cjs/Message/LinkMessage/LinkMessage.js +30 -0
  62. package/dist/cjs/Message/Message.d.ts +49 -8
  63. package/dist/cjs/Message/Message.js +70 -18
  64. package/dist/cjs/Message/Message.test.js +269 -3
  65. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +17 -0
  66. package/dist/cjs/Message/QuickResponse/QuickResponse.js +34 -0
  67. package/dist/cjs/Message/QuickStarts/FallbackImg.d.ts +13 -0
  68. package/dist/cjs/Message/QuickStarts/FallbackImg.js +34 -0
  69. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  70. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +82 -0
  71. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  72. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.js +64 -0
  73. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  74. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.js +76 -0
  75. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  76. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.js +30 -0
  77. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  78. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +77 -0
  79. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  80. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.js +77 -0
  81. package/dist/cjs/Message/QuickStarts/types.d.ts +132 -0
  82. package/dist/cjs/Message/QuickStarts/types.js +17 -0
  83. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +20 -0
  84. package/dist/cjs/Message/TableMessage/TableMessage.js +67 -0
  85. package/dist/cjs/Message/TableMessage/TbodyMessage.d.ts +7 -0
  86. package/dist/cjs/Message/TableMessage/TbodyMessage.js +33 -0
  87. package/dist/cjs/Message/TableMessage/TdMessage.d.ts +5 -0
  88. package/dist/cjs/Message/TableMessage/TdMessage.js +26 -0
  89. package/dist/cjs/Message/TableMessage/ThMessage.d.ts +5 -0
  90. package/dist/cjs/Message/TableMessage/ThMessage.js +26 -0
  91. package/dist/cjs/Message/TableMessage/TheadMessage.d.ts +5 -0
  92. package/dist/cjs/Message/TableMessage/TheadMessage.js +26 -0
  93. package/dist/cjs/Message/TableMessage/TrMessage.d.ts +7 -0
  94. package/dist/cjs/Message/TableMessage/TrMessage.js +37 -0
  95. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +2 -1
  96. package/dist/cjs/Message/TextMessage/TextMessage.js +2 -2
  97. package/dist/cjs/Message/UserFeedback/CloseButton.d.ts +10 -0
  98. package/dist/cjs/Message/UserFeedback/CloseButton.js +14 -0
  99. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +39 -0
  100. package/dist/cjs/Message/UserFeedback/UserFeedback.js +54 -0
  101. package/dist/cjs/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  102. package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +133 -0
  103. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  104. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +117 -0
  105. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  106. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +249 -0
  107. package/dist/cjs/MessageBar/AttachButton.js +4 -2
  108. package/dist/cjs/MessageBar/MessageBar.d.ts +11 -4
  109. package/dist/cjs/MessageBar/MessageBar.js +127 -46
  110. package/dist/cjs/MessageBar/MessageBar.test.js +12 -4
  111. package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -1
  112. package/dist/cjs/MessageBar/SendButton.js +3 -1
  113. package/dist/cjs/MessageBar/StopButton.js +3 -1
  114. package/dist/cjs/MessageBox/MessageBox.test.d.ts +1 -0
  115. package/dist/cjs/MessageBox/MessageBox.test.js +22 -0
  116. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  117. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.js +28 -0
  118. package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +4 -1
  119. package/dist/cjs/ResponseActions/ResponseActionButton.js +21 -6
  120. package/dist/cjs/ResponseActions/ResponseActions.d.ts +8 -2
  121. package/dist/cjs/ResponseActions/ResponseActions.js +7 -7
  122. package/dist/cjs/ResponseActions/ResponseActions.test.js +2 -2
  123. package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -0
  124. package/dist/cjs/Settings/SettingsForm.test.js +26 -0
  125. package/dist/cjs/__mocks__/rehype-external-links.d.ts +2 -0
  126. package/dist/cjs/__mocks__/rehype-external-links.js +4 -0
  127. package/dist/cjs/__mocks__/rehype-sanitize.d.ts +2 -0
  128. package/dist/cjs/__mocks__/rehype-sanitize.js +4 -0
  129. package/dist/cjs/__mocks__/rehype-unwrap-images.d.ts +2 -0
  130. package/dist/cjs/__mocks__/rehype-unwrap-images.js +4 -0
  131. package/dist/cjs/index.d.ts +4 -0
  132. package/dist/cjs/index.js +7 -1
  133. package/dist/cjs/tracking/console_tracking_provider.d.ts +10 -0
  134. package/dist/cjs/tracking/console_tracking_provider.js +27 -0
  135. package/dist/cjs/tracking/index.d.ts +2 -0
  136. package/dist/cjs/tracking/index.js +23 -0
  137. package/dist/cjs/tracking/posthog_tracking_provider.d.ts +9 -0
  138. package/dist/cjs/tracking/posthog_tracking_provider.js +37 -0
  139. package/dist/cjs/tracking/segment_tracking_provider.d.ts +10 -0
  140. package/dist/cjs/tracking/segment_tracking_provider.js +50 -0
  141. package/dist/cjs/tracking/trackingProviderProxy.d.ts +9 -0
  142. package/dist/cjs/tracking/trackingProviderProxy.js +24 -0
  143. package/dist/cjs/tracking/tracking_api.d.ts +8 -0
  144. package/dist/cjs/tracking/tracking_api.js +2 -0
  145. package/dist/cjs/tracking/tracking_registry.d.ts +4 -0
  146. package/dist/cjs/tracking/tracking_registry.js +33 -0
  147. package/dist/cjs/tracking/tracking_spi.d.ts +9 -0
  148. package/dist/cjs/tracking/tracking_spi.js +2 -0
  149. package/dist/cjs/tracking/umami_tracking_provider.d.ts +14 -0
  150. package/dist/cjs/tracking/umami_tracking_provider.js +44 -0
  151. package/dist/css/main.css +438 -147
  152. package/dist/css/main.css.map +1 -1
  153. package/dist/dynamic/Compare/package.json +1 -0
  154. package/dist/dynamic/tracking/package.json +1 -0
  155. package/dist/esm/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  156. package/dist/esm/AttachmentEdit/AttachmentEdit.test.js +47 -0
  157. package/dist/esm/Chatbot/Chatbot.d.ts +2 -1
  158. package/dist/esm/Chatbot/Chatbot.js +1 -0
  159. package/dist/esm/Chatbot/Chatbot.test.d.ts +1 -0
  160. package/dist/esm/Chatbot/Chatbot.test.js +23 -0
  161. package/dist/esm/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  162. package/dist/esm/ChatbotAlert/ChatbotAlert.test.js +22 -0
  163. package/dist/esm/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  164. package/dist/esm/ChatbotContent/ChatbotContent.test.js +13 -0
  165. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  166. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  167. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  168. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
  169. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  170. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  171. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.js +22 -0
  172. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  173. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.js +38 -0
  174. package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  175. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +13 -0
  176. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  177. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.js +82 -0
  178. package/dist/esm/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  179. package/dist/esm/ChatbotFooter/ChatbotFootnote.js +1 -1
  180. package/dist/esm/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  181. package/dist/esm/ChatbotHeader/ChatbotHeader.test.js +13 -0
  182. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  183. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.js +13 -0
  184. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
  185. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  186. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +15 -0
  187. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  188. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.js +13 -0
  189. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
  190. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  191. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +15 -0
  192. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  193. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  194. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +38 -0
  195. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
  196. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  197. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +36 -0
  198. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
  199. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
  200. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  201. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.js +50 -0
  202. package/dist/esm/ChatbotToggle/ChatbotToggle.js +3 -1
  203. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  204. package/dist/esm/Compare/Compare.d.ts +17 -0
  205. package/dist/esm/Compare/Compare.js +43 -0
  206. package/dist/esm/Compare/Compare.test.d.ts +1 -0
  207. package/dist/esm/Compare/Compare.test.js +15 -0
  208. package/dist/esm/Compare/index.d.ts +2 -0
  209. package/dist/esm/Compare/index.js +2 -0
  210. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
  211. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +21 -0
  212. package/dist/esm/Message/ImageMessage/ImageMessage.d.ts +4 -0
  213. package/dist/esm/Message/ImageMessage/ImageMessage.js +20 -0
  214. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +4 -0
  215. package/dist/esm/Message/LinkMessage/LinkMessage.js +25 -0
  216. package/dist/esm/Message/Message.d.ts +49 -8
  217. package/dist/esm/Message/Message.js +68 -16
  218. package/dist/esm/Message/Message.test.js +269 -3
  219. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +17 -0
  220. package/dist/esm/Message/QuickResponse/QuickResponse.js +27 -0
  221. package/dist/esm/Message/QuickStarts/FallbackImg.d.ts +13 -0
  222. package/dist/esm/Message/QuickStarts/FallbackImg.js +9 -0
  223. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  224. package/dist/esm/Message/QuickStarts/QuickStartTile.js +52 -0
  225. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  226. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.js +35 -0
  227. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  228. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.js +48 -0
  229. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  230. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.js +5 -0
  231. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  232. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +74 -0
  233. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  234. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.js +74 -0
  235. package/dist/esm/Message/QuickStarts/types.d.ts +132 -0
  236. package/dist/esm/Message/QuickStarts/types.js +14 -0
  237. package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
  238. package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
  239. package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
  240. package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
  241. package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
  242. package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
  243. package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
  244. package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
  245. package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
  246. package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
  247. package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
  248. package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
  249. package/dist/esm/Message/TextMessage/TextMessage.d.ts +2 -1
  250. package/dist/esm/Message/TextMessage/TextMessage.js +3 -3
  251. package/dist/esm/Message/UserFeedback/CloseButton.d.ts +10 -0
  252. package/dist/esm/Message/UserFeedback/CloseButton.js +9 -0
  253. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +39 -0
  254. package/dist/esm/Message/UserFeedback/UserFeedback.js +49 -0
  255. package/dist/esm/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  256. package/dist/esm/Message/UserFeedback/UserFeedback.test.js +128 -0
  257. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  258. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +112 -0
  259. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  260. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +244 -0
  261. package/dist/esm/MessageBar/AttachButton.js +4 -2
  262. package/dist/esm/MessageBar/MessageBar.d.ts +11 -4
  263. package/dist/esm/MessageBar/MessageBar.js +127 -46
  264. package/dist/esm/MessageBar/MessageBar.test.js +12 -4
  265. package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -1
  266. package/dist/esm/MessageBar/SendButton.js +3 -1
  267. package/dist/esm/MessageBar/StopButton.js +3 -1
  268. package/dist/esm/MessageBox/MessageBox.test.d.ts +1 -0
  269. package/dist/esm/MessageBox/MessageBox.test.js +17 -0
  270. package/dist/esm/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  271. package/dist/esm/PreviewAttachment/PreviewAttachment.test.js +23 -0
  272. package/dist/esm/ResponseActions/ResponseActionButton.d.ts +4 -1
  273. package/dist/esm/ResponseActions/ResponseActionButton.js +18 -3
  274. package/dist/esm/ResponseActions/ResponseActions.d.ts +8 -2
  275. package/dist/esm/ResponseActions/ResponseActions.js +7 -7
  276. package/dist/esm/ResponseActions/ResponseActions.test.js +2 -2
  277. package/dist/esm/Settings/SettingsForm.test.d.ts +1 -0
  278. package/dist/esm/Settings/SettingsForm.test.js +21 -0
  279. package/dist/esm/__mocks__/rehype-external-links.d.ts +2 -0
  280. package/dist/esm/__mocks__/rehype-external-links.js +2 -0
  281. package/dist/esm/__mocks__/rehype-sanitize.d.ts +2 -0
  282. package/dist/esm/__mocks__/rehype-sanitize.js +2 -0
  283. package/dist/esm/__mocks__/rehype-unwrap-images.d.ts +2 -0
  284. package/dist/esm/__mocks__/rehype-unwrap-images.js +2 -0
  285. package/dist/esm/index.d.ts +4 -0
  286. package/dist/esm/index.js +4 -0
  287. package/dist/esm/tracking/console_tracking_provider.d.ts +10 -0
  288. package/dist/esm/tracking/console_tracking_provider.js +23 -0
  289. package/dist/esm/tracking/index.d.ts +2 -0
  290. package/dist/esm/tracking/index.js +2 -0
  291. package/dist/esm/tracking/posthog_tracking_provider.d.ts +9 -0
  292. package/dist/esm/tracking/posthog_tracking_provider.js +33 -0
  293. package/dist/esm/tracking/segment_tracking_provider.d.ts +10 -0
  294. package/dist/esm/tracking/segment_tracking_provider.js +46 -0
  295. package/dist/esm/tracking/trackingProviderProxy.d.ts +9 -0
  296. package/dist/esm/tracking/trackingProviderProxy.js +22 -0
  297. package/dist/esm/tracking/tracking_api.d.ts +8 -0
  298. package/dist/esm/tracking/tracking_api.js +1 -0
  299. package/dist/esm/tracking/tracking_registry.d.ts +4 -0
  300. package/dist/esm/tracking/tracking_registry.js +26 -0
  301. package/dist/esm/tracking/tracking_spi.d.ts +9 -0
  302. package/dist/esm/tracking/tracking_spi.js +1 -0
  303. package/dist/esm/tracking/umami_tracking_provider.d.ts +14 -0
  304. package/dist/esm/tracking/umami_tracking_provider.js +40 -0
  305. package/dist/tsconfig.tsbuildinfo +1 -1
  306. package/package.json +8 -9
  307. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +8 -2
  308. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +192 -15
  309. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +219 -0
  310. package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentError.tsx +2 -2
  311. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +214 -12
  312. package/patternfly-docs/content/extensions/chatbot/examples/Messages/FileDropZone.tsx +2 -1
  313. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithAttachment.tsx +2 -2
  314. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +1 -1
  315. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +71 -0
  316. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedbackTimeout.tsx +27 -0
  317. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +1 -1
  318. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +31 -0
  319. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithResponseActions.tsx +1 -1
  320. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +1 -1
  321. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +61 -9
  322. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +244 -14
  323. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +54 -0
  324. package/patternfly-docs/content/extensions/chatbot/examples/Messages/explore-pipeline-quickstart.ts +65 -0
  325. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
  326. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +5 -5
  327. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderBasic.tsx +1 -1
  328. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +36 -3
  329. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
  330. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
  331. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarAttach.tsx +1 -1
  332. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomeInteraction.tsx +1 -1
  333. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomePrompt.tsx +7 -7
  334. package/patternfly-docs/content/extensions/chatbot/examples/UI/SquareChatbotToggle.tsx +1 -1
  335. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +21 -6
  336. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +14 -0
  337. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +39 -1
  338. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +48 -35
  339. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +2 -2
  340. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +3 -3
  341. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotInDrawer.tsx +453 -0
  342. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +11 -11
  343. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
  344. package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +104 -0
  345. package/patternfly-docs/content/extensions/chatbot/img/ai-action-inpage.svg +85 -0
  346. package/patternfly-docs/content/extensions/chatbot/img/ai-action-message.svg +63 -0
  347. package/patternfly-docs/content/extensions/chatbot/img/analytics-example.svg +127 -0
  348. package/patternfly-docs/content/extensions/chatbot/img/attached-file.svg +24 -29
  349. package/patternfly-docs/content/extensions/chatbot/img/attachment-menu.svg +4 -4
  350. package/patternfly-docs/content/extensions/chatbot/img/attachment-unsent.svg +30 -58
  351. package/patternfly-docs/content/extensions/chatbot/img/chatbot-analytics.svg +51 -0
  352. package/patternfly-docs/content/extensions/chatbot/img/chatbot-elements.svg +11 -12
  353. package/patternfly-docs/content/extensions/chatbot/img/chatbot-quickstarts-tile.svg +58 -0
  354. package/patternfly-docs/content/extensions/chatbot/img/chatbot-settings.svg +83 -0
  355. package/patternfly-docs/content/extensions/chatbot/img/comparison.svg +45 -0
  356. package/patternfly-docs/content/extensions/chatbot/img/conversation-history.svg +6 -29
  357. package/patternfly-docs/content/extensions/chatbot/img/docked.svg +259 -241
  358. package/patternfly-docs/content/extensions/chatbot/img/drawer.svg +255 -0
  359. package/patternfly-docs/content/extensions/chatbot/img/error-state.svg +30 -0
  360. package/patternfly-docs/content/extensions/chatbot/img/feedback-form.svg +88 -0
  361. package/patternfly-docs/content/extensions/chatbot/img/footnote.svg +1 -1
  362. package/patternfly-docs/content/extensions/chatbot/img/fullscreen.svg +25 -16
  363. package/patternfly-docs/content/extensions/chatbot/img/listening-pulse.svg +22 -0
  364. package/patternfly-docs/content/extensions/chatbot/img/listening.svg +1 -1
  365. package/patternfly-docs/content/extensions/chatbot/img/loading-state.svg +28 -0
  366. package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle-notification.svg +49 -0
  367. package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle.svg +75 -0
  368. package/patternfly-docs/content/extensions/chatbot/img/message-bar-elements.svg +3 -3
  369. package/patternfly-docs/content/extensions/chatbot/img/message-elements.svg +84 -142
  370. package/patternfly-docs/content/extensions/chatbot/img/message-feedback.svg +52 -0
  371. package/patternfly-docs/content/extensions/chatbot/img/message-responses.svg +54 -0
  372. package/patternfly-docs/content/extensions/chatbot/img/new-chat-emptystate.svg +27 -0
  373. package/patternfly-docs/content/extensions/chatbot/img/no-results-emptystate.svg +27 -0
  374. package/patternfly-docs/content/extensions/chatbot/img/overlay.svg +54 -39
  375. package/patternfly-docs/content/extensions/chatbot/img/posthog.svg +30 -0
  376. package/patternfly-docs/content/extensions/chatbot/img/segment.svg +36 -0
  377. package/patternfly-docs/content/extensions/chatbot/img/settings-menu.svg +122 -0
  378. package/patternfly-docs/content/extensions/chatbot/img/source-tile.svg +62 -0
  379. package/patternfly-docs/content/extensions/chatbot/img/thank-you-card.svg +81 -0
  380. package/patternfly-docs/content/extensions/chatbot/img/toggle-customizations.svg +12 -0
  381. package/patternfly-docs/content/extensions/chatbot/img/toggle-tooltips.svg +38 -0
  382. package/patternfly-docs/content/extensions/chatbot/img/umami.svg +30 -0
  383. package/patternfly-docs/content/extensions/chatbot/img/welcome-elements.svg +82 -0
  384. package/patternfly-docs/content/extensions/chatbot/img/welcome-message.svg +94 -0
  385. package/src/AttachMenu/AttachMenu.scss +1 -1
  386. package/src/AttachmentEdit/AttachmentEdit.test.tsx +55 -0
  387. package/src/Chatbot/Chatbot.scss +20 -1
  388. package/src/Chatbot/Chatbot.test.tsx +31 -0
  389. package/src/Chatbot/Chatbot.tsx +2 -1
  390. package/src/ChatbotAlert/ChatbotAlert.test.tsx +31 -0
  391. package/src/ChatbotContent/ChatbotContent.scss +1 -0
  392. package/src/ChatbotContent/ChatbotContent.test.tsx +15 -0
  393. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +10 -4
  394. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +24 -1
  395. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +242 -3
  396. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +94 -26
  397. package/src/ChatbotConversationHistoryNav/EmptyState.tsx +44 -0
  398. package/src/ChatbotConversationHistoryNav/LoadingState.tsx +38 -0
  399. package/src/ChatbotFooter/ChatbotFooter.scss +8 -4
  400. package/src/ChatbotFooter/ChatbotFooter.test.tsx +15 -0
  401. package/src/ChatbotFooter/ChatbotFooternote.test.tsx +84 -0
  402. package/src/ChatbotFooter/ChatbotFootnote.tsx +2 -2
  403. package/src/ChatbotHeader/ChatbotHeader.scss +5 -6
  404. package/src/ChatbotHeader/ChatbotHeader.test.tsx +15 -0
  405. package/src/ChatbotHeader/ChatbotHeaderActions.test.tsx +17 -0
  406. package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +20 -0
  407. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +7 -1
  408. package/src/ChatbotHeader/ChatbotHeaderMain.test.tsx +17 -0
  409. package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +19 -0
  410. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +7 -1
  411. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +45 -0
  412. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +8 -1
  413. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +43 -0
  414. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +11 -4
  415. package/src/ChatbotHeader/ChatbotHeaderTitle.test.tsx +75 -0
  416. package/src/ChatbotHeader/ChatbotHeaderTitle.tsx +7 -2
  417. package/src/ChatbotModal/ChatbotModal.scss +12 -12
  418. package/src/ChatbotToggle/ChatbotToggle.tsx +6 -1
  419. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss +2 -0
  420. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx +26 -18
  421. package/src/ChatbotWelcomePrompt/__snapshots__/ChatbotWelcomePrompt.test.tsx.snap +2 -2
  422. package/src/CodeModal/CodeModal.scss +7 -4
  423. package/src/Compare/Compare.scss +72 -0
  424. package/src/Compare/Compare.test.tsx +31 -0
  425. package/src/Compare/Compare.tsx +98 -0
  426. package/src/Compare/index.ts +2 -0
  427. package/src/FileDetails/FileDetails.scss +1 -1
  428. package/src/FileDetailsLabel/FileDetailsLabel.scss +2 -2
  429. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +4 -4
  430. package/src/Message/ErrorMessage/ErrorMessage.tsx +14 -0
  431. package/src/Message/ImageMessage/ImageMessage.scss +9 -0
  432. package/src/Message/ImageMessage/ImageMessage.tsx +14 -0
  433. package/src/Message/LinkMessage/LinkMessage.tsx +34 -0
  434. package/src/Message/ListMessage/ListMessage.scss +6 -6
  435. package/src/Message/Message.scss +4 -26
  436. package/src/Message/Message.test.tsx +367 -3
  437. package/src/Message/Message.tsx +157 -31
  438. package/src/Message/MessageLoading.scss +2 -2
  439. package/src/Message/QuickResponse/QuickResponse.scss +33 -0
  440. package/src/Message/QuickResponse/QuickResponse.tsx +54 -0
  441. package/src/Message/QuickStarts/FallbackImg.tsx +24 -0
  442. package/src/Message/QuickStarts/QuickStartTile.scss +24 -0
  443. package/src/Message/QuickStarts/QuickStartTile.tsx +147 -0
  444. package/src/Message/QuickStarts/QuickStartTileDescription.test.tsx +57 -0
  445. package/src/Message/QuickStarts/QuickStartTileDescription.tsx +81 -0
  446. package/src/Message/QuickStarts/QuickStartTileHeader.tsx +21 -0
  447. package/src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts +75 -0
  448. package/src/Message/QuickStarts/monitor-sampleapp-quickstart.ts +75 -0
  449. package/src/Message/QuickStarts/types.ts +154 -0
  450. package/src/Message/TableMessage/TableMessage.scss +23 -0
  451. package/src/Message/TableMessage/TableMessage.tsx +83 -0
  452. package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
  453. package/src/Message/TableMessage/TdMessage.tsx +11 -0
  454. package/src/Message/TableMessage/ThMessage.tsx +11 -0
  455. package/src/Message/TableMessage/TheadMessage.tsx +11 -0
  456. package/src/Message/TableMessage/TrMessage.tsx +27 -0
  457. package/src/Message/TextMessage/TextMessage.scss +21 -12
  458. package/src/Message/TextMessage/TextMessage.tsx +3 -3
  459. package/src/Message/UserFeedback/CloseButton.tsx +21 -0
  460. package/src/Message/UserFeedback/UserFeedback.scss +53 -0
  461. package/src/Message/UserFeedback/UserFeedback.test.tsx +236 -0
  462. package/src/Message/UserFeedback/UserFeedback.tsx +128 -0
  463. package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +255 -0
  464. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +211 -0
  465. package/src/MessageBar/AttachButton.scss +19 -3
  466. package/src/MessageBar/AttachButton.tsx +3 -1
  467. package/src/MessageBar/MessageBar.scss +58 -24
  468. package/src/MessageBar/MessageBar.test.tsx +12 -4
  469. package/src/MessageBar/MessageBar.tsx +164 -65
  470. package/src/MessageBar/MicrophoneButton.scss +8 -8
  471. package/src/MessageBar/MicrophoneButton.tsx +1 -1
  472. package/src/MessageBar/SendButton.tsx +2 -0
  473. package/src/MessageBar/StopButton.scss +17 -3
  474. package/src/MessageBar/StopButton.tsx +2 -0
  475. package/src/MessageBox/JumpButton.scss +6 -6
  476. package/src/MessageBox/MessageBox.scss +1 -0
  477. package/src/MessageBox/MessageBox.test.tsx +26 -0
  478. package/src/PreviewAttachment/PreviewAttachment.test.tsx +51 -0
  479. package/src/ResponseActions/ResponseActionButton.tsx +14 -2
  480. package/src/ResponseActions/ResponseActions.scss +2 -2
  481. package/src/ResponseActions/ResponseActions.test.tsx +4 -2
  482. package/src/ResponseActions/ResponseActions.tsx +26 -2
  483. package/src/Settings/Settings.scss +2 -2
  484. package/src/Settings/SettingsForm.test.tsx +28 -0
  485. package/src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss +2 -2
  486. package/src/SourcesCard/SourcesCard.scss +9 -3
  487. package/src/TermsOfUse/TermsOfUse.scss +1 -1
  488. package/src/__mocks__/rehype-external-links.ts +3 -0
  489. package/src/__mocks__/rehype-sanitize.ts +3 -0
  490. package/src/__mocks__/rehype-unwrap-images.tsx +3 -0
  491. package/src/index.ts +6 -0
  492. package/src/main.scss +6 -6
  493. package/src/tracking/console_tracking_provider.ts +30 -0
  494. package/src/tracking/index.ts +3 -0
  495. package/src/tracking/posthog_tracking_provider.ts +42 -0
  496. package/src/tracking/segment_tracking_provider.ts +62 -0
  497. package/src/tracking/trackingProviderProxy.ts +28 -0
  498. package/src/tracking/tracking_api.ts +11 -0
  499. package/src/tracking/tracking_registry.ts +33 -0
  500. package/src/tracking/tracking_spi.ts +14 -0
  501. package/src/tracking/umami_tracking_provider.ts +54 -0
@@ -3,6 +3,10 @@ import { render, screen } from '@testing-library/react';
3
3
  import '@testing-library/jest-dom';
4
4
  import Message from './Message';
5
5
  import userEvent from '@testing-library/user-event';
6
+ import { monitorSampleAppQuickStart } from './QuickStarts/monitor-sampleapp-quickstart';
7
+ import { monitorSampleAppQuickStartWithImage } from './QuickStarts/monitor-sampleapp-quickstart-with-image';
8
+ import rehypeExternalLinks from '../__mocks__/rehype-external-links';
9
+ import { AlertActionLink } from '@patternfly/react-core';
6
10
 
7
11
  const ALL_ACTIONS = [
8
12
  { label: /Good response/i },
@@ -69,6 +73,89 @@ const ORDERED_LIST_WITH_CODE = `
69
73
  3. Item 3
70
74
  `;
71
75
 
76
+ const HEADING = `
77
+ # h1 Heading
78
+
79
+ ## h2 Heading
80
+
81
+ ### h3 Heading
82
+
83
+ #### h4 Heading
84
+
85
+ ##### h5 Heading
86
+
87
+ ###### h6 Heading
88
+ `;
89
+
90
+ const BLOCK_QUOTES = `> Blockquotes can also be nested...
91
+ >> ...by using additional greater-than signs (>) right next to each other...
92
+ > > > ...or with spaces between each sign.`;
93
+ const TABLE = `
94
+
95
+ | Column 1 | Column 2 |
96
+ |-|-|
97
+ | Cell 1 | Cell 2 |
98
+ | Cell 3 | Cell 4 |
99
+
100
+ `;
101
+
102
+ const ONE_COLUMN_TABLE = `
103
+
104
+ | Column 1 |
105
+ |-|
106
+ | Cell 1 |
107
+ | Cell 2 |
108
+
109
+ `;
110
+
111
+ const ONE_CELL_TABLE = `
112
+
113
+ | Column 1 |
114
+ |-|
115
+ | Cell 1 |
116
+
117
+ `;
118
+
119
+ const HEADERLESS_TABLE = `
120
+
121
+ | |
122
+ |-|
123
+ | Cell 1 |
124
+
125
+ `;
126
+
127
+ const CHILDLESS_TABLE = `
128
+
129
+ | Column 1 |
130
+ |-|
131
+ | |
132
+
133
+ `;
134
+
135
+ const EMPTY_TABLE = `
136
+
137
+ | |
138
+ |-|
139
+ | |
140
+
141
+ `;
142
+
143
+ const IMAGE = `![Multi-colored wavy lines on a black background](https://cdn.dribbble.com/userupload/10651749/file/original-8a07b8e39d9e8bf002358c66fce1223e.gif)`;
144
+
145
+ const ERROR = {
146
+ title: 'Could not load chat',
147
+ children: 'Wait a few minutes and check your network settings. If the issue persists: ',
148
+ actionLinks: (
149
+ <React.Fragment>
150
+ <AlertActionLink component="a" href="#">
151
+ Start a new chat
152
+ </AlertActionLink>
153
+ <AlertActionLink component="a" href="#">
154
+ Contact support
155
+ </AlertActionLink>
156
+ </React.Fragment>
157
+ )
158
+ };
72
159
  const checkListItemsRendered = () => {
73
160
  const items = ['Item 1', 'Item 2', 'Item 3'];
74
161
  expect(screen.getAllByRole('listitem')).toHaveLength(3);
@@ -79,6 +166,9 @@ const checkListItemsRendered = () => {
79
166
  };
80
167
 
81
168
  describe('Message', () => {
169
+ beforeEach(() => {
170
+ jest.clearAllMocks();
171
+ });
82
172
  it('should render user messages correctly', () => {
83
173
  render(<Message avatar="./img" role="user" name="User" content="Hi" />);
84
174
  expect(screen.getByText('User')).toBeTruthy();
@@ -375,13 +465,17 @@ describe('Message', () => {
375
465
  render(<Message avatar="./img" role="user" name="User" content={CODE_MESSAGE} />);
376
466
  expect(screen.getByText('Here is some YAML code:')).toBeTruthy();
377
467
  expect(screen.getByRole('button', { name: 'Copy code button' })).toBeTruthy();
378
- expect(screen.getByText(/apiVersion: helm.openshift.io\/v1beta1/i)).toBeTruthy();
468
+ expect(screen.getByText(/yaml/)).toBeTruthy();
469
+ expect(screen.getByText(/apiVersion:/i)).toBeTruthy();
470
+ expect(screen.getByText(/helm.openshift.io\/v1beta1/i)).toBeTruthy();
379
471
  expect(screen.getByText(/metadata:/i)).toBeTruthy();
380
- expect(screen.getByText(/name: azure-sample-repo0oooo00ooo/i)).toBeTruthy();
472
+ expect(screen.getByText(/name:/i)).toBeTruthy();
473
+ expect(screen.getByText(/azure-sample-repo0oooo00ooo/i)).toBeTruthy();
381
474
  expect(screen.getByText(/spec/i)).toBeTruthy();
382
475
  expect(screen.getByText(/connectionConfig:/i)).toBeTruthy();
476
+ expect(screen.getByText(/url:/i)).toBeTruthy();
383
477
  expect(
384
- screen.getByText(/url: https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)
478
+ screen.getByText(/https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)
385
479
  ).toBeTruthy();
386
480
  });
387
481
  it('can click copy code button', async () => {
@@ -437,4 +531,274 @@ describe('Message', () => {
437
531
  expect(screen.getByRole('img')).toHaveClass('test');
438
532
  expect(screen.getByRole('img')).toHaveClass('pf-chatbot__message-avatar');
439
533
  });
534
+ it('should handle QuickStart tile correctly', () => {
535
+ render(
536
+ <Message
537
+ avatar="./img"
538
+ role="user"
539
+ name="User"
540
+ content="Hi"
541
+ quickStarts={{
542
+ quickStart: monitorSampleAppQuickStart,
543
+ onSelectQuickStart: (id) => alert(id)
544
+ }}
545
+ />
546
+ );
547
+ expect(screen.getByRole('button', { name: 'Monitoring your sample application' })).toBeTruthy();
548
+ expect(screen.getByRole('heading', { name: '1 Prerequisite' })).toBeTruthy();
549
+ expect(screen.getByRole('button', { name: 'Show prerequisites' })).toBeTruthy();
550
+ expect(screen.getByRole('button', { name: 'Start' })).toBeTruthy();
551
+ });
552
+ it('should handle click on QuickStart tile correctly', async () => {
553
+ const spy = jest.fn();
554
+ render(
555
+ <Message
556
+ avatar="./img"
557
+ role="user"
558
+ name="User"
559
+ content="Hi"
560
+ quickStarts={{
561
+ quickStart: monitorSampleAppQuickStart,
562
+ onSelectQuickStart: (id) => spy(id)
563
+ }}
564
+ />
565
+ );
566
+ await userEvent.click(screen.getByRole('button', { name: 'Monitoring your sample application' }));
567
+ expect(spy).toHaveBeenCalledTimes(1);
568
+ expect(spy).toHaveBeenCalledWith(monitorSampleAppQuickStart.metadata.name);
569
+ });
570
+ it('should handle QuickStart tile with image correctly', async () => {
571
+ const spy = jest.fn();
572
+ render(
573
+ <Message
574
+ avatar="./img"
575
+ role="user"
576
+ name="User"
577
+ content="Hi"
578
+ quickStarts={{
579
+ quickStart: monitorSampleAppQuickStartWithImage,
580
+ onSelectQuickStart: (id) => spy(id)
581
+ }}
582
+ />
583
+ );
584
+ expect(screen.getAllByRole('img')[1]).toHaveAttribute('src', 'test.png');
585
+ });
586
+ it('should handle block quote correctly', () => {
587
+ render(<Message avatar="./img" role="user" name="User" content={BLOCK_QUOTES} />);
588
+ expect(screen.getByText(/Blockquotes can also be nested.../)).toBeTruthy();
589
+ expect(screen.getByText('...by using additional greater-than signs (>) right next to each other...')).toBeTruthy();
590
+ expect(screen.getByText(/...or with spaces between each sign./)).toBeTruthy();
591
+ });
592
+ it('should handle heading correctly', () => {
593
+ render(<Message avatar="./img" role="user" name="User" content={HEADING} />);
594
+ expect(screen.getByRole('heading', { name: /h1 Heading/i })).toBeTruthy();
595
+ expect(screen.getByRole('heading', { name: /h2 Heading/i })).toBeTruthy();
596
+ expect(screen.getByRole('heading', { name: /h3 Heading/i })).toBeTruthy();
597
+ expect(screen.getByRole('heading', { name: /h4 Heading/i })).toBeTruthy();
598
+ expect(screen.getByRole('heading', { name: /h5 Heading/i })).toBeTruthy();
599
+ expect(screen.getByRole('heading', { name: /h6 Heading/i })).toBeTruthy();
600
+ });
601
+ it('should render table correctly', () => {
602
+ render(<Message avatar="./img" role="user" name="User" content={TABLE} />);
603
+ expect(screen.getByRole('row', { name: /Column 1 Column 2/i })).toBeTruthy();
604
+ expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toBeTruthy();
605
+ expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toBeTruthy();
606
+ expect(screen.getByRole('columnheader', { name: /Column 1/i })).toBeTruthy();
607
+ expect(screen.getByRole('columnheader', { name: /Column 2/i })).toBeTruthy();
608
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toBeTruthy();
609
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toBeTruthy();
610
+ expect(screen.getByRole('cell', { name: /Cell 3/i })).toBeTruthy();
611
+ expect(screen.getByRole('cell', { name: /Cell 4/i })).toBeTruthy();
612
+ });
613
+ it('should render table data labels correctly for mobile breakpoint', () => {
614
+ render(<Message avatar="./img" role="user" name="User" content={TABLE} />);
615
+ expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
616
+ expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
617
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
618
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 2');
619
+ expect(screen.getByRole('cell', { name: /Cell 3/i })).toHaveAttribute('data-label', 'Column 1');
620
+ expect(screen.getByRole('cell', { name: /Cell 4/i })).toHaveAttribute('data-label', 'Column 2');
621
+ });
622
+ it('should render table data labels correctly for mobile breakpoint for one column table', () => {
623
+ render(<Message avatar="./img" role="user" name="User" content={ONE_COLUMN_TABLE} />);
624
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
625
+ expect(screen.getByRole('row', { name: /Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1');
626
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
627
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 1');
628
+ });
629
+ it('should render table data labels correctly for mobile breakpoint for one cell table', () => {
630
+ render(<Message avatar="./img" role="user" name="User" content={ONE_CELL_TABLE} />);
631
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
632
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
633
+ });
634
+ it('should render table data labels correctly for mobile breakpoint for headerless', () => {
635
+ render(<Message avatar="./img" role="user" name="User" content={HEADERLESS_TABLE} />);
636
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', '');
637
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).not.toHaveAttribute('data-label');
638
+ });
639
+ it('should render table data labels correctly for mobile breakpoint for childless', () => {
640
+ render(<Message avatar="./img" role="user" name="User" content={CHILDLESS_TABLE} />);
641
+ expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', 'Column 1');
642
+ });
643
+ it('should render table data labels correctly for mobile breakpoint for empty', () => {
644
+ render(<Message avatar="./img" role="user" name="User" content={EMPTY_TABLE} />);
645
+ expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', '');
646
+ });
647
+ it('should render custom table aria label correctly', () => {
648
+ render(<Message avatar="./img" role="user" name="User" content={TABLE} tableProps={{ 'aria-label': 'Test' }} />);
649
+ expect(screen.getByRole('grid', { name: /Test/i })).toBeTruthy();
650
+ });
651
+ it('should render beforeMainContent with main content', () => {
652
+ const mainContent = 'Main message content';
653
+ const beforeMainContentText = 'Before main content';
654
+ const beforeMainContent = <div>{beforeMainContentText}</div>;
655
+
656
+ render(
657
+ <Message avatar="./img" role="user" name="User" content={mainContent} extraContent={{ beforeMainContent }} />
658
+ );
659
+
660
+ expect(screen.getByText(beforeMainContentText)).toBeTruthy();
661
+ expect(screen.getByText(mainContent)).toBeTruthy();
662
+ });
663
+ it('should render afterMainContent with main content', () => {
664
+ const mainContent = 'Main message content';
665
+ const afterMainContentText = 'After main content';
666
+ const afterMainContent = <div>{afterMainContentText}</div>;
667
+
668
+ render(
669
+ <Message avatar="./img" role="user" name="User" content={mainContent} extraContent={{ afterMainContent }} />
670
+ );
671
+
672
+ expect(screen.getByText(afterMainContentText)).toBeTruthy();
673
+ expect(screen.getByText(mainContent)).toBeTruthy();
674
+ });
675
+
676
+ it('should render endContent with main content', () => {
677
+ const mainContent = 'Main message content';
678
+ const endMainContentText = 'End content';
679
+ const endContent = <div>{endMainContentText}</div>;
680
+
681
+ render(<Message avatar="./img" role="user" name="User" content={mainContent} extraContent={{ endContent }} />);
682
+
683
+ expect(screen.getByText(endMainContentText)).toBeTruthy();
684
+ expect(screen.getByText(mainContent)).toBeTruthy();
685
+ });
686
+ it('should render all parts of extraContent with main content', () => {
687
+ const beforeMainContent = <div>Before main content</div>;
688
+ const afterMainContent = <div>After main content</div>;
689
+ const endContent = <div>End content</div>;
690
+
691
+ render(
692
+ <Message
693
+ avatar="./img"
694
+ role="user"
695
+ name="User"
696
+ content="Main message content"
697
+ extraContent={{ beforeMainContent, afterMainContent, endContent }}
698
+ />
699
+ );
700
+
701
+ expect(screen.getByText('Before main content')).toBeTruthy();
702
+ expect(screen.getByText('Main message content')).toBeTruthy();
703
+ expect(screen.getByText('After main content')).toBeTruthy();
704
+ expect(screen.getByText('End content')).toBeTruthy();
705
+ });
706
+
707
+ it('should not render extraContent when not provided', () => {
708
+ render(<Message avatar="./img" role="user" name="User" content="Main message content" />);
709
+
710
+ // Ensure no extraContent is rendered
711
+ expect(screen.getByText('Main message content')).toBeTruthy();
712
+ expect(screen.queryByText('Before main content')).toBeFalsy();
713
+ expect(screen.queryByText('After main content')).toBeFalsy();
714
+ expect(screen.queryByText('end message content')).toBeFalsy();
715
+ });
716
+
717
+ it('should handle undefined or null values in extraContent gracefully', () => {
718
+ render(
719
+ <Message
720
+ avatar="./img"
721
+ role="user"
722
+ name="User"
723
+ content="Main message content"
724
+ extraContent={{ beforeMainContent: null, afterMainContent: undefined, endContent: null }}
725
+ />
726
+ );
727
+
728
+ // Ensure that no extraContent is rendered if they are null or undefined
729
+ expect(screen.getByText('Main message content')).toBeTruthy();
730
+ expect(screen.queryByText('Before main content')).toBeFalsy();
731
+ expect(screen.queryByText('After main content')).toBeFalsy();
732
+ expect(screen.queryByText('end message content')).toBeFalsy();
733
+ });
734
+ it('should render JSX in extraContent correctly', () => {
735
+ const beforeMainContent = (
736
+ <div data-testid="before-main-content">
737
+ <strong>Bold before content</strong>
738
+ </div>
739
+ );
740
+ const afterMainContent = (
741
+ <div data-testid="after-main-content">
742
+ <strong>Bold after content</strong>
743
+ </div>
744
+ );
745
+ const endContent = (
746
+ <div data-testid="end-main-content">
747
+ <strong>Bold end content</strong>
748
+ </div>
749
+ );
750
+ render(
751
+ <Message
752
+ avatar="./img"
753
+ role="user"
754
+ name="User"
755
+ content="Main message content"
756
+ extraContent={{ beforeMainContent, afterMainContent, endContent }}
757
+ />
758
+ );
759
+
760
+ // Check that the JSX is correctly rendered
761
+ expect(screen.getByTestId('before-main-content')).toContainHTML('<strong>Bold before content</strong>');
762
+ expect(screen.getByTestId('after-main-content')).toContainHTML('<strong>Bold after content</strong>');
763
+ expect(screen.getByTestId('end-main-content')).toContainHTML('<strong>Bold end content</strong>');
764
+ });
765
+ it('should handle image correctly', () => {
766
+ render(<Message avatar="./img" role="user" name="User" content={IMAGE} />);
767
+ expect(screen.getByRole('img', { name: /Multi-colored wavy lines on a black background/i })).toBeTruthy();
768
+ });
769
+ it('should handle external links correctly', () => {
770
+ render(<Message avatar="./img" role="user" name="User" content={`[PatternFly](https://www.patternfly.org/)`} />);
771
+ // we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
772
+ expect(rehypeExternalLinks).toHaveBeenCalledTimes(1);
773
+ });
774
+ it('should handle external links correctly', () => {
775
+ render(
776
+ <Message
777
+ avatar="./img"
778
+ role="user"
779
+ name="User"
780
+ content={`[PatternFly](https://www.patternfly.org/)`}
781
+ openLinkInNewTab={false}
782
+ />
783
+ );
784
+ // we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
785
+ expect(rehypeExternalLinks).not.toHaveBeenCalled();
786
+ });
787
+ it('should handle error correctly', () => {
788
+ render(<Message avatar="./img" role="user" name="User" error={ERROR} />);
789
+ expect(screen.getByRole('heading', { name: /Could not load chat/i })).toBeTruthy();
790
+ expect(screen.getByRole('link', { name: /Start a new chat/i })).toBeTruthy();
791
+ expect(screen.getByRole('link', { name: /Contact support/i })).toBeTruthy();
792
+ expect(screen.getByText('Wait a few minutes and check your network settings. If the issue persists:')).toBeTruthy();
793
+ });
794
+ it('should handle error correctly when loading', () => {
795
+ render(<Message avatar="./img" role="user" name="User" error={ERROR} isLoading />);
796
+ expect(screen.queryByRole('heading', { name: /Could not load chat/i })).toBeFalsy();
797
+ expect(screen.getByText('Loading message')).toBeTruthy();
798
+ });
799
+ it('should handle error correctly when these is content', () => {
800
+ render(<Message avatar="./img" role="user" name="User" error={ERROR} content="Test" />);
801
+ expect(screen.getByRole('heading', { name: /Could not load chat/i })).toBeTruthy();
802
+ expect(screen.queryByText('Test')).toBeFalsy();
803
+ });
440
804
  });
@@ -2,17 +2,17 @@
2
2
  // Chatbot Main - Message
3
3
  // ============================================================================
4
4
 
5
- import React from 'react';
5
+ import React, { ReactNode } from 'react';
6
6
 
7
7
  import Markdown from 'react-markdown';
8
8
  import remarkGfm from 'remark-gfm';
9
9
  import {
10
+ AlertProps,
10
11
  Avatar,
11
12
  AvatarProps,
13
+ ContentVariants,
12
14
  Label,
13
- LabelGroup,
14
15
  LabelGroupProps,
15
- LabelProps,
16
16
  Timestamp,
17
17
  Truncate
18
18
  } from '@patternfly/react-core';
@@ -25,12 +25,26 @@ import SourcesCard, { SourcesCardProps } from '../SourcesCard';
25
25
  import ListItemMessage from './ListMessage/ListItemMessage';
26
26
  import UnorderedListMessage from './ListMessage/UnorderedListMessage';
27
27
  import OrderedListMessage from './ListMessage/OrderedListMessage';
28
+ import QuickStartTile from './QuickStarts/QuickStartTile';
29
+ import { QuickStart, QuickstartAction } from './QuickStarts/types';
30
+ import QuickResponse from './QuickResponse/QuickResponse';
31
+ import UserFeedback, { UserFeedbackProps } from './UserFeedback/UserFeedback';
32
+ import UserFeedbackComplete, { UserFeedbackCompleteProps } from './UserFeedback/UserFeedbackComplete';
33
+ import TableMessage from './TableMessage/TableMessage';
34
+ import TrMessage from './TableMessage/TrMessage';
35
+ import TdMessage from './TableMessage/TdMessage';
36
+ import TbodyMessage from './TableMessage/TbodyMessage';
37
+ import TheadMessage from './TableMessage/TheadMessage';
38
+ import ThMessage from './TableMessage/ThMessage';
39
+ import { TableProps } from '@patternfly/react-table';
40
+ import ImageMessage from './ImageMessage/ImageMessage';
41
+ import rehypeUnwrapImages from 'rehype-unwrap-images';
42
+ import rehypeExternalLinks from 'rehype-external-links';
43
+ import rehypeSanitize from 'rehype-sanitize';
44
+ import { PluggableList } from 'react-markdown/lib';
45
+ import LinkMessage from './LinkMessage/LinkMessage';
46
+ import ErrorMessage from './ErrorMessage/ErrorMessage';
28
47
 
29
- export interface QuickResponse extends Omit<LabelProps, 'children'> {
30
- content: string;
31
- id: string;
32
- onClick: () => void;
33
- }
34
48
  export interface MessageAttachment {
35
49
  /** Name of file attached to the message */
36
50
  name: string;
@@ -50,6 +64,17 @@ export interface MessageAttachment {
50
64
  spinnerTestId?: string;
51
65
  }
52
66
 
67
+ export interface MessageExtraContent {
68
+ /** Content to display before the main content */
69
+ beforeMainContent?: ReactNode;
70
+
71
+ /** Content to display after the main content */
72
+ afterMainContent?: ReactNode;
73
+
74
+ /** Content to display at the end */
75
+ endContent?: ReactNode;
76
+ }
77
+
53
78
  export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'role'> {
54
79
  /** Unique id for message */
55
80
  id?: string;
@@ -57,6 +82,8 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
57
82
  role: 'user' | 'bot';
58
83
  /** Message content */
59
84
  content?: string;
85
+ /** Extra Message content */
86
+ extraContent?: MessageExtraContent;
60
87
  /** Name of the user */
61
88
  name?: string;
62
89
  /** Avatar src for the user */
@@ -85,15 +112,45 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
85
112
  quickResponses?: QuickResponse[];
86
113
  /** Props for quick responses container */
87
114
  quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
115
+ /** Props for user feedback card */
116
+ userFeedbackForm?: Omit<UserFeedbackProps, 'ref'>;
117
+ /** Props for user feedback response */
118
+ userFeedbackComplete?: Omit<UserFeedbackCompleteProps, 'ref'>;
88
119
  /** Whether avatar is round */
89
120
  hasRoundAvatar?: boolean;
90
121
  /** Any additional props applied to the avatar, for additional customization */
91
122
  avatarProps?: Omit<AvatarProps, 'alt'>;
123
+ /** Props for QuickStart card */
124
+ quickStarts?: {
125
+ quickStart: QuickStart;
126
+ onSelectQuickStart: (id?: string) => void;
127
+ minuteWord?: string;
128
+ minuteWordPlural?: string;
129
+ prerequisiteWord?: string;
130
+ prerequisiteWordPlural?: string;
131
+ quickStartButtonAriaLabel?: string;
132
+ className?: string;
133
+ onClick?: () => void;
134
+ action?: QuickstartAction;
135
+ };
136
+ /** Turns the container into a live region so that changes to content within the Message, such as appending a feedback card, are reliably announced to assistive technology. */
137
+ isLiveRegion?: boolean;
138
+ /** Ref applied to message */
139
+ innerRef?: React.Ref<HTMLDivElement>;
140
+ /** Props for table message. It is important to include a detailed aria-label that describes the purpose of the table. */
141
+ tableProps?: Required<Pick<TableProps, 'aria-label'>> & TableProps;
142
+ /** Additional rehype plugins passed from the consumer */
143
+ additionalRehypePlugins?: PluggableList;
144
+ /** Whether to open links in message in new tab. */
145
+ openLinkInNewTab?: boolean;
146
+ /** Optional inline error message that can be displayed in the message */
147
+ error?: AlertProps;
92
148
  }
93
149
 
94
- export const Message: React.FunctionComponent<MessageProps> = ({
150
+ export const MessageBase: React.FunctionComponent<MessageProps> = ({
95
151
  role,
96
152
  content,
153
+ extraContent,
97
154
  name,
98
155
  avatar,
99
156
  timestamp,
@@ -108,8 +165,25 @@ export const Message: React.FunctionComponent<MessageProps> = ({
108
165
  attachments,
109
166
  hasRoundAvatar = true,
110
167
  avatarProps,
168
+ quickStarts,
169
+ userFeedbackForm,
170
+ userFeedbackComplete,
171
+ isLiveRegion = true,
172
+ innerRef,
173
+ tableProps,
174
+ openLinkInNewTab = true,
175
+ additionalRehypePlugins = [],
176
+ error,
111
177
  ...props
112
178
  }: MessageProps) => {
179
+ const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
180
+ let rehypePlugins: PluggableList = [rehypeUnwrapImages];
181
+ if (openLinkInNewTab) {
182
+ rehypePlugins = rehypePlugins.concat([[rehypeExternalLinks, { target: '_blank' }, rehypeSanitize]]);
183
+ }
184
+ if (additionalRehypePlugins) {
185
+ rehypePlugins.push(...additionalRehypePlugins);
186
+ }
113
187
  let avatarClassName;
114
188
  if (avatarProps && 'className' in avatarProps) {
115
189
  const { className, ...rest } = avatarProps;
@@ -123,6 +197,9 @@ export const Message: React.FunctionComponent<MessageProps> = ({
123
197
  <section
124
198
  aria-label={`Message from ${role} - ${dateString}`}
125
199
  className={`pf-chatbot__message pf-chatbot__message--${role}`}
200
+ aria-live={isLiveRegion ? 'polite' : undefined}
201
+ aria-atomic={isLiveRegion ? false : undefined}
202
+ ref={innerRef}
126
203
  {...props}
127
204
  >
128
205
  {/* We are using an empty alt tag intentionally in order to reduce noise on screen readers */}
@@ -151,32 +228,76 @@ export const Message: React.FunctionComponent<MessageProps> = ({
151
228
  {isLoading ? (
152
229
  <MessageLoading loadingWord={loadingWord} />
153
230
  ) : (
154
- <Markdown
155
- components={{
156
- p: TextMessage,
157
- code: ({ children }) => <CodeBlockMessage {...codeBlockProps}>{children}</CodeBlockMessage>,
158
- ul: UnorderedListMessage,
159
- ol: (props) => <OrderedListMessage {...props} />,
160
- li: ListItemMessage
161
- }}
162
- remarkPlugins={[remarkGfm]}
163
- >
164
- {content}
165
- </Markdown>
231
+ <>
232
+ {beforeMainContent && <>{beforeMainContent}</>}
233
+ {error ? (
234
+ <ErrorMessage {...error} />
235
+ ) : (
236
+ <Markdown
237
+ components={{
238
+ p: (props) => <TextMessage component={ContentVariants.p} {...props} />,
239
+ code: ({ children, ...props }) => (
240
+ <CodeBlockMessage {...props} {...codeBlockProps}>
241
+ {children}
242
+ </CodeBlockMessage>
243
+ ),
244
+ h1: (props) => <TextMessage component={ContentVariants.h1} {...props} />,
245
+ h2: (props) => <TextMessage component={ContentVariants.h2} {...props} />,
246
+ h3: (props) => <TextMessage component={ContentVariants.h3} {...props} />,
247
+ h4: (props) => <TextMessage component={ContentVariants.h4} {...props} />,
248
+ h5: (props) => <TextMessage component={ContentVariants.h5} {...props} />,
249
+ h6: (props) => <TextMessage component={ContentVariants.h6} {...props} />,
250
+ blockquote: (props) => <TextMessage component={ContentVariants.blockquote} {...props} />,
251
+ ul: (props) => <UnorderedListMessage {...props} />,
252
+ ol: (props) => <OrderedListMessage {...props} />,
253
+ li: (props) => <ListItemMessage {...props} />,
254
+ table: (props) => <TableMessage {...props} {...tableProps} />,
255
+ tbody: (props) => <TbodyMessage {...props} />,
256
+ thead: (props) => <TheadMessage {...props} />,
257
+ tr: (props) => <TrMessage {...props} />,
258
+ td: (props) => {
259
+ // Conflicts with Td type
260
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
261
+ const { width, ...rest } = props;
262
+ return <TdMessage {...rest} />;
263
+ },
264
+ th: (props) => <ThMessage {...props} />,
265
+ img: (props) => <ImageMessage {...props} />,
266
+ a: (props) => (
267
+ <LinkMessage href={props.href} rel={props.rel} target={props.target}>
268
+ {props.children}
269
+ </LinkMessage>
270
+ )
271
+ }}
272
+ remarkPlugins={[remarkGfm]}
273
+ rehypePlugins={rehypePlugins}
274
+ >
275
+ {content}
276
+ </Markdown>
277
+ )}
278
+ {afterMainContent && <>{afterMainContent}</>}
279
+ </>
166
280
  )}
167
281
  {!isLoading && sources && <SourcesCard {...sources} />}
282
+ {quickStarts && quickStarts.quickStart && (
283
+ <QuickStartTile
284
+ quickStart={quickStarts.quickStart}
285
+ onSelectQuickStart={quickStarts.onSelectQuickStart}
286
+ minuteWord={quickStarts.minuteWord}
287
+ minuteWordPlural={quickStarts.minuteWordPlural}
288
+ prerequisiteWord={quickStarts.prerequisiteWord}
289
+ prerequisiteWordPlural={quickStarts.prerequisiteWordPlural}
290
+ quickStartButtonAriaLabel={quickStarts.quickStartButtonAriaLabel}
291
+ />
292
+ )}
168
293
  {!isLoading && actions && <ResponseActions actions={actions} />}
294
+ {userFeedbackForm && <UserFeedback {...userFeedbackForm} timestamp={dateString} />}
295
+ {userFeedbackComplete && <UserFeedbackComplete {...userFeedbackComplete} timestamp={dateString} />}
169
296
  {!isLoading && quickResponses && (
170
- <LabelGroup
171
- className={`pf-chatbot__message-quick-response ${quickResponseContainerProps?.className}`}
172
- {...quickResponseContainerProps}
173
- >
174
- {quickResponses.map(({ id, onClick, content, ...props }: QuickResponse) => (
175
- <Label variant="outline" color="blue" key={id} onClick={onClick} {...props}>
176
- {content}
177
- </Label>
178
- ))}
179
- </LabelGroup>
297
+ <QuickResponse
298
+ quickResponses={quickResponses}
299
+ quickResponseContainerProps={quickResponseContainerProps}
300
+ />
180
301
  )}
181
302
  </div>
182
303
  {attachments && (
@@ -197,10 +318,15 @@ export const Message: React.FunctionComponent<MessageProps> = ({
197
318
  ))}
198
319
  </div>
199
320
  )}
321
+ {!isLoading && endContent && <>{endContent}</>}
200
322
  </div>
201
323
  </div>
202
324
  </section>
203
325
  );
204
326
  };
205
327
 
328
+ const Message = React.forwardRef((props: MessageProps, ref: React.Ref<HTMLDivElement>) => (
329
+ <MessageBase innerRef={ref} {...props} />
330
+ ));
331
+
206
332
  export default Message;