@servicetitan/titan-chat-ui-anvil2 3.0.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 +118 -0
- package/README.md +15 -0
- package/dist/assets/floating-chat-avatar.svg +16 -0
- package/dist/components/chat/__tests-cy__/chat-messages.test.d.ts +2 -0
- package/dist/components/chat/__tests-cy__/chat-messages.test.d.ts.map +1 -0
- package/dist/components/chat/__tests-cy__/chat-messages.test.js +95 -0
- package/dist/components/chat/__tests-cy__/chat-messages.test.js.map +1 -0
- package/dist/components/chat/__tests-cy__/chat.test.d.ts +2 -0
- package/dist/components/chat/__tests-cy__/chat.test.d.ts.map +1 -0
- package/dist/components/chat/__tests-cy__/chat.test.js +130 -0
- package/dist/components/chat/__tests-cy__/chat.test.js.map +1 -0
- package/dist/components/chat/chat-connecting.d.ts +7 -0
- package/dist/components/chat/chat-connecting.d.ts.map +1 -0
- package/dist/components/chat/chat-connecting.js +6 -0
- package/dist/components/chat/chat-connecting.js.map +1 -0
- package/dist/components/chat/chat-error.d.ts +3 -0
- package/dist/components/chat/chat-error.d.ts.map +1 -0
- package/dist/components/chat/chat-error.js +20 -0
- package/dist/components/chat/chat-error.js.map +1 -0
- package/dist/components/chat/chat-error.module.less +6 -0
- package/dist/components/chat/chat-input-file.d.ts +5 -0
- package/dist/components/chat/chat-input-file.d.ts.map +1 -0
- package/dist/components/chat/chat-input-file.js +41 -0
- package/dist/components/chat/chat-input-file.js.map +1 -0
- package/dist/components/chat/chat-input.d.ts +5 -0
- package/dist/components/chat/chat-input.d.ts.map +1 -0
- package/dist/components/chat/chat-input.js +97 -0
- package/dist/components/chat/chat-input.js.map +1 -0
- package/dist/components/chat/chat-input.module.less +11 -0
- package/dist/components/chat/chat-log.d.ts +8 -0
- package/dist/components/chat/chat-log.d.ts.map +1 -0
- package/dist/components/chat/chat-log.js +15 -0
- package/dist/components/chat/chat-log.js.map +1 -0
- package/dist/components/chat/chat-message-template-agent.d.ts +4 -0
- package/dist/components/chat/chat-message-template-agent.d.ts.map +1 -0
- package/dist/components/chat/chat-message-template-agent.js +14 -0
- package/dist/components/chat/chat-message-template-agent.js.map +1 -0
- package/dist/components/chat/chat-message-template-user.d.ts +4 -0
- package/dist/components/chat/chat-message-template-user.d.ts.map +1 -0
- package/dist/components/chat/chat-message-template-user.js +16 -0
- package/dist/components/chat/chat-message-template-user.js.map +1 -0
- package/dist/components/chat/chat-message-typing.d.ts +3 -0
- package/dist/components/chat/chat-message-typing.d.ts.map +1 -0
- package/dist/components/chat/chat-message-typing.js +15 -0
- package/dist/components/chat/chat-message-typing.js.map +1 -0
- package/dist/components/chat/chat-message.d.ts +8 -0
- package/dist/components/chat/chat-message.d.ts.map +1 -0
- package/dist/components/chat/chat-message.js +60 -0
- package/dist/components/chat/chat-message.js.map +1 -0
- package/dist/components/chat/chat-messages.d.ts +10 -0
- package/dist/components/chat/chat-messages.d.ts.map +1 -0
- package/dist/components/chat/chat-messages.js +40 -0
- package/dist/components/chat/chat-messages.js.map +1 -0
- package/dist/components/chat/chat-notifications.d.ts +5 -0
- package/dist/components/chat/chat-notifications.d.ts.map +1 -0
- package/dist/components/chat/chat-notifications.js +12 -0
- package/dist/components/chat/chat-notifications.js.map +1 -0
- package/dist/components/chat/chat-timer.d.ts +3 -0
- package/dist/components/chat/chat-timer.d.ts.map +1 -0
- package/dist/components/chat/chat-timer.js +18 -0
- package/dist/components/chat/chat-timer.js.map +1 -0
- package/dist/components/chat/chat-timer.module.less +5 -0
- package/dist/components/chat/chat.d.ts +8 -0
- package/dist/components/chat/chat.d.ts.map +1 -0
- package/dist/components/chat/chat.js +30 -0
- package/dist/components/chat/chat.js.map +1 -0
- package/dist/components/common/multiline-text.d.ts +9 -0
- package/dist/components/common/multiline-text.d.ts.map +1 -0
- package/dist/components/common/multiline-text.js +12 -0
- package/dist/components/common/multiline-text.js.map +1 -0
- package/dist/components/common/multiline-text.module.less +9 -0
- package/dist/components/message-content/message-content-file.d.ts +8 -0
- package/dist/components/message-content/message-content-file.d.ts.map +1 -0
- package/dist/components/message-content/message-content-file.js +12 -0
- package/dist/components/message-content/message-content-file.js.map +1 -0
- package/dist/components/message-content/message-content-text.d.ts +8 -0
- package/dist/components/message-content/message-content-text.d.ts.map +1 -0
- package/dist/components/message-content/message-content-text.js +7 -0
- package/dist/components/message-content/message-content-text.js.map +1 -0
- package/dist/components/messages/__tests-cy__/message-agent.test.d.ts +2 -0
- package/dist/components/messages/__tests-cy__/message-agent.test.d.ts.map +1 -0
- package/dist/components/messages/__tests-cy__/message-agent.test.js +83 -0
- package/dist/components/messages/__tests-cy__/message-agent.test.js.map +1 -0
- package/dist/components/messages/__tests-cy__/message-system.test.d.ts +2 -0
- package/dist/components/messages/__tests-cy__/message-system.test.d.ts.map +1 -0
- package/dist/components/messages/__tests-cy__/message-system.test.js +19 -0
- package/dist/components/messages/__tests-cy__/message-system.test.js.map +1 -0
- package/dist/components/messages/__tests-cy__/message-timeout.test.d.ts +2 -0
- package/dist/components/messages/__tests-cy__/message-timeout.test.d.ts.map +1 -0
- package/dist/components/messages/__tests-cy__/message-timeout.test.js +25 -0
- package/dist/components/messages/__tests-cy__/message-timeout.test.js.map +1 -0
- package/dist/components/messages/__tests-cy__/message-typing.test.d.ts +2 -0
- package/dist/components/messages/__tests-cy__/message-typing.test.d.ts.map +1 -0
- package/dist/components/messages/__tests-cy__/message-typing.test.js +48 -0
- package/dist/components/messages/__tests-cy__/message-typing.test.js.map +1 -0
- package/dist/components/messages/__tests-cy__/message-user.test.d.ts +2 -0
- package/dist/components/messages/__tests-cy__/message-user.test.d.ts.map +1 -0
- package/dist/components/messages/__tests-cy__/message-user.test.js +27 -0
- package/dist/components/messages/__tests-cy__/message-user.test.js.map +1 -0
- package/dist/components/messages/message-agent.d.ts +14 -0
- package/dist/components/messages/message-agent.d.ts.map +1 -0
- package/dist/components/messages/message-agent.js +15 -0
- package/dist/components/messages/message-agent.js.map +1 -0
- package/dist/components/messages/message-agent.module.less +51 -0
- package/dist/components/messages/message-avatar.d.ts +9 -0
- package/dist/components/messages/message-avatar.d.ts.map +1 -0
- package/dist/components/messages/message-avatar.js +17 -0
- package/dist/components/messages/message-avatar.js.map +1 -0
- package/dist/components/messages/message-avatar.module.less +26 -0
- package/dist/components/messages/message-footer.d.ts +7 -0
- package/dist/components/messages/message-footer.d.ts.map +1 -0
- package/dist/components/messages/message-footer.js +7 -0
- package/dist/components/messages/message-footer.js.map +1 -0
- package/dist/components/messages/message-system.d.ts +8 -0
- package/dist/components/messages/message-system.d.ts.map +1 -0
- package/dist/components/messages/message-system.js +12 -0
- package/dist/components/messages/message-system.js.map +1 -0
- package/dist/components/messages/message-system.module.less +26 -0
- package/dist/components/messages/message-timeout.d.ts +7 -0
- package/dist/components/messages/message-timeout.d.ts.map +1 -0
- package/dist/components/messages/message-timeout.js +14 -0
- package/dist/components/messages/message-timeout.js.map +1 -0
- package/dist/components/messages/message-typing.d.ts +7 -0
- package/dist/components/messages/message-typing.d.ts.map +1 -0
- package/dist/components/messages/message-typing.js +6 -0
- package/dist/components/messages/message-typing.js.map +1 -0
- package/dist/components/messages/message-typing.module.less +40 -0
- package/dist/components/messages/message-user.d.ts +8 -0
- package/dist/components/messages/message-user.d.ts.map +1 -0
- package/dist/components/messages/message-user.js +10 -0
- package/dist/components/messages/message-user.js.map +1 -0
- package/dist/components/messages/message-user.module.less +32 -0
- package/dist/components/messages/use-avatar-props.d.ts +4 -0
- package/dist/components/messages/use-avatar-props.d.ts.map +1 -0
- package/dist/components/messages/use-avatar-props.js +11 -0
- package/dist/components/messages/use-avatar-props.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/stores/__tests__/chat-input.store.test.d.ts +2 -0
- package/dist/stores/__tests__/chat-input.store.test.d.ts.map +1 -0
- package/dist/stores/__tests__/chat-input.store.test.js +36 -0
- package/dist/stores/__tests__/chat-input.store.test.js.map +1 -0
- package/dist/stores/chat-input.store.d.ts +10 -0
- package/dist/stores/chat-input.store.d.ts.map +1 -0
- package/dist/stores/chat-input.store.js +46 -0
- package/dist/stores/chat-input.store.js.map +1 -0
- package/package.json +53 -0
- package/src/assets/floating-chat-avatar.svg +16 -0
- package/src/components/chat/__tests-cy__/chat-messages.test.tsx +111 -0
- package/src/components/chat/__tests-cy__/chat.test.tsx +164 -0
- package/src/components/chat/chat-connecting.tsx +23 -0
- package/src/components/chat/chat-error.module.less +6 -0
- package/src/components/chat/chat-error.module.less.d.ts +3 -0
- package/src/components/chat/chat-error.tsx +40 -0
- package/src/components/chat/chat-input-file.tsx +70 -0
- package/src/components/chat/chat-input.module.less +11 -0
- package/src/components/chat/chat-input.module.less.d.ts +3 -0
- package/src/components/chat/chat-input.tsx +144 -0
- package/src/components/chat/chat-log.tsx +28 -0
- package/src/components/chat/chat-message-template-agent.tsx +29 -0
- package/src/components/chat/chat-message-template-user.tsx +53 -0
- package/src/components/chat/chat-message-typing.tsx +19 -0
- package/src/components/chat/chat-message.tsx +84 -0
- package/src/components/chat/chat-messages.tsx +66 -0
- package/src/components/chat/chat-notifications.tsx +19 -0
- package/src/components/chat/chat-timer.module.less +5 -0
- package/src/components/chat/chat-timer.module.less.d.ts +3 -0
- package/src/components/chat/chat-timer.tsx +34 -0
- package/src/components/chat/chat.tsx +60 -0
- package/src/components/common/multiline-text.module.less +9 -0
- package/src/components/common/multiline-text.module.less.d.ts +3 -0
- package/src/components/common/multiline-text.tsx +30 -0
- package/src/components/message-content/message-content-file.tsx +28 -0
- package/src/components/message-content/message-content-text.tsx +12 -0
- package/src/components/messages/__tests-cy__/message-agent.test.tsx +142 -0
- package/src/components/messages/__tests-cy__/message-system.test.tsx +32 -0
- package/src/components/messages/__tests-cy__/message-timeout.test.tsx +29 -0
- package/src/components/messages/__tests-cy__/message-typing.test.tsx +57 -0
- package/src/components/messages/__tests-cy__/message-user.test.tsx +41 -0
- package/src/components/messages/message-agent.module.less +51 -0
- package/src/components/messages/message-agent.module.less.d.ts +8 -0
- package/src/components/messages/message-agent.tsx +69 -0
- package/src/components/messages/message-avatar.module.less +26 -0
- package/src/components/messages/message-avatar.module.less.d.ts +5 -0
- package/src/components/messages/message-avatar.tsx +38 -0
- package/src/components/messages/message-footer.tsx +18 -0
- package/src/components/messages/message-system.module.less +26 -0
- package/src/components/messages/message-system.module.less.d.ts +5 -0
- package/src/components/messages/message-system.tsx +36 -0
- package/src/components/messages/message-timeout.tsx +47 -0
- package/src/components/messages/message-typing.module.less +40 -0
- package/src/components/messages/message-typing.module.less.d.ts +5 -0
- package/src/components/messages/message-typing.tsx +21 -0
- package/src/components/messages/message-user.module.less +32 -0
- package/src/components/messages/message-user.module.less.d.ts +7 -0
- package/src/components/messages/message-user.tsx +46 -0
- package/src/components/messages/use-avatar-props.tsx +16 -0
- package/src/cypress.d.ts +10 -0
- package/src/index.ts +13 -0
- package/src/stores/__tests__/chat-input.store.test.ts +43 -0
- package/src/stores/chat-input.store.ts +25 -0
- package/tsconfig.json +24 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Textarea } from '@servicetitan/anvil2';
|
|
3
|
+
import IconSend from '@servicetitan/anvil2/assets/icons/material/round/send.svg';
|
|
4
|
+
import { provide, useDependencies } from '@servicetitan/react-ioc';
|
|
5
|
+
import { CHAT_UI_STORE_TOKEN } from '@servicetitan/titan-chat-ui-common';
|
|
6
|
+
import classNames from 'classnames';
|
|
7
|
+
import { observer } from 'mobx-react';
|
|
8
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
9
|
+
import { ChatInputStore } from '../../stores/chat-input.store';
|
|
10
|
+
import * as Styles from './chat-input.module.less';
|
|
11
|
+
const TIMEOUT_COOLDOWN_MS = 3000;
|
|
12
|
+
export const ChatInput = provide({
|
|
13
|
+
singletons: [ChatInputStore],
|
|
14
|
+
})(observer(({ className }) => {
|
|
15
|
+
const typingTimeoutRef = useRef(undefined);
|
|
16
|
+
const [isSending, setIsSending] = useState(false);
|
|
17
|
+
const textareaRef = useRef(null);
|
|
18
|
+
const [chatUiStore, supportChatInputStore] = useDependencies(CHAT_UI_STORE_TOKEN, ChatInputStore);
|
|
19
|
+
const handleSendMessage = useCallback(async () => {
|
|
20
|
+
const validateResult = await supportChatInputStore.formState.validate();
|
|
21
|
+
if (validateResult.hasError) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const text = supportChatInputStore.formState.$.message.value;
|
|
25
|
+
if (!text.trim() && !chatUiStore.file) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
supportChatInputStore.formState.$.message.onChange('');
|
|
29
|
+
setIsSending(true);
|
|
30
|
+
try {
|
|
31
|
+
await chatUiStore.sendMessageText(text);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
setIsSending(false);
|
|
35
|
+
}
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
var _a;
|
|
38
|
+
(_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
39
|
+
}, 0);
|
|
40
|
+
}, [chatUiStore, supportChatInputStore]);
|
|
41
|
+
const clearTimer = useCallback(() => {
|
|
42
|
+
var _a;
|
|
43
|
+
clearTimeout((_a = typingTimeoutRef.current) !== null && _a !== void 0 ? _a : 0);
|
|
44
|
+
typingTimeoutRef.current = undefined;
|
|
45
|
+
}, []);
|
|
46
|
+
// Send typing status = false
|
|
47
|
+
const sendTypingStatusStop = useCallback(() => {
|
|
48
|
+
const isTyping = Boolean(typingTimeoutRef.current);
|
|
49
|
+
if (isTyping) {
|
|
50
|
+
clearTimer();
|
|
51
|
+
chatUiStore.chasitorTyping(false);
|
|
52
|
+
}
|
|
53
|
+
}, [chatUiStore, clearTimer]);
|
|
54
|
+
// Send typing status = true and start the typing countdown. After the countdown, send typing status = false
|
|
55
|
+
const sendTypingStatusStart = useCallback(() => {
|
|
56
|
+
if (!typingTimeoutRef.current) {
|
|
57
|
+
chatUiStore.chasitorTyping(true);
|
|
58
|
+
}
|
|
59
|
+
clearTimeout(typingTimeoutRef.current);
|
|
60
|
+
typingTimeoutRef.current = setTimeout(sendTypingStatusStop, TIMEOUT_COOLDOWN_MS);
|
|
61
|
+
}, [sendTypingStatusStop, chatUiStore]);
|
|
62
|
+
const setUserIsTyping = useCallback((typing) => {
|
|
63
|
+
if (typing) {
|
|
64
|
+
sendTypingStatusStart();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
sendTypingStatusStop();
|
|
68
|
+
}
|
|
69
|
+
}, [sendTypingStatusStart, sendTypingStatusStop]);
|
|
70
|
+
const handleTextKeyPress = useCallback((e) => {
|
|
71
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
clearTimer();
|
|
74
|
+
handleSendMessage().then(() => { });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
setUserIsTyping(true);
|
|
78
|
+
}, [setUserIsTyping, handleSendMessage, clearTimer]);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (textareaRef.current) {
|
|
81
|
+
textareaRef.current.focus();
|
|
82
|
+
}
|
|
83
|
+
}, []);
|
|
84
|
+
return (_jsx("form", { className: classNames(className), onSubmit: handleSendMessage, children: _jsxs("div", { className: classNames('d-f flex-row gap-2'), children: [_jsx(Textarea, { ref: textareaRef, name: "question", placeholder: "Type your message", rows: 1,
|
|
85
|
+
// maxRows={2}
|
|
86
|
+
autoHeight: true, onKeyDown: handleTextKeyPress, value: supportChatInputStore.formState.$.message.value, error: supportChatInputStore.formState.$.message.error, onChange: supportChatInputStore.formState.$.message.onChangeHandler, onFocus: () => {
|
|
87
|
+
setTimeout(() => {
|
|
88
|
+
chatUiStore.triggerScroll();
|
|
89
|
+
}, 0);
|
|
90
|
+
}, onBlur: () => {
|
|
91
|
+
supportChatInputStore.formState.$.message.enableAutoValidationAndValidate();
|
|
92
|
+
}, className: classNames('flex-grow-1', Styles.formTextarea), disabled: !chatUiStore.isStarted || isSending, "data-cy": "titan-chat-input" }), _jsx(Button, { className: "align-self-baseline", icon: IconSend, "data-pendo": "titan-chat-send", "data-cy": "titan-chat-send", type: "submit", appearance: "primary", "aria-label": "submit", disabled: !chatUiStore.isStarted ||
|
|
93
|
+
isSending ||
|
|
94
|
+
supportChatInputStore.formState.hasError ||
|
|
95
|
+
supportChatInputStore.isEmpty })] }) }));
|
|
96
|
+
}));
|
|
97
|
+
//# sourceMappingURL=chat-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-input.js","sourceRoot":"","sources":["../../../src/components/chat/chat-input.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChatCustomizations } from '@servicetitan/titan-chat-ui-common';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
export interface IChatProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
customizations?: ChatCustomizations;
|
|
6
|
+
}
|
|
7
|
+
export declare const ChatLog: FC<IChatProps>;
|
|
8
|
+
//# sourceMappingURL=chat-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-log.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-log.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7F,OAAO,EAAE,EAAE,EAAa,MAAM,OAAO,CAAC;AAGtC,MAAM,WAAW,UAAU;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACvC;AAED,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,UAAU,CAejC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Flex } from '@servicetitan/anvil2';
|
|
3
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
4
|
+
import { CHAT_UI_STORE_TOKEN } from '@servicetitan/titan-chat-ui-common';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
6
|
+
import { useEffect } from 'react';
|
|
7
|
+
import { ChatMessages } from './chat-messages';
|
|
8
|
+
export const ChatLog = observer(({ className, customizations }) => {
|
|
9
|
+
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
chatUiStore.setCustomizationContext(customizations);
|
|
12
|
+
}, [chatUiStore, customizations]);
|
|
13
|
+
return (_jsx(Flex, { direction: "column", className: className, "data-cy": "titan-chat", children: _jsx(ChatMessages, { messages: chatUiStore.messages, showTypingIndicator: chatUiStore.isAgentTyping }) }));
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=chat-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-log.js","sourceRoot":"","sources":["../../../src/components/chat/chat-log.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAsB,MAAM,oCAAoC,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAM,SAAS,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C,MAAM,CAAC,MAAM,OAAO,GAAmB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE;IAC9E,MAAM,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACX,WAAW,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IAElC,OAAO,CACH,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAE,SAAS,aAAU,YAAY,YAC/D,KAAC,YAAY,IACT,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAC9B,mBAAmB,EAAE,WAAW,CAAC,aAAa,GAChD,GACC,CACV,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message-template-agent.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-message-template-agent.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAgB,MAAM,oCAAoC,CAAC;AAErF,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAW,MAAM,OAAO,CAAC;AAKvD,eAAO,MAAM,wBAAwB,EAAE,EAAE,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAqB7E,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { getFirstName } from '@servicetitan/titan-chat-ui-common';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
4
|
+
import { useMemo } from 'react';
|
|
5
|
+
import { MessageAgent } from '../messages/message-agent';
|
|
6
|
+
import { MessageFooter } from '../messages/message-footer';
|
|
7
|
+
import { useAvatarProps } from '../messages/use-avatar-props';
|
|
8
|
+
export const ChatMessageTemplateAgent = observer(({ children, message, omitAvatar, omitTimestamp }) => {
|
|
9
|
+
const { participant: { icon, name }, } = message;
|
|
10
|
+
const firstName = useMemo(() => getFirstName(name), [name]);
|
|
11
|
+
const avatarProps = useAvatarProps(name, icon);
|
|
12
|
+
return (_jsx(MessageAgent, { avatar: avatarProps, omitAvatar: omitAvatar, messageFooter: !omitTimestamp ? (_jsx(MessageFooter, { name: firstName, timestamp: message.timestamp })) : undefined, children: children }));
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=chat-message-template-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message-template-agent.js","sourceRoot":"","sources":["../../../src/components/chat/chat-message-template-agent.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAqB,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAyB,OAAO,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,CAAC,MAAM,wBAAwB,GAA6C,QAAQ,CACtF,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;IACjD,MAAM,EACF,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAC9B,GAAG,OAAO,CAAC;IACZ,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO,CACH,KAAC,YAAY,IACT,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,UAAU,EACtB,aAAa,EACT,CAAC,aAAa,CAAC,CAAC,CAAC,CACb,KAAC,aAAa,IAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,GAAI,CACnE,CAAC,CAAC,CAAC,SAAS,YAGhB,QAAQ,GACE,CAClB,CAAC;AACN,CAAC,CACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message-template-user.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-message-template-user.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGH,iBAAiB,EACpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAe,MAAM,OAAO,CAAC;AAI3D,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAuC5E,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import IconRefresh from '@servicetitan/anvil2/assets/icons/material/round/refresh.svg';
|
|
4
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
5
|
+
import { CHAT_UI_STORE_TOKEN, ChatMessageState, } from '@servicetitan/titan-chat-ui-common';
|
|
6
|
+
import { observer } from 'mobx-react';
|
|
7
|
+
import { useCallback } from 'react';
|
|
8
|
+
import { MessageFooter } from '../messages/message-footer';
|
|
9
|
+
import { MessageUser } from '../messages/message-user';
|
|
10
|
+
export const ChatMessageTemplateUser = observer(({ children, message, omitTimestamp }) => {
|
|
11
|
+
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
12
|
+
const isError = message.state === ChatMessageState.Failed;
|
|
13
|
+
const handleRetry = useCallback(() => chatUiStore.sendMessageRetry(message), [chatUiStore, message]);
|
|
14
|
+
return (_jsx(MessageUser, { isError: isError, messageFooter: isError ? (_jsxs(Text, { variant: "eyebrow", className: "c-red-600", "data-cy": "titan-chat-message-error", children: ["Message not delivered. Retry", _jsx(Button, { icon: IconRefresh, appearance: "ghost", size: "small", "aria-label": "Retry send message", onClick: handleRetry, "data-cy": "titan-chat-message-error-retry" })] })) : !omitTimestamp ? (_jsx(MessageFooter, { timestamp: message.timestamp })) : null, children: children }));
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=chat-message-template-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message-template-user.js","sourceRoot":"","sources":["../../../src/components/chat/chat-message-template-user.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,WAAW,MAAM,8DAA8D,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACH,mBAAmB,EACnB,gBAAgB,GAEnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAyB,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAA6C,QAAQ,CACrF,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE;IACrC,MAAM,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,gBAAgB,CAAC,MAAM,CAAC;IAE1D,MAAM,WAAW,GAAG,WAAW,CAC3B,GAAG,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAC3C,CAAC,WAAW,EAAE,OAAO,CAAC,CACzB,CAAC;IAEF,OAAO,CACH,KAAC,WAAW,IACR,OAAO,EAAE,OAAO,EAChB,aAAa,EACT,OAAO,CAAC,CAAC,CAAC,CACN,MAAC,IAAI,IACD,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,WAAW,aACb,0BAA0B,6CAGlC,KAAC,MAAM,IACH,IAAI,EAAE,WAAW,EACjB,UAAU,EAAC,OAAO,EAClB,IAAI,EAAC,OAAO,gBACD,oBAAoB,EAC/B,OAAO,EAAE,WAAW,aACZ,gCAAgC,GAC1C,IACC,CACV,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CACjB,KAAC,aAAa,IAAC,SAAS,EAAE,OAAO,CAAC,SAAS,GAAI,CAClD,CAAC,CAAC,CAAC,IAAI,YAGX,QAAQ,GACC,CACjB,CAAC;AACN,CAAC,CACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message-typing.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-message-typing.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAI3B,eAAO,MAAM,iBAAiB,EAAE,EAW9B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
3
|
+
import { CHAT_UI_STORE_TOKEN } from '@servicetitan/titan-chat-ui-common';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
5
|
+
import { MessageTyping } from '../messages/message-typing';
|
|
6
|
+
import { useAvatarProps } from '../messages/use-avatar-props';
|
|
7
|
+
export const ChatMessageTyping = observer(() => {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
10
|
+
const [{ agent: { icon, name }, },] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
11
|
+
const avatar = useAvatarProps(name, icon);
|
|
12
|
+
const Component = (_b = (_a = chatUiStore.customizations.messageTyping) === null || _a === void 0 ? void 0 : _a.component) !== null && _b !== void 0 ? _b : MessageTyping;
|
|
13
|
+
return _jsx(Component, { avatar: avatar });
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=chat-message-typing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message-typing.js","sourceRoot":"","sources":["../../../src/components/chat/chat-message-typing.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,CAAC,MAAM,iBAAiB,GAAO,QAAQ,CAAC,GAAG,EAAE;;IAC/C,MAAM,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAC3D,MAAM,CACF,EACI,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GACxB,EACJ,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAA,MAAA,WAAW,CAAC,cAAc,CAAC,aAAa,0CAAE,SAAS,mCAAI,aAAa,CAAC;IAEvF,OAAO,KAAC,SAAS,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;AACzC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IChatMessageProps } from '@servicetitan/titan-chat-ui-common';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* ChatMessage component provides a default way to render chat messages in the chat UI and contains only most generic
|
|
5
|
+
* components and templates/customizations rendering
|
|
6
|
+
*/
|
|
7
|
+
export declare const ChatMessage: FC<IChatMessageProps>;
|
|
8
|
+
//# sourceMappingURL=chat-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-message.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKH,iBAAiB,EACpB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,EAAE,EAAgC,MAAM,OAAO,CAAC;AAMzD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CA+D7C,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from '@servicetitan/anvil2';
|
|
3
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
4
|
+
import { CHAT_UI_STORE_TOKEN, } from '@servicetitan/titan-chat-ui-common';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
6
|
+
import { MessageContentFile } from '../message-content/message-content-file';
|
|
7
|
+
import { MessageContentText } from '../message-content/message-content-text';
|
|
8
|
+
import { ChatMessageTemplateAgent } from './chat-message-template-agent';
|
|
9
|
+
import { ChatMessageTemplateUser } from './chat-message-template-user';
|
|
10
|
+
/**
|
|
11
|
+
* ChatMessage component provides a default way to render chat messages in the chat UI and contains only most generic
|
|
12
|
+
* components and templates/customizations rendering
|
|
13
|
+
*/
|
|
14
|
+
export const ChatMessage = observer(({ message, omitAvatar, omitTimestamp }) => {
|
|
15
|
+
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
16
|
+
const isAgent = message.participant.isAgent;
|
|
17
|
+
const { messageTemplates, messages } = chatUiStore.customizations;
|
|
18
|
+
const messageCustomization = messages === null || messages === void 0 ? void 0 : messages.find(c => c.predicate(message));
|
|
19
|
+
const isSystem = Boolean(messageCustomization === null || messageCustomization === void 0 ? void 0 : messageCustomization.isSystem);
|
|
20
|
+
let messageContentNode;
|
|
21
|
+
if (messageCustomization === null || messageCustomization === void 0 ? void 0 : messageCustomization.component) {
|
|
22
|
+
messageContentNode = _jsx(messageCustomization.component, { message: message });
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// Default message content rendering
|
|
26
|
+
switch (message.type) {
|
|
27
|
+
case 'message':
|
|
28
|
+
case 'welcome':
|
|
29
|
+
messageContentNode = (_jsx(MessageContentText, { message: message }));
|
|
30
|
+
break;
|
|
31
|
+
case 'file':
|
|
32
|
+
messageContentNode = (_jsx(MessageContentFile, { message: message }));
|
|
33
|
+
break;
|
|
34
|
+
default: {
|
|
35
|
+
messageContentNode = _jsxs(Text, { children: ["Unknown message type: ", message.type] });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!messageContentNode || (messageCustomization === null || messageCustomization === void 0 ? void 0 : messageCustomization.isIgnored)) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (isSystem) {
|
|
43
|
+
return messageContentNode;
|
|
44
|
+
}
|
|
45
|
+
let ComponentTemplate;
|
|
46
|
+
if (isAgent) {
|
|
47
|
+
const template = messageTemplates === null || messageTemplates === void 0 ? void 0 : messageTemplates.agent;
|
|
48
|
+
ComponentTemplate = (template === null || template === void 0 ? void 0 : template.predicate(message))
|
|
49
|
+
? template.component
|
|
50
|
+
: ChatMessageTemplateAgent;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const template = messageTemplates === null || messageTemplates === void 0 ? void 0 : messageTemplates.user;
|
|
54
|
+
ComponentTemplate = (template === null || template === void 0 ? void 0 : template.predicate(message))
|
|
55
|
+
? template.component
|
|
56
|
+
: ChatMessageTemplateUser;
|
|
57
|
+
}
|
|
58
|
+
return (_jsx(ComponentTemplate, { message: message, omitAvatar: omitAvatar, omitTimestamp: omitTimestamp, children: messageContentNode }));
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=chat-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message.js","sourceRoot":"","sources":["../../../src/components/chat/chat-message.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ChatMessageModelBase } from '@servicetitan/titan-chat-ui-common';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
interface IChatMessagesProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
messages: ChatMessageModelBase[];
|
|
6
|
+
showTypingIndicator?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const ChatMessages: FC<IChatMessagesProps>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=chat-messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-messages.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-messages.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,EAAE,EAAW,MAAM,OAAO,CAAC;AAIpC,UAAU,kBAAkB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IACjC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,kBAAkB,CAqD/C,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Flex } from '@servicetitan/anvil2';
|
|
3
|
+
import { formatChatMessageDate } from '@servicetitan/titan-chat-ui-common';
|
|
4
|
+
import { useMemo } from 'react';
|
|
5
|
+
import { ChatMessage } from './chat-message';
|
|
6
|
+
import { ChatMessageTyping } from './chat-message-typing';
|
|
7
|
+
export const ChatMessages = ({ className, messages, showTypingIndicator, }) => {
|
|
8
|
+
// Split messages into chunks divided by participant name and message time (with 1 minute accuracy)
|
|
9
|
+
const messagesChunks = useMemo(() => messages.reduce((acc, message) => {
|
|
10
|
+
if (!acc.length) {
|
|
11
|
+
acc.push([[message]]);
|
|
12
|
+
return acc;
|
|
13
|
+
}
|
|
14
|
+
const lastMessage = acc.at(-1).at(-1).at(-1);
|
|
15
|
+
if (lastMessage.participant.name !== message.participant.name) {
|
|
16
|
+
acc.push([[message]]);
|
|
17
|
+
}
|
|
18
|
+
else if (formatChatMessageDate(lastMessage.timestamp) !==
|
|
19
|
+
formatChatMessageDate(message.timestamp)) {
|
|
20
|
+
acc.at(-1).push([message]);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
acc.at(-1).at(-1).push(message);
|
|
24
|
+
}
|
|
25
|
+
return acc;
|
|
26
|
+
}, []), [messages]);
|
|
27
|
+
return (_jsxs(Flex, { direction: "column", gap: "4", className: className, "data-cy": "titan-chat-messages", children: [messagesChunks
|
|
28
|
+
.map(sameParticipantMessages => {
|
|
29
|
+
// Set omit avatar for all messages except the first one
|
|
30
|
+
const firstParticipantMessage = sameParticipantMessages[0][0];
|
|
31
|
+
return sameParticipantMessages.map(sameDateMessages => {
|
|
32
|
+
const lastTimestampMessage = sameDateMessages.at(-1);
|
|
33
|
+
return sameDateMessages.map(message => {
|
|
34
|
+
return (_jsx(ChatMessage, { message: message, omitAvatar: message !== firstParticipantMessage, omitTimestamp: message !== lastTimestampMessage }, message.id));
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
})
|
|
38
|
+
.flat(2), showTypingIndicator && _jsx(ChatMessageTyping, {})] }));
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=chat-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-messages.js","sourceRoot":"","sources":["../../../src/components/chat/chat-messages.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAwB,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAM,OAAO,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAQ1D,MAAM,CAAC,MAAM,YAAY,GAA2B,CAAC,EACjD,SAAS,EACT,QAAQ,EACR,mBAAmB,GACtB,EAAE,EAAE;IACD,mGAAmG;IACnG,MAAM,cAAc,GAAG,OAAO,CAC1B,GAAG,EAAE,CACD,QAAQ,CAAC,MAAM,CAAC,CAAC,GAA+B,EAAE,OAAO,EAAE,EAAE;QACzD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC;QACf,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QAChD,IAAI,WAAW,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC5D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,IACH,qBAAqB,CAAC,WAAW,CAAC,SAAS,CAAC;YAC5C,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,EAC1C,CAAC;YACC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,EACV,CAAC,QAAQ,CAAC,CACb,CAAC;IAEF,OAAO,CACH,MAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,EAAC,GAAG,EAAC,GAAG,EAAC,SAAS,EAAE,SAAS,aAAU,qBAAqB,aAC/E,cAAc;iBACV,GAAG,CAAC,uBAAuB,CAAC,EAAE;gBAC3B,wDAAwD;gBACxD,MAAM,uBAAuB,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,OAAO,uBAAuB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;oBAClD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;oBACtD,OAAO,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;wBAClC,OAAO,CACH,KAAC,WAAW,IAER,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,OAAO,KAAK,uBAAuB,EAC/C,aAAa,EAAE,OAAO,KAAK,oBAAoB,IAH1C,OAAO,CAAC,EAAE,CAIjB,CACL,CAAC;oBACN,CAAC,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,CAAC,EACX,mBAAmB,IAAI,KAAC,iBAAiB,KAAG,IAC1C,CACV,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-notifications.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-notifications.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAI3B,MAAM,WAAW,uBAAuB;CAAG;AAE3C,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,uBAAuB,CAQxD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Flex } from '@servicetitan/anvil2';
|
|
3
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
4
|
+
import { CHAT_UI_STORE_TOKEN } from '@servicetitan/titan-chat-ui-common';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
6
|
+
import { ChatError } from './chat-error';
|
|
7
|
+
import { ChatTimer } from './chat-timer';
|
|
8
|
+
export const ChatNotifications = observer(() => {
|
|
9
|
+
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
10
|
+
return (_jsxs(Flex, { direction: "column", gap: "4", "data-cy": "titan-chat-notifications", children: [chatUiStore.timer && !chatUiStore.isError && _jsx(ChatTimer, {}), chatUiStore.isError && _jsx(ChatError, {})] }));
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=chat-notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-notifications.js","sourceRoot":"","sources":["../../../src/components/chat/chat-notifications.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,MAAM,CAAC,MAAM,iBAAiB,GAAgC,QAAQ,CAAC,GAAG,EAAE;IACxE,MAAM,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAC3D,OAAO,CACH,MAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,EAAC,GAAG,EAAC,GAAG,aAAS,0BAA0B,aAC9D,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,KAAC,SAAS,KAAG,EAC1D,WAAW,CAAC,OAAO,IAAI,KAAC,SAAS,KAAG,IAClC,CACV,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-timer.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-timer.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAe,MAAM,OAAO,CAAC;AAGxC,eAAO,MAAM,SAAS,EAAE,EA0BtB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Announcement, Link, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
4
|
+
import { CHAT_UI_STORE_TOKEN } from '@servicetitan/titan-chat-ui-common';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
6
|
+
import { useCallback } from 'react';
|
|
7
|
+
import * as Styles from './chat-timer.module.less';
|
|
8
|
+
export const ChatTimer = observer(() => {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
11
|
+
const secondsLeft = (_b = (_a = chatUiStore.timer) === null || _a === void 0 ? void 0 : _a.secondsLeft) !== null && _b !== void 0 ? _b : 0;
|
|
12
|
+
const restartTimers = useCallback(() => chatUiStore.restartTimers(), [chatUiStore]);
|
|
13
|
+
if (!chatUiStore.timer) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return (_jsxs(Announcement, { status: "info", title: "Chat inactive", className: Styles.banner, "data-cy": "titan-chat-timer", children: [_jsxs(Text, { variant: "body", children: ['Are you still there? Please respond within ', _jsxs("b", { children: [secondsLeft, "s"] }), ' or this chat will time out.'] }), _jsx(Link, { onClick: restartTimers, appearance: "secondary", "data-cy": "titan-chat-timer-restart", children: "I'm here" })] }));
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=chat-timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-timer.js","sourceRoot":"","sources":["../../../src/components/chat/chat-timer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAM,WAAW,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,0BAA0B,CAAC;AAEnD,MAAM,CAAC,MAAM,SAAS,GAAO,QAAQ,CAAC,GAAG,EAAE;;IACvC,MAAM,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,MAAA,MAAA,WAAW,CAAC,KAAK,0CAAE,WAAW,mCAAI,CAAC,CAAC;IAExD,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAEpF,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,CACH,MAAC,YAAY,IACT,MAAM,EAAC,MAAM,EACb,KAAK,EAAC,eAAe,EACrB,SAAS,EAAE,MAAM,CAAC,MAAM,aAChB,kBAAkB,aAE1B,MAAC,IAAI,IAAC,OAAO,EAAC,MAAM,aACf,6CAA6C,EAC9C,wBAAI,WAAW,SAAM,EACpB,8BAA8B,IAC5B,EACP,KAAC,IAAI,IAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAC,WAAW,aAAS,0BAA0B,yBAEhF,IACI,CAClB,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChatCustomizations } from '@servicetitan/titan-chat-ui-common';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
export interface IChatProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
customizations?: ChatCustomizations;
|
|
6
|
+
}
|
|
7
|
+
export declare const Chat: FC<IChatProps>;
|
|
8
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7F,OAAO,EAAE,EAAE,EAA+B,MAAM,OAAO,CAAC;AAOxD,MAAM,WAAW,UAAU;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACvC;AAED,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,UAAU,CA2C9B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Flex } from '@servicetitan/anvil2';
|
|
3
|
+
import { useDependencies } from '@servicetitan/react-ioc';
|
|
4
|
+
import { CHAT_UI_STORE_TOKEN } from '@servicetitan/titan-chat-ui-common';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
6
|
+
import { Fragment, useEffect, useRef } from 'react';
|
|
7
|
+
import { ChatConnecting } from './chat-connecting';
|
|
8
|
+
import { ChatInput } from './chat-input';
|
|
9
|
+
import { ChatInputFile } from './chat-input-file';
|
|
10
|
+
import { ChatMessages } from './chat-messages';
|
|
11
|
+
import { ChatNotifications } from './chat-notifications';
|
|
12
|
+
export const Chat = observer(({ className, customizations }) => {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
const scrollRef = useRef(null);
|
|
15
|
+
const [chatUiStore] = useDependencies(CHAT_UI_STORE_TOKEN);
|
|
16
|
+
const footerComponent = customizations === null || customizations === void 0 ? void 0 : customizations.footerComponent;
|
|
17
|
+
const loadingComponent = customizations === null || customizations === void 0 ? void 0 : customizations.loadingComponent;
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
chatUiStore.setCustomizationContext(customizations);
|
|
20
|
+
}, [chatUiStore, customizations]);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
if (scrollRef.current) {
|
|
24
|
+
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
25
|
+
}
|
|
26
|
+
}, 0);
|
|
27
|
+
}, [chatUiStore.scrollCounter]);
|
|
28
|
+
return (_jsx(Flex, { direction: "column", className: className, "data-cy": "titan-chat", children: chatUiStore.isStarting ? ((loadingComponent !== null && loadingComponent !== void 0 ? loadingComponent : _jsx(ChatConnecting, { className: "p-x-3 p-y-2" }))) : (_jsxs(Fragment, { children: [_jsx("div", { ref: scrollRef, className: "p-x-3 p-y-2 flex-grow-1 of-y-auto", children: _jsx(ChatMessages, { messages: chatUiStore.messages, showTypingIndicator: chatUiStore.isAgentTyping }) }), _jsx(ChatNotifications, {}), !((_b = (_a = chatUiStore.customizations) === null || _a === void 0 ? void 0 : _a.input) === null || _b === void 0 ? void 0 : _b.isDisabled) && (_jsxs(Flex, { className: "p-x-3 p-y-2", direction: "column", gap: "4", children: [_jsx(ChatInputFile, { className: "p-2 box-sizing-border-box border-radius-1 border border-style-dashed" }), _jsx(ChatInput, {}), Boolean(footerComponent) && footerComponent] }))] })) }));
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/components/chat/chat.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAsB,MAAM,oCAAoC,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAM,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAOzD,MAAM,CAAC,MAAM,IAAI,GAAmB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE;;IAC3E,MAAM,SAAS,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAE3D,MAAM,eAAe,GAAG,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,eAAe,CAAC;IACxD,MAAM,gBAAgB,GAAG,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,gBAAgB,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACX,WAAW,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IAElC,SAAS,CAAC,GAAG,EAAE;QACX,UAAU,CAAC,GAAG,EAAE;YACZ,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACpB,SAAS,CAAC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC;YACjE,CAAC;QACL,CAAC,EAAE,CAAC,CAAC,CAAC;IACV,CAAC,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAEhC,OAAO,CACH,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAE,SAAS,aAAU,YAAY,YAC9D,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CACtB,CAAC,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,KAAC,cAAc,IAAC,SAAS,EAAC,aAAa,GAAG,CAAC,CACnE,CAAC,CAAC,CAAC,CACA,MAAC,QAAQ,eACL,cAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAC,mCAAmC,YAC9D,KAAC,YAAY,IACT,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAC9B,mBAAmB,EAAE,WAAW,CAAC,aAAa,GAChD,GACA,EACN,KAAC,iBAAiB,KAAG,EACpB,CAAC,CAAA,MAAA,MAAA,WAAW,CAAC,cAAc,0CAAE,KAAK,0CAAE,UAAU,CAAA,IAAI,CAC/C,MAAC,IAAI,IAAC,SAAS,EAAC,aAAa,EAAC,SAAS,EAAC,QAAQ,EAAC,GAAG,EAAC,GAAG,aACpD,KAAC,aAAa,IAAC,SAAS,EAAC,sEAAsE,GAAG,EAClG,KAAC,SAAS,KAAG,EACZ,OAAO,CAAC,eAAe,CAAC,IAAI,eAAe,IACzC,CACV,IACM,CACd,GACE,CACV,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TextProps } from '@servicetitan/anvil2';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
type MultilineTextProps = TextProps & {
|
|
4
|
+
text: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const MultilineText: FC<MultilineTextProps>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=multiline-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiline-text.d.ts","sourceRoot":"","sources":["../../../src/components/common/multiline-text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAQ,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAqB,MAAM,OAAO,CAAC;AAG9C,KAAK,kBAAkB,GAAG,SAAS,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAmBhD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from '@servicetitan/anvil2';
|
|
3
|
+
import classNames from 'classnames';
|
|
4
|
+
import { Fragment, useMemo } from 'react';
|
|
5
|
+
import * as Styles from './multiline-text.module.less';
|
|
6
|
+
export const MultilineText = ({ className, text, ...rest }) => {
|
|
7
|
+
const textParts = useMemo(() => text.split('\n'), [text]);
|
|
8
|
+
return (_jsx(Fragment, { children: textParts.map((part, index) => {
|
|
9
|
+
return (_jsx(Text, { variant: "body", ...rest, className: classNames(Styles.multilineText, className), children: part.trim() ? part : _jsx("span", { children: "\u00A0" }) }, index));
|
|
10
|
+
}) }));
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=multiline-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiline-text.js","sourceRoot":"","sources":["../../../src/components/common/multiline-text.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,sBAAsB,CAAC;AACvD,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAM,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,8BAA8B,CAAC;AAOvD,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IAClF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,OAAO,CACH,KAAC,QAAQ,cACJ,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC3B,OAAO,CACH,KAAC,IAAI,IACD,OAAO,EAAC,MAAM,KAGV,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,YAErD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oCAAmB,IAJpC,KAAK,CAKP,CACV,CAAC;QACN,CAAC,CAAC,GACK,CACd,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChatMessageModelFile } from '@servicetitan/titan-chat-ui-common';
|
|
2
|
+
import { FC } from 'react';
|
|
3
|
+
interface IMessageContentFileProps {
|
|
4
|
+
message: ChatMessageModelFile;
|
|
5
|
+
}
|
|
6
|
+
export declare const MessageContentFile: FC<IMessageContentFileProps>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=message-content-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-content-file.d.ts","sourceRoot":"","sources":["../../../src/components/message-content/message-content-file.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,oCAAoC,CAAC;AAE5F,OAAO,EAAE,EAAE,EAAY,MAAM,OAAO,CAAC;AAErC,UAAU,wBAAwB;IAC9B,OAAO,EAAE,oBAAoB,CAAC;CACjC;AAED,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,wBAAwB,CAiB1D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Flex, Icon, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import IconFileAttach from '@servicetitan/anvil2/assets/icons/material/round/file_upload.svg';
|
|
4
|
+
import { ChatMessageState } from '@servicetitan/titan-chat-ui-common';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
6
|
+
import { Fragment } from 'react';
|
|
7
|
+
export const MessageContentFile = observer(({ message }) => {
|
|
8
|
+
const isDelivering = message.state === ChatMessageState.Delivering;
|
|
9
|
+
const isDelivered = message.state === ChatMessageState.Delivered;
|
|
10
|
+
return (_jsxs(Fragment, { children: [_jsxs(Flex, { direction: "row", gap: "2", alignItems: "center", children: [_jsx(Icon, { svg: IconFileAttach }), _jsx("span", { children: message.fileName })] }), (isDelivering || isDelivered) && (_jsx(Text, { variant: "body", size: "small", className: "ta-right", subdued: true, children: isDelivered ? 'File uploaded' : 'Please wait while uploading...' }))] }));
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=message-content-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-content-file.js","sourceRoot":"","sources":["../../../src/components/message-content/message-content-file.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,cAAc,MAAM,kEAAkE,CAAC;AAC9F,OAAO,EAAwB,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAM,QAAQ,EAAE,MAAM,OAAO,CAAC;AAMrC,MAAM,CAAC,MAAM,kBAAkB,GAAiC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;IACrF,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,KAAK,gBAAgB,CAAC,UAAU,CAAC;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,KAAK,gBAAgB,CAAC,SAAS,CAAC;IAEjE,OAAO,CACH,MAAC,QAAQ,eACL,MAAC,IAAI,IAAC,SAAS,EAAC,KAAK,EAAC,GAAG,EAAC,GAAG,EAAC,UAAU,EAAC,QAAQ,aAC7C,KAAC,IAAI,IAAC,GAAG,EAAE,cAAc,GAAI,EAC7B,yBAAO,OAAO,CAAC,QAAQ,GAAQ,IAC5B,EACN,CAAC,YAAY,IAAI,WAAW,CAAC,IAAI,CAC9B,KAAC,IAAI,IAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,UAAU,EAAC,OAAO,kBACzD,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gCAAgC,GAC9D,CACV,IACM,CACd,CAAC;AACN,CAAC,CAAC,CAAC"}
|