chat 1.0.8 → 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 (318) hide show
  1. package/package.json +2 -96
  2. package/readme.md +1 -201
  3. package/lib/module/ChatContext/index.js +0 -2
  4. package/lib/module/ChatContext/index.js.map +0 -1
  5. package/lib/module/ChatContext/types.js +0 -2
  6. package/lib/module/ChatContext/types.js.map +0 -1
  7. package/lib/module/classes/Chat/index.js +0 -2
  8. package/lib/module/classes/Chat/index.js.map +0 -1
  9. package/lib/module/classes/Chat/types.js +0 -2
  10. package/lib/module/classes/Chat/types.js.map +0 -1
  11. package/lib/module/classes/Inbox/index.js +0 -2
  12. package/lib/module/classes/Inbox/index.js.map +0 -1
  13. package/lib/module/classes/Inbox/types.js +0 -2
  14. package/lib/module/classes/Inbox/types.js.map +0 -1
  15. package/lib/module/classes/Message/index.js +0 -2
  16. package/lib/module/classes/Message/index.js.map +0 -1
  17. package/lib/module/classes/Message/types.js +0 -2
  18. package/lib/module/classes/Message/types.js.map +0 -1
  19. package/lib/module/classes/Reaction/index.js +0 -2
  20. package/lib/module/classes/Reaction/index.js.map +0 -1
  21. package/lib/module/classes/Reaction/types.js +0 -2
  22. package/lib/module/classes/Reaction/types.js.map +0 -1
  23. package/lib/module/classes/Room/index.js +0 -2
  24. package/lib/module/classes/Room/index.js.map +0 -1
  25. package/lib/module/classes/Room/types.js +0 -2
  26. package/lib/module/classes/Room/types.js.map +0 -1
  27. package/lib/module/classes/index.js +0 -2
  28. package/lib/module/classes/index.js.map +0 -1
  29. package/lib/module/components/Avatar/index.js +0 -2
  30. package/lib/module/components/Avatar/index.js.map +0 -1
  31. package/lib/module/components/Chat/Bubble/index.js +0 -2
  32. package/lib/module/components/Chat/Bubble/index.js.map +0 -1
  33. package/lib/module/components/Chat/Composer/Input/index.js +0 -2
  34. package/lib/module/components/Chat/Composer/Input/index.js.map +0 -1
  35. package/lib/module/components/Chat/Composer/Send/index.js +0 -2
  36. package/lib/module/components/Chat/Composer/Send/index.js.map +0 -1
  37. package/lib/module/components/Chat/Composer/index.js +0 -2
  38. package/lib/module/components/Chat/Composer/index.js.map +0 -1
  39. package/lib/module/components/Chat/Media/Image/index.js +0 -2
  40. package/lib/module/components/Chat/Media/Image/index.js.map +0 -1
  41. package/lib/module/components/Chat/Media/index.js +0 -2
  42. package/lib/module/components/Chat/Media/index.js.map +0 -1
  43. package/lib/module/components/Chat/Message/Swiper/Action/index.js +0 -2
  44. package/lib/module/components/Chat/Message/Swiper/Action/index.js.map +0 -1
  45. package/lib/module/components/Chat/Message/Swiper/index.js +0 -2
  46. package/lib/module/components/Chat/Message/Swiper/index.js.map +0 -1
  47. package/lib/module/components/Chat/Message/Touchable/index.js +0 -2
  48. package/lib/module/components/Chat/Message/Touchable/index.js.map +0 -1
  49. package/lib/module/components/Chat/Message/index.js +0 -2
  50. package/lib/module/components/Chat/Message/index.js.map +0 -1
  51. package/lib/module/components/Chat/SystemMessage/index.js +0 -2
  52. package/lib/module/components/Chat/SystemMessage/index.js.map +0 -1
  53. package/lib/module/components/Chat/TypingFooter/index.js +0 -2
  54. package/lib/module/components/Chat/TypingFooter/index.js.map +0 -1
  55. package/lib/module/components/Chat/index.js +0 -2
  56. package/lib/module/components/Chat/index.js.map +0 -1
  57. package/lib/module/components/Chat/types.js +0 -2
  58. package/lib/module/components/Chat/types.js.map +0 -1
  59. package/lib/module/components/Chat-Old/Bubble/index.js +0 -2
  60. package/lib/module/components/Chat-Old/Bubble/index.js.map +0 -1
  61. package/lib/module/components/Chat-Old/Composer/Input/index.js +0 -2
  62. package/lib/module/components/Chat-Old/Composer/Input/index.js.map +0 -1
  63. package/lib/module/components/Chat-Old/Composer/Send/index.js +0 -2
  64. package/lib/module/components/Chat-Old/Composer/Send/index.js.map +0 -1
  65. package/lib/module/components/Chat-Old/Composer/index.js +0 -2
  66. package/lib/module/components/Chat-Old/Composer/index.js.map +0 -1
  67. package/lib/module/components/Chat-Old/Message/index.js +0 -2
  68. package/lib/module/components/Chat-Old/Message/index.js.map +0 -1
  69. package/lib/module/components/Chat-Old/Swiper/Action/index.js +0 -2
  70. package/lib/module/components/Chat-Old/Swiper/Action/index.js.map +0 -1
  71. package/lib/module/components/Chat-Old/Swiper/index.js +0 -2
  72. package/lib/module/components/Chat-Old/Swiper/index.js.map +0 -1
  73. package/lib/module/components/Chat-Old/SystemMessage/index.js +0 -2
  74. package/lib/module/components/Chat-Old/SystemMessage/index.js.map +0 -1
  75. package/lib/module/components/Chat-Old/index.js +0 -2
  76. package/lib/module/components/Chat-Old/index.js.map +0 -1
  77. package/lib/module/components/Chat-Old/types.js +0 -2
  78. package/lib/module/components/Chat-Old/types.js.map +0 -1
  79. package/lib/module/components/ChatProvider/index.js +0 -2
  80. package/lib/module/components/ChatProvider/index.js.map +0 -1
  81. package/lib/module/components/ChatProvider/types.js +0 -2
  82. package/lib/module/components/ChatProvider/types.js.map +0 -1
  83. package/lib/module/components/Inbox/Item/Circle/index.js +0 -2
  84. package/lib/module/components/Inbox/Item/Circle/index.js.map +0 -1
  85. package/lib/module/components/Inbox/Item/Circle/types.js +0 -2
  86. package/lib/module/components/Inbox/Item/Circle/types.js.map +0 -1
  87. package/lib/module/components/Inbox/Item/Initials/index.js +0 -2
  88. package/lib/module/components/Inbox/Item/Initials/index.js.map +0 -1
  89. package/lib/module/components/Inbox/Item/ItemDate/index.js +0 -2
  90. package/lib/module/components/Inbox/Item/ItemDate/index.js.map +0 -1
  91. package/lib/module/components/Inbox/Item/Separator/index.js +0 -2
  92. package/lib/module/components/Inbox/Item/Separator/index.js.map +0 -1
  93. package/lib/module/components/Inbox/Item/Subtitle/index.js +0 -2
  94. package/lib/module/components/Inbox/Item/Subtitle/index.js.map +0 -1
  95. package/lib/module/components/Inbox/Item/Swipeable/index.js +0 -2
  96. package/lib/module/components/Inbox/Item/Swipeable/index.js.map +0 -1
  97. package/lib/module/components/Inbox/Item/Title/index.js +0 -2
  98. package/lib/module/components/Inbox/Item/Title/index.js.map +0 -1
  99. package/lib/module/components/Inbox/Item/UnreadIndicator/index.js +0 -2
  100. package/lib/module/components/Inbox/Item/UnreadIndicator/index.js.map +0 -1
  101. package/lib/module/components/Inbox/Item/index.js +0 -2
  102. package/lib/module/components/Inbox/Item/index.js.map +0 -1
  103. package/lib/module/components/Inbox/index.js +0 -2
  104. package/lib/module/components/Inbox/index.js.map +0 -1
  105. package/lib/module/components/Inbox/question.md +0 -21
  106. package/lib/module/components/Inbox/readme.md +0 -21
  107. package/lib/module/components/Inbox/types.js +0 -2
  108. package/lib/module/components/Inbox/types.js.map +0 -1
  109. package/lib/module/components/RoomCreator/Content/Footer/Button/index.js +0 -2
  110. package/lib/module/components/RoomCreator/Content/Footer/Button/index.js.map +0 -1
  111. package/lib/module/components/RoomCreator/Content/Footer/Input/index.js +0 -2
  112. package/lib/module/components/RoomCreator/Content/Footer/Input/index.js.map +0 -1
  113. package/lib/module/components/RoomCreator/Content/Footer/index.js +0 -2
  114. package/lib/module/components/RoomCreator/Content/Footer/index.js.map +0 -1
  115. package/lib/module/components/RoomCreator/Content/Item/Icon/index.js +0 -2
  116. package/lib/module/components/RoomCreator/Content/Item/Icon/index.js.map +0 -1
  117. package/lib/module/components/RoomCreator/Content/Item/index.js +0 -2
  118. package/lib/module/components/RoomCreator/Content/Item/index.js.map +0 -1
  119. package/lib/module/components/RoomCreator/Content/index.js +0 -2
  120. package/lib/module/components/RoomCreator/Content/index.js.map +0 -1
  121. package/lib/module/components/RoomCreator/Header/index.js +0 -2
  122. package/lib/module/components/RoomCreator/Header/index.js.map +0 -1
  123. package/lib/module/components/RoomCreator/index.js +0 -2
  124. package/lib/module/components/RoomCreator/index.js.map +0 -1
  125. package/lib/module/components/RoomCreator/types.js +0 -2
  126. package/lib/module/components/RoomCreator/types.js.map +0 -1
  127. package/lib/module/components/TypingIndicator/index.js +0 -2
  128. package/lib/module/components/TypingIndicator/index.js.map +0 -1
  129. package/lib/module/components/index.js +0 -2
  130. package/lib/module/components/index.js.map +0 -1
  131. package/lib/module/helpers/getInitials.js +0 -2
  132. package/lib/module/helpers/getInitials.js.map +0 -1
  133. package/lib/module/helpers/sortByAvatar.js +0 -2
  134. package/lib/module/helpers/sortByAvatar.js.map +0 -1
  135. package/lib/module/hooks/index.js +0 -2
  136. package/lib/module/hooks/index.js.map +0 -1
  137. package/lib/module/hooks/useCreateRoom/index.js +0 -2
  138. package/lib/module/hooks/useCreateRoom/index.js.map +0 -1
  139. package/lib/module/hooks/useCreator/index.js +0 -2
  140. package/lib/module/hooks/useCreator/index.js.map +0 -1
  141. package/lib/module/hooks/useInbox/index.js +0 -2
  142. package/lib/module/hooks/useInbox/index.js.map +0 -1
  143. package/lib/module/hooks/useInbox/types.js +0 -2
  144. package/lib/module/hooks/useInbox/types.js.map +0 -1
  145. package/lib/module/hooks/useMessages/index.js +0 -2
  146. package/lib/module/hooks/useMessages/index.js.map +0 -1
  147. package/lib/module/hooks/useMessages/types.js +0 -2
  148. package/lib/module/hooks/useMessages/types.js.map +0 -1
  149. package/lib/module/hooks/useRoom/index.js +0 -2
  150. package/lib/module/hooks/useRoom/index.js.map +0 -1
  151. package/lib/module/hooks/useRoom/types.js +0 -2
  152. package/lib/module/hooks/useRoom/types.js.map +0 -1
  153. package/lib/module/hooks/useSend/useSendToGroup/index.js +0 -2
  154. package/lib/module/hooks/useSend/useSendToGroup/index.js.map +0 -1
  155. package/lib/module/hooks/useSend/useSendToPeople/index.js +0 -2
  156. package/lib/module/hooks/useSend/useSendToPeople/index.js.map +0 -1
  157. package/lib/module/hooks/useTyping/index.js +0 -2
  158. package/lib/module/hooks/useTyping/index.js.map +0 -1
  159. package/lib/module/hooks/useTypingOLD/index.js +0 -2
  160. package/lib/module/hooks/useTypingOLD/index.js.map +0 -1
  161. package/lib/module/hooks/useTypingOLD/types.js +0 -2
  162. package/lib/module/hooks/useTypingOLD/types.js.map +0 -1
  163. package/lib/module/hooks/useViewMessages/index.js +0 -2
  164. package/lib/module/hooks/useViewMessages/index.js.map +0 -1
  165. package/lib/module/hooks/useViewMessages/types.js +0 -2
  166. package/lib/module/hooks/useViewMessages/types.js.map +0 -1
  167. package/lib/module/hooks/useViewMessagesOld/index.js +0 -2
  168. package/lib/module/hooks/useViewMessagesOld/index.js.map +0 -1
  169. package/lib/module/index.js +0 -2
  170. package/lib/module/index.js.map +0 -1
  171. package/lib/typescript/ChatContext/index.d.ts +0 -2
  172. package/lib/typescript/ChatContext/types.d.ts +0 -4
  173. package/lib/typescript/classes/Chat/index.d.ts +0 -14
  174. package/lib/typescript/classes/Chat/types.d.ts +0 -21
  175. package/lib/typescript/classes/Inbox/types.d.ts +0 -2
  176. package/lib/typescript/classes/Message/index.d.ts +0 -47
  177. package/lib/typescript/classes/Message/types.d.ts +0 -66
  178. package/lib/typescript/classes/Reaction/index.d.ts +0 -17
  179. package/lib/typescript/classes/Reaction/types.d.ts +0 -33
  180. package/lib/typescript/classes/Room/index.d.ts +0 -42
  181. package/lib/typescript/classes/Room/types.d.ts +0 -112
  182. package/lib/typescript/classes/index.d.ts +0 -4
  183. package/lib/typescript/components/Avatar/index.d.ts +0 -4
  184. package/lib/typescript/components/Chat/Bubble/index.d.ts +0 -4
  185. package/lib/typescript/components/Chat/Composer/Input/index.d.ts +0 -7
  186. package/lib/typescript/components/Chat/Composer/Send/index.d.ts +0 -4
  187. package/lib/typescript/components/Chat/Composer/index.d.ts +0 -8
  188. package/lib/typescript/components/Chat/Media/Image/index.d.ts +0 -7
  189. package/lib/typescript/components/Chat/Media/index.d.ts +0 -4
  190. package/lib/typescript/components/Chat/Message/Touchable/index.d.ts +0 -4
  191. package/lib/typescript/components/Chat/Message/index.d.ts +0 -8
  192. package/lib/typescript/components/Chat/SystemMessage/index.d.ts +0 -4
  193. package/lib/typescript/components/Chat/TypingFooter/index.d.ts +0 -4
  194. package/lib/typescript/components/Chat/index.d.ts +0 -8
  195. package/lib/typescript/components/Chat/types.d.ts +0 -843
  196. package/lib/typescript/components/ChatProvider/index.d.ts +0 -10
  197. package/lib/typescript/components/ChatProvider/types.d.ts +0 -7
  198. package/lib/typescript/components/Inbox/Item/Initials/index.d.ts +0 -4
  199. package/lib/typescript/components/Inbox/Item/ItemDate/index.d.ts +0 -4
  200. package/lib/typescript/components/Inbox/Item/Separator/index.d.ts +0 -6
  201. package/lib/typescript/components/Inbox/Item/Subtitle/index.d.ts +0 -3
  202. package/lib/typescript/components/Inbox/Item/Swipeable/index.d.ts +0 -4
  203. package/lib/typescript/components/Inbox/Item/Title/index.d.ts +0 -3
  204. package/lib/typescript/components/Inbox/Item/UnreadIndicator/index.d.ts +0 -4
  205. package/lib/typescript/components/Inbox/Item/index.d.ts +0 -6
  206. package/lib/typescript/components/Inbox/index.d.ts +0 -4
  207. package/lib/typescript/components/Inbox/types.d.ts +0 -304
  208. package/lib/typescript/components/RoomCreator/Content/Footer/Button/index.d.ts +0 -4
  209. package/lib/typescript/components/RoomCreator/Content/Footer/Input/index.d.ts +0 -4
  210. package/lib/typescript/components/RoomCreator/Content/Footer/index.d.ts +0 -3
  211. package/lib/typescript/components/RoomCreator/Content/Item/Icon/index.d.ts +0 -4
  212. package/lib/typescript/components/RoomCreator/Content/Item/index.d.ts +0 -4
  213. package/lib/typescript/components/RoomCreator/Content/index.d.ts +0 -4
  214. package/lib/typescript/components/RoomCreator/Header/index.d.ts +0 -4
  215. package/lib/typescript/components/RoomCreator/index.d.ts +0 -4
  216. package/lib/typescript/components/RoomCreator/types.d.ts +0 -208
  217. package/lib/typescript/components/TypingIndicator/index.d.ts +0 -9
  218. package/lib/typescript/components/index.d.ts +0 -12
  219. package/lib/typescript/helpers/getInitials.d.ts +0 -1
  220. package/lib/typescript/hooks/index.d.ts +0 -8
  221. package/lib/typescript/hooks/useCreator/index.d.ts +0 -27
  222. package/lib/typescript/hooks/useInbox/index.d.ts +0 -29
  223. package/lib/typescript/hooks/useInbox/types.d.ts +0 -5
  224. package/lib/typescript/hooks/useMessages/index.d.ts +0 -24
  225. package/lib/typescript/hooks/useMessages/types.d.ts +0 -5
  226. package/lib/typescript/hooks/useRoom/index.d.ts +0 -26
  227. package/lib/typescript/hooks/useRoom/types.d.ts +0 -5
  228. package/lib/typescript/hooks/useSend/useSendToGroup/index.d.ts +0 -6
  229. package/lib/typescript/hooks/useSend/useSendToPeople/index.d.ts +0 -6
  230. package/lib/typescript/hooks/useTyping/index.d.ts +0 -36
  231. package/lib/typescript/hooks/useViewMessages/index.d.ts +0 -18
  232. package/lib/typescript/hooks/useViewMessages/types.d.ts +0 -20
  233. package/lib/typescript/index.d.ts +0 -11
  234. package/src/ChatContext/index.tsx +0 -9
  235. package/src/ChatContext/types.ts +0 -4
  236. package/src/classes/Chat/index.ts +0 -46
  237. package/src/classes/Chat/types.ts +0 -23
  238. package/src/classes/Inbox/index.ts +0 -12
  239. package/src/classes/Inbox/types.ts +0 -3
  240. package/src/classes/Message/index.ts +0 -310
  241. package/src/classes/Message/types.ts +0 -118
  242. package/src/classes/Reaction/index.ts +0 -108
  243. package/src/classes/Reaction/types.ts +0 -37
  244. package/src/classes/Room/index.ts +0 -323
  245. package/src/classes/Room/types.ts +0 -161
  246. package/src/classes/index.ts +0 -4
  247. package/src/components/Avatar/index.tsx +0 -25
  248. package/src/components/Chat/Bubble/index.tsx +0 -139
  249. package/src/components/Chat/Composer/Input/index.tsx +0 -45
  250. package/src/components/Chat/Composer/Send/index.tsx +0 -51
  251. package/src/components/Chat/Composer/index.tsx +0 -187
  252. package/src/components/Chat/Media/Image/index.tsx +0 -26
  253. package/src/components/Chat/Media/index.tsx +0 -11
  254. package/src/components/Chat/Message/Swiper/Action/index.tsx +0 -7
  255. package/src/components/Chat/Message/Swiper/index.tsx +0 -32
  256. package/src/components/Chat/Message/Touchable/index.tsx +0 -60
  257. package/src/components/Chat/Message/index.tsx +0 -328
  258. package/src/components/Chat/SystemMessage/index.tsx +0 -44
  259. package/src/components/Chat/TypingFooter/index.tsx +0 -48
  260. package/src/components/Chat/index.tsx +0 -596
  261. package/src/components/Chat/types.ts +0 -913
  262. package/src/components/Chat-Old/Bubble/index.tsx +0 -58
  263. package/src/components/Chat-Old/Composer/Input/index.tsx +0 -34
  264. package/src/components/Chat-Old/Composer/Send/index.tsx +0 -37
  265. package/src/components/Chat-Old/Composer/index.tsx +0 -131
  266. package/src/components/Chat-Old/Message/index.tsx +0 -160
  267. package/src/components/Chat-Old/Swiper/Action/index.tsx +0 -7
  268. package/src/components/Chat-Old/Swiper/index.tsx +0 -30
  269. package/src/components/Chat-Old/SystemMessage/index.tsx +0 -44
  270. package/src/components/Chat-Old/index.tsx +0 -356
  271. package/src/components/Chat-Old/types.ts +0 -752
  272. package/src/components/ChatProvider/index.tsx +0 -31
  273. package/src/components/ChatProvider/types.ts +0 -8
  274. package/src/components/Inbox/Item/Circle/index.tsx +0 -47
  275. package/src/components/Inbox/Item/Circle/types.ts +0 -8
  276. package/src/components/Inbox/Item/Initials/index.tsx +0 -41
  277. package/src/components/Inbox/Item/ItemDate/index.tsx +0 -26
  278. package/src/components/Inbox/Item/Separator/index.tsx +0 -13
  279. package/src/components/Inbox/Item/Subtitle/index.tsx +0 -23
  280. package/src/components/Inbox/Item/Swipeable/index.tsx +0 -143
  281. package/src/components/Inbox/Item/Title/index.tsx +0 -23
  282. package/src/components/Inbox/Item/UnreadIndicator/index.tsx +0 -84
  283. package/src/components/Inbox/Item/index.tsx +0 -307
  284. package/src/components/Inbox/index.tsx +0 -315
  285. package/src/components/Inbox/question.md +0 -21
  286. package/src/components/Inbox/readme.md +0 -21
  287. package/src/components/Inbox/types.ts +0 -371
  288. package/src/components/RoomCreator/Content/Footer/Button/index.tsx +0 -55
  289. package/src/components/RoomCreator/Content/Footer/Input/index.tsx +0 -27
  290. package/src/components/RoomCreator/Content/Footer/index.tsx +0 -72
  291. package/src/components/RoomCreator/Content/Item/Icon/index.tsx +0 -16
  292. package/src/components/RoomCreator/Content/Item/index.tsx +0 -87
  293. package/src/components/RoomCreator/Content/index.tsx +0 -75
  294. package/src/components/RoomCreator/Header/index.tsx +0 -74
  295. package/src/components/RoomCreator/index.tsx +0 -177
  296. package/src/components/RoomCreator/types.ts +0 -233
  297. package/src/components/TypingIndicator/index.tsx +0 -169
  298. package/src/components/index.ts +0 -18
  299. package/src/helpers/getInitials.ts +0 -11
  300. package/src/helpers/sortByAvatar.ts +0 -1
  301. package/src/hooks/index.ts +0 -8
  302. package/src/hooks/useCreateRoom/index.ts +0 -34
  303. package/src/hooks/useCreator/index.ts +0 -33
  304. package/src/hooks/useInbox/index.ts +0 -76
  305. package/src/hooks/useInbox/types.ts +0 -6
  306. package/src/hooks/useMessages/index.ts +0 -109
  307. package/src/hooks/useMessages/types.ts +0 -6
  308. package/src/hooks/useRoom/index.ts +0 -82
  309. package/src/hooks/useRoom/types.ts +0 -6
  310. package/src/hooks/useSend/useSendToGroup/index.ts +0 -38
  311. package/src/hooks/useSend/useSendToPeople/index.ts +0 -38
  312. package/src/hooks/useTyping/index.ts +0 -154
  313. package/src/hooks/useTypingOLD/index.ts +0 -67
  314. package/src/hooks/useTypingOLD/types.ts +0 -7
  315. package/src/hooks/useViewMessages/index.ts +0 -61
  316. package/src/hooks/useViewMessages/types.ts +0 -22
  317. package/src/hooks/useViewMessagesOld/index.ts +0 -39
  318. package/src/index.ts +0 -13
@@ -1,596 +0,0 @@
1
- import React, {
2
- useMemo,
3
- useRef,
4
- useEffect,
5
- useCallback,
6
- MutableRefObject,
7
- } from 'react'
8
- import {
9
- FlatList,
10
- ListRenderItemInfo,
11
- SafeAreaView,
12
- View,
13
- StyleSheet,
14
- Animated,
15
- ViewToken,
16
- TextInput,
17
- KeyboardAvoidingView,
18
- Alert,
19
- Clipboard,
20
- } from 'react-native'
21
- import {
22
- Transitioning,
23
- Transition,
24
- TransitioningView,
25
- } from 'react-native-reanimated'
26
- import { NewMessageModel } from '../../classes/Message/types'
27
- import Message from './Message'
28
- import {
29
- ChatProps,
30
- MessageProps,
31
- ComposerProps,
32
- SystemMessageProps,
33
- ChatRef,
34
- } from './types'
35
- import Composer from './Composer'
36
- import SystemMessage from './SystemMessage'
37
- import TypingFooter from './TypingFooter'
38
-
39
- function Chat<MessageModel extends NewMessageModel = NewMessageModel>(
40
- props: ChatProps<MessageModel>
41
- ) {
42
- const checkForBrokenProps = () => {
43
- if (!props.user.name) {
44
- console.error(
45
- 'Breaking error: Messages component is missing a name in the user prop.'
46
- )
47
- }
48
- if (!props.user.id) {
49
- console.error(
50
- 'Breaking error: Messages component is missing an id in the user prop.'
51
- )
52
- }
53
- }
54
- checkForBrokenProps()
55
- // "constructor" variables
56
- const { chatRef: ref } = props
57
- const inputRef = useRef<TextInput>()
58
- const flatListRef = useRef<typeof Animated.ScrollView>()
59
- // const flatListRef = useRef<typeof Animated.FlatList<MessageModel>>()
60
- const componentRef = useRef<ChatRef<MessageModel>>()
61
-
62
- useEffect(() => {
63
- componentRef.current = {
64
- focusInput: () => inputRef.current?.focus(),
65
- blurInput: () => inputRef.current?.blur(),
66
- scrollToEnd: () => flatListRef.current?.getNode().scrollToEnd(),
67
- scrollToIndex: params =>
68
- flatListRef.current?.getNode().scrollToIndex(params),
69
- scrollToItem: params =>
70
- flatListRef.current?.getNode().scrollToItem(params),
71
- scrollToOffset: params =>
72
- flatListRef.current?.getNode().scrollToOffset(params),
73
- }
74
- if (ref) ref.current = componentRef.current
75
- })
76
-
77
- // if (!componentRef.current) {
78
- // componentRef.current = {
79
- // focusInput: () => inputRef.current && inputRef.current.focus(),
80
- // blurInput: () => inputRef.current && inputRef.current.blur(),
81
- // scrollToEnd: () =>
82
- // flatListRef.current && flatListRef.current.getNode().scrollToEnd(),
83
- // scrollToIndex: params =>
84
- // flatListRef.current &&
85
- // flatListRef.current.getNode().scrollToIndex(params),
86
- // scrollToItem: params =>
87
- // flatListRef.current &&
88
- // flatListRef.current.getNode().scrollToItem(params),
89
- // scrollToOffset: params =>
90
- // flatListRef.current &&
91
- // flatListRef.current.getNode().scrollToOffset(params),
92
- // }
93
- // if (ref) ref.current = componentRef.current
94
- // }
95
-
96
- // used to shuffle/transition the inbox when it changes
97
- const transitionRef = useRef<TransitioningView>(null)
98
- const mounted = useRef(false)
99
-
100
- // track animated position of scroll
101
- const scrollY: Animated.Value = useMemo(
102
- () => props.animatedScrollNode || new Animated.Value(0),
103
- [props.animatedScrollNode]
104
- )
105
-
106
- // upate position of scroll variable
107
- const onScroll = Animated.event(
108
- [{ nativeEvent: { contentOffset: { y: scrollY } } }],
109
- { useNativeDriver: true }
110
- )
111
-
112
- const messagesRef = useRef(props.messages)
113
-
114
- // effect to handle new messages coming in / scrolling to bottom
115
- // TODO we may have to use getNode() for the animated flatlist, right?
116
- useEffect(() => {
117
- const latestMessageIsNew =
118
- (props.messages[0] && props.messages[0].id) !==
119
- (messagesRef.current[0] && messagesRef.current[0].id)
120
- // const numberOfMessagesIncreased =
121
- // props.messages.length > messagesRef.current.length
122
- if (
123
- latestMessageIsNew &&
124
- // numberOfMessagesIncreased &&
125
- flatListRef.current
126
- ) {
127
- const iSentLastMessage =
128
- props.messages[0] &&
129
- props.messages[0].user &&
130
- props.messages[0].user.id === props.user.id
131
- if (iSentLastMessage && !props.disableScrollToBottomOnSend)
132
- flatListRef.current.getNode().scrollToOffset({ offset: 0 })
133
- else if (props.scrollToBottomOnAllNewMessages)
134
- flatListRef.current.getNode().scrollToOffset({ offset: 0 })
135
- }
136
- }, [
137
- props.disableScrollToBottomOnSend,
138
- props.scrollToBottomOnAllNewMessages,
139
- props.messages,
140
- props.user.id,
141
- ])
142
-
143
- // 💩 a super way of handling viewable items not on the fly. (easy way to track viewed messages)
144
- // TODO abstract this to a different custom hook.
145
- const onViewableItemsChangedRef = useRef(props.onViewableItemsChanged)
146
- const onViewMessagesRef = useRef(props.onViewMessages)
147
- // track the messages in a non-array too for fast querying.
148
- const messagesDict = useRef<{ [id: string]: MessageModel }>({})
149
- // ...onto the effect 😅
150
- useEffect(() => {
151
- // make updated methods available to onviewable items changed
152
- onViewableItemsChangedRef.current = props.onViewableItemsChanged
153
- onViewMessagesRef.current = props.onViewMessages
154
- messagesRef.current = props.messages
155
- messagesDict.current = {}
156
- if (props.messages) {
157
- props.messages.forEach(message => {
158
- messagesDict.current[message.id] = message
159
- })
160
- }
161
- }, [props.onViewableItemsChanged, props.onViewMessages, props.messages])
162
-
163
- const onViewableItemsChanged: FlatList<
164
- MessageModel
165
- >['props']['onViewableItemsChanged'] = useCallback(
166
- (info: { viewableItems: ViewToken[]; changed: ViewToken[] }) => {
167
- if (onViewableItemsChangedRef.current)
168
- onViewableItemsChangedRef.current(info)
169
-
170
- if (onViewMessagesRef.current) {
171
- const visibleMessages = info.viewableItems
172
- .filter(i => i.isViewable)
173
- .map(i => i.item)
174
- const latestMessageId =
175
- messagesRef.current &&
176
- messagesRef.current[0] &&
177
- messagesRef.current[0].id
178
- onViewMessagesRef.current({
179
- visibleMessages,
180
- latestMessageId,
181
- })
182
- }
183
- },
184
- []
185
- )
186
- // END OF THAT 💩
187
-
188
- const numberOfUsersTyping = useMemo(
189
- () => props.namesOfUsersTyping?.length ?? 0,
190
- [props.namesOfUsersTyping]
191
- )
192
- // effect to handle animating the screen if the messages changed or people typing just changed
193
- useEffect(() => {
194
- if (
195
- !props.disableTransitions &&
196
- // if we've already mounted, or we want to transition even if we haven't...
197
- (mounted.current || !props.disableTransitionOnMount) &&
198
- // and assuming the transition component is initialized...
199
- transitionRef.current
200
- )
201
- // animate
202
- transitionRef.current.animateNextTransition()
203
- else mounted.current = true
204
- }, [
205
- props.disableTransitionOnMount,
206
- numberOfUsersTyping,
207
- props.messages,
208
- props.disableTransitions,
209
- ])
210
-
211
- const { onPressMessage, onDoubleTapMessage, onLongPressMessage } = props
212
- const onPressItem = useCallback(
213
- id => {
214
- const message = messagesDict.current?.[id]
215
- if (onPressMessage) onPressMessage(message)
216
- },
217
- [onPressMessage]
218
- )
219
-
220
- const onDoubleTapItem = useCallback(
221
- id => {
222
- const message = messagesDict.current?.[id]
223
- if (onDoubleTapMessage) onDoubleTapMessage(message)
224
- },
225
- [onDoubleTapMessage]
226
- )
227
-
228
- const onLongPressItem = useCallback(
229
- id => {
230
- const message = messagesDict.current?.[id]
231
- if (onLongPressMessage) return onLongPressMessage(message)
232
- if (message && message.text) {
233
- Alert.alert('Message', message.text, [
234
- {
235
- text: 'Copy text',
236
- onPress: () => {
237
- Clipboard.setString(message.text)
238
- },
239
- style: 'cancel',
240
- },
241
- { text: 'Go back' },
242
- ])
243
- }
244
- },
245
- [onLongPressMessage]
246
- )
247
-
248
- const renderItem = (info: ListRenderItemInfo<MessageModel>) => {
249
- if (props.renderItem) return props.renderItem(info)
250
- if (props.renderMessage === null) return null
251
-
252
- const { item: message, index } = info
253
-
254
- if (message.system) {
255
- const systemProps: SystemMessageProps = {
256
- text: message.text,
257
- createdAt: message.createdAt,
258
- textStyle: props.systemMessageTextStyle,
259
- containerStyle: props.systemMessageContainerStyle,
260
- dateToStringFunc: props.systemMessageDateToStringFunc,
261
- dateStyle: props.systemMessageDateStyle,
262
- }
263
-
264
- if (props.renderSystemMessage === null) return null
265
- if (props.renderSystemMessage)
266
- return props.renderSystemMessage(systemProps)
267
-
268
- return <SystemMessage {...systemProps} />
269
- }
270
-
271
- const isMe = message.user.id === props.user.id
272
-
273
- // indicates that the previous message was sent by someone else, so this starts a new bunch
274
- const messageCreatesNewBunch = !(
275
- props.messages[index + 1] &&
276
- props.messages[index + 1].user &&
277
- props.messages[index + 1].user.id ===
278
- (props.messages[index] &&
279
- props.messages[index].user &&
280
- props.messages[index].user.id)
281
- )
282
-
283
- const isMostRecentMessageInBunch = !(
284
- props.messages[index - 1] &&
285
- props.messages[index - 1].user &&
286
- props.messages[index - 1].user.id ===
287
- (props.messages[index] &&
288
- props.messages[index].user &&
289
- props.messages[index].user.id)
290
- )
291
-
292
- // show name if the previous message was sent by someone else
293
- // also, only show my own name if specified, since that's kinda weird to show my own. beat my dribble
294
- let showName = props.showNameForEveryMessage || messageCreatesNewBunch
295
- if (isMe && !props.showMyName) showName = false
296
-
297
- // by default, only show avatar for a the bottom of a bunch
298
- const showAvatar =
299
- props.showAvatarForEveryMessage || isMostRecentMessageInBunch
300
- let renderAvatar = props.renderAvatar
301
- // and we hide the avatar if we say to
302
- if (isMe && props.hideMyAvatar) {
303
- // showAvatar = false
304
- renderAvatar = null
305
- }
306
-
307
- const bubbleStyle = props.bubbleStyle?.({ isMe })
308
- const messageContainerStyle = props.messageContainerStyle?.({ isMe })
309
- const bubbleTextStyle = props.bubbleTextStyle?.({ isMe })
310
- const messageWrapperStyle = props.messageWrapperStyle?.({ isMe })
311
- const bubbleBackgroundColor = props.bubbleBackgroundColor?.({ isMe })
312
- const bubbleTextColor = props.bubbleTextColor?.({ isMe })
313
- const initialsBackgroundColor = props.initialsBackgroundColor?.({ isMe })
314
- const initialsTextColor = props.initialsTextColor?.({ isMe })
315
-
316
- const messageProps: MessageProps = {
317
- messageContainerStyle,
318
- bubbleStyle,
319
- bubbleTextStyle,
320
- messageWrapperStyle,
321
- delivered: true,
322
- // isMe: (message.user && message.user.id) === (props.user && props.user.id),
323
- isMe,
324
- renderFooter: props.renderMessageFooter,
325
- imageProps: props.imageProps,
326
- // media: message.media,
327
- name: message.user.name,
328
- system: message.system,
329
- text: message.text,
330
- read: true,
331
- renderMedia: props.renderMessageMedia,
332
- onLongPress: onLongPressItem,
333
- onPress: onPressItem,
334
- // pressType: props.messagePressType || 'double',
335
- onDoubleTap: onDoubleTapItem,
336
- doubleTapDelay: props.messageDoubleTapDelay,
337
- disableSwipeActions: props.disableSwipeActions,
338
- swipeActions: props.swipeActions,
339
- longPressDelay: props.messageLongPressDelay,
340
- id: message.id,
341
- showName,
342
- avatar: message.user.avatar,
343
- avatarImageProps: props.avatarImageProps,
344
- avatarSize: props.avatarSize,
345
- renderAvatar,
346
- showAvatar,
347
- // initialsBackgroundColor: props.initialsBackgroundColor,
348
- // initialsTextColor: props.initialsTextColor,
349
- initialsBackgroundColor,
350
- initialsTextColor,
351
- renderInitials: props.renderInitials,
352
- nameStyle: props.nameStyle,
353
- tintColor: props.tintColor,
354
- swipeActionWidth: props.swipeActionWidth,
355
- renderSwipeAction: props.renderSwipeAction,
356
- bubbleBackgroundColor,
357
- bubbleTextColor,
358
- userId: message.user.id,
359
- userName: message.user.name,
360
- AvatarImageComponent: props.AvatarImageComponent,
361
- mediaHeight: message.media?.height,
362
- mediaWidth: message.media?.width,
363
- mediaUri: message.media?.uri,
364
- mediaContentType: message.media?.contentType,
365
- mediaUrl: message.media?.url,
366
- createsNewBunch: messageCreatesNewBunch,
367
- renderText: props.renderMessageText,
368
- createdAt: message.createdAt,
369
- }
370
-
371
- if (props.renderMessage) return props.renderMessage(messageProps)
372
- return <Message {...messageProps} />
373
- }
374
- // ,
375
- // [
376
- // props.tintColor,
377
- // props.user,
378
- // props.renderItem,
379
- // props.renderMessage,
380
- // props.renderMessageFooter,
381
- // props.renderSystemMessage,
382
- // props.renderMessageMedia,
383
- // props.onPressMessage,
384
- // props.systemMessageContainerStyle,
385
- // props.systemMessageDateToStringFunc,
386
- // props.systemMessageDateStyle,
387
- // props.systemMessageTextStyle,
388
- // props.messages,
389
- // props.showNameForEveryMessage,
390
- // props.showMyName,
391
- // props.showAvatarForEveryMessage,
392
- // props.renderAvatar,
393
- // props.hideMyAvatar,
394
- // props.bubbleStyle,
395
- // props.messageContainerStyle,
396
- // props.bubbleTextStyle,
397
- // props.messageWrapperStyle,
398
- // props.bubbleBackgroundColor,
399
- // props.bubbleTextStyle,
400
- // props.bubbleTextColor,
401
- // props.renderMessageFooter,
402
- // props.imageProps,
403
- // props.onLongPressMessage,
404
- // props.messagePressType,
405
- // props.onPressMessage,
406
- // props.messageDoubleTapDelay,
407
- // props.disableSwipeActions,
408
- // props.swipeActionWidth,
409
- // props.swipeActions,
410
- // props.messageLongPressDelay,
411
- // props.avatarImageProps,
412
- // props.avatarSize,
413
- // props.initialsBackgroundColor,
414
- // props.initialsTextColor,
415
- // props.renderInitials,
416
- // props.nameStyle,
417
- // props.swipeActionWidth,
418
- // props.AvatarImageComponent,
419
- // ],
420
- // )
421
-
422
- const keyExtractor = useMemo(
423
- () => props.keyExtractor || (({ id }: MessageModel) => id),
424
- [props.keyExtractor]
425
- )
426
- const namesOfUsersTyping = useMemo(() => props.namesOfUsersTyping || [], [
427
- props.namesOfUsersTyping,
428
- ])
429
-
430
- const typingText = namesOfUsersTyping.join(', ')
431
-
432
- const { renderTypingIndicator, typingIndicatorProps } = props
433
- const ListFooterComponent = useCallback(() => {
434
- if (renderTypingIndicator === null || !numberOfUsersTyping) return null
435
-
436
- return (
437
- <TypingFooter
438
- typingText={props.showTypingText ? typingText : ''}
439
- numberOfUsersTyping={numberOfUsersTyping}
440
- {...typingIndicatorProps}
441
- />
442
- )
443
- }, [
444
- typingText,
445
- props.showTypingText,
446
- renderTypingIndicator,
447
- numberOfUsersTyping,
448
- typingIndicatorProps,
449
- ])
450
-
451
- const {
452
- flatListProps,
453
- keyboardDismissMode = 'interactive',
454
- keyboardShouldPersistTaps = 'handled',
455
- extraData,
456
- messages,
457
- contentContainerStyle,
458
- } = props
459
- const renderList = () => {
460
- return (
461
- <Animated.FlatList
462
- {...flatListProps}
463
- ref={flatListRef as MutableRefObject<FlatList<MessageModel>>}
464
- data={messages}
465
- keyExtractor={keyExtractor}
466
- renderItem={renderItem}
467
- extraData={extraData}
468
- ListHeaderComponent={ListFooterComponent}
469
- inverted
470
- // initialNum
471
- onScroll={onScroll}
472
- onViewableItemsChanged={onViewableItemsChanged}
473
- keyboardShouldPeristTaps={keyboardShouldPersistTaps}
474
- keyboardDismissMode={keyboardDismissMode}
475
- contentContainerStyle={{
476
- ...styles.contentContainer,
477
- ...(contentContainerStyle || {}),
478
- }}
479
- initialNumToRender={20}
480
- />
481
- )
482
- }
483
- // , [
484
- // flatListProps,
485
- // keyboardDismissMode,
486
- // keyboardShouldPersistTaps,
487
- // extraData,
488
- // messages,
489
- // onViewableItemsChanged,
490
- // ListFooterComponent,
491
- // onScroll,
492
- // keyExtractor,
493
- // renderItem,
494
- // contentContainerStyle,
495
- // ])
496
- const renderHeader = () => {
497
- if (props.renderHeader) return props.renderHeader()
498
- return null
499
- }
500
- const renderFooter = () => {
501
- if (props.renderFooter) return props.renderFooter()
502
- return null
503
- }
504
- const renderComposer = () => {
505
- if (props.renderComposer === null) return null
506
-
507
- const composerProps: ComposerProps = {
508
- onInputTextChanged: props.onInputTextChanged,
509
- text: props.text,
510
- initialText: props.initialText,
511
- placeholderColor: props.placeholderColor,
512
- placeholderText: props.placeholderText,
513
- renderSendButton: props.renderSendButton,
514
- renderTextInput: props.renderTextInput,
515
- textInputProps: props.textInputProps,
516
- media: props.media,
517
- onChangeMedia: props.onChangeMedia,
518
- user: props.user,
519
- onSend: props.onSend,
520
- sendButtonMode: props.sendButtonMode,
521
- containerStyle: props.composerContainerStyle,
522
- inputContainerStyle: props.inputContainerStyle,
523
- inputStyle: props.inputStyle,
524
- tintColor: props.tintColor,
525
- inputRef: inputRef as MutableRefObject<TextInput>,
526
- sendButtonContainerStyle: props.sendButtonContainerStyle,
527
- sendOnKeyboardReturn: props.sendOnKeyboardReturn,
528
- }
529
- if (props.renderComposer) return props.renderComposer(composerProps)
530
-
531
- return <Composer {...composerProps} />
532
- }
533
-
534
- // now, onto the actual render code
535
- const Container =
536
- props.ContainerComponent || (props.safeArea ? SafeAreaView : View)
537
- const KeyboardView =
538
- props.avoidKeyboard === false ? View : KeyboardAvoidingView
539
-
540
- // reanimated transition
541
- const transition = useMemo(
542
- () =>
543
- props.transitionConfig ||
544
- (true && (
545
- <Transition.Together>
546
- {/* <Transition.Out type="fade" durationMs={100} /> */}
547
- <Transition.Change interpolation="easeInOut" />
548
- <Transition.In type="fade" />
549
- </Transition.Together>
550
- )),
551
- [props.transitionConfig]
552
- )
553
- const containerStyle = useMemo(
554
- () => ({
555
- ...styles.container,
556
- ...props.containerStyle,
557
- }),
558
- [props.containerStyle]
559
- )
560
- return (
561
- <Transitioning.View
562
- ref={transitionRef}
563
- transition={transition}
564
- style={containerStyle}
565
- >
566
- <Container style={containerStyle}>
567
- <KeyboardView
568
- style={containerStyle}
569
- // behavior={Platform.OS === 'ios' ? 'padding' : undefined}
570
- behavior="padding"
571
- >
572
- {renderHeader()}
573
- {renderList()}
574
- {renderFooter()}
575
- {renderComposer()}
576
- </KeyboardView>
577
- </Container>
578
- </Transitioning.View>
579
- )
580
- }
581
-
582
- Chat.append = function<M>(state: M[], messages: M[]) {
583
- return [...messages, ...state]
584
- }
585
-
586
- export default Chat
587
-
588
- const styles = StyleSheet.create({
589
- container: {
590
- flex: 1,
591
- },
592
- contentContainer: {
593
- flexGrow: 1,
594
- marginTop: 5,
595
- },
596
- })