rn-erxes-sdk 0.1.23 → 0.1.25

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 (248) hide show
  1. package/README.md +322 -24
  2. package/lib/commonjs/App.js +7 -6
  3. package/lib/commonjs/App.js.map +1 -1
  4. package/lib/commonjs/Widget.js +154 -29
  5. package/lib/commonjs/Widget.js.map +1 -1
  6. package/lib/commonjs/assets/images/index.js +1 -1
  7. package/lib/commonjs/assets/images/index.js.map +1 -1
  8. package/lib/commonjs/assets/images/x.png +0 -0
  9. package/lib/commonjs/components/Avatar.js +24 -27
  10. package/lib/commonjs/components/Avatar.js.map +1 -1
  11. package/lib/commonjs/components/AvatarWithStatus.js +56 -0
  12. package/lib/commonjs/components/AvatarWithStatus.js.map +1 -0
  13. package/lib/commonjs/components/ConversationItem.js +161 -0
  14. package/lib/commonjs/components/ConversationItem.js.map +1 -0
  15. package/lib/commonjs/components/Icons.js +558 -0
  16. package/lib/commonjs/components/Icons.js.map +1 -0
  17. package/lib/commonjs/components/InputTools.js +329 -38
  18. package/lib/commonjs/components/InputTools.js.map +1 -1
  19. package/lib/commonjs/components/MessengerShell.js +64 -0
  20. package/lib/commonjs/components/MessengerShell.js.map +1 -0
  21. package/lib/commonjs/components/conversation/DateSeparator.js +47 -0
  22. package/lib/commonjs/components/conversation/DateSeparator.js.map +1 -0
  23. package/lib/commonjs/components/conversation/EmojiPicker.js +62 -0
  24. package/lib/commonjs/components/conversation/EmojiPicker.js.map +1 -0
  25. package/lib/commonjs/components/conversation/PersistentMenu.js +64 -0
  26. package/lib/commonjs/components/conversation/PersistentMenu.js.map +1 -0
  27. package/lib/commonjs/components/conversation/TypingStatus.js +122 -0
  28. package/lib/commonjs/components/conversation/TypingStatus.js.map +1 -0
  29. package/lib/commonjs/components/conversation/WelcomeMessage.js +85 -0
  30. package/lib/commonjs/components/conversation/WelcomeMessage.js.map +1 -0
  31. package/lib/commonjs/components/nav/Navigation.js +130 -0
  32. package/lib/commonjs/components/nav/Navigation.js.map +1 -0
  33. package/lib/commonjs/components/nav/constants.js +23 -0
  34. package/lib/commonjs/components/nav/constants.js.map +1 -0
  35. package/lib/commonjs/graphql/ApolloContainer.js +1 -2
  36. package/lib/commonjs/graphql/ApolloContainer.js.map +1 -1
  37. package/lib/commonjs/graphql/mutation.js +58 -23
  38. package/lib/commonjs/graphql/mutation.js.map +1 -1
  39. package/lib/commonjs/graphql/query.js +85 -55
  40. package/lib/commonjs/graphql/query.js.map +1 -1
  41. package/lib/commonjs/graphql/subscription.js +32 -28
  42. package/lib/commonjs/graphql/subscription.js.map +1 -1
  43. package/lib/commonjs/screen/conversation/Attachment.js +77 -12
  44. package/lib/commonjs/screen/conversation/Attachment.js.map +1 -1
  45. package/lib/commonjs/screen/conversation/ConversationDetail.js +305 -137
  46. package/lib/commonjs/screen/conversation/ConversationDetail.js.map +1 -1
  47. package/lib/commonjs/screen/conversation/Message.js +145 -82
  48. package/lib/commonjs/screen/conversation/Message.js.map +1 -1
  49. package/lib/commonjs/screen/faq/Faq.js +373 -0
  50. package/lib/commonjs/screen/faq/Faq.js.map +1 -0
  51. package/lib/commonjs/screen/greetings/Social.js +19 -9
  52. package/lib/commonjs/screen/greetings/Social.js.map +1 -1
  53. package/lib/commonjs/screen/greetings/Supporters.js +49 -46
  54. package/lib/commonjs/screen/greetings/Supporters.js.map +1 -1
  55. package/lib/commonjs/screen/home/Home.js +303 -0
  56. package/lib/commonjs/screen/home/Home.js.map +1 -0
  57. package/lib/commonjs/screen/messages/Messages.js +312 -0
  58. package/lib/commonjs/screen/messages/Messages.js.map +1 -0
  59. package/lib/commonjs/theme.js +132 -0
  60. package/lib/commonjs/theme.js.map +1 -0
  61. package/lib/commonjs/utils/messages.js +93 -0
  62. package/lib/commonjs/utils/messages.js.map +1 -0
  63. package/lib/commonjs/utils/objectId.js +61 -0
  64. package/lib/commonjs/utils/objectId.js.map +1 -0
  65. package/lib/commonjs/utils/onlineHours.js +127 -0
  66. package/lib/commonjs/utils/onlineHours.js.map +1 -0
  67. package/lib/commonjs/utils/upload.js +245 -0
  68. package/lib/commonjs/utils/upload.js.map +1 -0
  69. package/lib/module/App.js +7 -6
  70. package/lib/module/App.js.map +1 -1
  71. package/lib/module/Widget.js +157 -32
  72. package/lib/module/Widget.js.map +1 -1
  73. package/lib/module/assets/images/index.js +1 -1
  74. package/lib/module/assets/images/index.js.map +1 -1
  75. package/lib/module/assets/images/x.png +0 -0
  76. package/lib/module/components/Avatar.js +25 -28
  77. package/lib/module/components/Avatar.js.map +1 -1
  78. package/lib/module/components/AvatarWithStatus.js +47 -0
  79. package/lib/module/components/AvatarWithStatus.js.map +1 -0
  80. package/lib/module/components/ConversationItem.js +153 -0
  81. package/lib/module/components/ConversationItem.js.map +1 -0
  82. package/lib/module/components/Icons.js +537 -0
  83. package/lib/module/components/Icons.js.map +1 -0
  84. package/lib/module/components/InputTools.js +331 -39
  85. package/lib/module/components/InputTools.js.map +1 -1
  86. package/lib/module/components/MessengerShell.js +55 -0
  87. package/lib/module/components/MessengerShell.js.map +1 -0
  88. package/lib/module/components/conversation/DateSeparator.js +40 -0
  89. package/lib/module/components/conversation/DateSeparator.js.map +1 -0
  90. package/lib/module/components/conversation/EmojiPicker.js +55 -0
  91. package/lib/module/components/conversation/EmojiPicker.js.map +1 -0
  92. package/lib/module/components/conversation/PersistentMenu.js +57 -0
  93. package/lib/module/components/conversation/PersistentMenu.js.map +1 -0
  94. package/lib/module/components/conversation/TypingStatus.js +113 -0
  95. package/lib/module/components/conversation/TypingStatus.js.map +1 -0
  96. package/lib/module/components/conversation/WelcomeMessage.js +76 -0
  97. package/lib/module/components/conversation/WelcomeMessage.js.map +1 -0
  98. package/lib/module/components/nav/Navigation.js +121 -0
  99. package/lib/module/components/nav/Navigation.js.map +1 -0
  100. package/lib/module/components/nav/constants.js +16 -0
  101. package/lib/module/components/nav/constants.js.map +1 -0
  102. package/lib/module/graphql/ApolloContainer.js +1 -2
  103. package/lib/module/graphql/ApolloContainer.js.map +1 -1
  104. package/lib/module/graphql/mutation.js +57 -23
  105. package/lib/module/graphql/mutation.js.map +1 -1
  106. package/lib/module/graphql/query.js +83 -52
  107. package/lib/module/graphql/query.js.map +1 -1
  108. package/lib/module/graphql/subscription.js +31 -28
  109. package/lib/module/graphql/subscription.js.map +1 -1
  110. package/lib/module/screen/conversation/Attachment.js +79 -14
  111. package/lib/module/screen/conversation/Attachment.js.map +1 -1
  112. package/lib/module/screen/conversation/ConversationDetail.js +309 -140
  113. package/lib/module/screen/conversation/ConversationDetail.js.map +1 -1
  114. package/lib/module/screen/conversation/Message.js +145 -82
  115. package/lib/module/screen/conversation/Message.js.map +1 -1
  116. package/lib/module/screen/faq/Faq.js +363 -0
  117. package/lib/module/screen/faq/Faq.js.map +1 -0
  118. package/lib/module/screen/greetings/Social.js +19 -9
  119. package/lib/module/screen/greetings/Social.js.map +1 -1
  120. package/lib/module/screen/greetings/Supporters.js +50 -46
  121. package/lib/module/screen/greetings/Supporters.js.map +1 -1
  122. package/lib/module/screen/home/Home.js +293 -0
  123. package/lib/module/screen/home/Home.js.map +1 -0
  124. package/lib/module/screen/messages/Messages.js +303 -0
  125. package/lib/module/screen/messages/Messages.js.map +1 -0
  126. package/lib/module/theme.js +122 -0
  127. package/lib/module/theme.js.map +1 -0
  128. package/lib/module/utils/messages.js +81 -0
  129. package/lib/module/utils/messages.js.map +1 -0
  130. package/lib/module/utils/objectId.js +53 -0
  131. package/lib/module/utils/objectId.js.map +1 -0
  132. package/lib/module/utils/onlineHours.js +118 -0
  133. package/lib/module/utils/onlineHours.js.map +1 -0
  134. package/lib/module/utils/upload.js +233 -0
  135. package/lib/module/utils/upload.js.map +1 -0
  136. package/lib/typescript/App.d.ts +2 -1
  137. package/lib/typescript/App.d.ts.map +1 -1
  138. package/lib/typescript/Widget.d.ts.map +1 -1
  139. package/lib/typescript/components/Avatar.d.ts +7 -1
  140. package/lib/typescript/components/Avatar.d.ts.map +1 -1
  141. package/lib/typescript/components/AvatarWithStatus.d.ts +11 -0
  142. package/lib/typescript/components/AvatarWithStatus.d.ts.map +1 -0
  143. package/lib/typescript/components/ConversationItem.d.ts +9 -0
  144. package/lib/typescript/components/ConversationItem.d.ts.map +1 -0
  145. package/lib/typescript/components/Icons.d.ts +33 -0
  146. package/lib/typescript/components/Icons.d.ts.map +1 -0
  147. package/lib/typescript/components/InputTools.d.ts.map +1 -1
  148. package/lib/typescript/components/MessengerShell.d.ts +4 -0
  149. package/lib/typescript/components/MessengerShell.d.ts.map +1 -0
  150. package/lib/typescript/components/conversation/DateSeparator.d.ts +6 -0
  151. package/lib/typescript/components/conversation/DateSeparator.d.ts.map +1 -0
  152. package/lib/typescript/components/conversation/EmojiPicker.d.ts +7 -0
  153. package/lib/typescript/components/conversation/EmojiPicker.d.ts.map +1 -0
  154. package/lib/typescript/components/conversation/PersistentMenu.d.ts +13 -0
  155. package/lib/typescript/components/conversation/PersistentMenu.d.ts.map +1 -0
  156. package/lib/typescript/components/conversation/TypingStatus.d.ts +4 -0
  157. package/lib/typescript/components/conversation/TypingStatus.d.ts.map +1 -0
  158. package/lib/typescript/components/conversation/WelcomeMessage.d.ts +6 -0
  159. package/lib/typescript/components/conversation/WelcomeMessage.d.ts.map +1 -0
  160. package/lib/typescript/components/nav/Navigation.d.ts +12 -0
  161. package/lib/typescript/components/nav/Navigation.d.ts.map +1 -0
  162. package/lib/typescript/components/nav/constants.d.ts +7 -0
  163. package/lib/typescript/components/nav/constants.d.ts.map +1 -0
  164. package/lib/typescript/graphql/ApolloContainer.d.ts.map +1 -1
  165. package/lib/typescript/graphql/mutation.d.ts +2 -1
  166. package/lib/typescript/graphql/mutation.d.ts.map +1 -1
  167. package/lib/typescript/graphql/query.d.ts +2 -3
  168. package/lib/typescript/graphql/query.d.ts.map +1 -1
  169. package/lib/typescript/graphql/subscription.d.ts +2 -1
  170. package/lib/typescript/graphql/subscription.d.ts.map +1 -1
  171. package/lib/typescript/screen/conversation/Attachment.d.ts.map +1 -1
  172. package/lib/typescript/screen/conversation/ConversationDetail.d.ts.map +1 -1
  173. package/lib/typescript/screen/conversation/Message.d.ts.map +1 -1
  174. package/lib/typescript/screen/faq/Faq.d.ts +4 -0
  175. package/lib/typescript/screen/faq/Faq.d.ts.map +1 -0
  176. package/lib/typescript/screen/greetings/Social.d.ts +1 -1
  177. package/lib/typescript/screen/greetings/Social.d.ts.map +1 -1
  178. package/lib/typescript/screen/greetings/Supporters.d.ts.map +1 -1
  179. package/lib/typescript/screen/home/Home.d.ts +4 -0
  180. package/lib/typescript/screen/home/Home.d.ts.map +1 -0
  181. package/lib/typescript/screen/messages/Messages.d.ts +4 -0
  182. package/lib/typescript/screen/messages/Messages.d.ts.map +1 -0
  183. package/lib/typescript/theme.d.ts +93 -0
  184. package/lib/typescript/theme.d.ts.map +1 -0
  185. package/lib/typescript/utils/messages.d.ts +27 -0
  186. package/lib/typescript/utils/messages.d.ts.map +1 -0
  187. package/lib/typescript/utils/objectId.d.ts +3 -0
  188. package/lib/typescript/utils/objectId.d.ts.map +1 -0
  189. package/lib/typescript/utils/onlineHours.d.ts +19 -0
  190. package/lib/typescript/utils/onlineHours.d.ts.map +1 -0
  191. package/lib/typescript/utils/upload.d.ts +32 -0
  192. package/lib/typescript/utils/upload.d.ts.map +1 -0
  193. package/package.json +29 -23
  194. package/src/App.tsx +10 -7
  195. package/src/Widget.tsx +211 -39
  196. package/src/assets/images/index.ts +1 -1
  197. package/src/assets/images/x.png +0 -0
  198. package/src/components/Avatar.tsx +30 -30
  199. package/src/components/AvatarWithStatus.tsx +63 -0
  200. package/src/components/ConversationItem.tsx +199 -0
  201. package/src/components/Icons.tsx +532 -0
  202. package/src/components/InputTools.tsx +388 -49
  203. package/src/components/MessengerShell.tsx +58 -0
  204. package/src/components/conversation/DateSeparator.tsx +36 -0
  205. package/src/components/conversation/EmojiPicker.tsx +111 -0
  206. package/src/components/conversation/PersistentMenu.tsx +74 -0
  207. package/src/components/conversation/TypingStatus.tsx +112 -0
  208. package/src/components/conversation/WelcomeMessage.tsx +70 -0
  209. package/src/components/nav/Navigation.tsx +137 -0
  210. package/src/components/nav/constants.ts +16 -0
  211. package/src/graphql/ApolloContainer.tsx +0 -1
  212. package/src/graphql/mutation.ts +58 -22
  213. package/src/graphql/query.ts +83 -55
  214. package/src/graphql/subscription.ts +31 -27
  215. package/src/screen/conversation/Attachment.tsx +123 -33
  216. package/src/screen/conversation/ConversationDetail.tsx +365 -135
  217. package/src/screen/conversation/Message.tsx +160 -98
  218. package/src/screen/faq/Faq.tsx +425 -0
  219. package/src/screen/greetings/Social.tsx +18 -4
  220. package/src/screen/greetings/Supporters.tsx +56 -41
  221. package/src/screen/home/Home.tsx +347 -0
  222. package/src/screen/messages/Messages.tsx +331 -0
  223. package/src/theme.ts +104 -0
  224. package/src/utils/messages.ts +105 -0
  225. package/src/utils/objectId.ts +59 -0
  226. package/src/utils/onlineHours.ts +167 -0
  227. package/src/utils/upload.ts +326 -0
  228. package/lib/commonjs/components/FAB.js +0 -51
  229. package/lib/commonjs/components/FAB.js.map +0 -1
  230. package/lib/commonjs/screen/conversation/Conversations.js +0 -160
  231. package/lib/commonjs/screen/conversation/Conversations.js.map +0 -1
  232. package/lib/commonjs/screen/greetings/Greetings.js +0 -96
  233. package/lib/commonjs/screen/greetings/Greetings.js.map +0 -1
  234. package/lib/module/components/FAB.js +0 -42
  235. package/lib/module/components/FAB.js.map +0 -1
  236. package/lib/module/screen/conversation/Conversations.js +0 -149
  237. package/lib/module/screen/conversation/Conversations.js.map +0 -1
  238. package/lib/module/screen/greetings/Greetings.js +0 -85
  239. package/lib/module/screen/greetings/Greetings.js.map +0 -1
  240. package/lib/typescript/components/FAB.d.ts +0 -16
  241. package/lib/typescript/components/FAB.d.ts.map +0 -1
  242. package/lib/typescript/screen/conversation/Conversations.d.ts +0 -4
  243. package/lib/typescript/screen/conversation/Conversations.d.ts.map +0 -1
  244. package/lib/typescript/screen/greetings/Greetings.d.ts +0 -4
  245. package/lib/typescript/screen/greetings/Greetings.d.ts.map +0 -1
  246. package/src/components/FAB.tsx +0 -69
  247. package/src/screen/conversation/Conversations.tsx +0 -150
  248. package/src/screen/greetings/Greetings.tsx +0 -98
@@ -13,15 +13,66 @@ var _InputTools = _interopRequireDefault(require("../../components/InputTools"))
13
13
  var _mutation = require("../../graphql/mutation");
14
14
  var _subscription = require("../../graphql/subscription");
15
15
  var _utils = require("../../utils/utils");
16
+ var _messages = require("../../utils/messages");
16
17
  var _Context = _interopRequireDefault(require("../../context/Context"));
17
18
  var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
19
+ var _theme = require("../../theme");
20
+ var _Icons = require("../../components/Icons");
21
+ var _DateSeparator = _interopRequireDefault(require("../../components/conversation/DateSeparator"));
22
+ var _WelcomeMessage = _interopRequireDefault(require("../../components/conversation/WelcomeMessage"));
23
+ var _TypingStatus = _interopRequireDefault(require("../../components/conversation/TypingStatus"));
18
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
25
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
20
26
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
- /* eslint-disable react-native/no-inline-styles */
22
-
27
+ const hasUserDetails = user => {
28
+ var _user$details, _user$details2;
29
+ return Boolean((user === null || user === void 0 ? void 0 : (_user$details = user.details) === null || _user$details === void 0 ? void 0 : _user$details.fullName) || (user === null || user === void 0 ? void 0 : (_user$details2 = user.details) === null || _user$details2 === void 0 ? void 0 : _user$details2.avatar));
30
+ };
31
+ const mergeUserDetails = (baseUser, incomingUser) => {
32
+ if (!baseUser && !incomingUser) {
33
+ return incomingUser;
34
+ }
35
+ return {
36
+ ...(baseUser || {}),
37
+ ...(incomingUser || {}),
38
+ details: {
39
+ ...((baseUser === null || baseUser === void 0 ? void 0 : baseUser.details) || {}),
40
+ ...((incomingUser === null || incomingUser === void 0 ? void 0 : incomingUser.details) || {})
41
+ }
42
+ };
43
+ };
44
+ const hydrateIncomingMessageUser = (message, participants) => {
45
+ if (message !== null && message !== void 0 && message.customerId || hasUserDetails(message === null || message === void 0 ? void 0 : message.user)) {
46
+ return message;
47
+ }
48
+ const participant = participants.find(user => {
49
+ var _message$user;
50
+ return (user === null || user === void 0 ? void 0 : user._id) === (message === null || message === void 0 ? void 0 : (_message$user = message.user) === null || _message$user === void 0 ? void 0 : _message$user._id);
51
+ }) || (participants.length === 1 ? participants[0] : null);
52
+ if (!participant) {
53
+ return message;
54
+ }
55
+ return {
56
+ ...message,
57
+ user: mergeUserDetails(participant, message === null || message === void 0 ? void 0 : message.user)
58
+ };
59
+ };
60
+ const mergeParticipantFromMessage = (participants, message) => {
61
+ if (message !== null && message !== void 0 && message.customerId) {
62
+ return participants;
63
+ }
64
+ const incomingUser = message === null || message === void 0 ? void 0 : message.user;
65
+ if (!(incomingUser !== null && incomingUser !== void 0 && incomingUser._id) || !hasUserDetails(incomingUser)) {
66
+ return participants;
67
+ }
68
+ const existingParticipant = participants.find(user => (user === null || user === void 0 ? void 0 : user._id) === incomingUser._id);
69
+ if (!existingParticipant) {
70
+ return [...participants, incomingUser];
71
+ }
72
+ return participants.map(user => (user === null || user === void 0 ? void 0 : user._id) === incomingUser._id ? mergeUserDetails(user, incomingUser) : user);
73
+ };
23
74
  const ConversationDetail = () => {
24
- var _data$widgetsConversa5;
75
+ var _data$widgetsConversa7, _data$widgetsConversa8, _data$widgetsConversa9;
25
76
  const value = (0, _react.useContext)(_Context.default);
26
77
  const {
27
78
  brand,
@@ -30,16 +81,23 @@ const ConversationDetail = () => {
30
81
  integrationId,
31
82
  customerId,
32
83
  visitorId,
84
+ greetings,
85
+ setConversationId,
86
+ markConversationRead,
33
87
  //
34
- backIcon,
35
88
  sendIcon,
36
89
  //
37
90
  subDomain
38
91
  } = value;
39
92
  const [messages, setMessages] = _react.default.useState([]);
93
+ const [isBotTyping, setIsBotTyping] = (0, _react.useState)(false);
94
+ const [sending, setSending] = (0, _react.useState)(false);
95
+ const sendingRef = _react.default.useRef(false);
96
+ const client = (0, _client.useApolloClient)();
40
97
  const {
41
98
  data,
42
99
  loading,
100
+ refetch,
43
101
  subscribeToMore
44
102
  } = (0, _client.useQuery)(_query.widgetsConversationDetail, {
45
103
  variables: {
@@ -50,6 +108,9 @@ const ConversationDetail = () => {
50
108
  skip: !conversationId
51
109
  });
52
110
  (0, _react.useEffect)(() => {
111
+ if (!conversationId) {
112
+ return;
113
+ }
53
114
  const unSubsToMore = subscribeToMore({
54
115
  document: _subscription.conversationMessageInserted,
55
116
  variables: {
@@ -59,250 +120,357 @@ const ConversationDetail = () => {
59
120
  let {
60
121
  subscriptionData
61
122
  } = _ref;
123
+ if (!prev || !subscriptionData.data) {
124
+ return prev;
125
+ }
62
126
  const message = subscriptionData.data.conversationMessageInserted;
127
+ if (!message) {
128
+ return prev;
129
+ }
63
130
  const tempWidgetsConversationDetail = prev.widgetsConversationDetail || {};
64
131
  const tempMessages = (tempWidgetsConversationDetail === null || tempWidgetsConversationDetail === void 0 ? void 0 : tempWidgetsConversationDetail.messages) || [];
132
+ const tempParticipants = (tempWidgetsConversationDetail === null || tempWidgetsConversationDetail === void 0 ? void 0 : tempWidgetsConversationDetail.participatedUsers) || [];
133
+ const existingParticipant = tempParticipants.find(user => {
134
+ var _message$user2;
135
+ return (user === null || user === void 0 ? void 0 : user._id) === (message === null || message === void 0 ? void 0 : (_message$user2 = message.user) === null || _message$user2 === void 0 ? void 0 : _message$user2._id);
136
+ });
137
+ const messageUser = mergeUserDetails(existingParticipant, message === null || message === void 0 ? void 0 : message.user);
138
+ const hydratedMessage = {
139
+ ...message,
140
+ user: messageUser
141
+ };
142
+ if (!message.customerId && !hasUserDetails(messageUser)) {
143
+ setTimeout(() => refetch(), 0);
144
+ }
145
+ const nextParticipants = mergeParticipantFromMessage(tempParticipants, hydratedMessage);
65
146
 
66
147
  // check whether or not already inserted
67
- const prevEntry = tempMessages.find(m => m._id === (message === null || message === void 0 ? void 0 : message._id));
148
+ const prevEntry = tempMessages.find(m => m._id === (hydratedMessage === null || hydratedMessage === void 0 ? void 0 : hydratedMessage._id));
68
149
  if (prevEntry) {
69
- return prev;
150
+ return {
151
+ ...prev,
152
+ widgetsConversationDetail: {
153
+ ...tempWidgetsConversationDetail,
154
+ participatedUsers: nextParticipants
155
+ }
156
+ };
70
157
  }
71
158
 
72
159
  // do not show internal or bot messages
73
- if (message.internal || message.fromBot) {
160
+ if (hydratedMessage.internal || hydratedMessage.fromBot) {
74
161
  return prev;
75
162
  }
163
+ if (!hydratedMessage.customerId) {
164
+ setTimeout(() => markConversationRead === null || markConversationRead === void 0 ? void 0 : markConversationRead(conversationId), 0);
165
+ }
76
166
 
77
167
  // add new message to messages list
78
168
  const next = {
79
169
  ...prev,
80
170
  widgetsConversationDetail: {
81
171
  ...tempWidgetsConversationDetail,
82
- messages: [...tempMessages, message]
172
+ messages: [...tempMessages, hydratedMessage],
173
+ participatedUsers: nextParticipants
83
174
  }
84
175
  };
85
176
  return next;
86
177
  }
87
178
  });
88
179
  return () => {
89
- unSubsToMore;
180
+ unSubsToMore();
90
181
  };
91
- }, [conversationId, subscribeToMore]);
182
+ }, [conversationId, markConversationRead, refetch, subscribeToMore]);
92
183
  (0, _react.useEffect)(() => {
93
184
  var _data$widgetsConversa;
94
185
  if (data !== null && data !== void 0 && (_data$widgetsConversa = data.widgetsConversationDetail) !== null && _data$widgetsConversa !== void 0 && _data$widgetsConversa.messages) {
95
- var _data$widgetsConversa2, _data$widgetsConversa3, _data$widgetsConversa4;
96
- let reversed = data === null || data === void 0 ? void 0 : (_data$widgetsConversa2 = data.widgetsConversationDetail) === null || _data$widgetsConversa2 === void 0 ? void 0 : (_data$widgetsConversa3 = _data$widgetsConversa2.messages) === null || _data$widgetsConversa3 === void 0 ? void 0 : (_data$widgetsConversa4 = _data$widgetsConversa3.slice()) === null || _data$widgetsConversa4 === void 0 ? void 0 : _data$widgetsConversa4.reverse();
186
+ var _data$widgetsConversa2, _data$widgetsConversa3, _data$widgetsConversa4, _data$widgetsConversa5, _data$widgetsConversa6;
187
+ const participants = (data === null || data === void 0 ? void 0 : (_data$widgetsConversa2 = data.widgetsConversationDetail) === null || _data$widgetsConversa2 === void 0 ? void 0 : _data$widgetsConversa2.participatedUsers) || [];
188
+ let reversed = data === null || data === void 0 ? void 0 : (_data$widgetsConversa3 = data.widgetsConversationDetail) === null || _data$widgetsConversa3 === void 0 ? void 0 : (_data$widgetsConversa4 = _data$widgetsConversa3.messages) === null || _data$widgetsConversa4 === void 0 ? void 0 : (_data$widgetsConversa5 = _data$widgetsConversa4.slice()) === null || _data$widgetsConversa5 === void 0 ? void 0 : (_data$widgetsConversa6 = _data$widgetsConversa5.reverse()) === null || _data$widgetsConversa6 === void 0 ? void 0 : _data$widgetsConversa6.map(message => hydrateIncomingMessageUser(message, participants));
97
189
  setMessages(reversed);
98
190
  }
99
191
  }, [data]);
192
+
193
+ // Bot typing indicator — ported from the web messenger useConversationDetail.
194
+ (0, _react.useEffect)(() => {
195
+ if (!conversationId) {
196
+ return;
197
+ }
198
+ const subscription = client.subscribe({
199
+ query: _subscription.conversationBotTypingStatus,
200
+ variables: {
201
+ _id: conversationId
202
+ },
203
+ fetchPolicy: 'network-only'
204
+ }).subscribe({
205
+ next(_ref2) {
206
+ let {
207
+ data: typing
208
+ } = _ref2;
209
+ const status = typing === null || typing === void 0 ? void 0 : typing.conversationBotTypingStatus;
210
+ setIsBotTyping(typeof status === 'object' && status !== null ? Boolean(status.typing) : Boolean(status));
211
+ },
212
+ error() {
213
+ setIsBotTyping(false);
214
+ }
215
+ });
216
+ return () => subscription.unsubscribe();
217
+ }, [conversationId, client]);
218
+
219
+ // Build grouped rows (welcome → date separators → grouped messages) in
220
+ // chronological order, then reverse for the inverted FlatList.
221
+ const invertedRows = (0, _react.useMemo)(() => {
222
+ var _greetings$messages;
223
+ const chronological = [...messages].reverse();
224
+ const rows = (0, _messages.buildChatRows)(chronological, greetings === null || greetings === void 0 ? void 0 : (_greetings$messages = greetings.messages) === null || _greetings$messages === void 0 ? void 0 : _greetings$messages.welcome);
225
+ return [...rows].reverse();
226
+ }, [messages, greetings]);
100
227
  const [sendMutation] = (0, _client.useMutation)(_mutation.widgetsInsertMessage);
101
- const onSend = text => {
228
+ (0, _react.useEffect)(() => {
229
+ if (!conversationId) {
230
+ return;
231
+ }
232
+ markConversationRead === null || markConversationRead === void 0 ? void 0 : markConversationRead(conversationId);
233
+ }, [conversationId, markConversationRead]);
234
+ const onSend = (text, attachments) => {
235
+ if (sendingRef.current) {
236
+ return;
237
+ }
238
+ sendingRef.current = true;
239
+ setSending(true);
102
240
  sendMutation({
103
241
  variables: {
104
242
  integrationId,
105
243
  customerId,
106
244
  visitorId,
107
- conversationId,
245
+ conversationId: conversationId || null,
108
246
  contentType: 'text',
109
- message: text
247
+ message: text,
248
+ attachments: attachments && attachments.length > 0 ? attachments : undefined
110
249
  }
111
250
  }).then(res => {
112
251
  if (res.errors) {
113
252
  return console.log(res.errors);
114
253
  }
115
- if (res.data.widgetsInsertMessage) {
116
- let shouldAdd = (messages === null || messages === void 0 ? void 0 : messages.length) === 0;
117
- if (!shouldAdd) {
118
- shouldAdd = res.data.widgetsInsertMessage._id !== messages[0]._id;
119
- }
120
- if (shouldAdd) {
121
- const newArray = [res.data.widgetsInsertMessage, ...messages];
122
- setMessages(newArray);
254
+ const insertedMessage = res.data.widgetsInsertMessage;
255
+ if (insertedMessage) {
256
+ const nextConversationId = insertedMessage.conversationId;
257
+ if (nextConversationId && nextConversationId !== conversationId) {
258
+ _asyncStorage.default.setItem('conversationId', nextConversationId);
259
+ setConversationId(nextConversationId);
123
260
  }
261
+ setMessages(prevMessages => {
262
+ const alreadyExists = prevMessages.some(message => message._id === insertedMessage._id);
263
+ return alreadyExists ? prevMessages : [insertedMessage, ...prevMessages];
264
+ });
124
265
  }
125
266
  }).catch(err => {
126
267
  console.log(err);
268
+ }).finally(() => {
269
+ sendingRef.current = false;
270
+ setSending(false);
127
271
  });
128
272
  };
129
273
  if (loading) {
130
274
  return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
131
- style: {
132
- flex: 1,
133
- alignItems: 'center',
134
- justifyContent: 'center'
135
- }
275
+ style: styles.fullCenter
136
276
  }, /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
137
- color: '#686868',
277
+ color: bgColor,
138
278
  size: 'large'
139
279
  }));
140
280
  }
141
- const renderItem = _ref2 => {
281
+ const renderItem = _ref3 => {
142
282
  let {
143
283
  item
144
- } = _ref2;
284
+ } = _ref3;
285
+ if (item.type === 'welcome') {
286
+ return /*#__PURE__*/_react.default.createElement(_WelcomeMessage.default, {
287
+ content: item.content
288
+ });
289
+ }
290
+ if (item.type === 'date') {
291
+ return /*#__PURE__*/_react.default.createElement(_DateSeparator.default, {
292
+ label: item.label
293
+ });
294
+ }
145
295
  return /*#__PURE__*/_react.default.createElement(_Message.default, {
146
- item: item,
147
- bgColor: bgColor
296
+ item: item.item,
297
+ bgColor: bgColor,
298
+ isFirstInGroup: item.isFirstInGroup,
299
+ isLastInGroup: item.isLastInGroup
148
300
  });
149
301
  };
150
302
  const renderContent = () => {
151
- return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
152
- style: {
153
- flex: 1
154
- }
303
+ return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableWithoutFeedback, {
304
+ onPress: () => _reactNative.Keyboard.dismiss()
155
305
  }, /*#__PURE__*/_react.default.createElement(_reactNative.FlatList, {
156
306
  contentContainerStyle: styles.contentStyle,
157
307
  showsVerticalScrollIndicator: false,
158
- data: messages,
159
- keyExtractor: item => item._id,
308
+ data: invertedRows,
309
+ keyExtractor: item => item.id,
160
310
  onEndReachedThreshold: 0.2,
161
311
  renderItem: renderItem,
162
312
  ItemSeparatorComponent: () => null,
313
+ keyboardShouldPersistTaps: "handled",
163
314
  inverted: true
164
315
  }));
165
316
  };
166
317
  return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
167
- style: {
168
- flex: 1
169
- }
318
+ style: styles.root
170
319
  }, /*#__PURE__*/_react.default.createElement(Header, {
171
320
  brand: brand,
172
321
  bgColor: bgColor,
173
- users: data === null || data === void 0 ? void 0 : (_data$widgetsConversa5 = data.widgetsConversationDetail) === null || _data$widgetsConversa5 === void 0 ? void 0 : _data$widgetsConversa5.participatedUsers,
174
- backIcon: backIcon,
322
+ users: data === null || data === void 0 ? void 0 : (_data$widgetsConversa7 = data.widgetsConversationDetail) === null || _data$widgetsConversa7 === void 0 ? void 0 : _data$widgetsConversa7.participatedUsers,
323
+ isOnline: data === null || data === void 0 ? void 0 : (_data$widgetsConversa8 = data.widgetsConversationDetail) === null || _data$widgetsConversa8 === void 0 ? void 0 : _data$widgetsConversa8.isOnline,
175
324
  subDomain: subDomain
176
- }), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
177
- style: {
178
- backgroundColor: 'rgba(215,215,215,.7)',
179
- flex: 1
180
- }
181
- }, renderContent(), /*#__PURE__*/_react.default.createElement(_reactNative.KeyboardAvoidingView, {
325
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.KeyboardAvoidingView, {
326
+ style: styles.chatArea,
182
327
  behavior: _reactNative.Platform.OS === 'ios' ? 'padding' : undefined,
183
- keyboardVerticalOffset: 100
184
- }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableWithoutFeedback, {
185
- onPress: () => _reactNative.Keyboard.dismiss()
186
- }, /*#__PURE__*/_react.default.createElement(_InputTools.default, {
328
+ keyboardVerticalOffset: _reactNative.Platform.OS === 'ios' ? 0 : 0
329
+ }, renderContent(), isBotTyping ? /*#__PURE__*/_react.default.createElement(_reactNative.View, {
330
+ style: styles.typingWrap
331
+ }, /*#__PURE__*/_react.default.createElement(_TypingStatus.default, null)) : null, /*#__PURE__*/_react.default.createElement(_InputTools.default, {
187
332
  onSend: onSend,
188
333
  bgColor: bgColor,
189
- sendIcon: sendIcon
190
- })))));
334
+ sendIcon: sendIcon,
335
+ subDomain: subDomain,
336
+ sending: sending,
337
+ persistentMenus: (data === null || data === void 0 ? void 0 : (_data$widgetsConversa9 = data.widgetsConversationDetail) === null || _data$widgetsConversa9 === void 0 ? void 0 : _data$widgetsConversa9.persistentMenus) || (greetings === null || greetings === void 0 ? void 0 : greetings.persistentMenus)
338
+ })));
191
339
  };
192
340
  var _default = ConversationDetail;
193
341
  exports.default = _default;
194
342
  const Header = props => {
343
+ var _agent$details, _agent$details2;
195
344
  const {
196
345
  brand,
197
346
  bgColor,
198
347
  users,
199
- backIcon,
348
+ isOnline,
200
349
  subDomain
201
350
  } = props;
202
351
  const value = (0, _react.useContext)(_Context.default);
203
352
  const {
204
353
  setConversationId
205
354
  } = value;
206
- if ((users === null || users === void 0 ? void 0 : users.length) > 0) {
207
- var _users$, _users$$details, _users$3, _users$3$details;
208
- let source;
209
- if ((_users$ = users[0]) !== null && _users$ !== void 0 && (_users$$details = _users$.details) !== null && _users$$details !== void 0 && _users$$details.avatar) {
210
- var _users$2, _users$2$details;
211
- source = {
212
- uri: (0, _utils.getAttachmentUrl)((_users$2 = users[0]) === null || _users$2 === void 0 ? void 0 : (_users$2$details = _users$2.details) === null || _users$2$details === void 0 ? void 0 : _users$2$details.avatar, subDomain)
213
- };
214
- } else {
215
- source = require('../../assets/images/avatar.png');
216
- }
217
- return /*#__PURE__*/_react.default.createElement(_reactNative.SafeAreaView, {
218
- style: {
219
- backgroundColor: bgColor
220
- }
221
- }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
222
- style: {
223
- flexDirection: 'row',
224
- alignItems: 'center',
225
- paddingBottom: 20
226
- }
227
- }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
228
- onPress: () => {
229
- _asyncStorage.default.removeItem('conversationId');
230
- setConversationId(null);
231
- },
232
- style: [styles.backStyle, {
233
- backgroundColor: '#2F1F69'
234
- }]
235
- }, backIcon), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
236
- style: [styles.title, {
237
- marginLeft: 10,
238
- alignItems: 'center',
239
- flex: 1
240
- }]
241
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Image, {
242
- source: source,
243
- style: styles.avatar,
244
- resizeMode: "stretch"
245
- }), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
246
- style: {
247
- marginLeft: 10
248
- }
249
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
250
- style: {
251
- fontWeight: '600'
252
- }
253
- }, (_users$3 = users[0]) === null || _users$3 === void 0 ? void 0 : (_users$3$details = _users$3.details) === null || _users$3$details === void 0 ? void 0 : _users$3$details.fullName)))));
254
- }
355
+ const agent = (users === null || users === void 0 ? void 0 : users.length) > 0 ? users[0] : null;
356
+ const title = (agent === null || agent === void 0 ? void 0 : (_agent$details = agent.details) === null || _agent$details === void 0 ? void 0 : _agent$details.fullName) || (brand === null || brand === void 0 ? void 0 : brand.name) || 'Support';
357
+ const subtitle = agent ? 'usually replies in a few minutes' : null;
358
+ const avatarSource = agent !== null && agent !== void 0 && (_agent$details2 = agent.details) !== null && _agent$details2 !== void 0 && _agent$details2.avatar ? {
359
+ uri: (0, _utils.getAttachmentUrl)(agent.details.avatar, subDomain)
360
+ } : require('../../assets/images/avatar.png');
361
+ const androidTop = _reactNative.Platform.OS === 'android' ? _reactNative.StatusBar.currentHeight || 0 : 0;
255
362
  return /*#__PURE__*/_react.default.createElement(_reactNative.SafeAreaView, {
256
363
  style: {
257
364
  backgroundColor: bgColor
258
365
  }
259
366
  }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
260
- style: {
261
- flexDirection: 'row',
262
- alignItems: 'center',
263
- paddingBottom: 20
264
- }
367
+ style: [styles.header, {
368
+ paddingTop: androidTop + 6
369
+ }]
265
370
  }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
266
371
  onPress: () => {
267
372
  _asyncStorage.default.removeItem('conversationId');
268
373
  setConversationId(null);
269
374
  },
270
- style: [styles.backStyle, {
271
- backgroundColor: '#2F1F69'
272
- }]
273
- }, backIcon), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
274
- style: [styles.title]
275
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
276
- style: {
277
- fontWeight: '600',
278
- fontSize: 16
375
+ style: styles.backButton,
376
+ hitSlop: {
377
+ top: 8,
378
+ bottom: 8,
379
+ left: 8,
380
+ right: 8
279
381
  }
280
- }, brand === null || brand === void 0 ? void 0 : brand.name))));
382
+ }, /*#__PURE__*/_react.default.createElement(_Icons.BackIcon, {
383
+ color: _theme.messengerTheme.colors.primaryForeground,
384
+ size: 18
385
+ })), agent ? /*#__PURE__*/_react.default.createElement(_reactNative.View, {
386
+ style: styles.avatarWrap
387
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Image, {
388
+ source: avatarSource,
389
+ style: styles.avatar,
390
+ resizeMode: "cover"
391
+ }), isOnline ? /*#__PURE__*/_react.default.createElement(_reactNative.View, {
392
+ style: styles.onlineDot
393
+ }) : null) : null, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
394
+ style: styles.headerTextWrap
395
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
396
+ numberOfLines: 1,
397
+ style: styles.headerTitle
398
+ }, title), subtitle ? /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
399
+ numberOfLines: 1,
400
+ style: styles.headerSubtitle
401
+ }, subtitle) : null)));
281
402
  };
282
403
  const styles = _reactNative.StyleSheet.create({
283
- backStyle: {
284
- width: 40,
285
- height: 40,
286
- marginLeft: 15,
287
- borderRadius: 90,
288
- justifyContent: 'center',
289
- alignItems: 'center'
404
+ root: {
405
+ flex: 1,
406
+ backgroundColor: _theme.messengerTheme.colors.background
407
+ },
408
+ chatArea: {
409
+ flex: 1,
410
+ backgroundColor: _theme.messengerTheme.colors.background
290
411
  },
291
- title: {
292
- paddingVertical: 10,
293
- paddingHorizontal: 15,
294
- borderTopLeftRadius: 8,
295
- borderTopRightRadius: 8,
296
- flexDirection: 'row'
412
+ fullCenter: {
413
+ flex: 1,
414
+ alignItems: 'center',
415
+ justifyContent: 'center',
416
+ backgroundColor: _theme.messengerTheme.colors.background
297
417
  },
298
418
  contentStyle: {
299
419
  flexGrow: 1,
300
- padding: 20
420
+ paddingHorizontal: _theme.messengerTheme.spacing.lg,
421
+ paddingVertical: _theme.messengerTheme.spacing.md
301
422
  },
302
- avatar: {
423
+ typingWrap: {
424
+ paddingHorizontal: _theme.messengerTheme.spacing.lg,
425
+ paddingBottom: _theme.messengerTheme.spacing.xs
426
+ },
427
+ header: {
428
+ flexDirection: 'row',
429
+ alignItems: 'center',
430
+ paddingHorizontal: _theme.messengerTheme.spacing.md,
431
+ paddingBottom: _theme.messengerTheme.spacing.md,
432
+ paddingTop: 6
433
+ },
434
+ backButton: {
303
435
  width: 40,
304
436
  height: 40,
305
- borderRadius: 90
437
+ borderRadius: 20,
438
+ justifyContent: 'center',
439
+ alignItems: 'center',
440
+ backgroundColor: 'rgba(255,255,255,0.16)'
441
+ },
442
+ avatarWrap: {
443
+ marginLeft: _theme.messengerTheme.spacing.md
444
+ },
445
+ avatar: {
446
+ width: 36,
447
+ height: 36,
448
+ borderRadius: 18
449
+ },
450
+ onlineDot: {
451
+ position: 'absolute',
452
+ right: 0,
453
+ bottom: 0,
454
+ width: 11,
455
+ height: 11,
456
+ borderRadius: 6,
457
+ backgroundColor: _theme.messengerTheme.colors.online,
458
+ borderWidth: 2,
459
+ borderColor: _theme.messengerTheme.colors.primary
460
+ },
461
+ headerTextWrap: {
462
+ flex: 1,
463
+ marginLeft: _theme.messengerTheme.spacing.md
464
+ },
465
+ headerTitle: {
466
+ color: _theme.messengerTheme.colors.primaryForeground,
467
+ fontWeight: '600',
468
+ fontSize: 16
469
+ },
470
+ headerSubtitle: {
471
+ color: 'rgba(255,255,255,0.65)',
472
+ fontSize: 12,
473
+ marginTop: 1
306
474
  }
307
475
  });
308
476
  //# sourceMappingURL=ConversationDetail.js.map