@servicetitan/titan-chat-ui 5.0.0 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/components/chat/chat-input-file.d.ts.map +1 -1
- package/dist/components/chat/chat-input-file.js +2 -11
- package/dist/components/chat/chat-input-file.js.map +1 -1
- package/dist/components/chat/chat-input.d.ts.map +1 -1
- package/dist/components/chat/chat-input.js +11 -4
- package/dist/components/chat/chat-input.js.map +1 -1
- package/dist/components/common/markdown-text.d.ts.map +1 -1
- package/dist/components/common/markdown-text.js +2 -1
- package/dist/components/common/markdown-text.js.map +1 -1
- package/package.json +5 -4
- package/src/components/chat/chat-input-file.tsx +2 -12
- package/src/components/chat/chat-input.tsx +29 -2
- package/src/components/common/markdown-text.tsx +2 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# v5.1.0 (Tue Dec 02 2025)
|
|
2
|
+
|
|
3
|
+
#### 🚀 Enhancement
|
|
4
|
+
|
|
5
|
+
- SPA-7593: Added additional buttons customization for chat input. Enabled markdown line break plugin [#76](https://github.com/servicetitan/titan-chatbot-client/pull/76) ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Alexandr Yarmolchuk ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
1
13
|
# v4.3.1 (Fri Oct 17 2025)
|
|
2
14
|
|
|
3
15
|
#### 🐛 Bug Fix
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-input-file.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-input-file.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"chat-input-file.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-input-file.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAe,MAAM,OAAO,CAAC;AAExC,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAkDnD,CAAC"}
|
|
@@ -3,16 +3,14 @@ import { Eyebrow, FilePicker, Stack } from '@servicetitan/design-system';
|
|
|
3
3
|
import { useDependencies } from '@servicetitan/react-ioc';
|
|
4
4
|
import { CHAT_UI_STORE_TOKEN } from '@servicetitan/titan-chat-ui-common';
|
|
5
5
|
import { observer } from 'mobx-react';
|
|
6
|
-
import { useCallback
|
|
6
|
+
import { useCallback } from 'react';
|
|
7
7
|
export const ChatInputFile = observer(({ className }) => {
|
|
8
8
|
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
9
|
-
const [fileDescriptor, setFileDescriptor] = useState(undefined);
|
|
10
9
|
const handleSelected = useCallback((newAttachments) => {
|
|
11
10
|
const fileDescriptor = {
|
|
12
11
|
file: newAttachments[0],
|
|
13
12
|
displayName: newAttachments[0].name,
|
|
14
13
|
};
|
|
15
|
-
setFileDescriptor(fileDescriptor);
|
|
16
14
|
chatUiStore.setFile(fileDescriptor);
|
|
17
15
|
}, [chatUiStore]);
|
|
18
16
|
const handleReplace = useCallback(({ newFile }) => {
|
|
@@ -20,24 +18,17 @@ export const ChatInputFile = observer(({ className }) => {
|
|
|
20
18
|
file: newFile,
|
|
21
19
|
displayName: newFile.name,
|
|
22
20
|
};
|
|
23
|
-
setFileDescriptor(fileDescriptor);
|
|
24
21
|
chatUiStore.setFile(fileDescriptor);
|
|
25
22
|
}, [chatUiStore]);
|
|
26
23
|
const handleDelete = useCallback(() => {
|
|
27
|
-
setFileDescriptor(undefined);
|
|
28
24
|
chatUiStore.setFile(undefined);
|
|
29
25
|
}, [chatUiStore]);
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
if (!chatUiStore.file) {
|
|
32
|
-
setFileDescriptor(undefined);
|
|
33
|
-
}
|
|
34
|
-
}, [chatUiStore.file]);
|
|
35
26
|
if (!chatUiStore.isFilePickerEnabled) {
|
|
36
27
|
return null;
|
|
37
28
|
}
|
|
38
29
|
return (_jsxs(Stack, { className: className, spacing: "3", direction: "column", children: [_jsx(Eyebrow, { children: "Upload file" }), _jsx(FilePicker, { name: "attachments", buttonProps: {
|
|
39
30
|
color: 'primary',
|
|
40
31
|
fill: 'outline',
|
|
41
|
-
}, typesNote: "e.g. Screenshot of issue", value:
|
|
32
|
+
}, typesNote: "e.g. Screenshot of issue", value: chatUiStore.file, onSelected: handleSelected, onDelete: handleDelete, onReplace: handleReplace, "data-cy": "titan-chat-upload-file" })] }));
|
|
42
33
|
});
|
|
43
34
|
//# sourceMappingURL=chat-input-file.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-input-file.js","sourceRoot":"","sources":["../../../src/components/chat/chat-input-file.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAkB,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"chat-input-file.js","sourceRoot":"","sources":["../../../src/components/chat/chat-input-file.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAkB,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAM,WAAW,EAAE,MAAM,OAAO,CAAC;AAExC,MAAM,CAAC,MAAM,aAAa,GAA+B,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;IAChF,MAAM,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAE3D,MAAM,cAAc,GAAG,WAAW,CAC9B,CAAC,cAAwB,EAAE,EAAE;QACzB,MAAM,cAAc,GAAmB;YACnC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;YACvB,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI;SACtC,CAAC;QACF,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,EAAE,OAAO,EAA2C,EAAE,EAAE;QACrD,MAAM,cAAc,GAAmB;YACnC,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,OAAO,CAAC,IAAI;SAC5B,CAAC;QACF,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,CACH,MAAC,KAAK,IAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAC,GAAG,EAAC,SAAS,EAAC,QAAQ,aACvD,KAAC,OAAO,8BAAsB,EAC9B,KAAC,UAAU,IACP,IAAI,EAAC,aAAa,EAClB,WAAW,EAAE;oBACT,KAAK,EAAE,SAAS;oBAChB,IAAI,EAAE,SAAS;iBAClB,EACD,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE,WAAW,CAAC,IAAI,EACvB,UAAU,EAAE,cAAc,EAC1B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,aAAa,aAChB,wBAAwB,GAClC,IACE,CACX,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-input.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-input.tsx"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"chat-input.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-input.tsx"],"names":[],"mappings":"AAKA,OAAO,EAEH,EAAE,EAOL,MAAM,OAAO,CAAC;AAMf,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CA8JhD,CAAC"}
|
|
@@ -4,19 +4,22 @@ import { provide, useDependencies } from '@servicetitan/react-ioc';
|
|
|
4
4
|
import { CHAT_UI_STORE_TOKEN, useCustomizationChat } from '@servicetitan/titan-chat-ui-common';
|
|
5
5
|
import classNames from 'classnames';
|
|
6
6
|
import { observer } from 'mobx-react';
|
|
7
|
-
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
7
|
+
import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
8
8
|
import { ChatInputStore } from '../../stores/chat-input.store';
|
|
9
9
|
import * as Styles from './chat-input.module.less';
|
|
10
10
|
const TIMEOUT_COOLDOWN_MS = 3000;
|
|
11
11
|
export const ChatInput = provide({
|
|
12
12
|
singletons: [ChatInputStore],
|
|
13
13
|
})(observer(({ className }) => {
|
|
14
|
-
var _a, _b;
|
|
14
|
+
var _a, _b, _c;
|
|
15
15
|
const customization = useCustomizationChat();
|
|
16
16
|
const typingTimeoutRef = useRef(undefined);
|
|
17
17
|
const [isSending, setIsSending] = useState(false);
|
|
18
18
|
const textareaRef = useRef(null);
|
|
19
19
|
const [chatUiStore, supportChatInputStore] = useDependencies(CHAT_UI_STORE_TOKEN, ChatInputStore);
|
|
20
|
+
const additionalButtons = (_a = customization.input) === null || _a === void 0 ? void 0 : _a.additionalButtons;
|
|
21
|
+
const leftButtons = useMemo(() => { var _a; return (_a = additionalButtons === null || additionalButtons === void 0 ? void 0 : additionalButtons.filter(btn => btn.position === 'left')) !== null && _a !== void 0 ? _a : []; }, [additionalButtons]);
|
|
22
|
+
const rightButtons = useMemo(() => { var _a; return (_a = additionalButtons === null || additionalButtons === void 0 ? void 0 : additionalButtons.filter(btn => btn.position === 'right')) !== null && _a !== void 0 ? _a : []; }, [additionalButtons]);
|
|
20
23
|
const handleSendMessage = useCallback(async (event) => {
|
|
21
24
|
event === null || event === void 0 ? void 0 : event.preventDefault();
|
|
22
25
|
const validateResult = await supportChatInputStore.formState.validate();
|
|
@@ -83,7 +86,9 @@ export const ChatInput = provide({
|
|
|
83
86
|
textareaRef.current.focus();
|
|
84
87
|
}
|
|
85
88
|
}, []);
|
|
86
|
-
return (_jsx(Form, { className: classNames(className), onSubmit: handleSendMessage, children: _jsxs("div", { className: classNames('d-f flex-row gap-
|
|
89
|
+
return (_jsx(Form, { className: classNames(className), onSubmit: handleSendMessage, children: _jsxs("div", { className: classNames('d-f flex-row gap-1'), children: [leftButtons.map((button, index) => (
|
|
90
|
+
// eslint-disable-next-line react/no-array-index-key
|
|
91
|
+
_jsx(button.component, {}, index))), _jsx(FormTextArea, { ref: textareaRef, name: "question", placeholder: (_c = (_b = customization.input) === null || _b === void 0 ? void 0 : _b.placeholderText) !== null && _c !== void 0 ? _c : 'Type your message', rows: 1, maxRows: 2, autoHeight: true, onKeyPress: handleTextKeyPress, value: supportChatInputStore.formState.$.message.value, error: supportChatInputStore.formState.$.message.error, onChange: (e) => {
|
|
87
92
|
supportChatInputStore.formState.$.message.onChange(e.currentTarget.value);
|
|
88
93
|
}, onFocus: () => {
|
|
89
94
|
setTimeout(() => {
|
|
@@ -91,7 +96,9 @@ export const ChatInput = provide({
|
|
|
91
96
|
}, 0);
|
|
92
97
|
}, onBlur: () => {
|
|
93
98
|
supportChatInputStore.formState.$.message.enableAutoValidationAndValidate();
|
|
94
|
-
}, className: classNames('flex-grow-1', Styles.formTextarea), disabled: !chatUiStore.isStarted || isSending, "data-cy": "titan-chat-input" }),
|
|
99
|
+
}, className: classNames('flex-grow-1', Styles.formTextarea), disabled: !chatUiStore.isStarted || isSending, "data-cy": "titan-chat-input" }), rightButtons.map((button, index) => (
|
|
100
|
+
// eslint-disable-next-line react/no-array-index-key
|
|
101
|
+
_jsx(button.component, {}, index))), _jsx(Button, { className: "align-self-baseline", iconName: "send", "data-pendo": "titan-chat-send", "data-cy": "titan-chat-send", type: "submit", primary: true, "aria-label": "submit", disabled: !chatUiStore.isStarted ||
|
|
95
102
|
isSending ||
|
|
96
103
|
supportChatInputStore.formState.hasError ||
|
|
97
104
|
supportChatInputStore.isEmpty })] }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-input.js","sourceRoot":"","sources":["../../../src/components/chat/chat-input.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/F,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"chat-input.js","sourceRoot":"","sources":["../../../src/components/chat/chat-input.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/components/common/markdown-text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,aAAa,EAAkB,MAAM,6BAA6B,CAAC;AAGtF,OAAO,EAAE,EAAE,EAAsB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/components/common/markdown-text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,aAAa,EAAkB,MAAM,6BAA6B,CAAC;AAGtF,OAAO,EAAE,EAAE,EAAsB,MAAM,OAAO,CAAC;AAS/C,KAAK,iBAAiB,GAAG,aAAa,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAkF9C,CAAC"}
|
|
@@ -5,6 +5,7 @@ import DOMpurify from 'dompurify';
|
|
|
5
5
|
import { useMemo } from 'react';
|
|
6
6
|
import Markdown from 'react-markdown';
|
|
7
7
|
import rehypeRaw from 'rehype-raw';
|
|
8
|
+
import remarkBreaks from 'remark-breaks';
|
|
8
9
|
import remarkGfm from 'remark-gfm';
|
|
9
10
|
import * as Styles from './markdown-text.module.less';
|
|
10
11
|
export const MarkdownText = ({ className, text, ...rest }) => {
|
|
@@ -37,6 +38,6 @@ export const MarkdownText = ({ className, text, ...rest }) => {
|
|
|
37
38
|
return (_jsx(Headline, { el: "h6", size: "small", children: children }));
|
|
38
39
|
},
|
|
39
40
|
}), []);
|
|
40
|
-
return (_jsx(BodyText, { el: "div", className: classNames(Styles.content, className), ...rest, children: _jsx(Markdown, { components: markdownComponents, rehypePlugins: [rehypeRaw], remarkPlugins: [remarkGfm], children: DOMpurify.sanitize(text) }) }));
|
|
41
|
+
return (_jsx(BodyText, { el: "div", className: classNames(Styles.content, className), ...rest, children: _jsx(Markdown, { components: markdownComponents, rehypePlugins: [rehypeRaw], remarkPlugins: [remarkGfm, remarkBreaks], children: DOMpurify.sanitize(text) }) }));
|
|
41
42
|
};
|
|
42
43
|
//# sourceMappingURL=markdown-text.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-text.js","sourceRoot":"","sources":["../../../src/components/common/markdown-text.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAiB,QAAQ,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAiB,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,QAAwB,MAAM,gBAAgB,CAAC;AACtD,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAC;AAQtD,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IAChF,MAAM,kBAAkB,GAAe,OAAO,CAC1C,GAAG,EAAE,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAQ;YAC5B,OAAO,CACH,KAAC,QAAQ,IACL,EAAE,EAAC,MAAM,EACT,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAClD,IAAI,YAEP,QAAQ,GACF,CACd,CAAC;QACN,CAAC;QACD,CAAC,CAAC,EAAE,QAAQ,EAAQ;YAChB,OAAO,sBAAI,QAAQ,GAAK,CAAC;QAC7B,CAAC;QACD,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAA4B;YAC1C,OAAO,CACH,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,OAAO,QAAC,GAAG,EAAC,qBAAqB,YAC9D,QAAQ,GACN,CACV,CAAC;QACN,CAAC;QACD,EAAE,CAAC,EAAE,QAAQ,EAAQ;YACjB,OAAO,CACH,KAAC,QAAQ,IAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,YAC1B,QAAQ,GACF,CACd,CAAC;QACN,CAAC;QACD,EAAE,CAAC,EAAE,QAAQ,EAAQ;YACjB,OAAO,CACH,KAAC,QAAQ,IAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,YACzB,QAAQ,GACF,CACd,CAAC;QACN,CAAC;QACD,EAAE,CAAC,EAAE,QAAQ,EAAQ;YACjB,OAAO,CACH,KAAC,QAAQ,IAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,YAC1B,QAAQ,GACF,CACd,CAAC;QACN,CAAC;QACD,EAAE,CAAC,EAAE,QAAQ,EAAQ;YACjB,OAAO,CACH,KAAC,QAAQ,IAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,YACzB,QAAQ,GACF,CACd,CAAC;QACN,CAAC;QACD,EAAE,CAAC,EAAE,QAAQ,EAAQ;YACjB,OAAO,CACH,KAAC,QAAQ,IAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,YACzB,QAAQ,GACF,CACd,CAAC;QACN,CAAC;QACD,EAAE,CAAC,EAAE,QAAQ,EAAQ;YACjB,OAAO,CACH,KAAC,QAAQ,IAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,YACzB,QAAQ,GACF,CACd,CAAC;QACN,CAAC;KACJ,CAAC,EACF,EAAE,CACL,CAAC;IAEF,OAAO,CACH,KAAC,QAAQ,IAAC,EAAE,EAAC,KAAK,EAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,KAAM,IAAI,YACzE,KAAC,QAAQ,IACL,UAAU,EAAE,kBAAkB,EAC9B,aAAa,EAAE,CAAC,SAAS,CAAC,EAC1B,aAAa,EAAE,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"markdown-text.js","sourceRoot":"","sources":["../../../src/components/common/markdown-text.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/titan-chat-ui",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.2.0",
|
|
4
4
|
"description": "Chat experience UI package",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -17,12 +17,13 @@
|
|
|
17
17
|
"push:local": "yalc push"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@servicetitan/titan-chat-ui-common": "^5.
|
|
20
|
+
"@servicetitan/titan-chat-ui-common": "^5.2.0",
|
|
21
21
|
"dompurify": "^3.2.6",
|
|
22
22
|
"lodash": "4.17.21",
|
|
23
23
|
"nanoid": "^5.1.5",
|
|
24
24
|
"react-markdown": "^10.1.0",
|
|
25
25
|
"rehype-raw": "^7.0.0",
|
|
26
|
+
"remark-breaks": "^4.0.0",
|
|
26
27
|
"remark-gfm": "^4.0.1"
|
|
27
28
|
},
|
|
28
29
|
"peerDependencies": {
|
|
@@ -42,7 +43,7 @@
|
|
|
42
43
|
"react-dom": ">=18"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|
|
45
|
-
"@servicetitan/cypress-shared": "^5.
|
|
46
|
+
"@servicetitan/cypress-shared": "^5.2.0",
|
|
46
47
|
"cypress": "^15.2.0"
|
|
47
48
|
},
|
|
48
49
|
"keywords": [
|
|
@@ -55,5 +56,5 @@
|
|
|
55
56
|
"cli": {
|
|
56
57
|
"webpack": false
|
|
57
58
|
},
|
|
58
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "75b01344a375fc9a0b41abc83956e636774bb2b7"
|
|
59
60
|
}
|
|
@@ -2,11 +2,10 @@ import { Eyebrow, FilePicker, Stack } from '@servicetitan/design-system';
|
|
|
2
2
|
import { useDependencies } from '@servicetitan/react-ioc';
|
|
3
3
|
import { CHAT_UI_STORE_TOKEN, FileDescriptor } from '@servicetitan/titan-chat-ui-common';
|
|
4
4
|
import { observer } from 'mobx-react';
|
|
5
|
-
import { FC, useCallback
|
|
5
|
+
import { FC, useCallback } from 'react';
|
|
6
6
|
|
|
7
7
|
export const ChatInputFile: FC<{ className?: string }> = observer(({ className }) => {
|
|
8
8
|
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
9
|
-
const [fileDescriptor, setFileDescriptor] = useState<FileDescriptor | undefined>(undefined);
|
|
10
9
|
|
|
11
10
|
const handleSelected = useCallback(
|
|
12
11
|
(newAttachments: FileList) => {
|
|
@@ -14,7 +13,6 @@ export const ChatInputFile: FC<{ className?: string }> = observer(({ className }
|
|
|
14
13
|
file: newAttachments[0],
|
|
15
14
|
displayName: newAttachments[0].name,
|
|
16
15
|
};
|
|
17
|
-
setFileDescriptor(fileDescriptor);
|
|
18
16
|
chatUiStore.setFile(fileDescriptor);
|
|
19
17
|
},
|
|
20
18
|
[chatUiStore]
|
|
@@ -26,23 +24,15 @@ export const ChatInputFile: FC<{ className?: string }> = observer(({ className }
|
|
|
26
24
|
file: newFile,
|
|
27
25
|
displayName: newFile.name,
|
|
28
26
|
};
|
|
29
|
-
setFileDescriptor(fileDescriptor);
|
|
30
27
|
chatUiStore.setFile(fileDescriptor);
|
|
31
28
|
},
|
|
32
29
|
[chatUiStore]
|
|
33
30
|
);
|
|
34
31
|
|
|
35
32
|
const handleDelete = useCallback(() => {
|
|
36
|
-
setFileDescriptor(undefined);
|
|
37
33
|
chatUiStore.setFile(undefined);
|
|
38
34
|
}, [chatUiStore]);
|
|
39
35
|
|
|
40
|
-
useEffect(() => {
|
|
41
|
-
if (!chatUiStore.file) {
|
|
42
|
-
setFileDescriptor(undefined);
|
|
43
|
-
}
|
|
44
|
-
}, [chatUiStore.file]);
|
|
45
|
-
|
|
46
36
|
if (!chatUiStore.isFilePickerEnabled) {
|
|
47
37
|
return null;
|
|
48
38
|
}
|
|
@@ -56,7 +46,7 @@ export const ChatInputFile: FC<{ className?: string }> = observer(({ className }
|
|
|
56
46
|
fill: 'outline',
|
|
57
47
|
}}
|
|
58
48
|
typesNote="e.g. Screenshot of issue"
|
|
59
|
-
value={
|
|
49
|
+
value={chatUiStore.file}
|
|
60
50
|
onSelected={handleSelected}
|
|
61
51
|
onDelete={handleDelete}
|
|
62
52
|
onReplace={handleReplace}
|
|
@@ -3,7 +3,16 @@ import { provide, useDependencies } from '@servicetitan/react-ioc';
|
|
|
3
3
|
import { CHAT_UI_STORE_TOKEN, useCustomizationChat } from '@servicetitan/titan-chat-ui-common';
|
|
4
4
|
import classNames from 'classnames';
|
|
5
5
|
import { observer } from 'mobx-react';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
ChangeEvent,
|
|
8
|
+
FC,
|
|
9
|
+
FormEvent,
|
|
10
|
+
useCallback,
|
|
11
|
+
useEffect,
|
|
12
|
+
useMemo,
|
|
13
|
+
useRef,
|
|
14
|
+
useState,
|
|
15
|
+
} from 'react';
|
|
7
16
|
import { ChatInputStore } from '../../stores/chat-input.store';
|
|
8
17
|
import * as Styles from './chat-input.module.less';
|
|
9
18
|
|
|
@@ -22,6 +31,16 @@ export const ChatInput: FC<{ className?: string }> = provide({
|
|
|
22
31
|
ChatInputStore
|
|
23
32
|
);
|
|
24
33
|
|
|
34
|
+
const additionalButtons = customization.input?.additionalButtons;
|
|
35
|
+
const leftButtons = useMemo(
|
|
36
|
+
() => additionalButtons?.filter(btn => btn.position === 'left') ?? [],
|
|
37
|
+
[additionalButtons]
|
|
38
|
+
);
|
|
39
|
+
const rightButtons = useMemo(
|
|
40
|
+
() => additionalButtons?.filter(btn => btn.position === 'right') ?? [],
|
|
41
|
+
[additionalButtons]
|
|
42
|
+
);
|
|
43
|
+
|
|
25
44
|
const handleSendMessage = useCallback(
|
|
26
45
|
async (event?: FormEvent) => {
|
|
27
46
|
event?.preventDefault();
|
|
@@ -102,7 +121,11 @@ export const ChatInput: FC<{ className?: string }> = provide({
|
|
|
102
121
|
|
|
103
122
|
return (
|
|
104
123
|
<Form className={classNames(className)} onSubmit={handleSendMessage}>
|
|
105
|
-
<div className={classNames('d-f flex-row gap-
|
|
124
|
+
<div className={classNames('d-f flex-row gap-1')}>
|
|
125
|
+
{leftButtons.map((button, index) => (
|
|
126
|
+
// eslint-disable-next-line react/no-array-index-key
|
|
127
|
+
<button.component key={index} />
|
|
128
|
+
))}
|
|
106
129
|
<FormTextArea
|
|
107
130
|
ref={textareaRef}
|
|
108
131
|
name="question"
|
|
@@ -130,6 +153,10 @@ export const ChatInput: FC<{ className?: string }> = provide({
|
|
|
130
153
|
disabled={!chatUiStore.isStarted || isSending}
|
|
131
154
|
data-cy="titan-chat-input"
|
|
132
155
|
/>
|
|
156
|
+
{rightButtons.map((button, index) => (
|
|
157
|
+
// eslint-disable-next-line react/no-array-index-key
|
|
158
|
+
<button.component key={index} />
|
|
159
|
+
))}
|
|
133
160
|
<Button
|
|
134
161
|
className="align-self-baseline"
|
|
135
162
|
iconName="send"
|
|
@@ -4,6 +4,7 @@ import DOMpurify from 'dompurify';
|
|
|
4
4
|
import { FC, ReactNode, useMemo } from 'react';
|
|
5
5
|
import Markdown, { Components } from 'react-markdown';
|
|
6
6
|
import rehypeRaw from 'rehype-raw';
|
|
7
|
+
import remarkBreaks from 'remark-breaks';
|
|
7
8
|
import remarkGfm from 'remark-gfm';
|
|
8
9
|
import * as Styles from './markdown-text.module.less';
|
|
9
10
|
|
|
@@ -89,7 +90,7 @@ export const MarkdownText: FC<MarkdownTextProps> = ({ className, text, ...rest }
|
|
|
89
90
|
<Markdown
|
|
90
91
|
components={markdownComponents}
|
|
91
92
|
rehypePlugins={[rehypeRaw]}
|
|
92
|
-
remarkPlugins={[remarkGfm]}
|
|
93
|
+
remarkPlugins={[remarkGfm, remarkBreaks]}
|
|
93
94
|
>
|
|
94
95
|
{DOMpurify.sanitize(text)}
|
|
95
96
|
</Markdown>
|