@elliemae/ds-chat 2.3.0-next.6 → 2.3.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/cjs/{parts → exported-related}/bubble/ChatBubble.js +8 -10
  2. package/cjs/{parts → exported-related}/bubble/ChatBubbleArrow.js +0 -0
  3. package/cjs/{parts → exported-related}/bubble/index.js +0 -0
  4. package/cjs/exported-related/bubble/props.js +43 -0
  5. package/cjs/{parts → exported-related}/bubble/styled.js +9 -9
  6. package/cjs/{parts → exported-related}/chat-card/ChatCard.js +6 -7
  7. package/cjs/{parts → exported-related}/chat-card/index.js +0 -0
  8. package/cjs/exported-related/chat-card/props.js +22 -0
  9. package/cjs/{parts → exported-related}/chat-card/styled.js +6 -6
  10. package/cjs/{parts → exported-related}/chat-container-header/ChatContainerHeader.js +10 -4
  11. package/cjs/{parts → exported-related}/chat-container-header/helpers.js +0 -0
  12. package/cjs/exported-related/chat-container-header/props.js +18 -0
  13. package/cjs/{parts → exported-related}/chat-container-header/styled.js +4 -4
  14. package/cjs/{parts → exported-related}/chat-empty-state/ChatEmptyState.js +8 -10
  15. package/cjs/exported-related/chat-empty-state/props.js +18 -0
  16. package/cjs/{parts → exported-related}/chat-empty-state/styled.js +2 -2
  17. package/cjs/{parts → exported-related}/chat-sidebar/SideBarChat.js +10 -11
  18. package/cjs/{parts → exported-related}/chat-sidebar/index.js +0 -0
  19. package/cjs/{parts → exported-related}/chat-sidebar/props.js +2 -5
  20. package/cjs/{parts → exported-related/chat-sidebar}/sidebar-button/SidebarButton.js +1 -1
  21. package/cjs/{parts → exported-related/chat-sidebar}/sidebar-button/index.js +0 -0
  22. package/cjs/exported-related/chat-sidebar/sidebar-button/props.js +25 -0
  23. package/cjs/{parts → exported-related/chat-sidebar}/sidebar-button/styled.js +4 -4
  24. package/cjs/{parts → exported-related}/chat-sidebar/styled.js +2 -2
  25. package/cjs/{parts → exported-related}/floating-button/FloatingButton.js +13 -6
  26. package/cjs/{parts → exported-related}/floating-button/index.js +1 -0
  27. package/cjs/{parts → exported-related}/floating-button/props.js +0 -0
  28. package/cjs/{parts → exported-related}/floating-button/styled.js +1 -1
  29. package/cjs/{parts → exported-related}/floating-container/styled.js +1 -1
  30. package/cjs/{parts → exported-related}/grid-influencer/InfluencerContainer.js +1 -1
  31. package/cjs/{parts → exported-related}/grid-influencer/styled.js +2 -2
  32. package/cjs/exported-related/index.js +37 -0
  33. package/cjs/exported-related/message-delimiter/MessageDelimiter.js +53 -0
  34. package/cjs/{parts → exported-related}/message-delimiter/index.js +0 -0
  35. package/cjs/exported-related/message-delimiter/props.js +33 -0
  36. package/cjs/{parts → exported-related}/message-delimiter/styled.js +3 -3
  37. package/cjs/{parts → exported-related}/system-message/SystemMessage.js +6 -8
  38. package/cjs/{parts → exported-related}/system-message/index.js +0 -0
  39. package/cjs/{parts → exported-related}/system-message/props.js +0 -0
  40. package/cjs/{parts → exported-related}/system-message/style.js +5 -5
  41. package/cjs/{parts → exported-related}/tile-button/TileButton.js +7 -9
  42. package/cjs/{parts → exported-related}/tile-button/index.js +0 -0
  43. package/cjs/exported-related/tile-button/props.js +55 -0
  44. package/cjs/{parts → exported-related}/tile-button/styled.js +9 -9
  45. package/cjs/index.js +29 -18
  46. package/cjs/parts/chat-composer/ChatContainerComposer.js +7 -9
  47. package/cjs/parts/chat-container/ChatContainer.js +18 -20
  48. package/cjs/parts/chat-container/styled.js +2 -2
  49. package/cjs/parts/chat-container-messages-list/ChatContainerMessagesList.js +83 -70
  50. package/cjs/parts/chat-container-messages-list/styled.js +9 -5
  51. package/cjs/parts/chat-container-messages-list/useGetNewMessages.js +28 -0
  52. package/cjs/parts/index.js +16 -0
  53. package/cjs/react-desc-prop-types.js +116 -0
  54. package/esm/{parts → exported-related}/bubble/ChatBubble.js +7 -9
  55. package/esm/{parts → exported-related}/bubble/ChatBubbleArrow.js +0 -0
  56. package/esm/{parts → exported-related}/bubble/index.js +0 -0
  57. package/esm/{parts → exported-related}/bubble/props.js +14 -24
  58. package/esm/{parts → exported-related}/bubble/styled.js +9 -9
  59. package/esm/{parts → exported-related}/chat-card/ChatCard.js +4 -5
  60. package/esm/{parts → exported-related}/chat-card/index.js +0 -0
  61. package/esm/{parts → exported-related}/chat-card/props.js +9 -2
  62. package/esm/{parts → exported-related}/chat-card/styled.js +6 -6
  63. package/esm/{parts → exported-related}/chat-container-header/ChatContainerHeader.js +9 -4
  64. package/esm/{parts → exported-related}/chat-container-header/helpers.js +0 -0
  65. package/esm/exported-related/chat-container-header/props.js +13 -0
  66. package/esm/{parts → exported-related}/chat-container-header/styled.js +4 -4
  67. package/esm/{parts → exported-related}/chat-empty-state/ChatEmptyState.js +7 -9
  68. package/esm/exported-related/chat-empty-state/props.js +13 -0
  69. package/esm/{parts → exported-related}/chat-empty-state/styled.js +2 -2
  70. package/esm/{parts → exported-related}/chat-sidebar/SideBarChat.js +8 -9
  71. package/esm/{parts → exported-related}/chat-sidebar/index.js +0 -0
  72. package/esm/{parts → exported-related}/chat-sidebar/props.js +2 -5
  73. package/esm/{parts → exported-related/chat-sidebar}/sidebar-button/SidebarButton.js +1 -1
  74. package/esm/{parts → exported-related/chat-sidebar}/sidebar-button/index.js +0 -0
  75. package/esm/{parts → exported-related/chat-sidebar}/sidebar-button/props.js +3 -4
  76. package/esm/{parts → exported-related/chat-sidebar}/sidebar-button/styled.js +4 -4
  77. package/esm/{parts → exported-related}/chat-sidebar/styled.js +2 -2
  78. package/esm/exported-related/floating-button/FloatingButton.js +33 -0
  79. package/esm/exported-related/floating-button/index.js +1 -0
  80. package/esm/{parts → exported-related}/floating-button/props.js +0 -0
  81. package/esm/{parts → exported-related}/floating-button/styled.js +1 -1
  82. package/esm/{parts → exported-related}/floating-container/styled.js +1 -1
  83. package/esm/{parts → exported-related}/grid-influencer/InfluencerContainer.js +1 -1
  84. package/esm/{parts → exported-related}/grid-influencer/styled.js +2 -2
  85. package/esm/exported-related/index.js +11 -0
  86. package/esm/exported-related/message-delimiter/MessageDelimiter.js +43 -0
  87. package/esm/{parts → exported-related}/message-delimiter/index.js +0 -0
  88. package/esm/exported-related/message-delimiter/props.js +24 -0
  89. package/esm/{parts → exported-related}/message-delimiter/styled.js +3 -3
  90. package/esm/{parts → exported-related}/system-message/SystemMessage.js +4 -6
  91. package/esm/{parts → exported-related}/system-message/index.js +0 -0
  92. package/esm/{parts → exported-related}/system-message/props.js +0 -0
  93. package/esm/{parts → exported-related}/system-message/style.js +5 -5
  94. package/esm/{parts → exported-related}/tile-button/TileButton.js +5 -7
  95. package/esm/{parts → exported-related}/tile-button/index.js +0 -0
  96. package/esm/{parts → exported-related}/tile-button/props.js +3 -3
  97. package/esm/{parts → exported-related}/tile-button/styled.js +9 -9
  98. package/esm/index.js +14 -12
  99. package/esm/parts/chat-composer/ChatContainerComposer.js +9 -11
  100. package/esm/parts/chat-container/ChatContainer.js +16 -18
  101. package/esm/parts/chat-container/styled.js +2 -2
  102. package/esm/parts/chat-container-messages-list/ChatContainerMessagesList.js +81 -68
  103. package/esm/parts/chat-container-messages-list/styled.js +9 -6
  104. package/esm/parts/chat-container-messages-list/useGetNewMessages.js +24 -0
  105. package/esm/parts/index.js +3 -0
  106. package/esm/react-desc-prop-types.js +103 -0
  107. package/package.json +176 -216
  108. package/types/exported-related/bubble/ChatBubble.d.ts +5 -0
  109. package/types/{parts → exported-related}/bubble/ChatBubbleArrow.d.ts +1 -1
  110. package/types/{parts → exported-related}/bubble/index.d.ts +0 -0
  111. package/types/exported-related/bubble/props.d.ts +33 -0
  112. package/types/{parts → exported-related}/bubble/styled.d.ts +11 -7
  113. package/types/{parts → exported-related}/bubble/tests/ChatBubble.test.d.ts +0 -0
  114. package/types/exported-related/chat-card/ChatCard.d.ts +5 -0
  115. package/types/{parts → exported-related}/chat-card/index.d.ts +0 -0
  116. package/types/exported-related/chat-card/props.d.ts +14 -0
  117. package/types/{parts → exported-related}/chat-card/styled.d.ts +0 -0
  118. package/types/exported-related/chat-container-header/ChatContainerHeader.d.ts +5 -0
  119. package/types/{parts → exported-related}/chat-container-header/helpers.d.ts +2 -2
  120. package/types/exported-related/chat-container-header/props.d.ts +10 -0
  121. package/types/{parts → exported-related}/chat-container-header/styled.d.ts +0 -0
  122. package/types/exported-related/chat-container-header/tests/ChatContainerHeader.test.d.ts +1 -0
  123. package/types/exported-related/chat-empty-state/ChatEmptyState.d.ts +5 -0
  124. package/types/exported-related/chat-empty-state/props.d.ts +10 -0
  125. package/types/{parts → exported-related}/chat-empty-state/styled.d.ts +0 -0
  126. package/types/exported-related/chat-sidebar/SideBarChat.d.ts +5 -0
  127. package/types/{parts → exported-related}/chat-sidebar/index.d.ts +0 -0
  128. package/types/{parts → exported-related}/chat-sidebar/props.d.ts +4 -4
  129. package/types/exported-related/chat-sidebar/sidebar-button/SidebarButton.d.ts +13 -0
  130. package/types/{parts → exported-related/chat-sidebar}/sidebar-button/index.d.ts +0 -0
  131. package/types/exported-related/chat-sidebar/sidebar-button/props.d.ts +18 -0
  132. package/types/{parts → exported-related/chat-sidebar}/sidebar-button/styled.d.ts +0 -0
  133. package/types/{parts → exported-related}/chat-sidebar/styled.d.ts +0 -0
  134. package/types/exported-related/floating-button/FloatingButton.d.ts +5 -0
  135. package/types/{parts → exported-related}/floating-button/index.d.ts +0 -0
  136. package/types/{parts → exported-related}/floating-button/props.d.ts +0 -0
  137. package/types/{parts → exported-related}/floating-button/styled.d.ts +0 -0
  138. package/types/exported-related/floating-container/styled.d.ts +2 -0
  139. package/types/{parts → exported-related}/grid-influencer/InfluencerContainer.d.ts +0 -0
  140. package/types/{parts → exported-related}/grid-influencer/styled.d.ts +0 -0
  141. package/types/exported-related/index.d.ts +10 -0
  142. package/types/exported-related/message-delimiter/MessageDelimiter.d.ts +5 -0
  143. package/types/{parts → exported-related}/message-delimiter/index.d.ts +0 -0
  144. package/types/exported-related/message-delimiter/props.d.ts +371 -0
  145. package/types/{parts → exported-related}/message-delimiter/styled.d.ts +0 -0
  146. package/types/exported-related/system-message/SystemMessage.d.ts +5 -0
  147. package/types/{parts → exported-related}/system-message/index.d.ts +0 -0
  148. package/types/{parts → exported-related}/system-message/props.d.ts +0 -0
  149. package/types/{parts → exported-related}/system-message/style.d.ts +0 -0
  150. package/types/exported-related/tile-button/TileButton.d.ts +5 -0
  151. package/types/{parts → exported-related}/tile-button/index.d.ts +0 -0
  152. package/types/exported-related/tile-button/props.d.ts +46 -0
  153. package/types/{parts → exported-related}/tile-button/styled.d.ts +1 -1
  154. package/types/index.d.ts +4 -13
  155. package/types/parts/chat-composer/ChatContainerComposer.d.ts +4 -59
  156. package/types/parts/chat-composer/styled.d.ts +4 -3
  157. package/types/parts/chat-container/ChatContainer.d.ts +4 -62
  158. package/types/parts/chat-container-messages-list/ChatContainerMessagesList.d.ts +4 -47
  159. package/types/parts/chat-container-messages-list/index.d.ts +1 -1
  160. package/types/parts/chat-container-messages-list/styled.d.ts +2 -2
  161. package/types/parts/chat-container-messages-list/useGetNewMessages.d.ts +2 -0
  162. package/types/parts/index.d.ts +3 -0
  163. package/types/react-desc-prop-types.d.ts +838 -0
  164. package/cjs/index.d.js +0 -2
  165. package/cjs/parts/bubble/config/useValidateProps.js +0 -31
  166. package/cjs/parts/bubble/props.js +0 -57
  167. package/cjs/parts/chat-card/config/useValidateProps.js +0 -11
  168. package/cjs/parts/chat-card/props.js +0 -14
  169. package/cjs/parts/chat-composer/config/useValidateProps.js +0 -11
  170. package/cjs/parts/chat-composer/props.js +0 -44
  171. package/cjs/parts/chat-container/config/useValidateProps.js +0 -11
  172. package/cjs/parts/chat-container/index.js +0 -10
  173. package/cjs/parts/chat-container/props.js +0 -49
  174. package/cjs/parts/chat-container-messages-list/config/useValidateProps.js +0 -11
  175. package/cjs/parts/chat-container-messages-list/props.js +0 -30
  176. package/cjs/parts/chat-empty-state/config/useValidateProps.js +0 -11
  177. package/cjs/parts/chat-empty-state/props.js +0 -17
  178. package/cjs/parts/chat-sidebar/config/useValidateProps.js +0 -11
  179. package/cjs/parts/message-delimiter/MessageDelimiter.js +0 -41
  180. package/cjs/parts/message-delimiter/config/useValidateProps.js +0 -11
  181. package/cjs/parts/message-delimiter/props.js +0 -23
  182. package/cjs/parts/sidebar-button/props.js +0 -30
  183. package/cjs/parts/system-message/config/useValidateProps.js +0 -11
  184. package/cjs/parts/tile-button/config/useValidateProps.js +0 -11
  185. package/cjs/parts/tile-button/props.js +0 -55
  186. package/cjs/prop-types.js +0 -33
  187. package/esm/index.d.js +0 -1
  188. package/esm/parts/bubble/config/useValidateProps.js +0 -27
  189. package/esm/parts/chat-card/config/useValidateProps.js +0 -7
  190. package/esm/parts/chat-composer/config/useValidateProps.js +0 -7
  191. package/esm/parts/chat-composer/props.js +0 -39
  192. package/esm/parts/chat-container/config/useValidateProps.js +0 -7
  193. package/esm/parts/chat-container/index.js +0 -1
  194. package/esm/parts/chat-container/props.js +0 -44
  195. package/esm/parts/chat-container-messages-list/config/useValidateProps.js +0 -7
  196. package/esm/parts/chat-container-messages-list/props.js +0 -25
  197. package/esm/parts/chat-empty-state/config/useValidateProps.js +0 -7
  198. package/esm/parts/chat-empty-state/props.js +0 -12
  199. package/esm/parts/chat-sidebar/config/useValidateProps.js +0 -7
  200. package/esm/parts/floating-button/FloatingButton.js +0 -27
  201. package/esm/parts/floating-button/index.js +0 -1
  202. package/esm/parts/message-delimiter/MessageDelimiter.js +0 -32
  203. package/esm/parts/message-delimiter/config/useValidateProps.js +0 -7
  204. package/esm/parts/message-delimiter/props.js +0 -18
  205. package/esm/parts/system-message/config/useValidateProps.js +0 -7
  206. package/esm/parts/tile-button/config/useValidateProps.js +0 -7
  207. package/esm/prop-types.js +0 -28
  208. package/types/index.d.d.ts +0 -37
  209. package/types/parts/bubble/ChatBubble.d.ts +0 -30
  210. package/types/parts/bubble/config/useValidateProps.d.ts +0 -2
  211. package/types/parts/bubble/props.d.ts +0 -52
  212. package/types/parts/chat-card/ChatCard.d.ts +0 -33
  213. package/types/parts/chat-card/config/useValidateProps.d.ts +0 -2
  214. package/types/parts/chat-card/props.d.ts +0 -29
  215. package/types/parts/chat-composer/config/useValidateProps.d.ts +0 -2
  216. package/types/parts/chat-container/config/useValidateProps.d.ts +0 -2
  217. package/types/parts/chat-container/index.d.ts +0 -1
  218. package/types/parts/chat-container-header/ChatContainerHeader.d.ts +0 -2
  219. package/types/parts/chat-container-messages-list/config/useValidateProps.d.ts +0 -2
  220. package/types/parts/chat-empty-state/ChatEmptyState.d.ts +0 -21
  221. package/types/parts/chat-empty-state/config/useValidateProps.d.ts +0 -2
  222. package/types/parts/chat-empty-state/props.d.ts +0 -15
  223. package/types/parts/chat-sidebar/SideBarChat.d.ts +0 -48
  224. package/types/parts/chat-sidebar/config/useValidateProps.d.ts +0 -2
  225. package/types/parts/floating-button/FloatingButton.d.ts +0 -18
  226. package/types/parts/floating-container/styled.d.ts +0 -1
  227. package/types/parts/message-delimiter/MessageDelimiter.d.ts +0 -31
  228. package/types/parts/message-delimiter/config/useValidateProps.d.ts +0 -2
  229. package/types/parts/message-delimiter/props.d.ts +0 -26
  230. package/types/parts/sidebar-button/SidebarButton.d.ts +0 -24
  231. package/types/parts/sidebar-button/props.d.ts +0 -29
  232. package/types/parts/system-message/SystemMessage.d.ts +0 -23
  233. package/types/parts/system-message/config/useValidateProps.d.ts +0 -2
  234. package/types/parts/tile-button/TileButton.d.ts +0 -75
  235. package/types/parts/tile-button/config/useValidateProps.d.ts +0 -2
  236. package/types/parts/tile-button/props.d.ts +0 -88
  237. package/types/prop-types.d.ts +0 -33
@@ -12,17 +12,18 @@ import 'core-js/modules/esnext.iterator.map.js';
12
12
  import 'core-js/modules/esnext.async-iterator.find.js';
13
13
  import 'core-js/modules/esnext.iterator.find.js';
14
14
  import React from 'react';
15
- import { describe } from 'react-desc';
15
+ import { describe, useMemoMergePropsWithDefault, useValidateTypescriptPropTypes, useGetGlobalAttributes } from '@elliemae/ds-props-helpers';
16
16
  import { useVirtual } from 'react-virtual';
17
17
  import DSButton from '@elliemae/ds-button';
18
18
  import { debounce } from 'lodash';
19
- import { ChatBubble } from '../bubble/ChatBubble.js';
20
- import { BUBBLE_TYPES } from '../bubble/props.js';
21
- import { MessageDelimiter } from '../message-delimiter/MessageDelimiter.js';
22
- import { SystemMessage } from '../system-message/SystemMessage.js';
23
- import { ListItem, StyledWrapperListItem, StyledWrapper, StyledChatContainerContentList, StyledChatContainerContentListScroll, StyledLoadMoreContainer } from './styled.js';
24
- import { listProps, defaultProps } from './props.js';
25
- import { jsx } from 'react/jsx-runtime';
19
+ import { ChatBubble } from '../../exported-related/bubble/ChatBubble.js';
20
+ import { BUBBLE_TYPES } from '../../exported-related/bubble/props.js';
21
+ import { MessageDelimiter } from '../../exported-related/message-delimiter/MessageDelimiter.js';
22
+ import { SystemMessage } from '../../exported-related/system-message/SystemMessage.js';
23
+ import { ListItem, StyledWrapperListItem, StyledWrapper, StyledChatContainerContentList, StyledChatContainerContentListScroll, StyledLoadMoreContainer, StyledNewMessagesHiddenContainer } from './styled.js';
24
+ import { ChatContainerMessagesListPropTypes, defaultPropsMessagesList } from '../../react-desc-prop-types.js';
25
+ import { useGetNewMessages } from './useGetNewMessages.js';
26
+ import { jsx, jsxs } from 'react/jsx-runtime';
26
27
 
27
28
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
28
29
 
@@ -43,6 +44,9 @@ const getPadding = _ref => {
43
44
  };
44
45
 
45
46
  const ChatContainerMessagesList = props => {
47
+ const propsWithDefault = useMemoMergePropsWithDefault(props, defaultPropsMessagesList);
48
+ useValidateTypescriptPropTypes(propsWithDefault, ChatContainerMessagesListPropTypes);
49
+ const globalAttributes = useGetGlobalAttributes(propsWithDefault);
46
50
  const {
47
51
  sendingText,
48
52
  bannerPosition,
@@ -54,7 +58,7 @@ const ChatContainerMessagesList = props => {
54
58
  hasMoreItems,
55
59
  isLoading,
56
60
  bannerRef
57
- } = props;
61
+ } = propsWithDefault;
58
62
  const pendingOnScroll = React.useRef(false);
59
63
  const loadMoreRef = React.useRef(null);
60
64
  const virtualListRef = React.useRef(); // estimateSize should not be really required given what was stated on
@@ -65,7 +69,7 @@ const ChatContainerMessagesList = props => {
65
69
  totalSize,
66
70
  virtualItems
67
71
  } = useVirtual(_objectSpread(_objectSpread({
68
- size: messages.length,
72
+ size: messages === null || messages === void 0 ? void 0 : messages.length,
69
73
  parentRef: virtualListRef,
70
74
  overscan: 15
71
75
  }, getPadding({
@@ -75,6 +79,7 @@ const ChatContainerMessagesList = props => {
75
79
  })), {}, {
76
80
  estimateSize: React.useCallback(() => 80, [])
77
81
  }));
82
+ const newMessages = useGetNewMessages(messages);
78
83
  const debouncedScroll = React.useMemo(() => debounce(() => {
79
84
  var _virtualListRef$curre;
80
85
 
@@ -115,6 +120,9 @@ const ChatContainerMessagesList = props => {
115
120
  onlyFocus(index);
116
121
  onScrollStop();
117
122
  }, [onScrollStop, onlyFocus, vScroll]);
123
+ const checkPendingOnScroll = React.useCallback(() => {
124
+ if (pendingOnScroll.current === true) onScrollStop();
125
+ }, [onScrollStop]);
118
126
  React.useEffect(() => {
119
127
  if (actionRef && actionRef.current) {
120
128
  actionRef.current.scrollToIndex = function (a) {
@@ -144,6 +152,26 @@ const ChatContainerMessagesList = props => {
144
152
  };
145
153
  }
146
154
  }, [actionRef, onScrollStop, onlyFocus, scrollAndFocus, vScroll]);
155
+ React.useEffect(() => {
156
+ let handlerCallback = null;
157
+ const localVirtualRef = virtualListRef.current;
158
+
159
+ const onScroll = () => {
160
+ if (handlerCallback) clearTimeout(handlerCallback);
161
+ handlerCallback = setTimeout(onScrollStop, 300);
162
+ };
163
+
164
+ if (onScrollEnds) {
165
+ virtualListRef.current.addEventListener('scroll', onScroll);
166
+ }
167
+
168
+ document.addEventListener('visibilitychange', checkPendingOnScroll);
169
+ return () => {
170
+ if (handlerCallback) clearTimeout(handlerCallback);
171
+ if (onScrollEnds) localVirtualRef.removeEventListener('scroll', onScroll);
172
+ document.removeEventListener('visibilitychange', checkPendingOnScroll);
173
+ };
174
+ }, [onScrollStop, onScrollEnds, checkPendingOnScroll]);
147
175
  const handleKey = React.useCallback(e => {
148
176
  const {
149
177
  key
@@ -170,7 +198,7 @@ const ChatContainerMessagesList = props => {
170
198
  case 'ArrowDown':
171
199
  e.preventDefault();
172
200
 
173
- if (index < messages.length - 1) {
201
+ if (index < (messages === null || messages === void 0 ? void 0 : messages.length) - 1) {
174
202
  virtualListRef.current.querySelector("[data-index=\"".concat(index + 1, "\"]")).focus();
175
203
  }
176
204
 
@@ -183,7 +211,7 @@ const ChatContainerMessagesList = props => {
183
211
 
184
212
  case 'End':
185
213
  e.preventDefault();
186
- scrollAndFocus(messages.length - 1);
214
+ scrollAndFocus((messages === null || messages === void 0 ? void 0 : messages.length) - 1);
187
215
  break;
188
216
 
189
217
  case 'Tab':
@@ -192,10 +220,17 @@ const ChatContainerMessagesList = props => {
192
220
 
193
221
  e.preventDefault();
194
222
  (_loadMoreRef$current2 = loadMoreRef.current) === null || _loadMoreRef$current2 === void 0 ? void 0 : _loadMoreRef$current2.focus();
195
- } else if (hasMoreItems === 'top' && e.shiftKey) ; else if (!e.shiftKey) {
223
+ } else if (hasMoreItems === 'top' && e.shiftKey) {
224
+ var _loadMoreRef$current3;
225
+
226
+ e.preventDefault();
227
+ (_loadMoreRef$current3 = loadMoreRef.current) === null || _loadMoreRef$current3 === void 0 ? void 0 : _loadMoreRef$current3.focus();
228
+ } else if (!e.shiftKey) {
196
229
  if (bannerPosition) {
230
+ var _bannerRef$current;
231
+
197
232
  e.preventDefault();
198
- bannerRef.current.focusOnWrapper();
233
+ bannerRef === null || bannerRef === void 0 ? void 0 : (_bannerRef$current = bannerRef.current) === null || _bannerRef$current === void 0 ? void 0 : _bannerRef$current.focusOnWrapper();
199
234
  }
200
235
  } else {
201
236
  var _virtualListRef$curre4;
@@ -206,7 +241,7 @@ const ChatContainerMessagesList = props => {
206
241
 
207
242
  break;
208
243
  }
209
- }, [bannerRef, hasMoreItems, messages.length, bannerPosition, scrollAndFocus]);
244
+ }, [bannerRef, hasMoreItems, messages === null || messages === void 0 ? void 0 : messages.length, bannerPosition, scrollAndFocus]);
210
245
  const handleListKey = React.useCallback(e => {
211
246
  const {
212
247
  key
@@ -217,7 +252,9 @@ const ChatContainerMessagesList = props => {
217
252
  e.preventDefault();
218
253
 
219
254
  if (document.activeElement !== loadMoreRef.current) {
220
- onlyFocus(onScrollStop().shift());
255
+ var _onScrollStop;
256
+
257
+ onlyFocus((_onScrollStop = onScrollStop()) === null || _onScrollStop === void 0 ? void 0 : _onScrollStop.shift());
221
258
  }
222
259
 
223
260
  break;
@@ -228,7 +265,9 @@ const ChatContainerMessagesList = props => {
228
265
  if (document.activeElement === loadMoreRef.current) {
229
266
  virtualListRef.current.querySelector("[data-index=\"0\"]").focus();
230
267
  } else {
231
- onlyFocus(onScrollStop().pop());
268
+ var _onScrollStop2;
269
+
270
+ onlyFocus((_onScrollStop2 = onScrollStop()) === null || _onScrollStop2 === void 0 ? void 0 : _onScrollStop2.pop());
232
271
  }
233
272
 
234
273
  break;
@@ -240,17 +279,12 @@ const ChatContainerMessagesList = props => {
240
279
 
241
280
  case 'End':
242
281
  e.preventDefault();
243
- scrollAndFocus(messages.length - 1);
282
+ scrollAndFocus((messages === null || messages === void 0 ? void 0 : messages.length) - 1);
244
283
  break;
245
284
 
246
285
  case 'Tab':
247
286
  if (document.activeElement !== loadMoreRef.current) {
248
287
  if (hasMoreItems === 'bottom' && !e.shiftKey) {
249
- var _loadMoreRef$current3;
250
-
251
- e.preventDefault();
252
- (_loadMoreRef$current3 = loadMoreRef.current) === null || _loadMoreRef$current3 === void 0 ? void 0 : _loadMoreRef$current3.focus();
253
- } else if (hasMoreItems === 'top' && e.shiftKey) {
254
288
  var _loadMoreRef$current4;
255
289
 
256
290
  e.preventDefault();
@@ -271,30 +305,7 @@ const ChatContainerMessagesList = props => {
271
305
 
272
306
  break;
273
307
  }
274
- }, [actionRef, hasMoreItems, messages.length, onScrollStop, onlyFocus, scrollAndFocus]);
275
- const checkPendingOnScroll = React.useCallback(() => {
276
- if (pendingOnScroll.current === true) onScrollStop();
277
- }, [onScrollStop]);
278
- React.useEffect(() => {
279
- let handlerCallback = null;
280
- const localVirtualRef = virtualListRef.current;
281
-
282
- const onScroll = () => {
283
- if (handlerCallback) clearTimeout(handlerCallback);
284
- handlerCallback = setTimeout(onScrollStop, 300);
285
- };
286
-
287
- if (onScrollEnds) {
288
- virtualListRef.current.addEventListener('scroll', onScroll);
289
- }
290
-
291
- document.addEventListener('visibilitychange', checkPendingOnScroll);
292
- return () => {
293
- if (handlerCallback) clearTimeout(handlerCallback);
294
- if (onScrollEnds) localVirtualRef.removeEventListener('scroll', onScroll);
295
- document.removeEventListener('visibilitychange', checkPendingOnScroll);
296
- };
297
- }, [onScrollStop, onScrollEnds, checkPendingOnScroll]);
308
+ }, [actionRef, hasMoreItems, messages === null || messages === void 0 ? void 0 : messages.length, onScrollStop, onlyFocus, scrollAndFocus]);
298
309
  const render = React.useMemo(() => virtualItems.map(virtualItem => {
299
310
  const {
300
311
  index,
@@ -328,30 +339,32 @@ const ChatContainerMessagesList = props => {
328
339
  })) : null, row.type === BUBBLE_TYPES.DELIMITER ? /*#__PURE__*/jsx(MessageDelimiter, _objectSpread({}, row)) : null, row.type === BUBBLE_TYPES.SYSTEM ? /*#__PURE__*/jsx(SystemMessage, _objectSpread({}, row)) : null)
329
340
  }, "ds-chat-bubble-".concat(index, "-").concat(row.dsId, "-").concat(row.type));
330
341
  }), [virtualItems, messages, sendingMessages, handleKey, sendingText]);
331
- return /*#__PURE__*/_jsx(StyledWrapper, {}, void 0, /*#__PURE__*/jsx(StyledChatContainerContentList, {
332
- "data-testid": "chat-thread-container",
333
- tabIndex: 0,
334
- "aria-live": "polite",
335
- "aria-relevant": "additions",
336
- ref: virtualListRef,
337
- role: "list",
338
- onKeyDown: handleListKey,
339
- children: /*#__PURE__*/_jsx(StyledChatContainerContentListScroll, {
340
- height: "".concat(totalSize, "px")
341
- }, void 0, !isLoading && hasMoreItems ? /*#__PURE__*/_jsx(StyledLoadMoreContainer, {
342
- hasMoreItems: hasMoreItems
343
- }, void 0, /*#__PURE__*/_jsx(DSButton, {
344
- labelText: "Load More",
345
- buttonType: "secondary",
346
- onClick: getMoreMessages,
347
- "data-testid": "ds-chat-load-more-btn",
348
- innerRef: loadMoreRef
349
- })) : null, render)
342
+ return /*#__PURE__*/jsxs(StyledWrapper, _objectSpread(_objectSpread({}, globalAttributes), {}, {
343
+ children: [/*#__PURE__*/jsx(StyledChatContainerContentList, {
344
+ "data-testid": "chat-thread-container",
345
+ tabIndex: 0,
346
+ ref: virtualListRef,
347
+ role: "list",
348
+ onKeyDown: handleListKey,
349
+ children: /*#__PURE__*/_jsx(StyledChatContainerContentListScroll, {
350
+ height: "".concat(totalSize, "px")
351
+ }, void 0, !isLoading && hasMoreItems ? /*#__PURE__*/_jsx(StyledLoadMoreContainer, {
352
+ hasMoreItems: hasMoreItems
353
+ }, void 0, /*#__PURE__*/_jsx(DSButton, {
354
+ labelText: "Load More",
355
+ buttonType: "secondary",
356
+ onClick: getMoreMessages,
357
+ "data-testid": "ds-chat-load-more-btn",
358
+ innerRef: loadMoreRef
359
+ })) : null, render)
360
+ }), /*#__PURE__*/_jsx(StyledNewMessagesHiddenContainer, {
361
+ "aria-live": "polite",
362
+ "aria-hidden": "false"
363
+ }, void 0, newMessages.map(newMessage => /*#__PURE__*/_jsx("p", {}, void 0, newMessage.title, " ", newMessage.time, " ", newMessage.body, " ", newMessage.errorMessage, " ", newMessage.helpMessage)))]
350
364
  }));
351
365
  };
352
366
 
353
- ChatContainerMessagesList.defaultProps = defaultProps;
354
367
  const ChatContainerMessagesListWithSchema = describe(ChatContainerMessagesList);
355
- ChatContainerMessagesListWithSchema.propTypes = listProps;
368
+ ChatContainerMessagesListWithSchema.propTypes = ChatContainerMessagesListPropTypes;
356
369
 
357
370
  export { ChatContainerMessagesList, ChatContainerMessagesListWithSchema };
@@ -1,6 +1,6 @@
1
1
  import styled from 'styled-components';
2
- import '../bubble/ChatBubble.js';
3
- import { BUBBLE_TYPES } from '../bubble/props.js';
2
+ import '../../exported-related/bubble/ChatBubble.js';
3
+ import { BUBBLE_TYPES } from '../../exported-related/bubble/props.js';
4
4
 
5
5
  const StyledWrapper = /*#__PURE__*/styled.div.withConfig({
6
6
  componentId: "sc-1jhprzr-0"
@@ -12,14 +12,17 @@ const StyledWrapperListItem = /*#__PURE__*/styled.div.withConfig({
12
12
  const StyledChatContainerContentList = /*#__PURE__*/styled.div.withConfig({
13
13
  componentId: "sc-1jhprzr-2"
14
14
  })(["width:100%;height:100%;padding:", ";padding-bottom:0;overflow-y:auto;overflow-x:hidden;"], props => props.theme.space.xs);
15
- const StyledChatContainerContentListScroll = /*#__PURE__*/styled.div.withConfig({
15
+ const StyledNewMessagesHiddenContainer = /*#__PURE__*/styled.div.withConfig({
16
16
  componentId: "sc-1jhprzr-3"
17
+ })(["position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(100%);white-space:nowrap;"]);
18
+ const StyledChatContainerContentListScroll = /*#__PURE__*/styled.div.withConfig({
19
+ componentId: "sc-1jhprzr-4"
17
20
  })(["width:100%;height:", ";position:relative;"], props => props.height);
18
21
  const StyledLoadMoreContainer = /*#__PURE__*/styled.div.withConfig({
19
- componentId: "sc-1jhprzr-4"
22
+ componentId: "sc-1jhprzr-5"
20
23
  })(["position:absolute;width:calc(100% + ", ");padding:", ";left:-", ";right:-", ";display:grid;justify-content:center;align-items:center;", " ", ""], props => props.theme.space.xxs, props => props.theme.space.xxs, props => props.theme.space.xxs, props => props.theme.space.xxs, props => props.hasMoreItems === 'top' ? 'top: 0;' : '', props => props.hasMoreItems === 'bottom' ? 'bottom: 0;' : '');
21
24
  const ListItem = /*#__PURE__*/styled.div.withConfig({
22
- componentId: "sc-1jhprzr-5"
25
+ componentId: "sc-1jhprzr-6"
23
26
  })(["&:focus,&:focus-visible{outline:none;&:after{content:'';display:block;position:absolute;top:0;left:-", ";pointer-events:none;border-radius:2px;background-color:#ebedf0;width:calc(100% + 24px);border:2px solid #1e79c2;height:100%;z-index:-1;}}"], props => props.theme.space.xxs);
24
27
 
25
- export { ListItem, StyledChatContainerContentList, StyledChatContainerContentListScroll, StyledLoadMoreContainer, StyledWrapper, StyledWrapperListItem };
28
+ export { ListItem, StyledChatContainerContentList, StyledChatContainerContentListScroll, StyledLoadMoreContainer, StyledNewMessagesHiddenContainer, StyledWrapper, StyledWrapperListItem };
@@ -0,0 +1,24 @@
1
+ import 'core-js/modules/web.dom-collections.iterator.js';
2
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
3
+ import 'core-js/modules/esnext.iterator.constructor.js';
4
+ import 'core-js/modules/esnext.iterator.for-each.js';
5
+ import 'core-js/modules/esnext.async-iterator.map.js';
6
+ import 'core-js/modules/esnext.iterator.map.js';
7
+ import { useState, useMemo } from 'react';
8
+
9
+ const useGetNewMessages = messages => {
10
+ const [seenMessages, setSeenMessages] = useState({});
11
+ const newMessages = useMemo(() => {
12
+ const list = [];
13
+ messages.forEach(message => {
14
+ if (!(message.dsId in seenMessages)) {
15
+ list.push(message);
16
+ }
17
+ });
18
+ setSeenMessages(Object.fromEntries(messages.map(m => [m.dsId, true])));
19
+ return list; // eslint-disable-next-line react-hooks/exhaustive-deps
20
+ }, [messages]);
21
+ return newMessages;
22
+ };
23
+
24
+ export { useGetNewMessages };
@@ -0,0 +1,3 @@
1
+ export { ChatComposer, ChatComposerWithSchema } from './chat-composer/ChatContainerComposer.js';
2
+ export { ChatContainer, ChatContainerWithSchema } from './chat-container/ChatContainer.js';
3
+ export { ChatContainerMessagesList, ChatContainerMessagesListWithSchema } from './chat-container-messages-list/ChatContainerMessagesList.js';
@@ -0,0 +1,103 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
6
+ import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
+ import { noop } from 'lodash';
8
+ import { PropTypes, globalAttributesPropTypes } from '@elliemae/ds-props-helpers';
9
+ import { BANNER_TYPES } from '@elliemae/ds-banner';
10
+
11
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
12
+
13
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14
+ const defaultPropsComposer = {
15
+ placeholder: 'Type your message',
16
+ inputValue: '',
17
+ ariaMaxLengthMessage: '',
18
+ onChange: noop,
19
+ onResize: noop,
20
+ onSend: noop,
21
+ onFocus: noop,
22
+ onBlur: noop,
23
+ onKeyDown: noop,
24
+ maxHeight: 0,
25
+ inputMaxLength: undefined,
26
+ maxLengthMessage: undefined,
27
+ buttonDisabled: false,
28
+ dataTestid: 'ds-chat-composer',
29
+ actionRef: undefined
30
+ };
31
+ const ChatComposerPropTypes = {
32
+ placeholder: PropTypes.string.description('Input Placeholder').defaultValue(defaultPropsComposer.placeholder),
33
+ inputValue: PropTypes.string.description('Input value').defaultValue(defaultPropsComposer.inputValue),
34
+ ariaMaxLengthMessage: PropTypes.string.description('Aria message for Max length message when exceeded').defaultValue(defaultPropsComposer.maxLengthMessage),
35
+ maxLengthMessage: PropTypes.string.description('Max length message').defaultValue(defaultPropsComposer.maxLengthMessage),
36
+ onChange: PropTypes.func.description('Called when the user types').defaultValue(defaultPropsComposer.onChange),
37
+ onResize: PropTypes.func.description('Called the input changes his height').defaultValue(defaultPropsComposer.onResize),
38
+ onSend: PropTypes.func.description('Called when the click send').defaultValue(defaultPropsComposer.onSend),
39
+ onFocus: PropTypes.func.description('Input focus').defaultValue(defaultPropsComposer.onFocus),
40
+ onBlur: PropTypes.func.description('Input blur').defaultValue(defaultPropsComposer.onBlur),
41
+ onKeyDown: PropTypes.func.description('Input on key down').defaultValue(defaultPropsComposer.onKeyDown),
42
+ maxHeight: PropTypes.number.description('Max height of the composer. Use 0 for no limit').defaultValue(defaultPropsComposer.onBlur),
43
+ inputMaxLength: PropTypes.number.description('Max length of the composer. `undefined` for no limit').defaultValue(defaultPropsComposer.inputMaxLength),
44
+ buttonDisabled: PropTypes.bool.description('Control the disabled for the send button').defaultValue(defaultPropsComposer.buttonDisabled),
45
+ dataTestid: PropTypes.string.description('Data testid').defaultValue(defaultPropsComposer.placeholder),
46
+ actionRef: PropTypes.object.description("Reference: \n { \n scrollToIndex: (n: number) => void,\n getMessagesInView: () => number[],\n focusToIndex: (n: number) => void,\n focusToList: () => void,\n focusToComposer: () => void,\n focusToSend: () => void,\n }\n \n ").defaultValue(defaultPropsComposer.actionRef)
47
+ };
48
+ const defaultPropsMessagesList = {
49
+ messages: [],
50
+ actionRef: noop,
51
+ onScrollEnds: () => [],
52
+ getMoreMessages: noop,
53
+ sendingMessages: undefined,
54
+ sendingText: 'Sending',
55
+ bannerPosition: undefined,
56
+ bannerRef: undefined
57
+ };
58
+ const ChatContainerMessagesListPropTypes = _objectSpread(_objectSpread({}, globalAttributesPropTypes), {}, {
59
+ messages: PropTypes.arrayOf(PropTypes.object).description('The array of out-of-the-box items you want to render inside the ChatMessageList').defaultValue(defaultPropsMessagesList.messages),
60
+ actionRef: PropTypes.object.description("Reference: \n { \n scrollToIndex: (n: number) => void,\n getMessagesInView: () => number[],\n focusToIndex: (n: number) => void,\n focusToIndexWithoutScroll: (n: number) => void,\n focusToList: () => void,\n focusToComposer: () => void,\n focusToSend: () => void,\n }\n \n ").defaultValue(defaultPropsMessagesList.actionRef),
61
+ onScrollEnds: PropTypes.func.description("Called when the scroll stops."),
62
+ isLoading: PropTypes.oneOf(['top', 'bottom', undefined]).description('Keeps the load more space while the loading is in progress'),
63
+ hasMoreItems: PropTypes.oneOf(['top', 'bottom', undefined]).description('Show Load More button at the `top` or `bottom` of the container'),
64
+ getMoreMessages: PropTypes.func.description('Called when the user clicks on load more').defaultValue(defaultPropsMessagesList.getMoreMessages),
65
+ sendingMessages: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string), PropTypes.arrayOf(PropTypes.number)]).description('Array of ids of sending messages').defaultValue(defaultPropsMessagesList.sendingMessages),
66
+ sendingText: PropTypes.string.description('Label description for messages in sending status').defaultValue(defaultPropsMessagesList.sendingText)
67
+ });
68
+ const defaultProps = {
69
+ messagesListProps: defaultPropsMessagesList,
70
+ composerProps: defaultPropsComposer,
71
+ actionRef: undefined,
72
+ autoScroll: false,
73
+ device: 'desktop',
74
+ isLoading: undefined,
75
+ hasMoreItems: undefined,
76
+ getMoreMessages: noop,
77
+ bannerPosition: undefined,
78
+ bannerProps: {
79
+ type: BANNER_TYPES.INFO,
80
+ label: 'Unread Messages',
81
+ viewLabel: 'View',
82
+ onView: noop,
83
+ onClose: noop
84
+ },
85
+ sendingMessages: undefined,
86
+ sendingText: 'Sending'
87
+ };
88
+ const ChatContainerPropTypes = _objectSpread(_objectSpread({}, globalAttributesPropTypes), {}, {
89
+ messagesListProps: PropTypes.object.description('ChatMessageList props "messages" / "onScrollEnds"').defaultValue(defaultProps.messagesListProps),
90
+ composerProps: PropTypes.object.description('Composer configuration').defaultValue(defaultProps.composerProps),
91
+ autoScroll: PropTypes.bool.description('Auto scroll to bottom on resize').defaultValue(defaultProps.autoScroll),
92
+ device: PropTypes.string.description('Option to render mobile or desktop style composer').defaultValue(defaultProps.device),
93
+ isLoading: PropTypes.oneOf(['top', 'bottom', undefined]).description('Show Loading messages indicator at the `top` or `bottom` of the container'),
94
+ hasMoreItems: PropTypes.oneOf(['top', 'bottom', undefined]).description('Show Load More button at the `top` or `bottom` of the container'),
95
+ getMoreMessages: PropTypes.func.description('Called when the user clicks on load more').defaultValue(defaultProps.getMoreMessages),
96
+ bannerPosition: PropTypes.oneOf(['top', 'bottom', undefined]).description('Show Loading messages indicator at the `top` or `bottom` of the container'),
97
+ bannerProps: PropTypes.object.description("Banner configuration:\n label: string;\n viewLabel: string;\n type: BANNER_TYPES;\n onView: () => void;\n onClose: () => void;\n ").defaultValue(defaultProps.bannerProps),
98
+ sendingMessages: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.string), PropTypes.arrayOf(PropTypes.number)]).description('Array of ids of sending messages').defaultValue(defaultProps.sendingMessages),
99
+ sendingText: PropTypes.string.description('Label description for messages in sending status').defaultValue(defaultProps.sendingText),
100
+ actionRef: PropTypes.object.description("Reference: \n { \n scrollToIndex: (n: number) => void,\n getMessagesInView: () => number[],\n focusToIndex: (n: number) => void,\n focusToList: () => void,\n focusToComposer: () => void,\n focusToSend: () => void,\n }\n \n ").defaultValue(defaultProps.actionRef)
101
+ });
102
+
103
+ export { ChatComposerPropTypes, ChatContainerMessagesListPropTypes, ChatContainerPropTypes, defaultProps, defaultPropsComposer, defaultPropsMessagesList };