@patternfly/chatbot 2.2.0-prerelease.9 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) 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 +35 -8
  63. package/dist/cjs/Message/Message.js +68 -18
  64. package/dist/cjs/Message/Message.test.js +239 -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/TableMessage/TableMessage.d.ts +20 -0
  68. package/dist/cjs/Message/TableMessage/TableMessage.js +67 -0
  69. package/dist/cjs/Message/TableMessage/TbodyMessage.d.ts +7 -0
  70. package/dist/cjs/Message/TableMessage/TbodyMessage.js +33 -0
  71. package/dist/cjs/Message/TableMessage/TdMessage.d.ts +5 -0
  72. package/dist/cjs/Message/TableMessage/TdMessage.js +26 -0
  73. package/dist/cjs/Message/TableMessage/ThMessage.d.ts +5 -0
  74. package/dist/cjs/Message/TableMessage/ThMessage.js +26 -0
  75. package/dist/cjs/Message/TableMessage/TheadMessage.d.ts +5 -0
  76. package/dist/cjs/Message/TableMessage/TheadMessage.js +26 -0
  77. package/dist/cjs/Message/TableMessage/TrMessage.d.ts +7 -0
  78. package/dist/cjs/Message/TableMessage/TrMessage.js +37 -0
  79. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +2 -1
  80. package/dist/cjs/Message/TextMessage/TextMessage.js +2 -2
  81. package/dist/cjs/Message/UserFeedback/CloseButton.d.ts +10 -0
  82. package/dist/cjs/Message/UserFeedback/CloseButton.js +14 -0
  83. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +39 -0
  84. package/dist/cjs/Message/UserFeedback/UserFeedback.js +54 -0
  85. package/dist/cjs/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  86. package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +133 -0
  87. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  88. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +117 -0
  89. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  90. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +249 -0
  91. package/dist/cjs/MessageBar/AttachButton.js +4 -2
  92. package/dist/cjs/MessageBar/MessageBar.d.ts +11 -4
  93. package/dist/cjs/MessageBar/MessageBar.js +127 -46
  94. package/dist/cjs/MessageBar/MessageBar.test.js +12 -4
  95. package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -1
  96. package/dist/cjs/MessageBar/SendButton.js +3 -1
  97. package/dist/cjs/MessageBar/StopButton.js +3 -1
  98. package/dist/cjs/MessageBox/MessageBox.test.d.ts +1 -0
  99. package/dist/cjs/MessageBox/MessageBox.test.js +22 -0
  100. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  101. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.js +28 -0
  102. package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +4 -1
  103. package/dist/cjs/ResponseActions/ResponseActionButton.js +21 -6
  104. package/dist/cjs/ResponseActions/ResponseActions.d.ts +8 -2
  105. package/dist/cjs/ResponseActions/ResponseActions.js +7 -7
  106. package/dist/cjs/ResponseActions/ResponseActions.test.js +2 -2
  107. package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -0
  108. package/dist/cjs/Settings/SettingsForm.test.js +26 -0
  109. package/dist/cjs/__mocks__/rehype-external-links.d.ts +2 -0
  110. package/dist/cjs/__mocks__/rehype-external-links.js +4 -0
  111. package/dist/cjs/__mocks__/rehype-sanitize.d.ts +2 -0
  112. package/dist/cjs/__mocks__/rehype-sanitize.js +4 -0
  113. package/dist/cjs/__mocks__/rehype-unwrap-images.d.ts +2 -0
  114. package/dist/cjs/__mocks__/rehype-unwrap-images.js +4 -0
  115. package/dist/cjs/index.d.ts +4 -0
  116. package/dist/cjs/index.js +7 -1
  117. package/dist/cjs/tracking/console_tracking_provider.d.ts +10 -0
  118. package/dist/cjs/tracking/console_tracking_provider.js +27 -0
  119. package/dist/cjs/tracking/index.d.ts +2 -0
  120. package/dist/cjs/tracking/index.js +23 -0
  121. package/dist/cjs/tracking/posthog_tracking_provider.d.ts +9 -0
  122. package/dist/cjs/tracking/posthog_tracking_provider.js +37 -0
  123. package/dist/cjs/tracking/segment_tracking_provider.d.ts +10 -0
  124. package/dist/cjs/tracking/segment_tracking_provider.js +50 -0
  125. package/dist/cjs/tracking/trackingProviderProxy.d.ts +9 -0
  126. package/dist/cjs/tracking/trackingProviderProxy.js +24 -0
  127. package/dist/cjs/tracking/tracking_api.d.ts +8 -0
  128. package/dist/cjs/tracking/tracking_api.js +2 -0
  129. package/dist/cjs/tracking/tracking_registry.d.ts +4 -0
  130. package/dist/cjs/tracking/tracking_registry.js +33 -0
  131. package/dist/cjs/tracking/tracking_spi.d.ts +9 -0
  132. package/dist/cjs/tracking/tracking_spi.js +2 -0
  133. package/dist/cjs/tracking/umami_tracking_provider.d.ts +14 -0
  134. package/dist/cjs/tracking/umami_tracking_provider.js +44 -0
  135. package/dist/css/main.css +420 -148
  136. package/dist/css/main.css.map +1 -1
  137. package/dist/dynamic/Compare/package.json +1 -0
  138. package/dist/dynamic/tracking/package.json +1 -0
  139. package/dist/esm/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  140. package/dist/esm/AttachmentEdit/AttachmentEdit.test.js +47 -0
  141. package/dist/esm/Chatbot/Chatbot.d.ts +2 -1
  142. package/dist/esm/Chatbot/Chatbot.js +1 -0
  143. package/dist/esm/Chatbot/Chatbot.test.d.ts +1 -0
  144. package/dist/esm/Chatbot/Chatbot.test.js +23 -0
  145. package/dist/esm/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  146. package/dist/esm/ChatbotAlert/ChatbotAlert.test.js +22 -0
  147. package/dist/esm/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  148. package/dist/esm/ChatbotContent/ChatbotContent.test.js +13 -0
  149. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  150. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  151. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  152. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
  153. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  154. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  155. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.js +22 -0
  156. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  157. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.js +38 -0
  158. package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  159. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +13 -0
  160. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  161. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.js +82 -0
  162. package/dist/esm/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  163. package/dist/esm/ChatbotFooter/ChatbotFootnote.js +1 -1
  164. package/dist/esm/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  165. package/dist/esm/ChatbotHeader/ChatbotHeader.test.js +13 -0
  166. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  167. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.js +13 -0
  168. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
  169. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  170. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +15 -0
  171. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  172. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.js +13 -0
  173. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
  174. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  175. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +15 -0
  176. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  177. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  178. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +38 -0
  179. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
  180. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  181. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +36 -0
  182. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
  183. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
  184. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  185. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.js +50 -0
  186. package/dist/esm/ChatbotToggle/ChatbotToggle.js +3 -1
  187. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  188. package/dist/esm/Compare/Compare.d.ts +17 -0
  189. package/dist/esm/Compare/Compare.js +43 -0
  190. package/dist/esm/Compare/Compare.test.d.ts +1 -0
  191. package/dist/esm/Compare/Compare.test.js +15 -0
  192. package/dist/esm/Compare/index.d.ts +2 -0
  193. package/dist/esm/Compare/index.js +2 -0
  194. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
  195. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +21 -0
  196. package/dist/esm/Message/ImageMessage/ImageMessage.d.ts +4 -0
  197. package/dist/esm/Message/ImageMessage/ImageMessage.js +20 -0
  198. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +4 -0
  199. package/dist/esm/Message/LinkMessage/LinkMessage.js +25 -0
  200. package/dist/esm/Message/Message.d.ts +35 -8
  201. package/dist/esm/Message/Message.js +66 -16
  202. package/dist/esm/Message/Message.test.js +239 -3
  203. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +17 -0
  204. package/dist/esm/Message/QuickResponse/QuickResponse.js +27 -0
  205. package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
  206. package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
  207. package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
  208. package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
  209. package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
  210. package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
  211. package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
  212. package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
  213. package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
  214. package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
  215. package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
  216. package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
  217. package/dist/esm/Message/TextMessage/TextMessage.d.ts +2 -1
  218. package/dist/esm/Message/TextMessage/TextMessage.js +3 -3
  219. package/dist/esm/Message/UserFeedback/CloseButton.d.ts +10 -0
  220. package/dist/esm/Message/UserFeedback/CloseButton.js +9 -0
  221. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +39 -0
  222. package/dist/esm/Message/UserFeedback/UserFeedback.js +49 -0
  223. package/dist/esm/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  224. package/dist/esm/Message/UserFeedback/UserFeedback.test.js +128 -0
  225. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  226. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +112 -0
  227. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  228. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +244 -0
  229. package/dist/esm/MessageBar/AttachButton.js +4 -2
  230. package/dist/esm/MessageBar/MessageBar.d.ts +11 -4
  231. package/dist/esm/MessageBar/MessageBar.js +127 -46
  232. package/dist/esm/MessageBar/MessageBar.test.js +12 -4
  233. package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -1
  234. package/dist/esm/MessageBar/SendButton.js +3 -1
  235. package/dist/esm/MessageBar/StopButton.js +3 -1
  236. package/dist/esm/MessageBox/MessageBox.test.d.ts +1 -0
  237. package/dist/esm/MessageBox/MessageBox.test.js +17 -0
  238. package/dist/esm/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  239. package/dist/esm/PreviewAttachment/PreviewAttachment.test.js +23 -0
  240. package/dist/esm/ResponseActions/ResponseActionButton.d.ts +4 -1
  241. package/dist/esm/ResponseActions/ResponseActionButton.js +18 -3
  242. package/dist/esm/ResponseActions/ResponseActions.d.ts +8 -2
  243. package/dist/esm/ResponseActions/ResponseActions.js +7 -7
  244. package/dist/esm/ResponseActions/ResponseActions.test.js +2 -2
  245. package/dist/esm/Settings/SettingsForm.test.d.ts +1 -0
  246. package/dist/esm/Settings/SettingsForm.test.js +21 -0
  247. package/dist/esm/__mocks__/rehype-external-links.d.ts +2 -0
  248. package/dist/esm/__mocks__/rehype-external-links.js +2 -0
  249. package/dist/esm/__mocks__/rehype-sanitize.d.ts +2 -0
  250. package/dist/esm/__mocks__/rehype-sanitize.js +2 -0
  251. package/dist/esm/__mocks__/rehype-unwrap-images.d.ts +2 -0
  252. package/dist/esm/__mocks__/rehype-unwrap-images.js +2 -0
  253. package/dist/esm/index.d.ts +4 -0
  254. package/dist/esm/index.js +4 -0
  255. package/dist/esm/tracking/console_tracking_provider.d.ts +10 -0
  256. package/dist/esm/tracking/console_tracking_provider.js +23 -0
  257. package/dist/esm/tracking/index.d.ts +2 -0
  258. package/dist/esm/tracking/index.js +2 -0
  259. package/dist/esm/tracking/posthog_tracking_provider.d.ts +9 -0
  260. package/dist/esm/tracking/posthog_tracking_provider.js +33 -0
  261. package/dist/esm/tracking/segment_tracking_provider.d.ts +10 -0
  262. package/dist/esm/tracking/segment_tracking_provider.js +46 -0
  263. package/dist/esm/tracking/trackingProviderProxy.d.ts +9 -0
  264. package/dist/esm/tracking/trackingProviderProxy.js +22 -0
  265. package/dist/esm/tracking/tracking_api.d.ts +8 -0
  266. package/dist/esm/tracking/tracking_api.js +1 -0
  267. package/dist/esm/tracking/tracking_registry.d.ts +4 -0
  268. package/dist/esm/tracking/tracking_registry.js +26 -0
  269. package/dist/esm/tracking/tracking_spi.d.ts +9 -0
  270. package/dist/esm/tracking/tracking_spi.js +1 -0
  271. package/dist/esm/tracking/umami_tracking_provider.d.ts +14 -0
  272. package/dist/esm/tracking/umami_tracking_provider.js +40 -0
  273. package/dist/tsconfig.tsbuildinfo +1 -1
  274. package/package.json +8 -3
  275. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +8 -2
  276. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +192 -15
  277. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +219 -0
  278. package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentError.tsx +2 -2
  279. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +214 -12
  280. package/patternfly-docs/content/extensions/chatbot/examples/Messages/FileDropZone.tsx +2 -1
  281. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithAttachment.tsx +2 -2
  282. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +1 -1
  283. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +71 -0
  284. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedbackTimeout.tsx +27 -0
  285. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +1 -1
  286. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +2 -2
  287. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithResponseActions.tsx +1 -1
  288. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +1 -1
  289. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +49 -8
  290. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +244 -14
  291. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +54 -0
  292. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
  293. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +5 -5
  294. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderBasic.tsx +1 -1
  295. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +36 -3
  296. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
  297. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
  298. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarAttach.tsx +1 -1
  299. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomeInteraction.tsx +1 -1
  300. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomePrompt.tsx +7 -7
  301. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +21 -6
  302. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +14 -0
  303. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +39 -1
  304. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +48 -35
  305. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +2 -2
  306. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +3 -3
  307. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotInDrawer.tsx +453 -0
  308. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +11 -11
  309. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
  310. package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +104 -0
  311. package/patternfly-docs/content/extensions/chatbot/img/ai-action-inpage.svg +85 -0
  312. package/patternfly-docs/content/extensions/chatbot/img/ai-action-message.svg +63 -0
  313. package/patternfly-docs/content/extensions/chatbot/img/analytics-example.svg +127 -0
  314. package/patternfly-docs/content/extensions/chatbot/img/attached-file.svg +24 -29
  315. package/patternfly-docs/content/extensions/chatbot/img/attachment-menu.svg +4 -4
  316. package/patternfly-docs/content/extensions/chatbot/img/attachment-unsent.svg +30 -58
  317. package/patternfly-docs/content/extensions/chatbot/img/chatbot-analytics.svg +51 -0
  318. package/patternfly-docs/content/extensions/chatbot/img/chatbot-elements.svg +11 -12
  319. package/patternfly-docs/content/extensions/chatbot/img/chatbot-quickstarts-tile.svg +58 -0
  320. package/patternfly-docs/content/extensions/chatbot/img/chatbot-settings.svg +83 -0
  321. package/patternfly-docs/content/extensions/chatbot/img/comparison.svg +45 -0
  322. package/patternfly-docs/content/extensions/chatbot/img/conversation-history.svg +6 -29
  323. package/patternfly-docs/content/extensions/chatbot/img/docked.svg +259 -241
  324. package/patternfly-docs/content/extensions/chatbot/img/drawer.svg +255 -0
  325. package/patternfly-docs/content/extensions/chatbot/img/error-state.svg +30 -0
  326. package/patternfly-docs/content/extensions/chatbot/img/feedback-form.svg +88 -0
  327. package/patternfly-docs/content/extensions/chatbot/img/footnote.svg +1 -1
  328. package/patternfly-docs/content/extensions/chatbot/img/fullscreen.svg +25 -16
  329. package/patternfly-docs/content/extensions/chatbot/img/listening-pulse.svg +22 -0
  330. package/patternfly-docs/content/extensions/chatbot/img/listening.svg +1 -1
  331. package/patternfly-docs/content/extensions/chatbot/img/loading-state.svg +28 -0
  332. package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle-notification.svg +49 -0
  333. package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle.svg +75 -0
  334. package/patternfly-docs/content/extensions/chatbot/img/message-bar-elements.svg +3 -3
  335. package/patternfly-docs/content/extensions/chatbot/img/message-elements.svg +84 -142
  336. package/patternfly-docs/content/extensions/chatbot/img/message-feedback.svg +52 -0
  337. package/patternfly-docs/content/extensions/chatbot/img/message-responses.svg +54 -0
  338. package/patternfly-docs/content/extensions/chatbot/img/new-chat-emptystate.svg +27 -0
  339. package/patternfly-docs/content/extensions/chatbot/img/no-results-emptystate.svg +27 -0
  340. package/patternfly-docs/content/extensions/chatbot/img/overlay.svg +54 -39
  341. package/patternfly-docs/content/extensions/chatbot/img/posthog.svg +30 -0
  342. package/patternfly-docs/content/extensions/chatbot/img/segment.svg +36 -0
  343. package/patternfly-docs/content/extensions/chatbot/img/settings-menu.svg +122 -0
  344. package/patternfly-docs/content/extensions/chatbot/img/source-tile.svg +62 -0
  345. package/patternfly-docs/content/extensions/chatbot/img/thank-you-card.svg +81 -0
  346. package/patternfly-docs/content/extensions/chatbot/img/toggle-customizations.svg +12 -0
  347. package/patternfly-docs/content/extensions/chatbot/img/toggle-tooltips.svg +38 -0
  348. package/patternfly-docs/content/extensions/chatbot/img/umami.svg +30 -0
  349. package/patternfly-docs/content/extensions/chatbot/img/welcome-elements.svg +82 -0
  350. package/patternfly-docs/content/extensions/chatbot/img/welcome-message.svg +94 -0
  351. package/src/AttachMenu/AttachMenu.scss +1 -1
  352. package/src/AttachmentEdit/AttachmentEdit.test.tsx +55 -0
  353. package/src/Chatbot/Chatbot.scss +20 -1
  354. package/src/Chatbot/Chatbot.test.tsx +31 -0
  355. package/src/Chatbot/Chatbot.tsx +2 -1
  356. package/src/ChatbotAlert/ChatbotAlert.test.tsx +31 -0
  357. package/src/ChatbotContent/ChatbotContent.scss +1 -0
  358. package/src/ChatbotContent/ChatbotContent.test.tsx +15 -0
  359. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +10 -4
  360. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +24 -1
  361. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +242 -3
  362. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +94 -26
  363. package/src/ChatbotConversationHistoryNav/EmptyState.tsx +44 -0
  364. package/src/ChatbotConversationHistoryNav/LoadingState.tsx +38 -0
  365. package/src/ChatbotFooter/ChatbotFooter.scss +8 -4
  366. package/src/ChatbotFooter/ChatbotFooter.test.tsx +15 -0
  367. package/src/ChatbotFooter/ChatbotFooternote.test.tsx +84 -0
  368. package/src/ChatbotFooter/ChatbotFootnote.tsx +2 -2
  369. package/src/ChatbotHeader/ChatbotHeader.scss +5 -6
  370. package/src/ChatbotHeader/ChatbotHeader.test.tsx +15 -0
  371. package/src/ChatbotHeader/ChatbotHeaderActions.test.tsx +17 -0
  372. package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +20 -0
  373. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +7 -1
  374. package/src/ChatbotHeader/ChatbotHeaderMain.test.tsx +17 -0
  375. package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +19 -0
  376. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +7 -1
  377. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +45 -0
  378. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +8 -1
  379. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +43 -0
  380. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +11 -4
  381. package/src/ChatbotHeader/ChatbotHeaderTitle.test.tsx +75 -0
  382. package/src/ChatbotHeader/ChatbotHeaderTitle.tsx +7 -2
  383. package/src/ChatbotModal/ChatbotModal.scss +12 -12
  384. package/src/ChatbotToggle/ChatbotToggle.tsx +6 -1
  385. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss +2 -0
  386. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx +26 -18
  387. package/src/ChatbotWelcomePrompt/__snapshots__/ChatbotWelcomePrompt.test.tsx.snap +2 -2
  388. package/src/CodeModal/CodeModal.scss +7 -4
  389. package/src/Compare/Compare.scss +72 -0
  390. package/src/Compare/Compare.test.tsx +31 -0
  391. package/src/Compare/Compare.tsx +98 -0
  392. package/src/Compare/index.ts +2 -0
  393. package/src/FileDetails/FileDetails.scss +1 -1
  394. package/src/FileDetailsLabel/FileDetailsLabel.scss +2 -2
  395. package/src/FileDropZone/__snapshots__/FileDropZone.test.tsx.snap +1 -0
  396. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +4 -4
  397. package/src/Message/ErrorMessage/ErrorMessage.tsx +14 -0
  398. package/src/Message/ImageMessage/ImageMessage.scss +9 -0
  399. package/src/Message/ImageMessage/ImageMessage.tsx +14 -0
  400. package/src/Message/LinkMessage/LinkMessage.tsx +34 -0
  401. package/src/Message/ListMessage/ListMessage.scss +6 -6
  402. package/src/Message/Message.scss +4 -26
  403. package/src/Message/Message.test.tsx +313 -3
  404. package/src/Message/Message.tsx +130 -31
  405. package/src/Message/MessageLoading.scss +2 -2
  406. package/src/Message/QuickResponse/QuickResponse.scss +33 -0
  407. package/src/Message/QuickResponse/QuickResponse.tsx +54 -0
  408. package/src/Message/QuickStarts/QuickStartTile.scss +0 -1
  409. package/src/Message/TableMessage/TableMessage.scss +23 -0
  410. package/src/Message/TableMessage/TableMessage.tsx +83 -0
  411. package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
  412. package/src/Message/TableMessage/TdMessage.tsx +11 -0
  413. package/src/Message/TableMessage/ThMessage.tsx +11 -0
  414. package/src/Message/TableMessage/TheadMessage.tsx +11 -0
  415. package/src/Message/TableMessage/TrMessage.tsx +27 -0
  416. package/src/Message/TextMessage/TextMessage.scss +21 -12
  417. package/src/Message/TextMessage/TextMessage.tsx +3 -3
  418. package/src/Message/UserFeedback/CloseButton.tsx +21 -0
  419. package/src/Message/UserFeedback/UserFeedback.scss +53 -0
  420. package/src/Message/UserFeedback/UserFeedback.test.tsx +236 -0
  421. package/src/Message/UserFeedback/UserFeedback.tsx +128 -0
  422. package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +255 -0
  423. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +211 -0
  424. package/src/MessageBar/AttachButton.scss +19 -3
  425. package/src/MessageBar/AttachButton.tsx +3 -1
  426. package/src/MessageBar/MessageBar.scss +58 -24
  427. package/src/MessageBar/MessageBar.test.tsx +12 -4
  428. package/src/MessageBar/MessageBar.tsx +164 -65
  429. package/src/MessageBar/MicrophoneButton.scss +8 -8
  430. package/src/MessageBar/MicrophoneButton.tsx +1 -1
  431. package/src/MessageBar/SendButton.tsx +2 -0
  432. package/src/MessageBar/StopButton.scss +17 -3
  433. package/src/MessageBar/StopButton.tsx +2 -0
  434. package/src/MessageBox/JumpButton.scss +6 -6
  435. package/src/MessageBox/MessageBox.scss +1 -0
  436. package/src/MessageBox/MessageBox.test.tsx +26 -0
  437. package/src/PreviewAttachment/PreviewAttachment.test.tsx +51 -0
  438. package/src/ResponseActions/ResponseActionButton.tsx +14 -2
  439. package/src/ResponseActions/ResponseActions.scss +2 -2
  440. package/src/ResponseActions/ResponseActions.test.tsx +4 -2
  441. package/src/ResponseActions/ResponseActions.tsx +26 -2
  442. package/src/Settings/Settings.scss +2 -2
  443. package/src/Settings/SettingsForm.test.tsx +28 -0
  444. package/src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss +2 -2
  445. package/src/SourcesCard/SourcesCard.scss +9 -3
  446. package/src/TermsOfUse/TermsOfUse.scss +1 -1
  447. package/src/__mocks__/rehype-external-links.ts +3 -0
  448. package/src/__mocks__/rehype-sanitize.ts +3 -0
  449. package/src/__mocks__/rehype-unwrap-images.tsx +3 -0
  450. package/src/index.ts +6 -0
  451. package/src/main.scss +5 -6
  452. package/src/tracking/console_tracking_provider.ts +30 -0
  453. package/src/tracking/index.ts +3 -0
  454. package/src/tracking/posthog_tracking_provider.ts +42 -0
  455. package/src/tracking/segment_tracking_provider.ts +62 -0
  456. package/src/tracking/trackingProviderProxy.ts +28 -0
  457. package/src/tracking/tracking_api.ts +11 -0
  458. package/src/tracking/tracking_registry.ts +33 -0
  459. package/src/tracking/tracking_spi.ts +14 -0
  460. package/src/tracking/umami_tracking_provider.ts +54 -0
@@ -0,0 +1,21 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Error
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ import { Alert } from '@patternfly/react-core';
17
+ const ErrorMessage = (_a) => {
18
+ var { title, actionLinks, children } = _a, props = __rest(_a, ["title", "actionLinks", "children"]);
19
+ return (React.createElement(Alert, Object.assign({ isInline: true, variant: "danger", title: title, actionLinks: actionLinks }, props), children));
20
+ };
21
+ export default ErrorMessage;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { ExtraProps } from 'react-markdown';
3
+ declare const ImageMessage: ({ children, ...props }: JSX.IntrinsicElements["img"] & ExtraProps) => React.JSX.Element;
4
+ export default ImageMessage;
@@ -0,0 +1,20 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Image
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ const ImageMessage = (_a) => {
17
+ var { children } = _a, props = __rest(_a, ["children"]);
18
+ return (React.createElement("img", Object.assign({ className: "pf-chatbot__message-image" }, props), children));
19
+ };
20
+ export default ImageMessage;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { ButtonProps } from '@patternfly/react-core';
3
+ declare const LinkMessage: ({ children, target, href, ...props }: ButtonProps) => React.JSX.Element;
4
+ export default LinkMessage;
@@ -0,0 +1,25 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Link
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ import { Button } from '@patternfly/react-core';
17
+ import { ExternalLinkSquareAltIcon } from '@patternfly/react-icons';
18
+ const LinkMessage = (_a) => {
19
+ var { children, target, href } = _a, props = __rest(_a, ["children", "target", "href"]);
20
+ if (target === '_blank') {
21
+ return (React.createElement(Button, Object.assign({ component: "a", variant: "link", href: href, icon: React.createElement(ExternalLinkSquareAltIcon, null), iconPosition: "end", isInline: true, target: target }, props), children));
22
+ }
23
+ return (React.createElement(Button, Object.assign({ isInline: true, component: "a", href: href, variant: "link" }, props), children));
24
+ };
25
+ export default LinkMessage;
@@ -1,13 +1,13 @@
1
- import React from 'react';
2
- import { AvatarProps, LabelGroupProps, LabelProps } from '@patternfly/react-core';
1
+ import React, { ReactNode } from 'react';
2
+ import { AlertProps, AvatarProps, LabelGroupProps } from '@patternfly/react-core';
3
3
  import { ActionProps } from '../ResponseActions/ResponseActions';
4
4
  import { SourcesCardProps } from '../SourcesCard';
5
5
  import { QuickStart, QuickstartAction } from './QuickStarts/types';
6
- export interface QuickResponse extends Omit<LabelProps, 'children'> {
7
- content: string;
8
- id: string;
9
- onClick: () => void;
10
- }
6
+ import QuickResponse from './QuickResponse/QuickResponse';
7
+ import { UserFeedbackProps } from './UserFeedback/UserFeedback';
8
+ import { UserFeedbackCompleteProps } from './UserFeedback/UserFeedbackComplete';
9
+ import { TableProps } from '@patternfly/react-table';
10
+ import { PluggableList } from 'react-markdown/lib';
11
11
  export interface MessageAttachment {
12
12
  /** Name of file attached to the message */
13
13
  name: string;
@@ -26,6 +26,14 @@ export interface MessageAttachment {
26
26
  /** Custom test id for the loading spinner in the attachment component */
27
27
  spinnerTestId?: string;
28
28
  }
29
+ export interface MessageExtraContent {
30
+ /** Content to display before the main content */
31
+ beforeMainContent?: ReactNode;
32
+ /** Content to display after the main content */
33
+ afterMainContent?: ReactNode;
34
+ /** Content to display at the end */
35
+ endContent?: ReactNode;
36
+ }
29
37
  export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'role'> {
30
38
  /** Unique id for message */
31
39
  id?: string;
@@ -33,6 +41,8 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
33
41
  role: 'user' | 'bot';
34
42
  /** Message content */
35
43
  content?: string;
44
+ /** Extra Message content */
45
+ extraContent?: MessageExtraContent;
36
46
  /** Name of the user */
37
47
  name?: string;
38
48
  /** Avatar src for the user */
@@ -61,6 +71,10 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
61
71
  quickResponses?: QuickResponse[];
62
72
  /** Props for quick responses container */
63
73
  quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
74
+ /** Props for user feedback card */
75
+ userFeedbackForm?: Omit<UserFeedbackProps, 'ref'>;
76
+ /** Props for user feedback response */
77
+ userFeedbackComplete?: Omit<UserFeedbackCompleteProps, 'ref'>;
64
78
  /** Whether avatar is round */
65
79
  hasRoundAvatar?: boolean;
66
80
  /** Any additional props applied to the avatar, for additional customization */
@@ -78,6 +92,19 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
78
92
  onClick?: () => void;
79
93
  action?: QuickstartAction;
80
94
  };
95
+ /** 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. */
96
+ isLiveRegion?: boolean;
97
+ /** Ref applied to message */
98
+ innerRef?: React.Ref<HTMLDivElement>;
99
+ /** Props for table message. It is important to include a detailed aria-label that describes the purpose of the table. */
100
+ tableProps?: Required<Pick<TableProps, 'aria-label'>> & TableProps;
101
+ /** Additional rehype plugins passed from the consumer */
102
+ additionalRehypePlugins?: PluggableList;
103
+ /** Whether to open links in message in new tab. */
104
+ openLinkInNewTab?: boolean;
105
+ /** Optional inline error message that can be displayed in the message */
106
+ error?: AlertProps;
81
107
  }
82
- export declare const Message: React.FunctionComponent<MessageProps>;
108
+ export declare const MessageBase: React.FunctionComponent<MessageProps>;
109
+ declare const Message: React.ForwardRefExoticComponent<Omit<MessageProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
83
110
  export default Message;
@@ -15,7 +15,7 @@ var __rest = (this && this.__rest) || function (s, e) {
15
15
  import React from 'react';
16
16
  import Markdown from 'react-markdown';
17
17
  import remarkGfm from 'remark-gfm';
18
- import { Avatar, Label, LabelGroup, Timestamp, Truncate } from '@patternfly/react-core';
18
+ import { Avatar, ContentVariants, Label, Timestamp, Truncate } from '@patternfly/react-core';
19
19
  import MessageLoading from './MessageLoading';
20
20
  import CodeBlockMessage from './CodeBlockMessage/CodeBlockMessage';
21
21
  import TextMessage from './TextMessage/TextMessage';
@@ -26,8 +26,31 @@ import ListItemMessage from './ListMessage/ListItemMessage';
26
26
  import UnorderedListMessage from './ListMessage/UnorderedListMessage';
27
27
  import OrderedListMessage from './ListMessage/OrderedListMessage';
28
28
  import QuickStartTile from './QuickStarts/QuickStartTile';
29
- export const Message = (_a) => {
30
- var { role, content, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps, quickStarts } = _a, props = __rest(_a, ["role", "content", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps", "quickStarts"]);
29
+ import QuickResponse from './QuickResponse/QuickResponse';
30
+ import UserFeedback from './UserFeedback/UserFeedback';
31
+ import UserFeedbackComplete from './UserFeedback/UserFeedbackComplete';
32
+ import TableMessage from './TableMessage/TableMessage';
33
+ import TrMessage from './TableMessage/TrMessage';
34
+ import TdMessage from './TableMessage/TdMessage';
35
+ import TbodyMessage from './TableMessage/TbodyMessage';
36
+ import TheadMessage from './TableMessage/TheadMessage';
37
+ import ThMessage from './TableMessage/ThMessage';
38
+ import ImageMessage from './ImageMessage/ImageMessage';
39
+ import rehypeUnwrapImages from 'rehype-unwrap-images';
40
+ import rehypeExternalLinks from 'rehype-external-links';
41
+ import rehypeSanitize from 'rehype-sanitize';
42
+ import LinkMessage from './LinkMessage/LinkMessage';
43
+ import ErrorMessage from './ErrorMessage/ErrorMessage';
44
+ export const MessageBase = (_a) => {
45
+ var { role, content, extraContent, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps, quickStarts, userFeedbackForm, userFeedbackComplete, isLiveRegion = true, innerRef, tableProps, openLinkInNewTab = true, additionalRehypePlugins = [], error } = _a, props = __rest(_a, ["role", "content", "extraContent", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps", "quickStarts", "userFeedbackForm", "userFeedbackComplete", "isLiveRegion", "innerRef", "tableProps", "openLinkInNewTab", "additionalRehypePlugins", "error"]);
46
+ const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
47
+ let rehypePlugins = [rehypeUnwrapImages];
48
+ if (openLinkInNewTab) {
49
+ rehypePlugins = rehypePlugins.concat([[rehypeExternalLinks, { target: '_blank' }, rehypeSanitize]]);
50
+ }
51
+ if (additionalRehypePlugins) {
52
+ rehypePlugins.push(...additionalRehypePlugins);
53
+ }
31
54
  let avatarClassName;
32
55
  if (avatarProps && 'className' in avatarProps) {
33
56
  const { className } = avatarProps, rest = __rest(avatarProps, ["className"]);
@@ -37,7 +60,7 @@ export const Message = (_a) => {
37
60
  // Keep timestamps consistent between Timestamp component and aria-label
38
61
  const date = new Date();
39
62
  const dateString = timestamp !== null && timestamp !== void 0 ? timestamp : `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
40
- return (React.createElement("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}` }, props),
63
+ return (React.createElement("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}`, "aria-live": isLiveRegion ? 'polite' : undefined, "aria-atomic": isLiveRegion ? false : undefined, ref: innerRef }, props),
41
64
  React.createElement(Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps)),
42
65
  React.createElement("div", { className: "pf-chatbot__message-contents" },
43
66
  React.createElement("div", { className: "pf-chatbot__message-meta" },
@@ -47,24 +70,51 @@ export const Message = (_a) => {
47
70
  React.createElement(Timestamp, { date: date }, timestamp)),
48
71
  React.createElement("div", { className: "pf-chatbot__message-response" },
49
72
  React.createElement("div", { className: "pf-chatbot__message-and-actions" },
50
- isLoading ? (React.createElement(MessageLoading, { loadingWord: loadingWord })) : (React.createElement(Markdown, { components: {
51
- p: TextMessage,
52
- code: ({ children }) => React.createElement(CodeBlockMessage, Object.assign({}, codeBlockProps), children),
53
- ul: UnorderedListMessage,
54
- ol: (props) => React.createElement(OrderedListMessage, Object.assign({}, props)),
55
- li: ListItemMessage
56
- }, remarkPlugins: [remarkGfm] }, content)),
73
+ isLoading ? (React.createElement(MessageLoading, { loadingWord: loadingWord })) : (React.createElement(React.Fragment, null,
74
+ beforeMainContent && React.createElement(React.Fragment, null, beforeMainContent),
75
+ error ? (React.createElement(ErrorMessage, Object.assign({}, error))) : (React.createElement(Markdown, { components: {
76
+ p: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.p }, props)),
77
+ code: (_a) => {
78
+ var { children } = _a, props = __rest(_a, ["children"]);
79
+ return (React.createElement(CodeBlockMessage, Object.assign({}, props, codeBlockProps), children));
80
+ },
81
+ h1: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h1 }, props)),
82
+ h2: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h2 }, props)),
83
+ h3: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h3 }, props)),
84
+ h4: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h4 }, props)),
85
+ h5: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h5 }, props)),
86
+ h6: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h6 }, props)),
87
+ blockquote: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.blockquote }, props)),
88
+ ul: (props) => React.createElement(UnorderedListMessage, Object.assign({}, props)),
89
+ ol: (props) => React.createElement(OrderedListMessage, Object.assign({}, props)),
90
+ li: (props) => React.createElement(ListItemMessage, Object.assign({}, props)),
91
+ table: (props) => React.createElement(TableMessage, Object.assign({}, props, tableProps)),
92
+ tbody: (props) => React.createElement(TbodyMessage, Object.assign({}, props)),
93
+ thead: (props) => React.createElement(TheadMessage, Object.assign({}, props)),
94
+ tr: (props) => React.createElement(TrMessage, Object.assign({}, props)),
95
+ td: (props) => {
96
+ // Conflicts with Td type
97
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
98
+ const { width } = props, rest = __rest(props, ["width"]);
99
+ return React.createElement(TdMessage, Object.assign({}, rest));
100
+ },
101
+ th: (props) => React.createElement(ThMessage, Object.assign({}, props)),
102
+ img: (props) => React.createElement(ImageMessage, Object.assign({}, props)),
103
+ a: (props) => (React.createElement(LinkMessage, { href: props.href, rel: props.rel, target: props.target }, props.children))
104
+ }, remarkPlugins: [remarkGfm], rehypePlugins: rehypePlugins }, content)),
105
+ afterMainContent && React.createElement(React.Fragment, null, afterMainContent))),
57
106
  !isLoading && sources && React.createElement(SourcesCard, Object.assign({}, sources)),
58
107
  quickStarts && quickStarts.quickStart && (React.createElement(QuickStartTile, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel })),
59
108
  !isLoading && actions && React.createElement(ResponseActions, { actions: actions }),
60
- !isLoading && quickResponses && (React.createElement(LabelGroup, Object.assign({ className: `pf-chatbot__message-quick-response ${quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className}` }, quickResponseContainerProps), quickResponses.map((_a) => {
61
- var { id, onClick, content } = _a, props = __rest(_a, ["id", "onClick", "content"]);
62
- return (React.createElement(Label, Object.assign({ variant: "outline", color: "blue", key: id, onClick: onClick }, props), content));
63
- })))),
109
+ userFeedbackForm && React.createElement(UserFeedback, Object.assign({}, userFeedbackForm, { timestamp: dateString })),
110
+ userFeedbackComplete && React.createElement(UserFeedbackComplete, Object.assign({}, userFeedbackComplete, { timestamp: dateString })),
111
+ !isLoading && quickResponses && (React.createElement(QuickResponse, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps }))),
64
112
  attachments && (React.createElement("div", { className: "pf-chatbot__message-attachments-container" }, attachments.map((attachment) => {
65
113
  var _a;
66
114
  return (React.createElement("div", { key: (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name, className: "pf-chatbot__message-attachment" },
67
115
  React.createElement(FileDetailsLabel, { fileName: attachment.name, fileId: attachment.id, onClose: attachment.onClose, onClick: attachment.onClick, isLoading: attachment.isLoading, closeButtonAriaLabel: attachment.closeButtonAriaLabel, languageTestId: attachment.languageTestId, spinnerTestId: attachment.spinnerTestId })));
68
- })))))));
116
+ }))),
117
+ !isLoading && endContent && React.createElement(React.Fragment, null, endContent)))));
69
118
  };
119
+ const Message = React.forwardRef((props, ref) => (React.createElement(MessageBase, Object.assign({ innerRef: ref }, props))));
70
120
  export default Message;
@@ -14,6 +14,8 @@ import Message from './Message';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import { monitorSampleAppQuickStart } from './QuickStarts/monitor-sampleapp-quickstart';
16
16
  import { monitorSampleAppQuickStartWithImage } from './QuickStarts/monitor-sampleapp-quickstart-with-image';
17
+ import rehypeExternalLinks from '../__mocks__/rehype-external-links';
18
+ import { AlertActionLink } from '@patternfly/react-core';
17
19
  const ALL_ACTIONS = [
18
20
  { label: /Good response/i },
19
21
  { label: /Bad response/i },
@@ -72,6 +74,74 @@ const ORDERED_LIST_WITH_CODE = `
72
74
 
73
75
  3. Item 3
74
76
  `;
77
+ const HEADING = `
78
+ # h1 Heading
79
+
80
+ ## h2 Heading
81
+
82
+ ### h3 Heading
83
+
84
+ #### h4 Heading
85
+
86
+ ##### h5 Heading
87
+
88
+ ###### h6 Heading
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
+ const ONE_COLUMN_TABLE = `
102
+
103
+ | Column 1 |
104
+ |-|
105
+ | Cell 1 |
106
+ | Cell 2 |
107
+
108
+ `;
109
+ const ONE_CELL_TABLE = `
110
+
111
+ | Column 1 |
112
+ |-|
113
+ | Cell 1 |
114
+
115
+ `;
116
+ const HEADERLESS_TABLE = `
117
+
118
+ | |
119
+ |-|
120
+ | Cell 1 |
121
+
122
+ `;
123
+ const CHILDLESS_TABLE = `
124
+
125
+ | Column 1 |
126
+ |-|
127
+ | |
128
+
129
+ `;
130
+ const EMPTY_TABLE = `
131
+
132
+ | |
133
+ |-|
134
+ | |
135
+
136
+ `;
137
+ const IMAGE = `![Multi-colored wavy lines on a black background](https://cdn.dribbble.com/userupload/10651749/file/original-8a07b8e39d9e8bf002358c66fce1223e.gif)`;
138
+ const ERROR = {
139
+ title: 'Could not load chat',
140
+ children: 'Wait a few minutes and check your network settings. If the issue persists: ',
141
+ actionLinks: (React.createElement(React.Fragment, null,
142
+ React.createElement(AlertActionLink, { component: "a", href: "#" }, "Start a new chat"),
143
+ React.createElement(AlertActionLink, { component: "a", href: "#" }, "Contact support")))
144
+ };
75
145
  const checkListItemsRendered = () => {
76
146
  const items = ['Item 1', 'Item 2', 'Item 3'];
77
147
  expect(screen.getAllByRole('listitem')).toHaveLength(3);
@@ -81,6 +151,9 @@ const checkListItemsRendered = () => {
81
151
  });
82
152
  };
83
153
  describe('Message', () => {
154
+ beforeEach(() => {
155
+ jest.clearAllMocks();
156
+ });
84
157
  it('should render user messages correctly', () => {
85
158
  render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi" }));
86
159
  expect(screen.getByText('User')).toBeTruthy();
@@ -307,12 +380,16 @@ describe('Message', () => {
307
380
  render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: CODE_MESSAGE }));
308
381
  expect(screen.getByText('Here is some YAML code:')).toBeTruthy();
309
382
  expect(screen.getByRole('button', { name: 'Copy code button' })).toBeTruthy();
310
- expect(screen.getByText(/apiVersion: helm.openshift.io\/v1beta1/i)).toBeTruthy();
383
+ expect(screen.getByText(/yaml/)).toBeTruthy();
384
+ expect(screen.getByText(/apiVersion:/i)).toBeTruthy();
385
+ expect(screen.getByText(/helm.openshift.io\/v1beta1/i)).toBeTruthy();
311
386
  expect(screen.getByText(/metadata:/i)).toBeTruthy();
312
- expect(screen.getByText(/name: azure-sample-repo0oooo00ooo/i)).toBeTruthy();
387
+ expect(screen.getByText(/name:/i)).toBeTruthy();
388
+ expect(screen.getByText(/azure-sample-repo0oooo00ooo/i)).toBeTruthy();
313
389
  expect(screen.getByText(/spec/i)).toBeTruthy();
314
390
  expect(screen.getByText(/connectionConfig:/i)).toBeTruthy();
315
- expect(screen.getByText(/url: https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)).toBeTruthy();
391
+ expect(screen.getByText(/url:/i)).toBeTruthy();
392
+ expect(screen.getByText(/https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)).toBeTruthy();
316
393
  });
317
394
  it('can click copy code button', () => __awaiter(void 0, void 0, void 0, function* () {
318
395
  // need explicit setup since RTL stubs clipboard if you do this
@@ -378,4 +455,163 @@ describe('Message', () => {
378
455
  } }));
379
456
  expect(screen.getAllByRole('img')[1]).toHaveAttribute('src', 'test.png');
380
457
  }));
458
+ it('should handle block quote correctly', () => {
459
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: BLOCK_QUOTES }));
460
+ expect(screen.getByText(/Blockquotes can also be nested.../)).toBeTruthy();
461
+ expect(screen.getByText('...by using additional greater-than signs (>) right next to each other...')).toBeTruthy();
462
+ expect(screen.getByText(/...or with spaces between each sign./)).toBeTruthy();
463
+ });
464
+ it('should handle heading correctly', () => {
465
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: HEADING }));
466
+ expect(screen.getByRole('heading', { name: /h1 Heading/i })).toBeTruthy();
467
+ expect(screen.getByRole('heading', { name: /h2 Heading/i })).toBeTruthy();
468
+ expect(screen.getByRole('heading', { name: /h3 Heading/i })).toBeTruthy();
469
+ expect(screen.getByRole('heading', { name: /h4 Heading/i })).toBeTruthy();
470
+ expect(screen.getByRole('heading', { name: /h5 Heading/i })).toBeTruthy();
471
+ expect(screen.getByRole('heading', { name: /h6 Heading/i })).toBeTruthy();
472
+ });
473
+ it('should render table correctly', () => {
474
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE }));
475
+ expect(screen.getByRole('row', { name: /Column 1 Column 2/i })).toBeTruthy();
476
+ expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toBeTruthy();
477
+ expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toBeTruthy();
478
+ expect(screen.getByRole('columnheader', { name: /Column 1/i })).toBeTruthy();
479
+ expect(screen.getByRole('columnheader', { name: /Column 2/i })).toBeTruthy();
480
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toBeTruthy();
481
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toBeTruthy();
482
+ expect(screen.getByRole('cell', { name: /Cell 3/i })).toBeTruthy();
483
+ expect(screen.getByRole('cell', { name: /Cell 4/i })).toBeTruthy();
484
+ });
485
+ it('should render table data labels correctly for mobile breakpoint', () => {
486
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE }));
487
+ expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
488
+ expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
489
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
490
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 2');
491
+ expect(screen.getByRole('cell', { name: /Cell 3/i })).toHaveAttribute('data-label', 'Column 1');
492
+ expect(screen.getByRole('cell', { name: /Cell 4/i })).toHaveAttribute('data-label', 'Column 2');
493
+ });
494
+ it('should render table data labels correctly for mobile breakpoint for one column table', () => {
495
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: ONE_COLUMN_TABLE }));
496
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
497
+ expect(screen.getByRole('row', { name: /Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1');
498
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
499
+ expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 1');
500
+ });
501
+ it('should render table data labels correctly for mobile breakpoint for one cell table', () => {
502
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: ONE_CELL_TABLE }));
503
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
504
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
505
+ });
506
+ it('should render table data labels correctly for mobile breakpoint for headerless', () => {
507
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: HEADERLESS_TABLE }));
508
+ expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', '');
509
+ expect(screen.getByRole('cell', { name: /Cell 1/i })).not.toHaveAttribute('data-label');
510
+ });
511
+ it('should render table data labels correctly for mobile breakpoint for childless', () => {
512
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: CHILDLESS_TABLE }));
513
+ expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', 'Column 1');
514
+ });
515
+ it('should render table data labels correctly for mobile breakpoint for empty', () => {
516
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: EMPTY_TABLE }));
517
+ expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', '');
518
+ });
519
+ it('should render custom table aria label correctly', () => {
520
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE, tableProps: { 'aria-label': 'Test' } }));
521
+ expect(screen.getByRole('grid', { name: /Test/i })).toBeTruthy();
522
+ });
523
+ it('should render beforeMainContent with main content', () => {
524
+ const mainContent = 'Main message content';
525
+ const beforeMainContentText = 'Before main content';
526
+ const beforeMainContent = React.createElement("div", null, beforeMainContentText);
527
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { beforeMainContent } }));
528
+ expect(screen.getByText(beforeMainContentText)).toBeTruthy();
529
+ expect(screen.getByText(mainContent)).toBeTruthy();
530
+ });
531
+ it('should render afterMainContent with main content', () => {
532
+ const mainContent = 'Main message content';
533
+ const afterMainContentText = 'After main content';
534
+ const afterMainContent = React.createElement("div", null, afterMainContentText);
535
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { afterMainContent } }));
536
+ expect(screen.getByText(afterMainContentText)).toBeTruthy();
537
+ expect(screen.getByText(mainContent)).toBeTruthy();
538
+ });
539
+ it('should render endContent with main content', () => {
540
+ const mainContent = 'Main message content';
541
+ const endMainContentText = 'End content';
542
+ const endContent = React.createElement("div", null, endMainContentText);
543
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { endContent } }));
544
+ expect(screen.getByText(endMainContentText)).toBeTruthy();
545
+ expect(screen.getByText(mainContent)).toBeTruthy();
546
+ });
547
+ it('should render all parts of extraContent with main content', () => {
548
+ const beforeMainContent = React.createElement("div", null, "Before main content");
549
+ const afterMainContent = React.createElement("div", null, "After main content");
550
+ const endContent = React.createElement("div", null, "End content");
551
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent, afterMainContent, endContent } }));
552
+ expect(screen.getByText('Before main content')).toBeTruthy();
553
+ expect(screen.getByText('Main message content')).toBeTruthy();
554
+ expect(screen.getByText('After main content')).toBeTruthy();
555
+ expect(screen.getByText('End content')).toBeTruthy();
556
+ });
557
+ it('should not render extraContent when not provided', () => {
558
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content" }));
559
+ // Ensure no extraContent is rendered
560
+ expect(screen.getByText('Main message content')).toBeTruthy();
561
+ expect(screen.queryByText('Before main content')).toBeFalsy();
562
+ expect(screen.queryByText('After main content')).toBeFalsy();
563
+ expect(screen.queryByText('end message content')).toBeFalsy();
564
+ });
565
+ it('should handle undefined or null values in extraContent gracefully', () => {
566
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent: null, afterMainContent: undefined, endContent: null } }));
567
+ // Ensure that no extraContent is rendered if they are null or undefined
568
+ expect(screen.getByText('Main message content')).toBeTruthy();
569
+ expect(screen.queryByText('Before main content')).toBeFalsy();
570
+ expect(screen.queryByText('After main content')).toBeFalsy();
571
+ expect(screen.queryByText('end message content')).toBeFalsy();
572
+ });
573
+ it('should render JSX in extraContent correctly', () => {
574
+ const beforeMainContent = (React.createElement("div", { "data-testid": "before-main-content" },
575
+ React.createElement("strong", null, "Bold before content")));
576
+ const afterMainContent = (React.createElement("div", { "data-testid": "after-main-content" },
577
+ React.createElement("strong", null, "Bold after content")));
578
+ const endContent = (React.createElement("div", { "data-testid": "end-main-content" },
579
+ React.createElement("strong", null, "Bold end content")));
580
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent, afterMainContent, endContent } }));
581
+ // Check that the JSX is correctly rendered
582
+ expect(screen.getByTestId('before-main-content')).toContainHTML('<strong>Bold before content</strong>');
583
+ expect(screen.getByTestId('after-main-content')).toContainHTML('<strong>Bold after content</strong>');
584
+ expect(screen.getByTestId('end-main-content')).toContainHTML('<strong>Bold end content</strong>');
585
+ });
586
+ it('should handle image correctly', () => {
587
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: IMAGE }));
588
+ expect(screen.getByRole('img', { name: /Multi-colored wavy lines on a black background/i })).toBeTruthy();
589
+ });
590
+ it('should handle external links correctly', () => {
591
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: `[PatternFly](https://www.patternfly.org/)` }));
592
+ // we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
593
+ expect(rehypeExternalLinks).toHaveBeenCalledTimes(1);
594
+ });
595
+ it('should handle external links correctly', () => {
596
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: `[PatternFly](https://www.patternfly.org/)`, openLinkInNewTab: false }));
597
+ // we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
598
+ expect(rehypeExternalLinks).not.toHaveBeenCalled();
599
+ });
600
+ it('should handle error correctly', () => {
601
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", error: ERROR }));
602
+ expect(screen.getByRole('heading', { name: /Could not load chat/i })).toBeTruthy();
603
+ expect(screen.getByRole('link', { name: /Start a new chat/i })).toBeTruthy();
604
+ expect(screen.getByRole('link', { name: /Contact support/i })).toBeTruthy();
605
+ expect(screen.getByText('Wait a few minutes and check your network settings. If the issue persists:')).toBeTruthy();
606
+ });
607
+ it('should handle error correctly when loading', () => {
608
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", error: ERROR, isLoading: true }));
609
+ expect(screen.queryByRole('heading', { name: /Could not load chat/i })).toBeFalsy();
610
+ expect(screen.getByText('Loading message')).toBeTruthy();
611
+ });
612
+ it('should handle error correctly when these is content', () => {
613
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", error: ERROR, content: "Test" }));
614
+ expect(screen.getByRole('heading', { name: /Could not load chat/i })).toBeTruthy();
615
+ expect(screen.queryByText('Test')).toBeFalsy();
616
+ });
381
617
  });
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { LabelGroupProps, LabelProps } from '@patternfly/react-core';
3
+ export interface QuickResponse extends Omit<LabelProps, 'children'> {
4
+ content: string;
5
+ id: string;
6
+ onClick?: () => void;
7
+ }
8
+ export interface QuickResponseProps {
9
+ /** Props for quick responses */
10
+ quickResponses: QuickResponse[];
11
+ /** Props for quick responses container */
12
+ quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
13
+ /** Callback when a response is clicked; used in feedback cards */
14
+ onSelect?: (id: string) => void;
15
+ }
16
+ export declare const QuickResponse: React.FunctionComponent<QuickResponseProps>;
17
+ export default QuickResponse;
@@ -0,0 +1,27 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import React from 'react';
13
+ import { Label, LabelGroup } from '@patternfly/react-core';
14
+ import { CheckIcon } from '@patternfly/react-icons';
15
+ export const QuickResponse = ({ quickResponses, quickResponseContainerProps = { numLabels: 5 }, onSelect }) => {
16
+ const [selectedQuickResponse, setSelectedQuickResponse] = React.useState();
17
+ const handleQuickResponseClick = (id, onClick) => {
18
+ setSelectedQuickResponse(id);
19
+ onClick && onClick();
20
+ onSelect && onSelect(id);
21
+ };
22
+ return (React.createElement(LabelGroup, Object.assign({ className: `pf-chatbot__message-quick-response ${(quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className) ? quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className : ''}` }, quickResponseContainerProps), quickResponses.map((_a) => {
23
+ var { id, onClick, content, className } = _a, props = __rest(_a, ["id", "onClick", "content", "className"]);
24
+ return (React.createElement(Label, Object.assign({ variant: id === selectedQuickResponse ? undefined : 'outline', icon: id === selectedQuickResponse ? React.createElement(CheckIcon, null) : undefined, color: "blue", key: id, onClick: () => handleQuickResponseClick(id, onClick), className: `${id === selectedQuickResponse ? 'pf-chatbot__message-quick-response--selected' : ''} ${className ? className : ''}` }, props), content));
25
+ })));
26
+ };
27
+ export default QuickResponse;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { ExtraProps } from 'react-markdown';
3
+ import { TableProps } from '@patternfly/react-table';
4
+ interface Properties {
5
+ line: number;
6
+ column: number;
7
+ offset: number;
8
+ }
9
+ export interface TableNode {
10
+ children?: TableNode[];
11
+ value?: string;
12
+ position: {
13
+ start: Properties;
14
+ end: Properties;
15
+ };
16
+ tagName: string;
17
+ type: string;
18
+ }
19
+ declare const TableMessage: ({ children, ...props }: TableProps & ExtraProps) => React.JSX.Element;
20
+ export default TableMessage;