@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.
Files changed (205) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README.md +15 -0
  3. package/dist/assets/floating-chat-avatar.svg +16 -0
  4. package/dist/components/chat/__tests-cy__/chat-messages.test.d.ts +2 -0
  5. package/dist/components/chat/__tests-cy__/chat-messages.test.d.ts.map +1 -0
  6. package/dist/components/chat/__tests-cy__/chat-messages.test.js +95 -0
  7. package/dist/components/chat/__tests-cy__/chat-messages.test.js.map +1 -0
  8. package/dist/components/chat/__tests-cy__/chat.test.d.ts +2 -0
  9. package/dist/components/chat/__tests-cy__/chat.test.d.ts.map +1 -0
  10. package/dist/components/chat/__tests-cy__/chat.test.js +130 -0
  11. package/dist/components/chat/__tests-cy__/chat.test.js.map +1 -0
  12. package/dist/components/chat/chat-connecting.d.ts +7 -0
  13. package/dist/components/chat/chat-connecting.d.ts.map +1 -0
  14. package/dist/components/chat/chat-connecting.js +6 -0
  15. package/dist/components/chat/chat-connecting.js.map +1 -0
  16. package/dist/components/chat/chat-error.d.ts +3 -0
  17. package/dist/components/chat/chat-error.d.ts.map +1 -0
  18. package/dist/components/chat/chat-error.js +20 -0
  19. package/dist/components/chat/chat-error.js.map +1 -0
  20. package/dist/components/chat/chat-error.module.less +6 -0
  21. package/dist/components/chat/chat-input-file.d.ts +5 -0
  22. package/dist/components/chat/chat-input-file.d.ts.map +1 -0
  23. package/dist/components/chat/chat-input-file.js +41 -0
  24. package/dist/components/chat/chat-input-file.js.map +1 -0
  25. package/dist/components/chat/chat-input.d.ts +5 -0
  26. package/dist/components/chat/chat-input.d.ts.map +1 -0
  27. package/dist/components/chat/chat-input.js +97 -0
  28. package/dist/components/chat/chat-input.js.map +1 -0
  29. package/dist/components/chat/chat-input.module.less +11 -0
  30. package/dist/components/chat/chat-log.d.ts +8 -0
  31. package/dist/components/chat/chat-log.d.ts.map +1 -0
  32. package/dist/components/chat/chat-log.js +15 -0
  33. package/dist/components/chat/chat-log.js.map +1 -0
  34. package/dist/components/chat/chat-message-template-agent.d.ts +4 -0
  35. package/dist/components/chat/chat-message-template-agent.d.ts.map +1 -0
  36. package/dist/components/chat/chat-message-template-agent.js +14 -0
  37. package/dist/components/chat/chat-message-template-agent.js.map +1 -0
  38. package/dist/components/chat/chat-message-template-user.d.ts +4 -0
  39. package/dist/components/chat/chat-message-template-user.d.ts.map +1 -0
  40. package/dist/components/chat/chat-message-template-user.js +16 -0
  41. package/dist/components/chat/chat-message-template-user.js.map +1 -0
  42. package/dist/components/chat/chat-message-typing.d.ts +3 -0
  43. package/dist/components/chat/chat-message-typing.d.ts.map +1 -0
  44. package/dist/components/chat/chat-message-typing.js +15 -0
  45. package/dist/components/chat/chat-message-typing.js.map +1 -0
  46. package/dist/components/chat/chat-message.d.ts +8 -0
  47. package/dist/components/chat/chat-message.d.ts.map +1 -0
  48. package/dist/components/chat/chat-message.js +60 -0
  49. package/dist/components/chat/chat-message.js.map +1 -0
  50. package/dist/components/chat/chat-messages.d.ts +10 -0
  51. package/dist/components/chat/chat-messages.d.ts.map +1 -0
  52. package/dist/components/chat/chat-messages.js +40 -0
  53. package/dist/components/chat/chat-messages.js.map +1 -0
  54. package/dist/components/chat/chat-notifications.d.ts +5 -0
  55. package/dist/components/chat/chat-notifications.d.ts.map +1 -0
  56. package/dist/components/chat/chat-notifications.js +12 -0
  57. package/dist/components/chat/chat-notifications.js.map +1 -0
  58. package/dist/components/chat/chat-timer.d.ts +3 -0
  59. package/dist/components/chat/chat-timer.d.ts.map +1 -0
  60. package/dist/components/chat/chat-timer.js +18 -0
  61. package/dist/components/chat/chat-timer.js.map +1 -0
  62. package/dist/components/chat/chat-timer.module.less +5 -0
  63. package/dist/components/chat/chat.d.ts +8 -0
  64. package/dist/components/chat/chat.d.ts.map +1 -0
  65. package/dist/components/chat/chat.js +30 -0
  66. package/dist/components/chat/chat.js.map +1 -0
  67. package/dist/components/common/multiline-text.d.ts +9 -0
  68. package/dist/components/common/multiline-text.d.ts.map +1 -0
  69. package/dist/components/common/multiline-text.js +12 -0
  70. package/dist/components/common/multiline-text.js.map +1 -0
  71. package/dist/components/common/multiline-text.module.less +9 -0
  72. package/dist/components/message-content/message-content-file.d.ts +8 -0
  73. package/dist/components/message-content/message-content-file.d.ts.map +1 -0
  74. package/dist/components/message-content/message-content-file.js +12 -0
  75. package/dist/components/message-content/message-content-file.js.map +1 -0
  76. package/dist/components/message-content/message-content-text.d.ts +8 -0
  77. package/dist/components/message-content/message-content-text.d.ts.map +1 -0
  78. package/dist/components/message-content/message-content-text.js +7 -0
  79. package/dist/components/message-content/message-content-text.js.map +1 -0
  80. package/dist/components/messages/__tests-cy__/message-agent.test.d.ts +2 -0
  81. package/dist/components/messages/__tests-cy__/message-agent.test.d.ts.map +1 -0
  82. package/dist/components/messages/__tests-cy__/message-agent.test.js +83 -0
  83. package/dist/components/messages/__tests-cy__/message-agent.test.js.map +1 -0
  84. package/dist/components/messages/__tests-cy__/message-system.test.d.ts +2 -0
  85. package/dist/components/messages/__tests-cy__/message-system.test.d.ts.map +1 -0
  86. package/dist/components/messages/__tests-cy__/message-system.test.js +19 -0
  87. package/dist/components/messages/__tests-cy__/message-system.test.js.map +1 -0
  88. package/dist/components/messages/__tests-cy__/message-timeout.test.d.ts +2 -0
  89. package/dist/components/messages/__tests-cy__/message-timeout.test.d.ts.map +1 -0
  90. package/dist/components/messages/__tests-cy__/message-timeout.test.js +25 -0
  91. package/dist/components/messages/__tests-cy__/message-timeout.test.js.map +1 -0
  92. package/dist/components/messages/__tests-cy__/message-typing.test.d.ts +2 -0
  93. package/dist/components/messages/__tests-cy__/message-typing.test.d.ts.map +1 -0
  94. package/dist/components/messages/__tests-cy__/message-typing.test.js +48 -0
  95. package/dist/components/messages/__tests-cy__/message-typing.test.js.map +1 -0
  96. package/dist/components/messages/__tests-cy__/message-user.test.d.ts +2 -0
  97. package/dist/components/messages/__tests-cy__/message-user.test.d.ts.map +1 -0
  98. package/dist/components/messages/__tests-cy__/message-user.test.js +27 -0
  99. package/dist/components/messages/__tests-cy__/message-user.test.js.map +1 -0
  100. package/dist/components/messages/message-agent.d.ts +14 -0
  101. package/dist/components/messages/message-agent.d.ts.map +1 -0
  102. package/dist/components/messages/message-agent.js +15 -0
  103. package/dist/components/messages/message-agent.js.map +1 -0
  104. package/dist/components/messages/message-agent.module.less +51 -0
  105. package/dist/components/messages/message-avatar.d.ts +9 -0
  106. package/dist/components/messages/message-avatar.d.ts.map +1 -0
  107. package/dist/components/messages/message-avatar.js +17 -0
  108. package/dist/components/messages/message-avatar.js.map +1 -0
  109. package/dist/components/messages/message-avatar.module.less +26 -0
  110. package/dist/components/messages/message-footer.d.ts +7 -0
  111. package/dist/components/messages/message-footer.d.ts.map +1 -0
  112. package/dist/components/messages/message-footer.js +7 -0
  113. package/dist/components/messages/message-footer.js.map +1 -0
  114. package/dist/components/messages/message-system.d.ts +8 -0
  115. package/dist/components/messages/message-system.d.ts.map +1 -0
  116. package/dist/components/messages/message-system.js +12 -0
  117. package/dist/components/messages/message-system.js.map +1 -0
  118. package/dist/components/messages/message-system.module.less +26 -0
  119. package/dist/components/messages/message-timeout.d.ts +7 -0
  120. package/dist/components/messages/message-timeout.d.ts.map +1 -0
  121. package/dist/components/messages/message-timeout.js +14 -0
  122. package/dist/components/messages/message-timeout.js.map +1 -0
  123. package/dist/components/messages/message-typing.d.ts +7 -0
  124. package/dist/components/messages/message-typing.d.ts.map +1 -0
  125. package/dist/components/messages/message-typing.js +6 -0
  126. package/dist/components/messages/message-typing.js.map +1 -0
  127. package/dist/components/messages/message-typing.module.less +40 -0
  128. package/dist/components/messages/message-user.d.ts +8 -0
  129. package/dist/components/messages/message-user.d.ts.map +1 -0
  130. package/dist/components/messages/message-user.js +10 -0
  131. package/dist/components/messages/message-user.js.map +1 -0
  132. package/dist/components/messages/message-user.module.less +32 -0
  133. package/dist/components/messages/use-avatar-props.d.ts +4 -0
  134. package/dist/components/messages/use-avatar-props.d.ts.map +1 -0
  135. package/dist/components/messages/use-avatar-props.js +11 -0
  136. package/dist/components/messages/use-avatar-props.js.map +1 -0
  137. package/dist/index.d.ts +14 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +14 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/stores/__tests__/chat-input.store.test.d.ts +2 -0
  142. package/dist/stores/__tests__/chat-input.store.test.d.ts.map +1 -0
  143. package/dist/stores/__tests__/chat-input.store.test.js +36 -0
  144. package/dist/stores/__tests__/chat-input.store.test.js.map +1 -0
  145. package/dist/stores/chat-input.store.d.ts +10 -0
  146. package/dist/stores/chat-input.store.d.ts.map +1 -0
  147. package/dist/stores/chat-input.store.js +46 -0
  148. package/dist/stores/chat-input.store.js.map +1 -0
  149. package/package.json +53 -0
  150. package/src/assets/floating-chat-avatar.svg +16 -0
  151. package/src/components/chat/__tests-cy__/chat-messages.test.tsx +111 -0
  152. package/src/components/chat/__tests-cy__/chat.test.tsx +164 -0
  153. package/src/components/chat/chat-connecting.tsx +23 -0
  154. package/src/components/chat/chat-error.module.less +6 -0
  155. package/src/components/chat/chat-error.module.less.d.ts +3 -0
  156. package/src/components/chat/chat-error.tsx +40 -0
  157. package/src/components/chat/chat-input-file.tsx +70 -0
  158. package/src/components/chat/chat-input.module.less +11 -0
  159. package/src/components/chat/chat-input.module.less.d.ts +3 -0
  160. package/src/components/chat/chat-input.tsx +144 -0
  161. package/src/components/chat/chat-log.tsx +28 -0
  162. package/src/components/chat/chat-message-template-agent.tsx +29 -0
  163. package/src/components/chat/chat-message-template-user.tsx +53 -0
  164. package/src/components/chat/chat-message-typing.tsx +19 -0
  165. package/src/components/chat/chat-message.tsx +84 -0
  166. package/src/components/chat/chat-messages.tsx +66 -0
  167. package/src/components/chat/chat-notifications.tsx +19 -0
  168. package/src/components/chat/chat-timer.module.less +5 -0
  169. package/src/components/chat/chat-timer.module.less.d.ts +3 -0
  170. package/src/components/chat/chat-timer.tsx +34 -0
  171. package/src/components/chat/chat.tsx +60 -0
  172. package/src/components/common/multiline-text.module.less +9 -0
  173. package/src/components/common/multiline-text.module.less.d.ts +3 -0
  174. package/src/components/common/multiline-text.tsx +30 -0
  175. package/src/components/message-content/message-content-file.tsx +28 -0
  176. package/src/components/message-content/message-content-text.tsx +12 -0
  177. package/src/components/messages/__tests-cy__/message-agent.test.tsx +142 -0
  178. package/src/components/messages/__tests-cy__/message-system.test.tsx +32 -0
  179. package/src/components/messages/__tests-cy__/message-timeout.test.tsx +29 -0
  180. package/src/components/messages/__tests-cy__/message-typing.test.tsx +57 -0
  181. package/src/components/messages/__tests-cy__/message-user.test.tsx +41 -0
  182. package/src/components/messages/message-agent.module.less +51 -0
  183. package/src/components/messages/message-agent.module.less.d.ts +8 -0
  184. package/src/components/messages/message-agent.tsx +69 -0
  185. package/src/components/messages/message-avatar.module.less +26 -0
  186. package/src/components/messages/message-avatar.module.less.d.ts +5 -0
  187. package/src/components/messages/message-avatar.tsx +38 -0
  188. package/src/components/messages/message-footer.tsx +18 -0
  189. package/src/components/messages/message-system.module.less +26 -0
  190. package/src/components/messages/message-system.module.less.d.ts +5 -0
  191. package/src/components/messages/message-system.tsx +36 -0
  192. package/src/components/messages/message-timeout.tsx +47 -0
  193. package/src/components/messages/message-typing.module.less +40 -0
  194. package/src/components/messages/message-typing.module.less.d.ts +5 -0
  195. package/src/components/messages/message-typing.tsx +21 -0
  196. package/src/components/messages/message-user.module.less +32 -0
  197. package/src/components/messages/message-user.module.less.d.ts +7 -0
  198. package/src/components/messages/message-user.tsx +46 -0
  199. package/src/components/messages/use-avatar-props.tsx +16 -0
  200. package/src/cypress.d.ts +10 -0
  201. package/src/index.ts +13 -0
  202. package/src/stores/__tests__/chat-input.store.test.ts +43 -0
  203. package/src/stores/chat-input.store.ts +25 -0
  204. package/tsconfig.json +24 -0
  205. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,18 @@
1
+ import { Text } from '@servicetitan/anvil2';
2
+ import { formatChatMessageDate } from '@servicetitan/titan-chat-ui-common';
3
+ import { FC } from 'react';
4
+
5
+ export interface IMessageFooterProps {
6
+ timestamp?: Date;
7
+ name?: string;
8
+ }
9
+
10
+ export const MessageFooter: FC<IMessageFooterProps> = ({ name, timestamp }) => {
11
+ return (
12
+ <Text variant="eyebrow">
13
+ {Boolean(name) && name}
14
+ {name && timestamp && ' • '}
15
+ {timestamp && formatChatMessageDate(timestamp)}
16
+ </Text>
17
+ );
18
+ };
@@ -0,0 +1,26 @@
1
+ @import '@servicetitan/tokens/dist/tokens.less';
2
+
3
+ /* stylelint-disable declaration-property-value-no-unknown */
4
+ .messageRoot {
5
+ display: grid;
6
+ grid-template-areas: '. content .';
7
+ grid-template-rows: auto;
8
+ grid-template-columns: minmax(@spacing-5, auto) 1fr minmax(@spacing-5, auto);
9
+ column-gap: @spacing-2;
10
+ row-gap: @spacing-1;
11
+ width: 100%;
12
+
13
+ &.fullWidth {
14
+ grid-template:
15
+ 'content' auto
16
+ /
17
+ 1fr;
18
+ }
19
+ }
20
+
21
+ .messageContent {
22
+ grid-area: content;
23
+ overflow-wrap: anywhere;
24
+ justify-self: flex-start;
25
+ width: 100%;
26
+ }
@@ -0,0 +1,5 @@
1
+ export const __esModule: true;
2
+ export const fullWidth: string;
3
+ export const messageContent: string;
4
+ export const messageRoot: string;
5
+
@@ -0,0 +1,36 @@
1
+ import { Flex } from '@servicetitan/anvil2';
2
+ import classNames from 'classnames';
3
+ import { FC, PropsWithChildren } from 'react';
4
+ import * as Styles from './message-system.module.less';
5
+
6
+ export interface IMessageSystemProps {
7
+ fullWidth?: boolean;
8
+ className?: string;
9
+ ['data-cy']?: string;
10
+ }
11
+
12
+ export const MessageSystem: FC<PropsWithChildren<IMessageSystemProps>> = ({
13
+ children,
14
+ className,
15
+ fullWidth,
16
+ ...rest
17
+ }) => {
18
+ const dataCy = rest['data-cy'] ?? 'titan-chat-message-system';
19
+ return (
20
+ <div
21
+ className={classNames(
22
+ Styles.messageRoot,
23
+ {
24
+ [Styles.fullWidth]: Boolean(fullWidth),
25
+ },
26
+ className
27
+ )}
28
+ data-cy2="titan-chat-message"
29
+ data-cy={dataCy}
30
+ >
31
+ <Flex direction="column" gap="2" className={Styles.messageContent}>
32
+ {children}
33
+ </Flex>
34
+ </div>
35
+ );
36
+ };
@@ -0,0 +1,47 @@
1
+ import { Divider, Flex, Link, Text } from '@servicetitan/anvil2';
2
+ import { FC, useCallback } from 'react';
3
+ import { MessageSystem } from './message-system';
4
+
5
+ export interface IMessageTimeoutProps {
6
+ onResume: () => void;
7
+ onReset: () => void;
8
+ }
9
+
10
+ export const MessageTimeout: FC<IMessageTimeoutProps> = ({ onReset, onResume }) => {
11
+ const handleResume = useCallback(() => {
12
+ onResume();
13
+ }, [onResume]);
14
+
15
+ const handleReset = useCallback(() => {
16
+ onReset();
17
+ }, [onReset]);
18
+
19
+ return (
20
+ <MessageSystem data-cy="titan-chat-message-timeout" fullWidth>
21
+ <Flex direction="column" gap="4">
22
+ <Divider />
23
+ <Text className="ta-center">
24
+ Your session has timed out.
25
+ <br />
26
+ Would you like to resume it or start a new one?
27
+ <br />
28
+ <Link
29
+ onClick={handleResume}
30
+ appearance="primary"
31
+ data-cy="titan-chat-message-timeout-resume"
32
+ >
33
+ Continue session
34
+ </Link>{' '}
35
+ or{' '}
36
+ <Link
37
+ onClick={handleReset}
38
+ appearance="primary"
39
+ data-cy="titan-chat-message-timeout-reset"
40
+ >
41
+ Start new session
42
+ </Link>
43
+ </Text>
44
+ </Flex>
45
+ </MessageSystem>
46
+ );
47
+ };
@@ -0,0 +1,40 @@
1
+ @import '@servicetitan/tokens/dist/tokens.less';
2
+
3
+ .dotsContainer {
4
+ @keyframes dot-jumping {
5
+ 0% {
6
+ transform: translateY(0);
7
+ }
8
+ 16.6666% {
9
+ transform: translateY(-6px);
10
+ }
11
+ 33.3333% {
12
+ transform: translateY(0);
13
+ }
14
+ 100% {
15
+ transform: translateY(0);
16
+ }
17
+ }
18
+
19
+ & .dot {
20
+ width: 6px;
21
+ height: 6px;
22
+ margin: @spacing-0 2px;
23
+ background-color: @color-neutral-80;
24
+ border-radius: @border-radius-circular;
25
+ display: inline-block;
26
+ animation: dot-jumping 1.5s infinite ease-in-out;
27
+ }
28
+
29
+ & .dot:nth-child(1) {
30
+ animation-delay: 0s;
31
+ }
32
+
33
+ & .dot:nth-child(2) {
34
+ animation-delay: 0.5s;
35
+ }
36
+
37
+ & .dot:nth-child(3) {
38
+ animation-delay: 1s;
39
+ }
40
+ }
@@ -0,0 +1,5 @@
1
+ export const __esModule: true;
2
+ export const dot: string;
3
+ export const dotJumping: string;
4
+ export const dotsContainer: string;
5
+
@@ -0,0 +1,21 @@
1
+ import { Flex } from '@servicetitan/anvil2';
2
+ import { FC } from 'react';
3
+ import { MessageAgent } from './message-agent';
4
+ import { IMessageAvatarProps } from './message-avatar';
5
+ import * as Styles from './message-typing.module.less';
6
+
7
+ export interface IMessageTypingProps {
8
+ avatar: IMessageAvatarProps;
9
+ }
10
+
11
+ export const MessageTyping: FC<IMessageTypingProps> = ({ avatar }) => (
12
+ <MessageAgent avatar={avatar} data-cy="titan-chat-message-typing" subtle>
13
+ <Flex className="h-100" alignItems="center">
14
+ <div className={Styles.dotsContainer} data-cy="titan-chat-message-typing-dots">
15
+ <span className={Styles.dot} />
16
+ <span className={Styles.dot} />
17
+ <span className={Styles.dot} />
18
+ </div>
19
+ </Flex>
20
+ </MessageAgent>
21
+ );
@@ -0,0 +1,32 @@
1
+ @import '@servicetitan/tokens/dist/tokens.less';
2
+
3
+ /* stylelint-disable declaration-property-value-no-unknown */
4
+ .messageRoot {
5
+ display: grid;
6
+ grid-template-areas: '. content';
7
+ grid-template-rows: auto;
8
+ grid-template-columns: minmax(@spacing-5, auto) 1fr;
9
+ column-gap: @spacing-2;
10
+ row-gap: @spacing-1;
11
+ }
12
+
13
+ .messageFooter {
14
+ text-align: right;
15
+ }
16
+
17
+ .messageContent {
18
+ grid-area: content;
19
+ overflow-wrap: anywhere;
20
+ justify-self: end;
21
+ }
22
+
23
+ .messageBubble {
24
+ color: @color-neutral-200;
25
+ padding: @spacing-2 @spacing-3;
26
+ background-color: @color-neutral-50;
27
+ border-radius: @spacing-3 @spacing-3 @spacing-0 @spacing-3;
28
+
29
+ &.error {
30
+ background-color: @color-red-100;
31
+ }
32
+ }
@@ -0,0 +1,7 @@
1
+ export const __esModule: true;
2
+ export const error: string;
3
+ export const messageBubble: string;
4
+ export const messageContent: string;
5
+ export const messageFooter: string;
6
+ export const messageRoot: string;
7
+
@@ -0,0 +1,46 @@
1
+ import { Flex } from '@servicetitan/anvil2';
2
+ import classNames from 'classnames';
3
+ import { FC, PropsWithChildren, ReactNode } from 'react';
4
+ import * as Styles from './message-user.module.less';
5
+
6
+ export interface IMessageUserProps {
7
+ messageFooter?: ReactNode;
8
+ isError?: boolean;
9
+ className?: string;
10
+ }
11
+
12
+ export const MessageUser: FC<PropsWithChildren<IMessageUserProps>> = ({
13
+ children,
14
+ className,
15
+ isError,
16
+ messageFooter,
17
+ }) => {
18
+ return (
19
+ <div
20
+ className={classNames(Styles.messageRoot, 'max-w-100', className)}
21
+ data-cy2="titan-chat-message"
22
+ data-cy="titan-chat-message-user"
23
+ >
24
+ <Flex
25
+ direction="column"
26
+ gap="2"
27
+ className={classNames('max-w-100', Styles.messageContent)}
28
+ >
29
+ <div
30
+ className={classNames(Styles.messageBubble, {
31
+ [Styles.error]: isError,
32
+ })}
33
+ data-cy="titan-chat-message-content"
34
+ data-cy2="titan-chat-message-content-user"
35
+ >
36
+ {children}
37
+ </div>
38
+ {Boolean(messageFooter) && (
39
+ <div className={Styles.messageFooter} data-cy="titan-chat-message-footer">
40
+ {messageFooter}
41
+ </div>
42
+ )}
43
+ </Flex>
44
+ </div>
45
+ );
46
+ };
@@ -0,0 +1,16 @@
1
+ import { ChatParticipantIcon, getNameInitialsFirst } from '@servicetitan/titan-chat-ui-common';
2
+ import { useMemo } from 'react';
3
+ import { IMessageAvatarProps } from './message-avatar';
4
+
5
+ export const useAvatarProps = (name: string, icon: ChatParticipantIcon): IMessageAvatarProps => {
6
+ return useMemo<IMessageAvatarProps>(
7
+ () => ({
8
+ name:
9
+ name.length && icon === ChatParticipantIcon.Initials
10
+ ? getNameInitialsFirst(name)
11
+ : name,
12
+ icon,
13
+ }),
14
+ [icon, name]
15
+ );
16
+ };
@@ -0,0 +1,10 @@
1
+ // eslint-disable-next-line spaced-comment
2
+ /// <reference types="cypress" />
3
+ declare namespace Cypress {
4
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
5
+ interface Chainable<Subject = any> {
6
+ getCy<E extends Node = HTMLElement>(value: string): Chainable<JQuery<E>>;
7
+ getCy2<E extends Node = HTMLElement>(value: string): Chainable<JQuery<E>>;
8
+ getAnvil<E extends Node = HTMLElement>(value: string, extra?: string): Chainable<JQuery<E>>;
9
+ }
10
+ }
package/src/index.ts ADDED
@@ -0,0 +1,13 @@
1
+ export { ChatMessages } from './components/chat/chat-messages';
2
+ export { Chat, IChatProps } from './components/chat/chat';
3
+ export { ChatLog } from './components/chat/chat-log';
4
+ export { MessageAgent, IMessageAgentProps } from './components/messages/message-agent';
5
+ export { MessageUser, IMessageUserProps } from './components/messages/message-user';
6
+ export { MessageSystem, IMessageSystemProps } from './components/messages/message-system';
7
+ export { MessageTyping, IMessageTypingProps } from './components/messages/message-typing';
8
+ export { MessageTimeout, IMessageTimeoutProps } from './components/messages/message-timeout';
9
+ export { MessageAvatar, IMessageAvatarProps } from './components/messages/message-avatar';
10
+ export { MessageFooter, IMessageFooterProps } from './components/messages/message-footer';
11
+ export { useAvatarProps } from './components/messages/use-avatar-props';
12
+ export { MultilineText } from './components/common/multiline-text';
13
+ export { ChatInputStore } from './stores/chat-input.store';
@@ -0,0 +1,43 @@
1
+ import { expect } from '@jest/globals';
2
+ import { Container } from '@servicetitan/react-ioc';
3
+ import { initTestContainer } from '@servicetitan/titan-chat-ui-common';
4
+ import { ChatInputStore } from '../chat-input.store';
5
+
6
+ const initContainer = initTestContainer(ChatInputStore, () => {});
7
+
8
+ describe('[ChatInputStore]', () => {
9
+ let container: Container;
10
+ let store: ChatInputStore;
11
+
12
+ beforeEach(() => {
13
+ container = initContainer();
14
+ store = container.get(ChatInputStore);
15
+ });
16
+
17
+ test('should have proper form state', async () => {
18
+ expect(store.formState.$.message).toBeDefined();
19
+ expect(store.formState.$.message.value).toBe('');
20
+ const validateResult = await store.formState.validate();
21
+ expect(validateResult.hasError).toBe(false);
22
+ expect(store.isEmpty).toBe(true);
23
+
24
+ store.formState.$.message.onChange('test');
25
+ expect(store.formState.$.message.value).toBe('test');
26
+ const validateResult2 = await store.formState.validate();
27
+ expect(validateResult2.hasError).toBe(false);
28
+ expect(store.isEmpty).toBe(false);
29
+
30
+ store.formState.$.message.onChange('a'.repeat(6000));
31
+ expect(store.formState.$.message.value).toBe('a'.repeat(6000));
32
+ const validateResult3 = await store.formState.validate();
33
+ expect(validateResult3.hasError).toBe(false);
34
+ expect(store.isEmpty).toBe(false);
35
+
36
+ store.formState.$.message.onChange('a'.repeat(6001));
37
+ expect(store.formState.$.message.value).toBe('a'.repeat(6001));
38
+ const validateResult4 = await store.formState.validate();
39
+ expect(validateResult4.hasError).toBe(true);
40
+ expect(store.formState.$.message.error).toBe('Message character max is 6000.');
41
+ expect(store.isEmpty).toBe(false);
42
+ });
43
+ });
@@ -0,0 +1,25 @@
1
+ import { TextAreaFieldState } from '@servicetitan/form';
2
+ import { injectable } from '@servicetitan/react-ioc';
3
+ import { FormState } from 'formstate';
4
+ import { computed, makeObservable, observable } from 'mobx';
5
+
6
+ @injectable()
7
+ export class ChatInputStore {
8
+ @observable
9
+ formState = new FormState({
10
+ message: new TextAreaFieldState('')
11
+ .validators((text: string) =>
12
+ text.length > 6000 ? 'Message character max is 6000.' : false
13
+ )
14
+ .disableAutoValidation(),
15
+ });
16
+
17
+ @computed
18
+ get isEmpty() {
19
+ return !this.formState.$.message.value;
20
+ }
21
+
22
+ constructor() {
23
+ makeObservable(this);
24
+ }
25
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "extends": "@servicetitan/startup/tsconfig/base",
3
+ "compilerOptions": {
4
+ "composite": true,
5
+ "outDir": "dist",
6
+ "rootDir": "src",
7
+ "jsx": "react-jsx",
8
+ "moduleResolution": "bundler"
9
+ },
10
+ "include": [
11
+ "src/**/*"
12
+ ],
13
+ "exclude": [
14
+ "node_modules"
15
+ ],
16
+ "references": [
17
+ {
18
+ "path": "../titan-chatbot-ui-cypress"
19
+ },
20
+ {
21
+ "path": "../titan-chat-ui-common"
22
+ }
23
+ ]
24
+ }