@servicetitan/titan-chatbot-ui-anvil2 3.1.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 (219) hide show
  1. package/CHANGELOG.md +166 -0
  2. package/README.md +15 -0
  3. package/dist/components/chatbot/__tests-cy__/chatbot-help-center.test.d.ts +2 -0
  4. package/dist/components/chatbot/__tests-cy__/chatbot-help-center.test.d.ts.map +1 -0
  5. package/dist/components/chatbot/__tests-cy__/chatbot-help-center.test.js +8 -0
  6. package/dist/components/chatbot/__tests-cy__/chatbot-help-center.test.js.map +1 -0
  7. package/dist/components/chatbot/__tests-cy__/chatbot-live.test.d.ts +2 -0
  8. package/dist/components/chatbot/__tests-cy__/chatbot-live.test.d.ts.map +1 -0
  9. package/dist/components/chatbot/__tests-cy__/chatbot-live.test.js +8 -0
  10. package/dist/components/chatbot/__tests-cy__/chatbot-live.test.js.map +1 -0
  11. package/dist/components/chatbot/__tests-cy__/chatbot-titan-chatbot.test.d.ts +2 -0
  12. package/dist/components/chatbot/__tests-cy__/chatbot-titan-chatbot.test.d.ts.map +1 -0
  13. package/dist/components/chatbot/__tests-cy__/chatbot-titan-chatbot.test.js +8 -0
  14. package/dist/components/chatbot/__tests-cy__/chatbot-titan-chatbot.test.js.map +1 -0
  15. package/dist/components/chatbot/__tests-cy__/chatbot.test.d.ts +2 -0
  16. package/dist/components/chatbot/__tests-cy__/chatbot.test.d.ts.map +1 -0
  17. package/dist/components/chatbot/__tests-cy__/chatbot.test.js +8 -0
  18. package/dist/components/chatbot/__tests-cy__/chatbot.test.js.map +1 -0
  19. package/dist/components/chatbot/chatbot-to-chat-provider-adapter.d.ts +6 -0
  20. package/dist/components/chatbot/chatbot-to-chat-provider-adapter.d.ts.map +1 -0
  21. package/dist/components/chatbot/chatbot-to-chat-provider-adapter.js +21 -0
  22. package/dist/components/chatbot/chatbot-to-chat-provider-adapter.js.map +1 -0
  23. package/dist/components/chatbot/chatbot.d.ts +10 -0
  24. package/dist/components/chatbot/chatbot.d.ts.map +1 -0
  25. package/dist/components/chatbot/chatbot.js +69 -0
  26. package/dist/components/chatbot/chatbot.js.map +1 -0
  27. package/dist/components/chatbot/chatbot.module.less +4 -0
  28. package/dist/components/chatbot/dialog/__tests-cy__/chatbot-restart-dialog.test.d.ts +2 -0
  29. package/dist/components/chatbot/dialog/__tests-cy__/chatbot-restart-dialog.test.d.ts.map +1 -0
  30. package/dist/components/chatbot/dialog/__tests-cy__/chatbot-restart-dialog.test.js +8 -0
  31. package/dist/components/chatbot/dialog/__tests-cy__/chatbot-restart-dialog.test.js.map +1 -0
  32. package/dist/components/chatbot/dialog/__tests-cy__/chatbot-restart-link.test.d.ts +2 -0
  33. package/dist/components/chatbot/dialog/__tests-cy__/chatbot-restart-link.test.d.ts.map +1 -0
  34. package/dist/components/chatbot/dialog/__tests-cy__/chatbot-restart-link.test.js +8 -0
  35. package/dist/components/chatbot/dialog/__tests-cy__/chatbot-restart-link.test.js.map +1 -0
  36. package/dist/components/chatbot/dialog/chatbot-restart-dialog.d.ts +6 -0
  37. package/dist/components/chatbot/dialog/chatbot-restart-dialog.d.ts.map +1 -0
  38. package/dist/components/chatbot/dialog/chatbot-restart-dialog.js +20 -0
  39. package/dist/components/chatbot/dialog/chatbot-restart-dialog.js.map +1 -0
  40. package/dist/components/chatbot/dialog/chatbot-restart-link.d.ts +4 -0
  41. package/dist/components/chatbot/dialog/chatbot-restart-link.d.ts.map +1 -0
  42. package/dist/components/chatbot/dialog/chatbot-restart-link.js +13 -0
  43. package/dist/components/chatbot/dialog/chatbot-restart-link.js.map +1 -0
  44. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form-guardrail.test.d.ts +2 -0
  45. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form-guardrail.test.d.ts.map +1 -0
  46. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form-guardrail.test.js +8 -0
  47. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form-guardrail.test.js.map +1 -0
  48. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form.test.d.ts +2 -0
  49. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form.test.d.ts.map +1 -0
  50. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form.test.js +8 -0
  51. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form.test.js.map +1 -0
  52. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-popover.test.d.ts +2 -0
  53. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-popover.test.d.ts.map +1 -0
  54. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-popover.test.js +8 -0
  55. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-popover.test.js.map +1 -0
  56. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-session-feedback-modal.test.d.ts +2 -0
  57. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-session-feedback-modal.test.d.ts.map +1 -0
  58. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-session-feedback-modal.test.js +8 -0
  59. package/dist/components/chatbot/feedback/__tests-cy__/chatbot-session-feedback-modal.test.js.map +1 -0
  60. package/dist/components/chatbot/feedback/chatbot-message-feedback-form-guardrail.d.ts +3 -0
  61. package/dist/components/chatbot/feedback/chatbot-message-feedback-form-guardrail.d.ts.map +1 -0
  62. package/dist/components/chatbot/feedback/chatbot-message-feedback-form-guardrail.js +16 -0
  63. package/dist/components/chatbot/feedback/chatbot-message-feedback-form-guardrail.js.map +1 -0
  64. package/dist/components/chatbot/feedback/chatbot-message-feedback-form.d.ts +3 -0
  65. package/dist/components/chatbot/feedback/chatbot-message-feedback-form.d.ts.map +1 -0
  66. package/dist/components/chatbot/feedback/chatbot-message-feedback-form.js +18 -0
  67. package/dist/components/chatbot/feedback/chatbot-message-feedback-form.js.map +1 -0
  68. package/dist/components/chatbot/feedback/chatbot-message-feedback-form.module.less +15 -0
  69. package/dist/components/chatbot/feedback/chatbot-message-feedback-popover.d.ts +9 -0
  70. package/dist/components/chatbot/feedback/chatbot-message-feedback-popover.d.ts.map +1 -0
  71. package/dist/components/chatbot/feedback/chatbot-message-feedback-popover.js +61 -0
  72. package/dist/components/chatbot/feedback/chatbot-message-feedback-popover.js.map +1 -0
  73. package/dist/components/chatbot/feedback/chatbot-message-feedback-popover.module.less +14 -0
  74. package/dist/components/chatbot/feedback/chatbot-message-feedback.d.ts +9 -0
  75. package/dist/components/chatbot/feedback/chatbot-message-feedback.d.ts.map +1 -0
  76. package/dist/components/chatbot/feedback/chatbot-message-feedback.js +17 -0
  77. package/dist/components/chatbot/feedback/chatbot-message-feedback.js.map +1 -0
  78. package/dist/components/chatbot/feedback/chatbot-session-feedback-link.d.ts +4 -0
  79. package/dist/components/chatbot/feedback/chatbot-session-feedback-link.d.ts.map +1 -0
  80. package/dist/components/chatbot/feedback/chatbot-session-feedback-link.js +15 -0
  81. package/dist/components/chatbot/feedback/chatbot-session-feedback-link.js.map +1 -0
  82. package/dist/components/chatbot/feedback/chatbot-session-feedback-modal.d.ts +5 -0
  83. package/dist/components/chatbot/feedback/chatbot-session-feedback-modal.d.ts.map +1 -0
  84. package/dist/components/chatbot/feedback/chatbot-session-feedback-modal.js +25 -0
  85. package/dist/components/chatbot/feedback/chatbot-session-feedback-modal.js.map +1 -0
  86. package/dist/components/chatbot/filters/__tests-cy__/chatbot-filters.test.d.ts +2 -0
  87. package/dist/components/chatbot/filters/__tests-cy__/chatbot-filters.test.d.ts.map +1 -0
  88. package/dist/components/chatbot/filters/__tests-cy__/chatbot-filters.test.js +8 -0
  89. package/dist/components/chatbot/filters/__tests-cy__/chatbot-filters.test.js.map +1 -0
  90. package/dist/components/chatbot/filters/chatbot-filter-button.d.ts +7 -0
  91. package/dist/components/chatbot/filters/chatbot-filter-button.d.ts.map +1 -0
  92. package/dist/components/chatbot/filters/chatbot-filter-button.js +39 -0
  93. package/dist/components/chatbot/filters/chatbot-filter-button.js.map +1 -0
  94. package/dist/components/chatbot/filters/chatbot-filter.d.ts +8 -0
  95. package/dist/components/chatbot/filters/chatbot-filter.d.ts.map +1 -0
  96. package/dist/components/chatbot/filters/chatbot-filter.js +71 -0
  97. package/dist/components/chatbot/filters/chatbot-filter.js.map +1 -0
  98. package/dist/components/chatbot/filters/chatbot-filter.module.css +43 -0
  99. package/dist/components/chatbot/filters/chatbot-filters.d.ts +5 -0
  100. package/dist/components/chatbot/filters/chatbot-filters.d.ts.map +1 -0
  101. package/dist/components/chatbot/filters/chatbot-filters.js +11 -0
  102. package/dist/components/chatbot/filters/chatbot-filters.js.map +1 -0
  103. package/dist/components/chatbot/messages/__tests-cy__/chatbot-links.test.d.ts +2 -0
  104. package/dist/components/chatbot/messages/__tests-cy__/chatbot-links.test.d.ts.map +1 -0
  105. package/dist/components/chatbot/messages/__tests-cy__/chatbot-links.test.js +8 -0
  106. package/dist/components/chatbot/messages/__tests-cy__/chatbot-links.test.js.map +1 -0
  107. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-answer-readonly.test.d.ts +2 -0
  108. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-answer-readonly.test.d.ts.map +1 -0
  109. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-answer-readonly.test.js +8 -0
  110. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-answer-readonly.test.js.map +1 -0
  111. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-answer.test.d.ts +2 -0
  112. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-answer.test.d.ts.map +1 -0
  113. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-answer.test.js +8 -0
  114. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-answer.test.js.map +1 -0
  115. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-typing.test.d.ts +2 -0
  116. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-typing.test.d.ts.map +1 -0
  117. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-typing.test.js +8 -0
  118. package/dist/components/chatbot/messages/__tests-cy__/chatbot-message-typing.test.js.map +1 -0
  119. package/dist/components/chatbot/messages/chatbot-links.d.ts +15 -0
  120. package/dist/components/chatbot/messages/chatbot-links.d.ts.map +1 -0
  121. package/dist/components/chatbot/messages/chatbot-links.js +21 -0
  122. package/dist/components/chatbot/messages/chatbot-links.js.map +1 -0
  123. package/dist/components/chatbot/messages/chatbot-links.module.less +24 -0
  124. package/dist/components/chatbot/messages/chatbot-message-agent-footer.d.ts +8 -0
  125. package/dist/components/chatbot/messages/chatbot-message-agent-footer.d.ts.map +1 -0
  126. package/dist/components/chatbot/messages/chatbot-message-agent-footer.js +13 -0
  127. package/dist/components/chatbot/messages/chatbot-message-agent-footer.js.map +1 -0
  128. package/dist/components/chatbot/messages/chatbot-message-answer-readonly.d.ts +6 -0
  129. package/dist/components/chatbot/messages/chatbot-message-answer-readonly.d.ts.map +1 -0
  130. package/dist/components/chatbot/messages/chatbot-message-answer-readonly.js +17 -0
  131. package/dist/components/chatbot/messages/chatbot-message-answer-readonly.js.map +1 -0
  132. package/dist/components/chatbot/messages/chatbot-message-answer.d.ts +6 -0
  133. package/dist/components/chatbot/messages/chatbot-message-answer.d.ts.map +1 -0
  134. package/dist/components/chatbot/messages/chatbot-message-answer.js +29 -0
  135. package/dist/components/chatbot/messages/chatbot-message-answer.js.map +1 -0
  136. package/dist/components/chatbot/messages/chatbot-message-answer.module.less +3 -0
  137. package/dist/components/chatbot/messages/chatbot-message-timeout.d.ts +6 -0
  138. package/dist/components/chatbot/messages/chatbot-message-timeout.d.ts.map +1 -0
  139. package/dist/components/chatbot/messages/chatbot-message-timeout.js +17 -0
  140. package/dist/components/chatbot/messages/chatbot-message-timeout.js.map +1 -0
  141. package/dist/components/chatbot/messages/chatbot-message-typing.d.ts +8 -0
  142. package/dist/components/chatbot/messages/chatbot-message-typing.d.ts.map +1 -0
  143. package/dist/components/chatbot/messages/chatbot-message-typing.js +27 -0
  144. package/dist/components/chatbot/messages/chatbot-message-typing.js.map +1 -0
  145. package/dist/components/chatbot/messages/chatbot-message-welcome.d.ts +3 -0
  146. package/dist/components/chatbot/messages/chatbot-message-welcome.d.ts.map +1 -0
  147. package/dist/components/chatbot/messages/chatbot-message-welcome.js +4 -0
  148. package/dist/components/chatbot/messages/chatbot-message-welcome.js.map +1 -0
  149. package/dist/components/chatbot/templates/chatbot-message-template-agent-readonly.d.ts +6 -0
  150. package/dist/components/chatbot/templates/chatbot-message-template-agent-readonly.d.ts.map +1 -0
  151. package/dist/components/chatbot/templates/chatbot-message-template-agent-readonly.js +12 -0
  152. package/dist/components/chatbot/templates/chatbot-message-template-agent-readonly.js.map +1 -0
  153. package/dist/components/chatbot/templates/chatbot-message-template-agent.d.ts +6 -0
  154. package/dist/components/chatbot/templates/chatbot-message-template-agent.d.ts.map +1 -0
  155. package/dist/components/chatbot/templates/chatbot-message-template-agent.js +10 -0
  156. package/dist/components/chatbot/templates/chatbot-message-template-agent.js.map +1 -0
  157. package/dist/components/chatbot/templates/chatbot-message-template-user-readonly.d.ts +6 -0
  158. package/dist/components/chatbot/templates/chatbot-message-template-user-readonly.d.ts.map +1 -0
  159. package/dist/components/chatbot/templates/chatbot-message-template-user-readonly.js +7 -0
  160. package/dist/components/chatbot/templates/chatbot-message-template-user-readonly.js.map +1 -0
  161. package/dist/index.d.ts +6 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +6 -0
  164. package/dist/index.js.map +1 -0
  165. package/package.json +59 -0
  166. package/src/components/chatbot/__tests-cy__/chatbot-help-center.test.tsx +9 -0
  167. package/src/components/chatbot/__tests-cy__/chatbot-live.test.tsx +7 -0
  168. package/src/components/chatbot/__tests-cy__/chatbot-titan-chatbot.test.tsx +9 -0
  169. package/src/components/chatbot/__tests-cy__/chatbot.test.tsx +7 -0
  170. package/src/components/chatbot/chatbot-to-chat-provider-adapter.tsx +36 -0
  171. package/src/components/chatbot/chatbot.module.less +4 -0
  172. package/src/components/chatbot/chatbot.module.less.d.ts +3 -0
  173. package/src/components/chatbot/chatbot.tsx +99 -0
  174. package/src/components/chatbot/dialog/__tests-cy__/chatbot-restart-dialog.test.tsx +9 -0
  175. package/src/components/chatbot/dialog/__tests-cy__/chatbot-restart-link.test.tsx +9 -0
  176. package/src/components/chatbot/dialog/chatbot-restart-dialog.tsx +41 -0
  177. package/src/components/chatbot/dialog/chatbot-restart-link.tsx +29 -0
  178. package/src/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form-guardrail.test.tsx +10 -0
  179. package/src/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-form.test.tsx +9 -0
  180. package/src/components/chatbot/feedback/__tests-cy__/chatbot-message-feedback-popover.test.tsx +9 -0
  181. package/src/components/chatbot/feedback/__tests-cy__/chatbot-session-feedback-modal.test.tsx +9 -0
  182. package/src/components/chatbot/feedback/chatbot-message-feedback-form-guardrail.tsx +40 -0
  183. package/src/components/chatbot/feedback/chatbot-message-feedback-form.module.less +15 -0
  184. package/src/components/chatbot/feedback/chatbot-message-feedback-form.module.less.d.ts +4 -0
  185. package/src/components/chatbot/feedback/chatbot-message-feedback-form.tsx +76 -0
  186. package/src/components/chatbot/feedback/chatbot-message-feedback-popover.module.less +14 -0
  187. package/src/components/chatbot/feedback/chatbot-message-feedback-popover.module.less.d.ts +5 -0
  188. package/src/components/chatbot/feedback/chatbot-message-feedback-popover.tsx +207 -0
  189. package/src/components/chatbot/feedback/chatbot-message-feedback.tsx +27 -0
  190. package/src/components/chatbot/feedback/chatbot-session-feedback-link.tsx +27 -0
  191. package/src/components/chatbot/feedback/chatbot-session-feedback-modal.tsx +95 -0
  192. package/src/components/chatbot/filters/__tests-cy__/chatbot-filters.test.tsx +9 -0
  193. package/src/components/chatbot/filters/chatbot-filter-button.tsx +58 -0
  194. package/src/components/chatbot/filters/chatbot-filter.module.css +43 -0
  195. package/src/components/chatbot/filters/chatbot-filter.module.css.d.ts +5 -0
  196. package/src/components/chatbot/filters/chatbot-filter.tsx +166 -0
  197. package/src/components/chatbot/filters/chatbot-filters.tsx +17 -0
  198. package/src/components/chatbot/messages/__tests-cy__/chatbot-links.test.tsx +9 -0
  199. package/src/components/chatbot/messages/__tests-cy__/chatbot-message-answer-readonly.test.tsx +9 -0
  200. package/src/components/chatbot/messages/__tests-cy__/chatbot-message-answer.test.tsx +9 -0
  201. package/src/components/chatbot/messages/__tests-cy__/chatbot-message-typing.test.tsx +9 -0
  202. package/src/components/chatbot/messages/chatbot-links.module.less +24 -0
  203. package/src/components/chatbot/messages/chatbot-links.module.less.d.ts +5 -0
  204. package/src/components/chatbot/messages/chatbot-links.tsx +73 -0
  205. package/src/components/chatbot/messages/chatbot-message-agent-footer.tsx +35 -0
  206. package/src/components/chatbot/messages/chatbot-message-answer-readonly.tsx +39 -0
  207. package/src/components/chatbot/messages/chatbot-message-answer.module.less +3 -0
  208. package/src/components/chatbot/messages/chatbot-message-answer.module.less.d.ts +3 -0
  209. package/src/components/chatbot/messages/chatbot-message-answer.tsx +55 -0
  210. package/src/components/chatbot/messages/chatbot-message-timeout.tsx +20 -0
  211. package/src/components/chatbot/messages/chatbot-message-typing.tsx +43 -0
  212. package/src/components/chatbot/messages/chatbot-message-welcome.tsx +16 -0
  213. package/src/components/chatbot/templates/chatbot-message-template-agent-readonly.tsx +25 -0
  214. package/src/components/chatbot/templates/chatbot-message-template-agent.tsx +25 -0
  215. package/src/components/chatbot/templates/chatbot-message-template-user-readonly.tsx +16 -0
  216. package/src/cypress.d.ts +10 -0
  217. package/src/index.ts +5 -0
  218. package/tsconfig.json +25 -0
  219. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,36 @@
1
+ import { Provider, useDependencies } from '@servicetitan/react-ioc';
2
+ import {
3
+ CHAT_UI_BACKEND_STORE_TOKEN,
4
+ CHAT_UI_STORE_TOKEN,
5
+ } from '@servicetitan/titan-chat-ui-common';
6
+ import {
7
+ CHATBOT_UI_BACKEND_STORE_TOKEN,
8
+ CHATBOT_UI_STORE_TOKEN,
9
+ } from '@servicetitan/titan-chatbot-api';
10
+ import { FC, PropsWithChildren } from 'react';
11
+
12
+ /**
13
+ * Passes the Chatbot UI store and backend store to the Chat UI providers.
14
+ */
15
+ export const ChatbotToChatProviderAdapter: FC<PropsWithChildren> = ({ children }) => {
16
+ const [chatbotUiStore, chatbotUiBackendStore] = useDependencies(
17
+ CHATBOT_UI_STORE_TOKEN,
18
+ CHATBOT_UI_BACKEND_STORE_TOKEN
19
+ );
20
+ return (
21
+ <Provider
22
+ singletons={[
23
+ {
24
+ provide: CHAT_UI_STORE_TOKEN,
25
+ useValue: chatbotUiStore,
26
+ },
27
+ {
28
+ provide: CHAT_UI_BACKEND_STORE_TOKEN,
29
+ useValue: chatbotUiBackendStore,
30
+ },
31
+ ]}
32
+ >
33
+ {children}
34
+ </Provider>
35
+ );
36
+ };
@@ -0,0 +1,4 @@
1
+ .chat {
2
+ flex-grow: 1;
3
+ height: 0;
4
+ }
@@ -0,0 +1,3 @@
1
+ export const __esModule: true;
2
+ export const chat: string;
3
+
@@ -0,0 +1,99 @@
1
+ import { Flex } from '@servicetitan/anvil2';
2
+ import { useDependencies } from '@servicetitan/react-ioc';
3
+ import { Chat } from '@servicetitan/titan-chat-ui-anvil2';
4
+ import {
5
+ ChatMessageModelText,
6
+ ChatMessageModelTimeout,
7
+ ChatMessageModelWelcome,
8
+ ChatParticipantIcon,
9
+ } from '@servicetitan/titan-chat-ui-common';
10
+ import {
11
+ CHATBOT_UI_BACKEND_STORE_TOKEN,
12
+ CHATBOT_UI_STORE_TOKEN,
13
+ ChatbotCustomizations,
14
+ } from '@servicetitan/titan-chatbot-api';
15
+ import { observer } from 'mobx-react';
16
+ import { CSSProperties, FC, useEffect, useMemo } from 'react';
17
+ import { ChatbotToChatProviderAdapter } from './chatbot-to-chat-provider-adapter';
18
+ import * as Styles from './chatbot.module.less';
19
+ import { ChatFilters } from './filters/chatbot-filters';
20
+ import { ChatbotMessageAnswer } from './messages/chatbot-message-answer';
21
+ import { ChatbotMessageTimeout } from './messages/chatbot-message-timeout';
22
+ import { ChatbotMessageTyping } from './messages/chatbot-message-typing';
23
+ import { ChatbotMessageWelcome } from './messages/chatbot-message-welcome';
24
+ import { ChatbotMessageTemplateAgent } from './templates/chatbot-message-template-agent';
25
+
26
+ export interface IChatbotProps {
27
+ className?: string;
28
+ style?: CSSProperties;
29
+ customizations?: ChatbotCustomizations;
30
+ onReady?: () => void;
31
+ }
32
+
33
+ export const Chatbot: FC<IChatbotProps> = observer(
34
+ ({ className, customizations, onReady, style }) => {
35
+ const [chatUiStore, chatUiBackendStore] = useDependencies(
36
+ CHATBOT_UI_STORE_TOKEN,
37
+ CHATBOT_UI_BACKEND_STORE_TOKEN
38
+ );
39
+ useEffect(() => {
40
+ const init = async () => {
41
+ chatUiBackendStore.subscribe();
42
+ await chatUiStore.run({
43
+ agentName: 'Titan',
44
+ agentIcon: ChatParticipantIcon.Bot,
45
+ });
46
+ onReady?.();
47
+ };
48
+ init().then(() => {});
49
+ return () => chatUiBackendStore.unsubscribe();
50
+ // eslint-disable-next-line react-hooks/exhaustive-deps
51
+ }, []);
52
+
53
+ const customizationsMerged = useMemo<ChatbotCustomizations>(() => {
54
+ const templateCustomizations = customizations?.messageTemplates ?? {};
55
+ templateCustomizations.agent = templateCustomizations.agent ?? {
56
+ predicate: message => message.participant.isAgent,
57
+ component: ChatbotMessageTemplateAgent,
58
+ };
59
+ return {
60
+ error: customizations?.error,
61
+ filters: customizations?.filters,
62
+ feedback: customizations?.feedback,
63
+ footerComponent: customizations?.footerComponent,
64
+ messageTyping: customizations?.messageTyping ?? {
65
+ component: ChatbotMessageTyping,
66
+ },
67
+ messages: [
68
+ ...(customizations?.messages ?? []),
69
+ {
70
+ predicate: (message: ChatMessageModelWelcome) => message.type === 'welcome',
71
+ component: ChatbotMessageWelcome,
72
+ },
73
+ {
74
+ predicate: (message: ChatMessageModelText) =>
75
+ message.participant.isAgent && message.type === 'message',
76
+ component: ChatbotMessageAnswer,
77
+ },
78
+ {
79
+ predicate: (message: ChatMessageModelTimeout) => message.type === 'timeout',
80
+ component: ChatbotMessageTimeout,
81
+ isSystem: true,
82
+ },
83
+ ],
84
+ messageTemplates: templateCustomizations,
85
+ };
86
+ }, [customizations]);
87
+
88
+ return (
89
+ <ChatbotToChatProviderAdapter>
90
+ <Flex direction="column" className={className} style={style}>
91
+ <Chat className={Styles.chat} customizations={customizationsMerged} />
92
+ {Boolean(customizationsMerged.filters?.enabled) && (
93
+ <ChatFilters className="p-inline-6 p-block-end-4" />
94
+ )}
95
+ </Flex>
96
+ </ChatbotToChatProviderAdapter>
97
+ );
98
+ }
99
+ );
@@ -0,0 +1,9 @@
1
+ import { AnvilProvider } from '@servicetitan/anvil2';
2
+ import { runChatbotRestartDialogSharedTests } from '@servicetitan/titan-chatbot-ui-cypress';
3
+ import { ChatbotRestartDialog } from '../chatbot-restart-dialog';
4
+
5
+ describe('[ChatbotRestartDialog]', () => {
6
+ runChatbotRestartDialogSharedTests(ChatbotRestartDialog, component => (
7
+ <AnvilProvider>{component}</AnvilProvider>
8
+ ));
9
+ });
@@ -0,0 +1,9 @@
1
+ import { AnvilProvider } from '@servicetitan/anvil2';
2
+ import { runChatbotRestartLinkSharedTests } from '@servicetitan/titan-chatbot-ui-cypress';
3
+ import { ChatbotRestartLink } from '../chatbot-restart-link';
4
+
5
+ describe('[ChatbotRestartLink]', () => {
6
+ runChatbotRestartLinkSharedTests(ChatbotRestartLink, component => (
7
+ <AnvilProvider>{component}</AnvilProvider>
8
+ ));
9
+ });
@@ -0,0 +1,41 @@
1
+ import { Button, Dialog, Flex } from '@servicetitan/anvil2';
2
+ import { useDependencies } from '@servicetitan/react-ioc';
3
+ import { CHATBOT_UI_STORE_TOKEN } from '@servicetitan/titan-chatbot-api';
4
+ import { FC, useCallback, useState } from 'react';
5
+
6
+ export const ChatbotRestartDialog: FC<{ confirmText: string; onClose: () => void }> = ({
7
+ confirmText,
8
+ onClose,
9
+ }) => {
10
+ const [isRestartDialogOpen, setIsRestartDialogOpen] = useState(true);
11
+ const [chatbotUiStore] = useDependencies(CHATBOT_UI_STORE_TOKEN);
12
+
13
+ const handleCloseDialog = useCallback(() => {
14
+ setIsRestartDialogOpen(false);
15
+ onClose();
16
+ }, [onClose]);
17
+
18
+ const handleRestart = useCallback(() => {
19
+ setIsRestartDialogOpen(false);
20
+ onClose();
21
+ chatbotUiStore.restart();
22
+ }, [onClose, chatbotUiStore]);
23
+
24
+ return (
25
+ <Dialog open={isRestartDialogOpen} data-cy="titan-chatbot-restart-dialog">
26
+ <Dialog.Content>
27
+ <Flex className="m-block-start-4">{confirmText}</Flex>
28
+ </Dialog.Content>
29
+ <Dialog.Footer>
30
+ <Flex justifyContent="flex-end">
31
+ <Flex gap="3">
32
+ <Button onClick={handleCloseDialog}>Cancel</Button>
33
+ <Button appearance="primary" onClick={handleRestart}>
34
+ Restart
35
+ </Button>
36
+ </Flex>
37
+ </Flex>
38
+ </Dialog.Footer>
39
+ </Dialog>
40
+ );
41
+ };
@@ -0,0 +1,29 @@
1
+ import { Link, LinkProps } from '@servicetitan/anvil2';
2
+ import { FC, Fragment, MouseEvent, useCallback, useState } from 'react';
3
+ import { ChatbotRestartDialog } from './chatbot-restart-dialog';
4
+
5
+ export const ChatbotRestartLink: FC<LinkProps> = ({ children, onClick, ...rest }) => {
6
+ const [isRestartDialogOpen, setIsRestartDialogOpen] = useState(false);
7
+
8
+ const handleRestartOpen = useCallback(
9
+ (event: MouseEvent<HTMLAnchorElement>) => {
10
+ setIsRestartDialogOpen(true);
11
+ onClick?.(event);
12
+ },
13
+ [onClick]
14
+ );
15
+
16
+ return (
17
+ <Fragment>
18
+ <Link {...rest} onClick={handleRestartOpen} data-cy="titan-chatbot-restart-session">
19
+ {children}
20
+ </Link>
21
+ {isRestartDialogOpen && (
22
+ <ChatbotRestartDialog
23
+ confirmText="Restart Titan session?"
24
+ onClose={() => setIsRestartDialogOpen(false)}
25
+ />
26
+ )}
27
+ </Fragment>
28
+ );
29
+ };
@@ -0,0 +1,10 @@
1
+ import { AnvilProvider } from '@servicetitan/anvil2';
2
+ import { runChatbotMessageFeedbackFormGuardrailSharedTests } from '@servicetitan/titan-chatbot-ui-cypress';
3
+ import { ChatbotMessageFeedbackFormGuardrail } from '../chatbot-message-feedback-form-guardrail';
4
+
5
+ describe('[ChatbotMessageFeedbackFormGuardrail]', () => {
6
+ runChatbotMessageFeedbackFormGuardrailSharedTests(
7
+ ChatbotMessageFeedbackFormGuardrail,
8
+ component => <AnvilProvider>{component}</AnvilProvider>
9
+ );
10
+ });
@@ -0,0 +1,9 @@
1
+ import { AnvilProvider } from '@servicetitan/anvil2';
2
+ import { runChatbotMessageFeedbackFormSharedTests } from '@servicetitan/titan-chatbot-ui-cypress';
3
+ import { ChatbotMessageFeedbackForm } from '../chatbot-message-feedback-form';
4
+
5
+ describe('[ChatbotMessageFeedbackForm]', () => {
6
+ runChatbotMessageFeedbackFormSharedTests(ChatbotMessageFeedbackForm, component => (
7
+ <AnvilProvider>{component}</AnvilProvider>
8
+ ));
9
+ });
@@ -0,0 +1,9 @@
1
+ import { AnvilProvider } from '@servicetitan/anvil2';
2
+ import { runChatbotMessageFeedbackPopoverSharedTests } from '@servicetitan/titan-chatbot-ui-cypress';
3
+ import { ChatbotMessageFeedbackPopover } from '../chatbot-message-feedback-popover';
4
+
5
+ describe('[ChatbotMessageFeedbackPopover]', () => {
6
+ runChatbotMessageFeedbackPopoverSharedTests(ChatbotMessageFeedbackPopover, component => (
7
+ <AnvilProvider>{component}</AnvilProvider>
8
+ ));
9
+ });
@@ -0,0 +1,9 @@
1
+ import { AnvilProvider } from '@servicetitan/anvil2';
2
+ import { runChatbotSessionFeedbackModalSharedTests } from '@servicetitan/titan-chatbot-ui-cypress';
3
+ import { ChatbotSessionFeedbackModal } from '../chatbot-session-feedback-modal';
4
+
5
+ describe('[ChatbotSessionFeedbackModal]', () => {
6
+ runChatbotSessionFeedbackModalSharedTests(ChatbotSessionFeedbackModal, component => (
7
+ <AnvilProvider>{component}</AnvilProvider>
8
+ ));
9
+ });
@@ -0,0 +1,40 @@
1
+ import { Flex, TextField, Textarea } from '@servicetitan/anvil2';
2
+ import { FormStateErrorBanner } from '@servicetitan/form';
3
+ import { useDependencies } from '@servicetitan/react-ioc';
4
+ import { MessageFeedbackGuardrailStore } from '@servicetitan/titan-chatbot-api';
5
+ import classNames from 'classnames';
6
+ import { observer } from 'mobx-react';
7
+ import { ChangeEvent, FC } from 'react';
8
+ import * as Styles from './chatbot-message-feedback-form.module.less';
9
+
10
+ export const ChatbotMessageFeedbackFormGuardrail: FC = observer(() => {
11
+ const [store] = useDependencies(MessageFeedbackGuardrailStore);
12
+
13
+ const onLinkUrlChange = (event: ChangeEvent<HTMLInputElement>) => {
14
+ store.formState.$.linkUrl.onChange(event.target.value);
15
+ };
16
+
17
+ return (
18
+ <Flex direction="column" gap="4">
19
+ {store.formState.error && <FormStateErrorBanner form={store.formState} />}
20
+ <form data-cy="titan-chatbot-message-feedback-form">
21
+ <TextField
22
+ label="Link to correct article"
23
+ className={classNames(Styles.formItem)}
24
+ error={store.formState.$.linkUrl.error}
25
+ value={store.formState.$.linkUrl.value}
26
+ onChange={onLinkUrlChange}
27
+ data-cy="titan-chatbot-message-feedback-form-link-url"
28
+ />
29
+ <Textarea
30
+ label="Notes"
31
+ className={classNames(Styles.formItem, Styles.textArea)}
32
+ value={store.formState.$.comment.value}
33
+ onChange={store.formState.$.comment.onChangeHandler}
34
+ onBlur={store.formState.$.comment.enableAutoValidationAndValidate}
35
+ data-cy="titan-chatbot-message-feedback-form-other-comment"
36
+ />
37
+ </form>
38
+ </Flex>
39
+ );
40
+ });
@@ -0,0 +1,15 @@
1
+ @import '@servicetitan/tokens/dist/tokens.less';
2
+
3
+ .formItem {
4
+ margin-bottom: @spacing-2;
5
+ white-space: nowrap;
6
+ }
7
+
8
+ .formItem.textArea {
9
+ margin-bottom: @spacing-1;
10
+ }
11
+
12
+ .formItem.textArea textarea {
13
+ resize: none;
14
+ height: 4lh;
15
+ }
@@ -0,0 +1,4 @@
1
+ export const __esModule: true;
2
+ export const formItem: string;
3
+ export const textArea: string;
4
+
@@ -0,0 +1,76 @@
1
+ import { Checkbox, Flex, Text, Textarea } from '@servicetitan/anvil2';
2
+ import { CheckboxFieldState } from '@servicetitan/form';
3
+ import { useDependencies } from '@servicetitan/react-ioc';
4
+ import { MessageFeedbackStore } from '@servicetitan/titan-chatbot-api';
5
+ import classNames from 'classnames';
6
+ import { observer } from 'mobx-react';
7
+ import { FC } from 'react';
8
+ import * as Styles from './chatbot-message-feedback-form.module.less';
9
+
10
+ export const ChatbotMessageFeedbackForm: FC = observer(() => {
11
+ const [store] = useDependencies(MessageFeedbackStore);
12
+
13
+ const onCheckboxChange = (checkbox: keyof MessageFeedbackStore['formState']['$']) => {
14
+ return (_: any, state: any) => {
15
+ const fieldState = store.formState.$[checkbox] as CheckboxFieldState;
16
+ fieldState.onChange(!state.checked);
17
+ };
18
+ };
19
+
20
+ return (
21
+ <form data-cy="titan-chatbot-message-feedback-form">
22
+ <Flex direction="column">
23
+ <Checkbox
24
+ label="Answer is unrelated to my question"
25
+ className={Styles.formItem}
26
+ checked={store.formState.$.unrelated.value}
27
+ onChange={onCheckboxChange('unrelated')}
28
+ data-cy="titan-chatbot-message-feedback-form-unrelated"
29
+ />
30
+ <Checkbox
31
+ label="Answer is unclear, not sure what it means"
32
+ className={Styles.formItem}
33
+ checked={store.formState.$.unclear.value}
34
+ onChange={onCheckboxChange('unclear')}
35
+ data-cy="titan-chatbot-message-feedback-form-unclear"
36
+ />
37
+ <Checkbox
38
+ label="Answer doesn’t fully address the question"
39
+ className={Styles.formItem}
40
+ checked={store.formState.$.notFull.value}
41
+ onChange={onCheckboxChange('notFull')}
42
+ data-cy="titan-chatbot-message-feedback-form-not-full"
43
+ />
44
+ <Checkbox
45
+ label="Answer is incorrect or doesn’t work"
46
+ className={Styles.formItem}
47
+ checked={store.formState.$.incorrect.value}
48
+ onChange={onCheckboxChange('incorrect')}
49
+ data-cy="titan-chatbot-message-feedback-form-incorrect"
50
+ />
51
+ <Checkbox
52
+ label="Other"
53
+ className={Styles.formItem}
54
+ checked={store.formState.$.other.value}
55
+ onChange={onCheckboxChange('other')}
56
+ data-cy="titan-chatbot-message-feedback-form-other"
57
+ />
58
+ {store.isTextAreaVisible && (
59
+ <div className="m-inline-start-8">
60
+ <Textarea
61
+ className={classNames(Styles.formItem, Styles.textArea)}
62
+ error={store.formState.$.otherComment.error}
63
+ value={store.formState.$.otherComment.value}
64
+ onChange={store.formState.$.otherComment.onChangeHandler}
65
+ onBlur={store.formState.$.otherComment.enableAutoValidationAndValidate}
66
+ data-cy="titan-chatbot-message-feedback-form-other-comment"
67
+ />
68
+ <Text size="small" subdued className="m-block-end-2">
69
+ Tell us more about what can be improved.
70
+ </Text>
71
+ </div>
72
+ )}
73
+ </Flex>
74
+ </form>
75
+ );
76
+ });
@@ -0,0 +1,14 @@
1
+ @import '@servicetitan/tokens/dist/tokens.less';
2
+
3
+ .feedback {
4
+ min-width: 200px;
5
+ max-width: 200px;
6
+ }
7
+
8
+ .feedbackResultText {
9
+ white-space: nowrap;
10
+ }
11
+
12
+ .provideAnswer {
13
+ text-transform: uppercase;
14
+ }
@@ -0,0 +1,5 @@
1
+ export const __esModule: true;
2
+ export const feedback: string;
3
+ export const feedbackResultText: string;
4
+ export const provideAnswer: string;
5
+
@@ -0,0 +1,207 @@
1
+ import { Button, Flex, Icon, Link, Popover, Spinner, Text } from '@servicetitan/anvil2';
2
+ import IconCheck from '@servicetitan/anvil2/assets/icons/material/round/check.svg';
3
+ import IconError from '@servicetitan/anvil2/assets/icons/material/round/error.svg';
4
+ import IconThumbDown from '@servicetitan/anvil2/assets/icons/material/round/thumb_down.svg';
5
+ import IconThumbUp from '@servicetitan/anvil2/assets/icons/material/round/thumb_up.svg';
6
+ import { provide, useDependencies } from '@servicetitan/react-ioc';
7
+ import {
8
+ CHATBOT_UI_STORE_TOKEN,
9
+ IMessageFeedbackBaseStore,
10
+ MessageFeedbackGuardrailStore,
11
+ MessageFeedbackStore,
12
+ Models,
13
+ } from '@servicetitan/titan-chatbot-api';
14
+ import classNames from 'classnames';
15
+ import { observer } from 'mobx-react';
16
+ import { FC, Fragment, HTMLAttributes, useCallback, useState } from 'react';
17
+ import { ChatbotMessageFeedbackForm } from './chatbot-message-feedback-form';
18
+ import { ChatbotMessageFeedbackFormGuardrail } from './chatbot-message-feedback-form-guardrail';
19
+ import * as Styles from './chatbot-message-feedback-popover.module.less';
20
+
21
+ interface IChatbotMessageFeedbackProps {
22
+ botMessage: Models.IBotMessage;
23
+ className?: string;
24
+ }
25
+
26
+ export const ChatbotMessageFeedbackPopover: FC<IChatbotMessageFeedbackProps> = provide({
27
+ singletons: [MessageFeedbackStore, MessageFeedbackGuardrailStore],
28
+ })(
29
+ observer(({ botMessage, className }) => {
30
+ const [chatbotUiStore, messageFeedbackStore, messageFeedbackGuardrailStore] =
31
+ useDependencies(
32
+ CHATBOT_UI_STORE_TOKEN,
33
+ MessageFeedbackStore,
34
+ MessageFeedbackGuardrailStore
35
+ );
36
+ const [feedbackState, setFeedbackState] = useState<Models.ChatbotFeedbackState>(
37
+ Models.ChatbotFeedbackState.None
38
+ );
39
+ const [isPopoverOpen, setIsPopoverOpen] = useState(false);
40
+ const title = chatbotUiStore.customizations.feedback?.title;
41
+ const isGuardrail = botMessage.isGuardrailed;
42
+ const feedbackStore: IMessageFeedbackBaseStore = isGuardrail
43
+ ? messageFeedbackGuardrailStore
44
+ : messageFeedbackStore;
45
+
46
+ const sendFeedback = useCallback(
47
+ async (feedback: Models.IFeedback) => {
48
+ setFeedbackState(Models.ChatbotFeedbackState.Sent);
49
+ try {
50
+ await chatbotUiStore.sendMessageFeedback(botMessage, feedback);
51
+ setFeedbackState(Models.ChatbotFeedbackState.Success);
52
+ } catch {
53
+ setFeedbackState(Models.ChatbotFeedbackState.Failure);
54
+ }
55
+ },
56
+ [chatbotUiStore, botMessage]
57
+ );
58
+
59
+ const handleFeedbackThumbsUp = useCallback(async () => {
60
+ await sendFeedback(new Models.Feedback({ rating: Models.FeedbackRatings.ThumbsUp }));
61
+ }, [sendFeedback]);
62
+
63
+ const handleFeedbackSubmit = useCallback(async () => {
64
+ const validateResult = await feedbackStore.formState.validate();
65
+ if (validateResult.hasError) {
66
+ return;
67
+ }
68
+ const feedback = feedbackStore.export();
69
+ await sendFeedback(feedback);
70
+ }, [feedbackStore, sendFeedback]);
71
+
72
+ if (feedbackState === Models.ChatbotFeedbackState.Sent) {
73
+ return (
74
+ <Flex
75
+ direction="row"
76
+ gap="2"
77
+ alignItems="center"
78
+ className={classNames(className, Styles.feedback)}
79
+ data-cy="titan-chatbot-message-feedback-loading"
80
+ >
81
+ <Spinner />
82
+ </Flex>
83
+ );
84
+ }
85
+ if (feedbackState === Models.ChatbotFeedbackState.Success) {
86
+ return (
87
+ <Flex
88
+ direction="row"
89
+ gap="2"
90
+ alignItems="center"
91
+ className={classNames(className, Styles.feedback)}
92
+ >
93
+ <Icon svg={IconCheck} className="c-status-success" />
94
+ <Text
95
+ className={Styles.feedbackResultText}
96
+ subdued
97
+ size="small"
98
+ data-cy="titan-chatbot-message-feedback-success"
99
+ >
100
+ Thanks for your feedback.
101
+ </Text>
102
+ </Flex>
103
+ );
104
+ }
105
+ if (feedbackState === Models.ChatbotFeedbackState.Failure) {
106
+ // Feedback is done: either user clicked thumbs up or submitted feedback
107
+ return (
108
+ <Flex
109
+ direction="row"
110
+ gap="2"
111
+ alignItems="center"
112
+ className={classNames(className, Styles.feedback)}
113
+ data-cy="titan-chatbot-message-feedback-failed"
114
+ >
115
+ <Icon svg={IconError} className="c-status-danger" />
116
+ <Text className={classNames('c-status-danger', Styles.feedbackResultText)}>
117
+ Failed to send feedback.
118
+ </Text>
119
+ </Flex>
120
+ );
121
+ }
122
+ const SubmitButton = (
123
+ <Button
124
+ appearance="primary"
125
+ disabled={!feedbackStore.isValid}
126
+ onClick={handleFeedbackSubmit}
127
+ data-cy="titan-chatbot-message-feedback-submit"
128
+ >
129
+ Submit
130
+ </Button>
131
+ );
132
+ return (
133
+ <Flex direction="row" gap="2" alignItems="center" className={className}>
134
+ {!isGuardrail && title && <Text variant="eyebrow">{title}</Text>}
135
+ {!isGuardrail && (
136
+ <Button
137
+ icon={IconThumbUp}
138
+ size="small"
139
+ appearance="ghost"
140
+ aria-label="thumb up"
141
+ onClick={handleFeedbackThumbsUp}
142
+ data-cy="titan-chatbot-message-feedback-thumbs-up"
143
+ />
144
+ )}
145
+ <Popover
146
+ placement="top-start"
147
+ onOutsidePress={() => setIsPopoverOpen(false)}
148
+ open={isPopoverOpen}
149
+ >
150
+ {isGuardrail ? (
151
+ <Fragment>
152
+ <Popover.Trigger>
153
+ {props => (
154
+ <Link
155
+ {...(props as unknown as HTMLAttributes<HTMLAnchorElement>)}
156
+ onClick={() => setIsPopoverOpen(true)}
157
+ className={classNames(
158
+ 'fs-paragraph-small',
159
+ Styles.provideAnswer
160
+ )}
161
+ color="blue"
162
+ data-cy="titan-chatbot-message-feedback-provide-answer"
163
+ >
164
+ Provide correct answer
165
+ </Link>
166
+ )}
167
+ </Popover.Trigger>
168
+ <Popover.Content>
169
+ <Flex direction="column">
170
+ <Flex justifyContent="space-between" alignItems="center">
171
+ <Text el="h3" variant="headline" size="small">
172
+ Provide correct answer
173
+ </Text>
174
+ </Flex>
175
+ <ChatbotMessageFeedbackFormGuardrail />
176
+ {SubmitButton}
177
+ </Flex>
178
+ </Popover.Content>
179
+ </Fragment>
180
+ ) : (
181
+ <Fragment>
182
+ <Popover.Button
183
+ icon={IconThumbDown}
184
+ size="small"
185
+ appearance="ghost"
186
+ onClick={() => setIsPopoverOpen(true)}
187
+ aria-label="thumb down"
188
+ data-cy="titan-chatbot-message-feedback-thumbs-down"
189
+ />
190
+ <Popover.Content>
191
+ <Flex direction="column">
192
+ <Flex justifyContent="space-between" alignItems="center">
193
+ <Text el="h3" variant="headline" size="small">
194
+ Why didn't this answer solve your problem?
195
+ </Text>
196
+ </Flex>
197
+ <ChatbotMessageFeedbackForm />
198
+ {SubmitButton}
199
+ </Flex>
200
+ </Popover.Content>
201
+ </Fragment>
202
+ )}
203
+ </Popover>
204
+ </Flex>
205
+ );
206
+ })
207
+ );