@servicetitan/titan-chatbot-ui-anvil2 3.2.1 → 4.0.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.
- package/CHANGELOG.md +29 -0
- package/dist/components/chatbot/chatbot.d.ts +3 -0
- package/dist/components/chatbot/chatbot.d.ts.map +1 -1
- package/dist/components/chatbot/chatbot.js +5 -3
- package/dist/components/chatbot/chatbot.js.map +1 -1
- package/dist/components/chatbot/dialog/chatbot-restart-link.d.ts.map +1 -1
- package/dist/components/chatbot/dialog/chatbot-restart-link.js +4 -1
- package/dist/components/chatbot/dialog/chatbot-restart-link.js.map +1 -1
- package/dist/components/chatbot/feedback/chatbot-message-feedback-popover.d.ts.map +1 -1
- package/dist/components/chatbot/feedback/chatbot-message-feedback-popover.js +3 -2
- package/dist/components/chatbot/feedback/chatbot-message-feedback-popover.js.map +1 -1
- package/dist/components/chatbot/feedback/chatbot-message-feedback.d.ts.map +1 -1
- package/dist/components/chatbot/feedback/chatbot-message-feedback.js +4 -5
- package/dist/components/chatbot/feedback/chatbot-message-feedback.js.map +1 -1
- package/dist/components/chatbot/feedback/chatbot-session-feedback-modal.d.ts.map +1 -1
- package/dist/components/chatbot/feedback/chatbot-session-feedback-modal.js +2 -2
- package/dist/components/chatbot/feedback/chatbot-session-feedback-modal.js.map +1 -1
- package/dist/components/chatbot/messages/chatbot-message-welcome.d.ts.map +1 -1
- package/dist/components/chatbot/messages/chatbot-message-welcome.js +6 -1
- package/dist/components/chatbot/messages/chatbot-message-welcome.js.map +1 -1
- package/package.json +7 -7
- package/src/components/chatbot/chatbot.tsx +7 -3
- package/src/components/chatbot/dialog/chatbot-restart-link.tsx +4 -1
- package/src/components/chatbot/feedback/chatbot-message-feedback-popover.tsx +3 -1
- package/src/components/chatbot/feedback/chatbot-message-feedback.tsx +3 -6
- package/src/components/chatbot/feedback/chatbot-session-feedback-modal.tsx +4 -2
- package/src/components/chatbot/messages/chatbot-message-welcome.tsx +18 -13
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
# v4.0.1 (Fri Sep 19 2025)
|
|
2
|
+
|
|
3
|
+
#### 🐛 Bug Fix
|
|
4
|
+
|
|
5
|
+
- SPA-7400: Fixed agent name [#57](https://github.com/servicetitan/titan-chatbot-client/pull/57) ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Alexandr Yarmolchuk ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# v4.0.0 (Fri Sep 19 2025)
|
|
14
|
+
|
|
15
|
+
#### 💥 Breaking Change
|
|
16
|
+
|
|
17
|
+
- Bump cypress from 14.3.3 to 15.2.0 [#55](https://github.com/servicetitan/titan-chatbot-client/pull/55) ([@dependabot[bot]](https://github.com/dependabot[bot]))
|
|
18
|
+
|
|
19
|
+
#### 🚀 Enhancement
|
|
20
|
+
|
|
21
|
+
- SPA-7400: Rebrand Support Chatbot to Atlas [#56](https://github.com/servicetitan/titan-chatbot-client/pull/56) ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
|
|
22
|
+
|
|
23
|
+
#### Authors: 2
|
|
24
|
+
|
|
25
|
+
- [@dependabot[bot]](https://github.com/dependabot[bot])
|
|
26
|
+
- Alexandr Yarmolchuk ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
1
30
|
# v3.2.0 (Tue Sep 09 2025)
|
|
2
31
|
|
|
3
32
|
#### 🚀 Enhancement
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { ChatParticipantIcon } from '@servicetitan/titan-chat-ui-common';
|
|
1
2
|
import { ChatbotCustomizations } from '@servicetitan/titan-chatbot-api';
|
|
2
3
|
import { CSSProperties, FC } from 'react';
|
|
3
4
|
export interface IChatbotProps {
|
|
4
5
|
className?: string;
|
|
5
6
|
style?: CSSProperties;
|
|
6
7
|
customizations?: ChatbotCustomizations;
|
|
8
|
+
botIcon?: ChatParticipantIcon;
|
|
9
|
+
botName?: string;
|
|
7
10
|
onReady?: () => void;
|
|
8
11
|
}
|
|
9
12
|
export declare const Chatbot: FC<IChatbotProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot.d.ts","sourceRoot":"","sources":["../../../src/components/chatbot/chatbot.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chatbot.d.ts","sourceRoot":"","sources":["../../../src/components/chatbot/chatbot.tsx"],"names":[],"mappings":"AAGA,OAAO,EAIH,mBAAmB,EACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAGH,qBAAqB,EACxB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAsB,MAAM,OAAO,CAAC;AAU9D,MAAM,WAAW,aAAa;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,aAAa,CAoErC,CAAC"}
|
|
@@ -14,15 +14,15 @@ import { ChatbotMessageTimeout } from './messages/chatbot-message-timeout';
|
|
|
14
14
|
import { ChatbotMessageTyping } from './messages/chatbot-message-typing';
|
|
15
15
|
import { ChatbotMessageWelcome } from './messages/chatbot-message-welcome';
|
|
16
16
|
import { ChatbotMessageTemplateAgent } from './templates/chatbot-message-template-agent';
|
|
17
|
-
export const Chatbot = observer(({ className, customizations, onReady, style }) => {
|
|
17
|
+
export const Chatbot = observer(({ botIcon, botName, className, customizations, onReady, style }) => {
|
|
18
18
|
var _a;
|
|
19
19
|
const [chatUiStore, chatUiBackendStore] = useDependencies(CHATBOT_UI_STORE_TOKEN, CHATBOT_UI_BACKEND_STORE_TOKEN);
|
|
20
20
|
useEffect(() => {
|
|
21
21
|
const init = async () => {
|
|
22
22
|
chatUiBackendStore.subscribe();
|
|
23
23
|
await chatUiStore.run({
|
|
24
|
-
agentName: 'Titan',
|
|
25
|
-
agentIcon: ChatParticipantIcon.Bot,
|
|
24
|
+
agentName: botName !== null && botName !== void 0 ? botName : 'Titan',
|
|
25
|
+
agentIcon: botIcon !== null && botIcon !== void 0 ? botIcon : ChatParticipantIcon.Bot,
|
|
26
26
|
});
|
|
27
27
|
onReady === null || onReady === void 0 ? void 0 : onReady();
|
|
28
28
|
};
|
|
@@ -38,6 +38,8 @@ export const Chatbot = observer(({ className, customizations, onReady, style })
|
|
|
38
38
|
component: ChatbotMessageTemplateAgent,
|
|
39
39
|
};
|
|
40
40
|
return {
|
|
41
|
+
loadingComponent: customizations === null || customizations === void 0 ? void 0 : customizations.loadingComponent,
|
|
42
|
+
input: customizations === null || customizations === void 0 ? void 0 : customizations.input,
|
|
41
43
|
error: customizations === null || customizations === void 0 ? void 0 : customizations.error,
|
|
42
44
|
filters: customizations === null || customizations === void 0 ? void 0 : customizations.filters,
|
|
43
45
|
feedback: customizations === null || customizations === void 0 ? void 0 : customizations.feedback,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot.js","sourceRoot":"","sources":["../../../src/components/chatbot/chatbot.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAIH,mBAAmB,GACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,8BAA8B,EAC9B,sBAAsB,GAEzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAqB,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"chatbot.js","sourceRoot":"","sources":["../../../src/components/chatbot/chatbot.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-restart-link.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/dialog/chatbot-restart-link.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAQ,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"chatbot-restart-link.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/dialog/chatbot-restart-link.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAQ,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,EAAE,EAA+C,MAAM,OAAO,CAAC;AAGxE,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,SAAS,CAyB5C,CAAC"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Link } from '@servicetitan/anvil2';
|
|
3
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
4
|
+
import { CHATBOT_UI_STORE_TOKEN } from '@servicetitan/titan-chatbot-api';
|
|
3
5
|
import { Fragment, useCallback, useState } from 'react';
|
|
4
6
|
import { ChatbotRestartDialog } from './chatbot-restart-dialog';
|
|
5
7
|
export const ChatbotRestartLink = ({ children, onClick, ...rest }) => {
|
|
8
|
+
const [chatbotUiStore] = useDependencies(CHATBOT_UI_STORE_TOKEN);
|
|
6
9
|
const [isRestartDialogOpen, setIsRestartDialogOpen] = useState(false);
|
|
7
10
|
const handleRestartOpen = useCallback((event) => {
|
|
8
11
|
setIsRestartDialogOpen(true);
|
|
9
12
|
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
10
13
|
}, [onClick]);
|
|
11
|
-
return (_jsxs(Fragment, { children: [_jsx(Link, { ...rest, onClick: handleRestartOpen, "data-cy": "titan-chatbot-restart-session", children: children }), isRestartDialogOpen && (_jsx(ChatbotRestartDialog, { confirmText:
|
|
14
|
+
return (_jsxs(Fragment, { children: [_jsx(Link, { ...rest, onClick: handleRestartOpen, "data-cy": "titan-chatbot-restart-session", children: children }), isRestartDialogOpen && (_jsx(ChatbotRestartDialog, { confirmText: `Restart ${chatbotUiStore.agent.name} session?`, onClose: () => setIsRestartDialogOpen(false) }))] }));
|
|
12
15
|
};
|
|
13
16
|
//# sourceMappingURL=chatbot-restart-link.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-restart-link.js","sourceRoot":"","sources":["../../../../src/components/chatbot/dialog/chatbot-restart-link.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAM,QAAQ,EAAc,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAkB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IAChF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtE,MAAM,iBAAiB,GAAG,WAAW,CACjC,CAAC,KAAoC,EAAE,EAAE;QACrC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,KAAK,CAAC,CAAC;IACrB,CAAC,EACD,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,OAAO,CACH,MAAC,QAAQ,eACL,KAAC,IAAI,OAAK,IAAI,EAAE,OAAO,EAAE,iBAAiB,aAAU,+BAA+B,YAC9E,QAAQ,GACN,EACN,mBAAmB,IAAI,CACpB,KAAC,oBAAoB,IACjB,WAAW,
|
|
1
|
+
{"version":3,"file":"chatbot-restart-link.js","sourceRoot":"","sources":["../../../../src/components/chatbot/dialog/chatbot-restart-link.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAM,QAAQ,EAAc,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAkB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IAChF,MAAM,CAAC,cAAc,CAAC,GAAG,eAAe,CAAC,sBAAsB,CAAC,CAAC;IACjE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtE,MAAM,iBAAiB,GAAG,WAAW,CACjC,CAAC,KAAoC,EAAE,EAAE;QACrC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,KAAK,CAAC,CAAC;IACrB,CAAC,EACD,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,OAAO,CACH,MAAC,QAAQ,eACL,KAAC,IAAI,OAAK,IAAI,EAAE,OAAO,EAAE,iBAAiB,aAAU,+BAA+B,YAC9E,QAAQ,GACN,EACN,mBAAmB,IAAI,CACpB,KAAC,oBAAoB,IACjB,WAAW,EAAE,WAAW,cAAc,CAAC,KAAK,CAAC,IAAI,WAAW,EAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAC9C,CACL,IACM,CACd,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-message-feedback-popover.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-message-feedback-popover.tsx"],"names":[],"mappings":"AAMA,OAAO,EAKH,MAAM,
|
|
1
|
+
{"version":3,"file":"chatbot-message-feedback-popover.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-message-feedback-popover.tsx"],"names":[],"mappings":"AAMA,OAAO,EAKH,MAAM,EAET,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAE,EAAE,EAAmD,MAAM,OAAO,CAAC;AAK5E,UAAU,4BAA4B;IAClC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,6BAA6B,EAAE,EAAE,CAAC,4BAA4B,CAsL1E,CAAC"}
|
|
@@ -5,7 +5,7 @@ import IconError from '@servicetitan/anvil2/assets/icons/material/round/error.sv
|
|
|
5
5
|
import IconThumbDown from '@servicetitan/anvil2/assets/icons/material/round/thumb_down.svg';
|
|
6
6
|
import IconThumbUp from '@servicetitan/anvil2/assets/icons/material/round/thumb_up.svg';
|
|
7
7
|
import { provide, useDependencies } from '@servicetitan/react-ioc';
|
|
8
|
-
import { CHATBOT_UI_STORE_TOKEN, MessageFeedbackGuardrailStore, MessageFeedbackStore, Models, } from '@servicetitan/titan-chatbot-api';
|
|
8
|
+
import { CHATBOT_UI_STORE_TOKEN, MessageFeedbackGuardrailStore, MessageFeedbackStore, Models, useCustomizationChatbot, } from '@servicetitan/titan-chatbot-api';
|
|
9
9
|
import classNames from 'classnames';
|
|
10
10
|
import { observer } from 'mobx-react';
|
|
11
11
|
import { Fragment, useCallback, useState } from 'react';
|
|
@@ -16,10 +16,11 @@ export const ChatbotMessageFeedbackPopover = provide({
|
|
|
16
16
|
singletons: [MessageFeedbackStore, MessageFeedbackGuardrailStore],
|
|
17
17
|
})(observer(({ botMessage, className }) => {
|
|
18
18
|
var _a;
|
|
19
|
+
const customization = useCustomizationChatbot();
|
|
19
20
|
const [chatbotUiStore, messageFeedbackStore, messageFeedbackGuardrailStore] = useDependencies(CHATBOT_UI_STORE_TOKEN, MessageFeedbackStore, MessageFeedbackGuardrailStore);
|
|
20
21
|
const [feedbackState, setFeedbackState] = useState(Models.ChatbotFeedbackState.None);
|
|
21
22
|
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
|
22
|
-
const title = (_a =
|
|
23
|
+
const title = (_a = customization.feedback) === null || _a === void 0 ? void 0 : _a.title;
|
|
23
24
|
const isGuardrail = botMessage.isGuardrailed;
|
|
24
25
|
const feedbackStore = isGuardrail
|
|
25
26
|
? messageFeedbackGuardrailStore
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-message-feedback-popover.js","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-message-feedback-popover.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,SAAS,MAAM,4DAA4D,CAAC;AACnF,OAAO,SAAS,MAAM,4DAA4D,CAAC;AACnF,OAAO,aAAa,MAAM,iEAAiE,CAAC;AAC5F,OAAO,WAAW,MAAM,+DAA+D,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EACH,sBAAsB,EAEtB,6BAA6B,EAC7B,oBAAoB,EACpB,MAAM,
|
|
1
|
+
{"version":3,"file":"chatbot-message-feedback-popover.js","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-message-feedback-popover.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-message-feedback.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-message-feedback.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chatbot-message-feedback.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-message-feedback.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA2B,MAAM,iCAAiC,CAAC;AAElF,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAG3B,UAAU,qBAAqB;IAC3B,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC,qBAAqB,CAa5D,CAAC"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import { CHATBOT_UI_STORE_TOKEN } from '@servicetitan/titan-chatbot-api';
|
|
2
|
+
import { useCustomizationChatbot } from '@servicetitan/titan-chatbot-api';
|
|
4
3
|
import { observer } from 'mobx-react';
|
|
5
4
|
import { ChatbotMessageFeedbackPopover } from './chatbot-message-feedback-popover';
|
|
6
5
|
export const ChatbotMessageFeedback = observer(({ botMessage, className }) => {
|
|
7
|
-
var _a
|
|
8
|
-
const
|
|
6
|
+
var _a;
|
|
7
|
+
const customization = useCustomizationChatbot();
|
|
9
8
|
// We show feedback for all messages with normal answer and for guardrailed messages if internal chatbot setting is enabled
|
|
10
|
-
const showGuardrailFeedback = Boolean((
|
|
9
|
+
const showGuardrailFeedback = Boolean((_a = customization === null || customization === void 0 ? void 0 : customization.feedback) === null || _a === void 0 ? void 0 : _a.showGuardrailFeedback);
|
|
11
10
|
const isFeedbackVisible = showGuardrailFeedback || !botMessage.isGuardrailed;
|
|
12
11
|
if (!isFeedbackVisible) {
|
|
13
12
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-message-feedback.js","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-message-feedback.tsx"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"chatbot-message-feedback.js","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-message-feedback.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAU,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAOnF,MAAM,CAAC,MAAM,sBAAsB,GAA8B,QAAQ,CACrE,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;;IAC1B,MAAM,aAAa,GAAG,uBAAuB,EAAE,CAAC;IAEhD,2HAA2H;IAC3H,MAAM,qBAAqB,GAAG,OAAO,CAAC,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,QAAQ,0CAAE,qBAAqB,CAAC,CAAC;IACtF,MAAM,iBAAiB,GAAG,qBAAqB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;IAE7E,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,KAAC,6BAA6B,IAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,GAAI,CAAC;AAC3F,CAAC,CACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-session-feedback-modal.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-session-feedback-modal.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAe,EAAE,EAAe,MAAM,OAAO,CAAC;AAErD,eAAO,MAAM,2BAA2B,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"chatbot-session-feedback-modal.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-session-feedback-modal.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAe,EAAE,EAAe,MAAM,OAAO,CAAC;AAErD,eAAO,MAAM,2BAA2B,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CA4FnE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Button, ButtonToggle, Dialog, Flex, Text, Textarea } from '@servicetitan/anvil2';
|
|
3
3
|
import IconThumbDown from '@servicetitan/anvil2/assets/icons/material/round/thumb_down.svg';
|
|
4
4
|
import IconThumbUp from '@servicetitan/anvil2/assets/icons/material/round/thumb_up.svg';
|
|
@@ -20,7 +20,7 @@ export const ChatbotSessionFeedbackModal = provide({
|
|
|
20
20
|
const handleThumbs = useCallback((isThumbsUp) => {
|
|
21
21
|
chatbotFeedbackStore.formState.$.thumbs.onChange(isThumbsUp ? 1 : -1);
|
|
22
22
|
}, [chatbotFeedbackStore]);
|
|
23
|
-
return (_jsxs(Dialog, { onClose: handleClose, open: true, title:
|
|
23
|
+
return (_jsxs(Dialog, { onClose: handleClose, open: true, title: `Give Feedback on ${chatbotUiStore.agent.name}`, "data-cy": "titan-chatbot-session-feedback-modal", children: [_jsx(Dialog.Content, { children: _jsxs(Flex, { direction: "column", gap: "2", className: "m-block-start-6", children: [_jsxs(Text, { children: ["Was ", chatbotUiStore.agent.name, " able to help solve your problem?"] }), _jsxs(Flex, { direction: "row", gap: "4", alignItems: "center", children: [_jsx(ButtonToggle, { size: "small", "aria-label": "Thumbs Up", title: "Thumbs Up", icon: IconThumbUp, checked: chatbotFeedbackStore.isThumbsUp, onClick: () => handleThumbs(true), "data-cy": "titan-chatbot-session-feedback-thumbs-up" }), _jsx(ButtonToggle, { size: "small", "aria-label": "Thumbs Down", title: "Thumbs Down", icon: IconThumbDown, checked: chatbotFeedbackStore.isThumbsDown, onClick: () => handleThumbs(false), "data-cy": "titan-chatbot-session-feedback-thumbs-down" })] }), _jsx(Textarea, { className: "m-block-start-4", label: "Tell us more", rows: 3, value: chatbotFeedbackStore.formState.$.comment.value, onChange: (e) => {
|
|
24
24
|
chatbotFeedbackStore.formState.$.comment.onChange(e.currentTarget.value);
|
|
25
25
|
}, "data-cy": "titan-chatbot-session-feedback-comment" })] }) }), _jsx(Dialog.Footer, { children: _jsxs(Flex, { direction: "row", justifyContent: "flex-end", gap: "3", children: [_jsx(Button, { onClick: handleClose, "data-cy": "titan-chatbot-session-feedback-cancel", children: "Cancel" }), _jsx(Button, { onClick: handleSubmit, appearance: "primary", disabled: !chatbotFeedbackStore.isValid, "data-cy": "titan-chatbot-session-feedback-submit", children: "Submit Feedback" })] }) })] }));
|
|
26
26
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-session-feedback-modal.js","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-session-feedback-modal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,aAAa,MAAM,iEAAiE,CAAC;AAC5F,OAAO,WAAW,MAAM,+DAA+D,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAmB,WAAW,EAAE,MAAM,OAAO,CAAC;AAErD,MAAM,CAAC,MAAM,2BAA2B,GAAgC,OAAO,CAAC;IAC5E,UAAU,EAAE,CAAC,oBAAoB,CAAC;CACrC,CAAC,CACE,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;IACrB,MAAM,CAAC,oBAAoB,EAAE,cAAc,CAAC,GAAG,eAAe,CAC1D,oBAAoB,EACpB,sBAAsB,CACzB,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,OAAO,EAAE,CAAC;IACd,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,cAAc,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,EAAE,CAAC;IACd,CAAC,EAAE,CAAC,cAAc,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,WAAW,CAC5B,CAAC,UAAmB,EAAE,EAAE;QACpB,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC,EACD,CAAC,oBAAoB,CAAC,CACzB,CAAC;IAEF,OAAO,CACH,MAAC,MAAM,IACH,OAAO,EAAE,WAAW,EACpB,IAAI,QACJ,KAAK,
|
|
1
|
+
{"version":3,"file":"chatbot-session-feedback-modal.js","sourceRoot":"","sources":["../../../../src/components/chatbot/feedback/chatbot-session-feedback-modal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-message-welcome.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/messages/chatbot-message-welcome.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chatbot-message-welcome.d.ts","sourceRoot":"","sources":["../../../../src/components/chatbot/messages/chatbot-message-welcome.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,eAAO,MAAM,qBAAqB,EAAE,EAenC,CAAC"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Text } from '@servicetitan/anvil2';
|
|
3
|
-
|
|
3
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
4
|
+
import { CHATBOT_UI_STORE_TOKEN } from '@servicetitan/titan-chatbot-api';
|
|
5
|
+
export const ChatbotMessageWelcome = () => {
|
|
6
|
+
const [chatbotUiStore] = useDependencies(CHATBOT_UI_STORE_TOKEN);
|
|
7
|
+
return (_jsxs(Text, { children: ["Hi there! I\u2019m ", chatbotUiStore.agent.name, ", an AI chatbot.", _jsx("br", {}), _jsx("br", {}), _jsx("b", { children: "Have a question?" }), " Ask me anything about how ServiceTitan works.", _jsx("br", {}), _jsx("b", { children: "Need help?" }), " If I can\u2019t solve your issue, I\u2019ll guide you through submitting a support case.", _jsx("br", {}), "Let\u2019s get started - how can I assist you today?"] }));
|
|
8
|
+
};
|
|
4
9
|
//# sourceMappingURL=chatbot-message-welcome.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot-message-welcome.js","sourceRoot":"","sources":["../../../../src/components/chatbot/messages/chatbot-message-welcome.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"chatbot-message-welcome.js","sourceRoot":"","sources":["../../../../src/components/chatbot/messages/chatbot-message-welcome.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAGzE,MAAM,CAAC,MAAM,qBAAqB,GAAO,GAAG,EAAE;IAC1C,MAAM,CAAC,cAAc,CAAC,GAAG,eAAe,CAAC,sBAAsB,CAAC,CAAC;IACjE,OAAO,CACH,MAAC,IAAI,sCACc,cAAc,CAAC,KAAK,CAAC,IAAI,sBACxC,cAAM,EACN,cAAM,EACN,2CAAuB,oDACvB,cAAM,EACN,qCAAiB,+FAEjB,cAAM,4DAEH,CACV,CAAC;AACN,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/titan-chatbot-ui-anvil2",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "Chatbot experience UI package (Anvil2 version)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
"push:local": "yalc push"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@servicetitan/titan-chat-ui-anvil2": "^
|
|
21
|
-
"@servicetitan/titan-chat-ui-common": "^
|
|
22
|
-
"@servicetitan/titan-chatbot-api": "^
|
|
20
|
+
"@servicetitan/titan-chat-ui-anvil2": "^4.0.1",
|
|
21
|
+
"@servicetitan/titan-chat-ui-common": "^4.0.1",
|
|
22
|
+
"@servicetitan/titan-chatbot-api": "^4.0.1",
|
|
23
23
|
"nanoid": "^5.1.5"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"react-dom": ">=18"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@servicetitan/cypress-shared": "^
|
|
40
|
-
"cypress": "^
|
|
39
|
+
"@servicetitan/cypress-shared": "^4.0.1",
|
|
40
|
+
"cypress": "^15.2.0"
|
|
41
41
|
},
|
|
42
42
|
"keywords": [
|
|
43
43
|
"ServiceTitan"
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"cli": {
|
|
50
50
|
"webpack": false
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "6c7d023e9833d328cd8537a95fc2740a9f09c046"
|
|
53
53
|
}
|
|
@@ -27,11 +27,13 @@ export interface IChatbotProps {
|
|
|
27
27
|
className?: string;
|
|
28
28
|
style?: CSSProperties;
|
|
29
29
|
customizations?: ChatbotCustomizations;
|
|
30
|
+
botIcon?: ChatParticipantIcon;
|
|
31
|
+
botName?: string;
|
|
30
32
|
onReady?: () => void;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
export const Chatbot: FC<IChatbotProps> = observer(
|
|
34
|
-
({ className, customizations, onReady, style }) => {
|
|
36
|
+
({ botIcon, botName, className, customizations, onReady, style }) => {
|
|
35
37
|
const [chatUiStore, chatUiBackendStore] = useDependencies(
|
|
36
38
|
CHATBOT_UI_STORE_TOKEN,
|
|
37
39
|
CHATBOT_UI_BACKEND_STORE_TOKEN
|
|
@@ -40,8 +42,8 @@ export const Chatbot: FC<IChatbotProps> = observer(
|
|
|
40
42
|
const init = async () => {
|
|
41
43
|
chatUiBackendStore.subscribe();
|
|
42
44
|
await chatUiStore.run({
|
|
43
|
-
agentName: 'Titan',
|
|
44
|
-
agentIcon: ChatParticipantIcon.Bot,
|
|
45
|
+
agentName: botName ?? 'Titan',
|
|
46
|
+
agentIcon: botIcon ?? ChatParticipantIcon.Bot,
|
|
45
47
|
});
|
|
46
48
|
onReady?.();
|
|
47
49
|
};
|
|
@@ -57,6 +59,8 @@ export const Chatbot: FC<IChatbotProps> = observer(
|
|
|
57
59
|
component: ChatbotMessageTemplateAgent,
|
|
58
60
|
};
|
|
59
61
|
return {
|
|
62
|
+
loadingComponent: customizations?.loadingComponent,
|
|
63
|
+
input: customizations?.input,
|
|
60
64
|
error: customizations?.error,
|
|
61
65
|
filters: customizations?.filters,
|
|
62
66
|
feedback: customizations?.feedback,
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { Link, LinkProps } from '@servicetitan/anvil2';
|
|
2
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
3
|
+
import { CHATBOT_UI_STORE_TOKEN } from '@servicetitan/titan-chatbot-api';
|
|
2
4
|
import { FC, Fragment, MouseEvent, useCallback, useState } from 'react';
|
|
3
5
|
import { ChatbotRestartDialog } from './chatbot-restart-dialog';
|
|
4
6
|
|
|
5
7
|
export const ChatbotRestartLink: FC<LinkProps> = ({ children, onClick, ...rest }) => {
|
|
8
|
+
const [chatbotUiStore] = useDependencies(CHATBOT_UI_STORE_TOKEN);
|
|
6
9
|
const [isRestartDialogOpen, setIsRestartDialogOpen] = useState(false);
|
|
7
10
|
|
|
8
11
|
const handleRestartOpen = useCallback(
|
|
@@ -20,7 +23,7 @@ export const ChatbotRestartLink: FC<LinkProps> = ({ children, onClick, ...rest }
|
|
|
20
23
|
</Link>
|
|
21
24
|
{isRestartDialogOpen && (
|
|
22
25
|
<ChatbotRestartDialog
|
|
23
|
-
confirmText=
|
|
26
|
+
confirmText={`Restart ${chatbotUiStore.agent.name} session?`}
|
|
24
27
|
onClose={() => setIsRestartDialogOpen(false)}
|
|
25
28
|
/>
|
|
26
29
|
)}
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
MessageFeedbackGuardrailStore,
|
|
11
11
|
MessageFeedbackStore,
|
|
12
12
|
Models,
|
|
13
|
+
useCustomizationChatbot,
|
|
13
14
|
} from '@servicetitan/titan-chatbot-api';
|
|
14
15
|
import classNames from 'classnames';
|
|
15
16
|
import { observer } from 'mobx-react';
|
|
@@ -27,6 +28,7 @@ export const ChatbotMessageFeedbackPopover: FC<IChatbotMessageFeedbackProps> = p
|
|
|
27
28
|
singletons: [MessageFeedbackStore, MessageFeedbackGuardrailStore],
|
|
28
29
|
})(
|
|
29
30
|
observer(({ botMessage, className }) => {
|
|
31
|
+
const customization = useCustomizationChatbot();
|
|
30
32
|
const [chatbotUiStore, messageFeedbackStore, messageFeedbackGuardrailStore] =
|
|
31
33
|
useDependencies(
|
|
32
34
|
CHATBOT_UI_STORE_TOKEN,
|
|
@@ -37,7 +39,7 @@ export const ChatbotMessageFeedbackPopover: FC<IChatbotMessageFeedbackProps> = p
|
|
|
37
39
|
Models.ChatbotFeedbackState.None
|
|
38
40
|
);
|
|
39
41
|
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
|
40
|
-
const title =
|
|
42
|
+
const title = customization.feedback?.title;
|
|
41
43
|
const isGuardrail = botMessage.isGuardrailed;
|
|
42
44
|
const feedbackStore: IMessageFeedbackBaseStore = isGuardrail
|
|
43
45
|
? messageFeedbackGuardrailStore
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CHATBOT_UI_STORE_TOKEN, Models } from '@servicetitan/titan-chatbot-api';
|
|
1
|
+
import { Models, useCustomizationChatbot } from '@servicetitan/titan-chatbot-api';
|
|
3
2
|
import { observer } from 'mobx-react';
|
|
4
3
|
import { FC } from 'react';
|
|
5
4
|
import { ChatbotMessageFeedbackPopover } from './chatbot-message-feedback-popover';
|
|
@@ -11,12 +10,10 @@ interface IChatbotFeedbackProps {
|
|
|
11
10
|
|
|
12
11
|
export const ChatbotMessageFeedback: FC<IChatbotFeedbackProps> = observer(
|
|
13
12
|
({ botMessage, className }) => {
|
|
14
|
-
const
|
|
13
|
+
const customization = useCustomizationChatbot();
|
|
15
14
|
|
|
16
15
|
// We show feedback for all messages with normal answer and for guardrailed messages if internal chatbot setting is enabled
|
|
17
|
-
const showGuardrailFeedback = Boolean(
|
|
18
|
-
chatbotUiStore.customizations?.feedback?.showGuardrailFeedback
|
|
19
|
-
);
|
|
16
|
+
const showGuardrailFeedback = Boolean(customization?.feedback?.showGuardrailFeedback);
|
|
20
17
|
const isFeedbackVisible = showGuardrailFeedback || !botMessage.isGuardrailed;
|
|
21
18
|
|
|
22
19
|
if (!isFeedbackVisible) {
|
|
@@ -35,12 +35,14 @@ export const ChatbotSessionFeedbackModal: FC<{ onClose: () => void }> = provide(
|
|
|
35
35
|
<Dialog
|
|
36
36
|
onClose={handleClose}
|
|
37
37
|
open
|
|
38
|
-
title=
|
|
38
|
+
title={`Give Feedback on ${chatbotUiStore.agent.name}`}
|
|
39
39
|
data-cy="titan-chatbot-session-feedback-modal"
|
|
40
40
|
>
|
|
41
41
|
<Dialog.Content>
|
|
42
42
|
<Flex direction="column" gap="2" className="m-block-start-6">
|
|
43
|
-
<Text>
|
|
43
|
+
<Text>
|
|
44
|
+
Was {chatbotUiStore.agent.name} able to help solve your problem?
|
|
45
|
+
</Text>
|
|
44
46
|
<Flex direction="row" gap="4" alignItems="center">
|
|
45
47
|
<ButtonToggle
|
|
46
48
|
size="small"
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { Text } from '@servicetitan/anvil2';
|
|
2
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
3
|
+
import { CHATBOT_UI_STORE_TOKEN } from '@servicetitan/titan-chatbot-api';
|
|
2
4
|
import { FC } from 'react';
|
|
3
5
|
|
|
4
|
-
export const ChatbotMessageWelcome: FC = () =>
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
export const ChatbotMessageWelcome: FC = () => {
|
|
7
|
+
const [chatbotUiStore] = useDependencies(CHATBOT_UI_STORE_TOKEN);
|
|
8
|
+
return (
|
|
9
|
+
<Text>
|
|
10
|
+
Hi there! I’m {chatbotUiStore.agent.name}, an AI chatbot.
|
|
11
|
+
<br />
|
|
12
|
+
<br />
|
|
13
|
+
<b>Have a question?</b> Ask me anything about how ServiceTitan works.
|
|
14
|
+
<br />
|
|
15
|
+
<b>Need help?</b> If I can’t solve your issue, I’ll guide you through submitting a
|
|
16
|
+
support case.
|
|
17
|
+
<br />
|
|
18
|
+
Let’s get started - how can I assist you today?
|
|
19
|
+
</Text>
|
|
20
|
+
);
|
|
21
|
+
};
|