react-native-gifted-chat 3.3.0 → 3.3.3

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 (326) hide show
  1. package/CHANGELOG.md +435 -0
  2. package/README.md +68 -12
  3. package/lib/Actions.d.ts +16 -0
  4. package/lib/Actions.d.ts.map +1 -0
  5. package/lib/Actions.js +65 -0
  6. package/lib/Actions.js.map +1 -0
  7. package/lib/Avatar.d.ts +19 -0
  8. package/lib/Avatar.d.ts.map +1 -0
  9. package/lib/Avatar.js +93 -0
  10. package/lib/Avatar.js.map +1 -0
  11. package/lib/Bubble/index.d.ts +6 -0
  12. package/lib/Bubble/index.d.ts.map +1 -0
  13. package/lib/Bubble/index.js +269 -0
  14. package/lib/Bubble/index.js.map +1 -0
  15. package/lib/Bubble/styles.d.ts +57 -0
  16. package/lib/Bubble/styles.d.ts.map +1 -0
  17. package/lib/Bubble/styles.js +59 -0
  18. package/lib/Bubble/styles.js.map +1 -0
  19. package/lib/Bubble/types.d.ts +59 -0
  20. package/lib/Bubble/types.d.ts.map +1 -0
  21. package/lib/Bubble/types.js +2 -0
  22. package/lib/Bubble/types.js.map +1 -0
  23. package/lib/Color.d.ts +18 -0
  24. package/lib/Color.d.ts.map +1 -0
  25. package/lib/Color.js +18 -0
  26. package/lib/Color.js.map +1 -0
  27. package/lib/Composer.d.ts +9 -0
  28. package/lib/Composer.d.ts.map +1 -0
  29. package/lib/Composer.js +56 -0
  30. package/lib/Composer.js.map +1 -0
  31. package/lib/Constant.d.ts +8 -0
  32. package/lib/Constant.d.ts.map +1 -0
  33. package/lib/Constant.js +8 -0
  34. package/lib/Constant.js.map +1 -0
  35. package/lib/Day/index.d.ts +5 -0
  36. package/lib/Day/index.d.ts.map +1 -0
  37. package/lib/Day/index.js +40 -0
  38. package/lib/Day/index.js.map +1 -0
  39. package/lib/Day/styles.d.ts +21 -0
  40. package/lib/Day/styles.d.ts.map +1 -0
  41. package/lib/Day/styles.js +22 -0
  42. package/lib/Day/styles.js.map +1 -0
  43. package/lib/Day/types.d.ts +11 -0
  44. package/lib/Day/types.d.ts.map +1 -0
  45. package/lib/Day/types.js +2 -0
  46. package/lib/Day/types.js.map +1 -0
  47. package/lib/GiftedAvatar.d.ts +12 -0
  48. package/lib/GiftedAvatar.d.ts.map +1 -0
  49. package/lib/GiftedAvatar.js +101 -0
  50. package/lib/GiftedAvatar.js.map +1 -0
  51. package/lib/GiftedChat/index.d.ts +10 -0
  52. package/lib/GiftedChat/index.d.ts.map +1 -0
  53. package/lib/GiftedChat/index.js +241 -0
  54. package/lib/GiftedChat/index.js.map +1 -0
  55. package/lib/GiftedChat/styles.d.ts +13 -0
  56. package/lib/GiftedChat/styles.d.ts.map +1 -0
  57. package/lib/GiftedChat/styles.js +13 -0
  58. package/lib/GiftedChat/styles.js.map +1 -0
  59. package/lib/GiftedChat/types.d.ts +90 -0
  60. package/lib/GiftedChat/types.d.ts.map +1 -0
  61. package/lib/GiftedChat/types.js +2 -0
  62. package/lib/GiftedChat/types.js.map +1 -0
  63. package/lib/GiftedChatContext.d.ts +11 -0
  64. package/lib/GiftedChatContext.d.ts.map +1 -0
  65. package/lib/GiftedChatContext.js +10 -0
  66. package/lib/GiftedChatContext.js.map +1 -0
  67. package/lib/InputToolbar.d.ts +36 -0
  68. package/lib/InputToolbar.d.ts.map +1 -0
  69. package/lib/InputToolbar.js +108 -0
  70. package/lib/InputToolbar.js.map +1 -0
  71. package/lib/LoadEarlierMessages.d.ts +17 -0
  72. package/lib/LoadEarlierMessages.d.ts.map +1 -0
  73. package/lib/LoadEarlierMessages.js +45 -0
  74. package/lib/LoadEarlierMessages.js.map +1 -0
  75. package/lib/Message/index.d.ts +6 -0
  76. package/lib/Message/index.d.ts.map +1 -0
  77. package/lib/Message/index.js +180 -0
  78. package/lib/Message/index.js.map +1 -0
  79. package/lib/Message/styles.d.ts +18 -0
  80. package/lib/Message/styles.d.ts.map +1 -0
  81. package/lib/Message/styles.js +18 -0
  82. package/lib/Message/styles.js.map +1 -0
  83. package/lib/Message/types.d.ts +25 -0
  84. package/lib/Message/types.d.ts.map +1 -0
  85. package/lib/Message/types.js +2 -0
  86. package/lib/Message/types.js.map +1 -0
  87. package/lib/MessageAudio.d.ts +3 -0
  88. package/lib/MessageAudio.d.ts.map +1 -0
  89. package/lib/MessageAudio.js +25 -0
  90. package/lib/MessageAudio.js.map +1 -0
  91. package/lib/MessageImage.d.ts +12 -0
  92. package/lib/MessageImage.d.ts.map +1 -0
  93. package/lib/MessageImage.js +164 -0
  94. package/lib/MessageImage.js.map +1 -0
  95. package/lib/MessageReply.d.ts +15 -0
  96. package/lib/MessageReply.d.ts.map +1 -0
  97. package/lib/MessageReply.js +103 -0
  98. package/lib/MessageReply.js.map +1 -0
  99. package/lib/MessageText.d.ts +24 -0
  100. package/lib/MessageText.d.ts.map +1 -0
  101. package/lib/MessageText.js +41 -0
  102. package/lib/MessageText.js.map +1 -0
  103. package/lib/MessageVideo.d.ts +3 -0
  104. package/lib/MessageVideo.d.ts.map +1 -0
  105. package/lib/MessageVideo.js +25 -0
  106. package/lib/MessageVideo.js.map +1 -0
  107. package/lib/MessagesContainer/components/DayAnimated/index.d.ts +5 -0
  108. package/lib/MessagesContainer/components/DayAnimated/index.d.ts.map +1 -0
  109. package/lib/MessagesContainer/components/DayAnimated/index.js +92 -0
  110. package/lib/MessagesContainer/components/DayAnimated/index.js.map +1 -0
  111. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts +12 -0
  112. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts.map +1 -0
  113. package/lib/MessagesContainer/components/DayAnimated/styles.js +12 -0
  114. package/lib/MessagesContainer/components/DayAnimated/styles.js.map +1 -0
  115. package/lib/MessagesContainer/components/DayAnimated/types.d.ts +18 -0
  116. package/lib/MessagesContainer/components/DayAnimated/types.d.ts.map +1 -0
  117. package/lib/MessagesContainer/components/DayAnimated/types.js +2 -0
  118. package/lib/MessagesContainer/components/DayAnimated/types.js.map +1 -0
  119. package/lib/MessagesContainer/components/Item/index.d.ts +23 -0
  120. package/lib/MessagesContainer/components/Item/index.d.ts.map +1 -0
  121. package/lib/MessagesContainer/components/Item/index.js +120 -0
  122. package/lib/MessagesContainer/components/Item/index.js.map +1 -0
  123. package/lib/MessagesContainer/components/Item/types.d.ts +19 -0
  124. package/lib/MessagesContainer/components/Item/types.d.ts.map +1 -0
  125. package/lib/MessagesContainer/components/Item/types.js +2 -0
  126. package/lib/MessagesContainer/components/Item/types.js.map +1 -0
  127. package/lib/MessagesContainer/index.d.ts +6 -0
  128. package/lib/MessagesContainer/index.d.ts.map +1 -0
  129. package/lib/MessagesContainer/index.js +258 -0
  130. package/lib/MessagesContainer/index.js.map +1 -0
  131. package/lib/MessagesContainer/styles.d.ts +55 -0
  132. package/lib/MessagesContainer/styles.d.ts.map +1 -0
  133. package/lib/MessagesContainer/styles.js +42 -0
  134. package/lib/MessagesContainer/styles.js.map +1 -0
  135. package/lib/MessagesContainer/types.d.ts +88 -0
  136. package/lib/MessagesContainer/types.d.ts.map +1 -0
  137. package/lib/MessagesContainer/types.js +10 -0
  138. package/lib/MessagesContainer/types.js.map +1 -0
  139. package/lib/Models.d.ts +58 -0
  140. package/lib/Models.d.ts.map +1 -0
  141. package/lib/Models.js +2 -0
  142. package/lib/Models.js.map +1 -0
  143. package/lib/QuickReplies.d.ts +16 -0
  144. package/lib/QuickReplies.d.ts.map +1 -0
  145. package/lib/QuickReplies.js +108 -0
  146. package/lib/QuickReplies.js.map +1 -0
  147. package/lib/Reply/index.d.ts +2 -0
  148. package/lib/Reply/index.d.ts.map +1 -0
  149. package/lib/Reply/index.js +2 -0
  150. package/lib/Reply/index.js.map +1 -0
  151. package/lib/Reply/types.d.ts +72 -0
  152. package/lib/Reply/types.d.ts.map +1 -0
  153. package/lib/Reply/types.js +2 -0
  154. package/lib/Reply/types.js.map +1 -0
  155. package/lib/ReplyPreview.d.ts +14 -0
  156. package/lib/ReplyPreview.d.ts.map +1 -0
  157. package/lib/ReplyPreview.js +95 -0
  158. package/lib/ReplyPreview.js.map +1 -0
  159. package/lib/Send.d.ts +19 -0
  160. package/lib/Send.d.ts.map +1 -0
  161. package/lib/Send.js +57 -0
  162. package/lib/Send.js.map +1 -0
  163. package/lib/SystemMessage.d.ts +14 -0
  164. package/lib/SystemMessage.d.ts.map +1 -0
  165. package/lib/SystemMessage.js +42 -0
  166. package/lib/SystemMessage.js.map +1 -0
  167. package/lib/Time.d.ts +12 -0
  168. package/lib/Time.d.ts.map +1 -0
  169. package/lib/Time.js +39 -0
  170. package/lib/Time.js.map +1 -0
  171. package/lib/TypingIndicator/index.d.ts +5 -0
  172. package/lib/TypingIndicator/index.d.ts.map +1 -0
  173. package/lib/TypingIndicator/index.js +94 -0
  174. package/lib/TypingIndicator/index.js.map +1 -0
  175. package/lib/TypingIndicator/styles.d.ts +21 -0
  176. package/lib/TypingIndicator/styles.d.ts.map +1 -0
  177. package/lib/TypingIndicator/styles.js +22 -0
  178. package/lib/TypingIndicator/styles.js.map +1 -0
  179. package/lib/TypingIndicator/types.d.ts +6 -0
  180. package/lib/TypingIndicator/types.d.ts.map +1 -0
  181. package/lib/TypingIndicator/types.js +2 -0
  182. package/lib/TypingIndicator/types.js.map +1 -0
  183. package/lib/components/MessageReply.d.ts +29 -0
  184. package/lib/components/MessageReply.d.ts.map +1 -0
  185. package/lib/components/MessageReply.js +87 -0
  186. package/lib/components/MessageReply.js.map +1 -0
  187. package/lib/components/ReplyPreview.d.ts +17 -0
  188. package/lib/components/ReplyPreview.d.ts.map +1 -0
  189. package/lib/components/ReplyPreview.js +148 -0
  190. package/lib/components/ReplyPreview.js.map +1 -0
  191. package/lib/components/TouchableOpacity.d.ts +9 -0
  192. package/lib/components/TouchableOpacity.d.ts.map +1 -0
  193. package/lib/components/TouchableOpacity.js +37 -0
  194. package/lib/components/TouchableOpacity.js.map +1 -0
  195. package/lib/hooks/useColorScheme.d.ts +8 -0
  196. package/lib/hooks/useColorScheme.d.ts.map +1 -0
  197. package/lib/hooks/useColorScheme.js +17 -0
  198. package/lib/hooks/useColorScheme.js.map +1 -0
  199. package/lib/hooks/useUpdateLayoutEffect.d.ts +9 -0
  200. package/lib/hooks/useUpdateLayoutEffect.d.ts.map +1 -0
  201. package/lib/hooks/useUpdateLayoutEffect.js +17 -0
  202. package/lib/hooks/useUpdateLayoutEffect.js.map +1 -0
  203. package/lib/index.d.ts +31 -0
  204. package/lib/index.d.ts.map +1 -0
  205. package/lib/index.js +31 -0
  206. package/lib/index.js.map +1 -0
  207. package/lib/linkParser.d.ts +39 -0
  208. package/lib/linkParser.d.ts.map +1 -0
  209. package/lib/linkParser.js +154 -0
  210. package/lib/linkParser.js.map +1 -0
  211. package/lib/logging.d.ts +3 -0
  212. package/lib/logging.d.ts.map +1 -0
  213. package/lib/logging.js +5 -0
  214. package/lib/logging.js.map +1 -0
  215. package/lib/styles.d.ts +14 -0
  216. package/lib/styles.d.ts.map +1 -0
  217. package/lib/styles.js +23 -0
  218. package/lib/styles.js.map +1 -0
  219. package/lib/types.d.ts +19 -0
  220. package/lib/types.d.ts.map +1 -0
  221. package/lib/types.js +2 -0
  222. package/lib/types.js.map +1 -0
  223. package/lib/utils.d.ts +8 -0
  224. package/lib/utils.d.ts.map +1 -0
  225. package/lib/utils.js +105 -0
  226. package/lib/utils.js.map +1 -0
  227. package/package.json +12 -11
  228. package/src/Actions.tsx +0 -110
  229. package/src/Avatar.tsx +0 -169
  230. package/src/Bubble/index.tsx +0 -407
  231. package/src/Bubble/styles.ts +0 -66
  232. package/src/Bubble/types.ts +0 -104
  233. package/src/Color.ts +0 -17
  234. package/src/Composer.tsx +0 -100
  235. package/src/Constant.ts +0 -8
  236. package/src/Day/index.tsx +0 -63
  237. package/src/Day/styles.ts +0 -22
  238. package/src/Day/types.ts +0 -15
  239. package/src/GiftedAvatar.tsx +0 -187
  240. package/src/GiftedChat/index.tsx +0 -420
  241. package/src/GiftedChat/styles.ts +0 -10
  242. package/src/GiftedChat/types.ts +0 -156
  243. package/src/GiftedChatContext.ts +0 -25
  244. package/src/InputToolbar.tsx +0 -177
  245. package/src/LoadEarlierMessages.tsx +0 -94
  246. package/src/Message/index.tsx +0 -273
  247. package/src/Message/styles.ts +0 -18
  248. package/src/Message/types.ts +0 -26
  249. package/src/MessageAudio.tsx +0 -29
  250. package/src/MessageImage.tsx +0 -251
  251. package/src/MessageReply.tsx +0 -160
  252. package/src/MessageText.tsx +0 -111
  253. package/src/MessageVideo.tsx +0 -29
  254. package/src/MessagesContainer/components/DayAnimated/index.tsx +0 -151
  255. package/src/MessagesContainer/components/DayAnimated/styles.ts +0 -12
  256. package/src/MessagesContainer/components/DayAnimated/types.ts +0 -12
  257. package/src/MessagesContainer/components/Item/index.tsx +0 -197
  258. package/src/MessagesContainer/components/Item/types.ts +0 -13
  259. package/src/MessagesContainer/index.tsx +0 -434
  260. package/src/MessagesContainer/styles.ts +0 -42
  261. package/src/MessagesContainer/types.ts +0 -102
  262. package/src/Models.ts +0 -66
  263. package/src/QuickReplies.tsx +0 -181
  264. package/src/Reply/index.ts +0 -1
  265. package/src/Reply/types.ts +0 -80
  266. package/src/ReplyPreview.tsx +0 -132
  267. package/src/Send.tsx +0 -115
  268. package/src/SystemMessage.tsx +0 -79
  269. package/src/Time.tsx +0 -64
  270. package/src/TypingIndicator/index.tsx +0 -155
  271. package/src/TypingIndicator/styles.ts +0 -22
  272. package/src/TypingIndicator/types.ts +0 -6
  273. package/src/__tests__/Actions.test.tsx +0 -9
  274. package/src/__tests__/Avatar.test.tsx +0 -17
  275. package/src/__tests__/Bubble.test.tsx +0 -17
  276. package/src/__tests__/Color.test.tsx +0 -5
  277. package/src/__tests__/Composer.test.tsx +0 -10
  278. package/src/__tests__/Constant.test.tsx +0 -5
  279. package/src/__tests__/Day.test.tsx +0 -20
  280. package/src/__tests__/DayAnimated.test.tsx +0 -46
  281. package/src/__tests__/GiftedAvatar.test.tsx +0 -10
  282. package/src/__tests__/GiftedChat.test.tsx +0 -60
  283. package/src/__tests__/InputToolbar.test.tsx +0 -10
  284. package/src/__tests__/LoadEarlier.test.tsx +0 -10
  285. package/src/__tests__/Message.test.tsx +0 -67
  286. package/src/__tests__/MessageImage.test.tsx +0 -24
  287. package/src/__tests__/MessageReply.test.tsx +0 -54
  288. package/src/__tests__/MessageText.test.tsx +0 -15
  289. package/src/__tests__/MessagesContainer.test.tsx +0 -38
  290. package/src/__tests__/ReplyPreview.test.tsx +0 -41
  291. package/src/__tests__/Send.test.tsx +0 -21
  292. package/src/__tests__/SystemMessage.test.tsx +0 -24
  293. package/src/__tests__/Time.test.tsx +0 -26
  294. package/src/__tests__/__snapshots__/Actions.test.tsx.snap +0 -40
  295. package/src/__tests__/__snapshots__/Avatar.test.tsx.snap +0 -17
  296. package/src/__tests__/__snapshots__/Bubble.test.tsx.snap +0 -121
  297. package/src/__tests__/__snapshots__/Color.test.tsx.snap +0 -21
  298. package/src/__tests__/__snapshots__/Composer.test.tsx.snap +0 -51
  299. package/src/__tests__/__snapshots__/Constant.test.tsx.snap +0 -13
  300. package/src/__tests__/__snapshots__/Day.test.tsx.snap +0 -99
  301. package/src/__tests__/__snapshots__/DayAnimated.test.tsx.snap +0 -5
  302. package/src/__tests__/__snapshots__/GiftedAvatar.test.tsx.snap +0 -24
  303. package/src/__tests__/__snapshots__/GiftedChat.test.tsx.snap +0 -169
  304. package/src/__tests__/__snapshots__/InputToolbar.test.tsx.snap +0 -145
  305. package/src/__tests__/__snapshots__/LoadEarlier.test.tsx.snap +0 -33
  306. package/src/__tests__/__snapshots__/Message.test.tsx.snap +0 -510
  307. package/src/__tests__/__snapshots__/MessageImage.test.tsx.snap +0 -293
  308. package/src/__tests__/__snapshots__/MessageReply.test.tsx.snap +0 -181
  309. package/src/__tests__/__snapshots__/MessageText.test.tsx.snap +0 -29
  310. package/src/__tests__/__snapshots__/ReplyPreview.test.tsx.snap +0 -403
  311. package/src/__tests__/__snapshots__/Send.test.tsx.snap +0 -214
  312. package/src/__tests__/__snapshots__/SystemMessage.test.tsx.snap +0 -77
  313. package/src/__tests__/__snapshots__/Time.test.tsx.snap +0 -22
  314. package/src/__tests__/data.ts +0 -8
  315. package/src/__tests__/utils.test.ts +0 -31
  316. package/src/components/MessageReply.tsx +0 -156
  317. package/src/components/ReplyPreview.tsx +0 -230
  318. package/src/components/TouchableOpacity.tsx +0 -67
  319. package/src/hooks/useColorScheme.ts +0 -18
  320. package/src/hooks/useUpdateLayoutEffect.ts +0 -21
  321. package/src/index.ts +0 -29
  322. package/src/linkParser.tsx +0 -255
  323. package/src/logging.ts +0 -8
  324. package/src/styles.ts +0 -25
  325. package/src/types.ts +0 -25
  326. package/src/utils.ts +0 -134
@@ -1,407 +0,0 @@
1
- import React, { useCallback, useMemo } from 'react'
2
- import {
3
- View,
4
- Pressable,
5
- } from 'react-native'
6
-
7
- import { Text } from 'react-native-gesture-handler'
8
-
9
- import { MessageReply } from '../components/MessageReply'
10
- import { useChatContext } from '../GiftedChatContext'
11
- import { MessageAudio } from '../MessageAudio'
12
- import { MessageImage } from '../MessageImage'
13
- import { MessageText } from '../MessageText'
14
- import { MessageVideo } from '../MessageVideo'
15
- import { IMessage } from '../Models'
16
- import { QuickReplies } from '../QuickReplies'
17
- import { getStyleWithPosition } from '../styles'
18
- import { Time } from '../Time'
19
- import { isSameUser, isSameDay, renderComponentOrElement } from '../utils'
20
- import styles from './styles'
21
- import { BubbleProps, RenderMessageTextProps } from './types'
22
-
23
- export * from './types'
24
-
25
- export const Bubble = <TMessage extends IMessage = IMessage>(props: BubbleProps<TMessage>): React.ReactElement => {
26
- const {
27
- currentMessage,
28
- nextMessage,
29
- position,
30
- containerToNextStyle,
31
- previousMessage,
32
- containerToPreviousStyle,
33
- onQuickReply,
34
- renderQuickReplySend,
35
- quickReplyStyle,
36
- quickReplyTextStyle,
37
- quickReplyContainerStyle,
38
- containerStyle,
39
- wrapperStyle,
40
- bottomContainerStyle,
41
- onPressMessage: onPressMessageProp,
42
- onLongPressMessage: onLongPressMessageProp,
43
- } = props
44
-
45
- const context = useChatContext()
46
-
47
- const onPress = useCallback(() => {
48
- onPressMessageProp?.(context, currentMessage)
49
- }, [onPressMessageProp, context, currentMessage])
50
-
51
- const onLongPress = useCallback(() => {
52
- onLongPressMessageProp?.(context, currentMessage)
53
- }, [
54
- currentMessage,
55
- context,
56
- onLongPressMessageProp,
57
- ])
58
-
59
- const styledBubbleToNext = useMemo(() => {
60
- if (
61
- currentMessage &&
62
- nextMessage &&
63
- position &&
64
- isSameUser(currentMessage, nextMessage) &&
65
- isSameDay(currentMessage, nextMessage)
66
- )
67
- return [
68
- getStyleWithPosition(styles, 'containerToNext', position),
69
- containerToNextStyle?.[position],
70
- ]
71
-
72
- return null
73
- }, [
74
- currentMessage,
75
- nextMessage,
76
- position,
77
- containerToNextStyle,
78
- ])
79
-
80
- const styledBubbleToPrevious = useMemo(() => {
81
- if (
82
- currentMessage &&
83
- previousMessage &&
84
- position &&
85
- isSameUser(currentMessage, previousMessage) &&
86
- isSameDay(currentMessage, previousMessage)
87
- )
88
- return [
89
- getStyleWithPosition(styles, 'containerToPrevious', position),
90
- containerToPreviousStyle?.[position],
91
- ]
92
-
93
- return null
94
- }, [
95
- currentMessage,
96
- previousMessage,
97
- position,
98
- containerToPreviousStyle,
99
- ])
100
-
101
- const renderQuickReplies = useCallback(() => {
102
- if (currentMessage?.quickReplies) {
103
- const {
104
- /* eslint-disable @typescript-eslint/no-unused-vars */
105
- containerStyle,
106
- wrapperStyle,
107
- /* eslint-enable @typescript-eslint/no-unused-vars */
108
- ...quickReplyProps
109
- } = props
110
-
111
- if (props.renderQuickReplies)
112
- return renderComponentOrElement(props.renderQuickReplies, quickReplyProps)
113
-
114
- return (
115
- <QuickReplies
116
- currentMessage={currentMessage}
117
- onQuickReply={onQuickReply}
118
- renderQuickReplySend={renderQuickReplySend}
119
- quickReplyStyle={quickReplyStyle}
120
- quickReplyTextStyle={quickReplyTextStyle}
121
- quickReplyContainerStyle={quickReplyContainerStyle}
122
- nextMessage={nextMessage}
123
- />
124
- )
125
- }
126
-
127
- return null
128
- }, [
129
- currentMessage,
130
- onQuickReply,
131
- renderQuickReplySend,
132
- quickReplyStyle,
133
- quickReplyTextStyle,
134
- quickReplyContainerStyle,
135
- nextMessage,
136
- props,
137
- ])
138
-
139
- const renderMessageText = useCallback(() => {
140
- if (currentMessage?.text) {
141
- const {
142
- /* eslint-disable @typescript-eslint/no-unused-vars */
143
- containerStyle,
144
- wrapperStyle,
145
- messageTextProps,
146
- /* eslint-enable @typescript-eslint/no-unused-vars */
147
- ...messageTextPropsRest
148
- } = props
149
-
150
- const combinedProps = {
151
- ...messageTextPropsRest,
152
- ...messageTextProps,
153
- } as RenderMessageTextProps<TMessage>
154
-
155
- if (props.renderMessageText)
156
- return renderComponentOrElement(props.renderMessageText, combinedProps)
157
-
158
- return <MessageText {...combinedProps as any} />
159
- }
160
-
161
- return null
162
- }, [props, currentMessage])
163
-
164
- const renderMessageImage = useCallback(() => {
165
- if (currentMessage?.image) {
166
- const {
167
- /* eslint-disable @typescript-eslint/no-unused-vars */
168
- containerStyle,
169
- wrapperStyle,
170
- /* eslint-enable @typescript-eslint/no-unused-vars */
171
- ...messageImageProps
172
- } = props
173
-
174
- if (props.renderMessageImage)
175
- return renderComponentOrElement(props.renderMessageImage, messageImageProps)
176
-
177
- return <MessageImage {...messageImageProps} />
178
- }
179
-
180
- return null
181
- }, [props, currentMessage])
182
-
183
- const renderMessageVideo = useCallback(() => {
184
- if (!currentMessage?.video)
185
- return null
186
-
187
- const {
188
- /* eslint-disable @typescript-eslint/no-unused-vars */
189
- containerStyle,
190
- wrapperStyle,
191
- /* eslint-enable @typescript-eslint/no-unused-vars */
192
- ...messageVideoProps
193
- } = props
194
-
195
- if (props.renderMessageVideo)
196
- return renderComponentOrElement(props.renderMessageVideo, messageVideoProps)
197
-
198
- return <MessageVideo />
199
- }, [props, currentMessage])
200
-
201
- const renderMessageAudio = useCallback(() => {
202
- if (!currentMessage?.audio)
203
- return null
204
-
205
- const {
206
- /* eslint-disable @typescript-eslint/no-unused-vars */
207
- containerStyle,
208
- wrapperStyle,
209
- /* eslint-enable @typescript-eslint/no-unused-vars */
210
- ...messageAudioProps
211
- } = props
212
-
213
- if (props.renderMessageAudio)
214
- return renderComponentOrElement(props.renderMessageAudio, messageAudioProps)
215
-
216
- return <MessageAudio />
217
- }, [props, currentMessage])
218
-
219
- const renderTicks = useCallback(() => {
220
- const {
221
- renderTicks,
222
- user,
223
- } = props
224
-
225
- if (renderTicks && currentMessage)
226
- return renderComponentOrElement(renderTicks, currentMessage)
227
-
228
- if (
229
- user &&
230
- currentMessage?.user &&
231
- currentMessage.user._id !== user._id
232
- )
233
- return null
234
-
235
- if (
236
- currentMessage &&
237
- (currentMessage.sent || currentMessage.received || currentMessage.pending)
238
- )
239
- return (
240
- <View style={styles.messageStatusContainer}>
241
- {!!currentMessage.sent && (
242
- <Text style={[styles.messageStatus, props.tickStyle]}>
243
- {'✓'}
244
- </Text>
245
- )}
246
- {!!currentMessage.received && (
247
- <Text style={[styles.messageStatus, props.tickStyle]}>
248
- {'✓'}
249
- </Text>
250
- )}
251
- {!!currentMessage.pending && (
252
- <Text style={[styles.messageStatus, props.tickStyle]}>
253
- {'🕓'}
254
- </Text>
255
- )}
256
- </View>
257
- )
258
-
259
- return null
260
- }, [
261
- props,
262
- currentMessage,
263
- ])
264
-
265
- const renderTime = useCallback(() => {
266
- if (currentMessage?.createdAt) {
267
- const {
268
- /* eslint-disable @typescript-eslint/no-unused-vars */
269
- containerStyle,
270
- wrapperStyle,
271
- textStyle,
272
- /* eslint-enable @typescript-eslint/no-unused-vars */
273
- ...timeProps
274
- } = props
275
-
276
- if (props.renderTime)
277
- return renderComponentOrElement(props.renderTime, timeProps)
278
-
279
- return <Time {...timeProps} />
280
- }
281
-
282
- return null
283
- }, [props, currentMessage])
284
-
285
- const renderUsername = useCallback(() => {
286
- const {
287
- user,
288
- renderUsername,
289
- } = props
290
-
291
- if (props.isUsernameVisible && currentMessage) {
292
- if (user && currentMessage.user._id === user._id)
293
- return null
294
-
295
- if (renderUsername)
296
- return renderComponentOrElement(renderUsername, currentMessage.user)
297
-
298
- return (
299
- <View style={styles.usernameContainer}>
300
- <Text
301
- style={[styles.username, props.usernameStyle]}
302
- >
303
- {currentMessage.user.name}
304
- </Text>
305
- </View>
306
- )
307
- }
308
-
309
- return null
310
- }, [
311
- currentMessage,
312
- props,
313
- ])
314
-
315
- const renderCustomView = useCallback(() => {
316
- if (props.renderCustomView)
317
- return renderComponentOrElement(props.renderCustomView, props)
318
-
319
- return null
320
- }, [props])
321
-
322
- const renderMessageReply = useCallback(() => {
323
- if (!currentMessage?.replyMessage)
324
- return null
325
-
326
- const { messageReply } = props
327
-
328
- const messageReplyProps = {
329
- replyMessage: currentMessage.replyMessage,
330
- currentMessage,
331
- position,
332
- onPress: messageReply?.onPress,
333
- containerStyle: position === 'left'
334
- ? messageReply?.containerStyleLeft ?? messageReply?.containerStyle
335
- : messageReply?.containerStyleRight ?? messageReply?.containerStyle,
336
- textStyle: position === 'left'
337
- ? messageReply?.textStyleLeft ?? messageReply?.textStyle
338
- : messageReply?.textStyleRight ?? messageReply?.textStyle,
339
- imageStyle: messageReply?.imageStyle,
340
- }
341
-
342
- if (messageReply?.renderMessageReply)
343
- return renderComponentOrElement(messageReply.renderMessageReply, messageReplyProps)
344
-
345
- return <MessageReply {...messageReplyProps} />
346
- }, [
347
- props,
348
- currentMessage,
349
- position,
350
- ])
351
-
352
- const renderBubbleContent = useCallback(() => {
353
- return (
354
- <>
355
- {!props.isCustomViewBottom && renderCustomView()}
356
- {renderMessageReply()}
357
- {renderMessageImage()}
358
- {renderMessageVideo()}
359
- {renderMessageAudio()}
360
- {renderMessageText()}
361
- {props.isCustomViewBottom && renderCustomView()}
362
- </>
363
- )
364
- }, [
365
- renderMessageReply,
366
- renderCustomView,
367
- renderMessageImage,
368
- renderMessageVideo,
369
- renderMessageAudio,
370
- renderMessageText,
371
- props.isCustomViewBottom,
372
- ])
373
-
374
- return (
375
- <View style={containerStyle?.[position]}>
376
- <View
377
- style={[
378
- getStyleWithPosition(styles, 'wrapper', position),
379
- styledBubbleToNext,
380
- styledBubbleToPrevious,
381
- wrapperStyle?.[position],
382
- ]}
383
- >
384
- <Pressable
385
- onPress={onPress}
386
- onLongPress={onLongPress}
387
- {...props.touchableProps}
388
- >
389
- {renderBubbleContent()}
390
- <View
391
- style={[
392
- styles.bottom,
393
- bottomContainerStyle?.[position],
394
- ]}
395
- >
396
- {renderUsername()}
397
- <View style={styles.messageTimeAndStatusContainer}>
398
- {renderTime()}
399
- {renderTicks()}
400
- </View>
401
- </View>
402
- </Pressable>
403
- </View>
404
- {renderQuickReplies()}
405
- </View>
406
- )
407
- }
@@ -1,66 +0,0 @@
1
- import { StyleSheet } from 'react-native'
2
- import { Color } from '../Color'
3
-
4
- const styles = StyleSheet.create({
5
- wrapper: {
6
- borderRadius: 15,
7
- minHeight: 20,
8
- },
9
- wrapper_left: {
10
- backgroundColor: Color.leftBubbleBackground,
11
- justifyContent: 'flex-end',
12
- },
13
- wrapper_right: {
14
- backgroundColor: Color.defaultBlue,
15
- justifyContent: 'flex-end',
16
- },
17
-
18
- bottom: {
19
- flexDirection: 'row',
20
- justifyContent: 'space-between',
21
- alignItems: 'flex-end',
22
- paddingHorizontal: 10,
23
- paddingBottom: 5,
24
- },
25
-
26
- containerToNext_left: {
27
- borderBottomLeftRadius: 3,
28
- },
29
- containerToNext_right: {
30
- borderBottomRightRadius: 3,
31
- },
32
-
33
- containerToPrevious_left: {
34
- borderTopLeftRadius: 3,
35
- },
36
- containerToPrevious_right: {
37
- borderTopRightRadius: 3,
38
- },
39
-
40
- messageTimeAndStatusContainer: {
41
- flexGrow: 1,
42
- flexDirection: 'row',
43
- alignItems: 'center',
44
- justifyContent: 'flex-end',
45
- },
46
-
47
- messageStatusContainer: {
48
- flexDirection: 'row',
49
- marginLeft: 5,
50
- },
51
- messageStatus: {
52
- fontSize: 10,
53
- color: Color.white,
54
- },
55
-
56
- usernameContainer: {
57
- flexDirection: 'row',
58
- marginRight: 5,
59
- },
60
- username: {
61
- fontSize: 12,
62
- color: '#aaa',
63
- },
64
- })
65
-
66
- export default styles
@@ -1,104 +0,0 @@
1
- import React, { ComponentProps } from 'react'
2
- import {
3
- StyleProp,
4
- ViewStyle,
5
- TextStyle,
6
- Pressable,
7
- } from 'react-native'
8
-
9
- import { MessageReplyProps } from '../components/MessageReply'
10
- import { MessageImageProps } from '../MessageImage'
11
- import { MessageTextProps } from '../MessageText'
12
- import {
13
- User,
14
- IMessage,
15
- LeftRightStyle,
16
- Reply,
17
- ReplyMessage,
18
- Omit,
19
- MessageVideoProps,
20
- MessageAudioProps,
21
- } from '../Models'
22
- import { QuickRepliesProps } from '../QuickReplies'
23
- import { MessageReplyStyleProps } from '../Reply'
24
- import { TimeProps } from '../Time'
25
-
26
-
27
- export type RenderMessageImageProps<TMessage extends IMessage> = Omit<
28
- BubbleProps<TMessage>,
29
- 'containerStyle' | 'wrapperStyle'
30
- > &
31
- MessageImageProps<TMessage>
32
-
33
- export type RenderMessageVideoProps<TMessage extends IMessage> = Omit<
34
- BubbleProps<TMessage>,
35
- 'containerStyle' | 'wrapperStyle'
36
- > &
37
- MessageVideoProps<TMessage>
38
-
39
- export type RenderMessageAudioProps<TMessage extends IMessage> = Omit<
40
- BubbleProps<TMessage>,
41
- 'containerStyle' | 'wrapperStyle'
42
- > &
43
- MessageAudioProps<TMessage>
44
-
45
- export type RenderMessageTextProps<TMessage extends IMessage> = Omit<
46
- BubbleProps<TMessage>,
47
- 'containerStyle' | 'wrapperStyle'
48
- > &
49
- MessageTextProps<TMessage>
50
-
51
- /** Props for message reply functionality in bubble */
52
- export interface BubbleReplyProps<TMessage extends IMessage> extends MessageReplyStyleProps {
53
- /** Custom render for message reply; rendered on top of message content */
54
- renderMessageReply?: (props: MessageReplyProps<TMessage>) => React.ReactNode
55
- /** Callback when message reply is pressed */
56
- onPress?: (replyMessage: ReplyMessage) => void
57
- }
58
-
59
- export interface BubbleProps<TMessage extends IMessage> {
60
- user?: User
61
- touchableProps?: ComponentProps<typeof Pressable>
62
- isUsernameVisible?: boolean
63
- isCustomViewBottom?: boolean
64
- isInverted?: boolean
65
- position: 'left' | 'right'
66
- currentMessage: TMessage
67
- nextMessage?: TMessage
68
- previousMessage?: TMessage
69
- containerStyle?: LeftRightStyle<ViewStyle>
70
- wrapperStyle?: LeftRightStyle<ViewStyle>
71
- textStyle?: LeftRightStyle<TextStyle>
72
- bottomContainerStyle?: LeftRightStyle<ViewStyle>
73
- tickStyle?: StyleProp<TextStyle>
74
- containerToNextStyle?: LeftRightStyle<ViewStyle>
75
- containerToPreviousStyle?: LeftRightStyle<ViewStyle>
76
- usernameStyle?: TextStyle
77
- quickReplyStyle?: StyleProp<ViewStyle>
78
- quickReplyTextStyle?: StyleProp<TextStyle>
79
- quickReplyContainerStyle?: StyleProp<ViewStyle>
80
- messageTextProps?: Partial<MessageTextProps<TMessage>>
81
- onPressMessage?: (context?: unknown, message?: unknown) => void
82
- onLongPressMessage?: (context?: unknown, message?: unknown) => void
83
- onQuickReply?: (replies: Reply[]) => void
84
- renderMessageImage?: (
85
- props: RenderMessageImageProps<TMessage>
86
- ) => React.ReactNode
87
- renderMessageVideo?: (
88
- props: RenderMessageVideoProps<TMessage>
89
- ) => React.ReactNode
90
- renderMessageAudio?: (
91
- props: RenderMessageAudioProps<TMessage>
92
- ) => React.ReactNode
93
- renderMessageText?: (props: RenderMessageTextProps<TMessage>) => React.ReactNode
94
- renderCustomView?: (bubbleProps: BubbleProps<TMessage>) => React.ReactNode
95
- renderTime?: (timeProps: TimeProps<TMessage>) => React.ReactNode
96
- renderTicks?: (currentMessage: TMessage) => React.ReactNode
97
- renderUsername?: (user?: TMessage['user']) => React.ReactNode
98
- renderQuickReplySend?: () => React.ReactNode
99
- renderQuickReplies?: (
100
- quickReplies: QuickRepliesProps<TMessage>
101
- ) => React.ReactNode
102
- /** Message reply configuration */
103
- messageReply?: BubbleReplyProps<TMessage>
104
- }
package/src/Color.ts DELETED
@@ -1,17 +0,0 @@
1
- export const Color = {
2
- defaultColor: '#b2b2b2',
3
- backgroundTransparent: 'transparent',
4
- defaultBlue: '#0084ff',
5
- leftBubbleBackground: '#f0f0f0',
6
- black: '#000',
7
- white: '#fff',
8
- carrot: '#e67e22',
9
- emerald: '#2ecc71',
10
- peterRiver: '#3498db',
11
- wisteria: '#8e44ad',
12
- alizarin: '#e74c3c',
13
- turquoise: '#1abc9c',
14
- midnightBlue: '#2c3e50',
15
- optionTintColor: '#007AFF',
16
- timeTextColor: '#aaa',
17
- }
package/src/Composer.tsx DELETED
@@ -1,100 +0,0 @@
1
- import React, { useCallback, useMemo, useState } from 'react'
2
- import {
3
- Platform,
4
- StyleSheet,
5
- TextInputChangeEvent,
6
- TextInputContentSizeChangeEvent,
7
- TextInputProps,
8
- View,
9
- } from 'react-native'
10
- import { TextInput } from 'react-native-gesture-handler'
11
- import { Color } from './Color'
12
- import { useColorScheme } from './hooks/useColorScheme'
13
- import stylesCommon, { getColorSchemeStyle } from './styles'
14
-
15
- export interface ComposerProps {
16
- composerHeight?: number
17
- text?: string
18
- textInputProps?: Partial<TextInputProps>
19
- }
20
-
21
- export function Composer ({
22
- text = '',
23
- textInputProps,
24
- }: ComposerProps): React.ReactElement {
25
- const colorScheme = useColorScheme()
26
- const isDark = colorScheme === 'dark'
27
-
28
- const placeholder = textInputProps?.placeholder ?? 'Type a message...'
29
-
30
- const minHeight = useMemo(() =>
31
- Platform.select({
32
- web: styles.textInput.lineHeight + styles.textInput.paddingTop + styles.textInput.paddingBottom,
33
- default: undefined,
34
- })
35
- , [])
36
-
37
- const [height, setHeight] = useState<number | undefined>(minHeight)
38
-
39
- const handleContentSizeChange = useMemo(() => {
40
- if (Platform.OS === 'web')
41
- return (e: TextInputContentSizeChangeEvent) => {
42
- const contentHeight = e.nativeEvent.contentSize.height
43
- setHeight(Math.max(minHeight ?? 0, contentHeight))
44
- }
45
-
46
- return undefined
47
- }, [minHeight])
48
-
49
- const handleChange = useCallback((event: TextInputChangeEvent) => {
50
- if (Platform.OS === 'web')
51
- // Reset height to 0 to get the correct scrollHeight
52
- requestAnimationFrame(() => {
53
- // @ts-expect-error - web-specific code
54
- event.nativeEvent.target.style.height = '0px'
55
- // @ts-expect-error - web-specific code
56
- event.nativeEvent.target.style.height = `${event.nativeEvent.target.scrollHeight}px`
57
- })
58
- }, [])
59
-
60
- return (
61
- <View style={stylesCommon.fill}>
62
- <TextInput
63
- testID={placeholder}
64
- accessible
65
- accessibilityLabel={placeholder}
66
- placeholderTextColor={textInputProps?.placeholderTextColor ?? (isDark ? '#888' : Color.defaultColor)}
67
- value={text}
68
- enablesReturnKeyAutomatically
69
- underlineColorAndroid='transparent'
70
- keyboardAppearance={isDark ? 'dark' : 'default'}
71
- multiline
72
- placeholder={placeholder}
73
- onContentSizeChange={handleContentSizeChange}
74
- onChange={handleChange}
75
- {...textInputProps}
76
- style={[getColorSchemeStyle(styles, 'textInput', colorScheme), stylesWeb.textInput, { height }, textInputProps?.style]}
77
- />
78
- </View>
79
- )
80
- }
81
-
82
- const styles = StyleSheet.create({
83
- textInput: {
84
- fontSize: 16,
85
- lineHeight: 22,
86
- paddingTop: 8,
87
- paddingBottom: 10,
88
- paddingHorizontal: 8,
89
- },
90
- textInput_dark: {
91
- color: '#fff',
92
- },
93
- })
94
-
95
- const stylesWeb = StyleSheet.create({
96
- textInput: {
97
- /* @ts-expect-error - web-specific styles */
98
- outlineStyle: 'none',
99
- },
100
- })
package/src/Constant.ts DELETED
@@ -1,8 +0,0 @@
1
- export const DATE_FORMAT = 'D MMMM'
2
- export const TIME_FORMAT = 'LT'
3
-
4
- export const TEST_ID = {
5
- WRAPPER: 'GC_WRAPPER',
6
- LOADING_WRAPPER: 'GC_LOADING_CONTAINER',
7
- SEND_TOUCHABLE: 'GC_SEND_TOUCHABLE',
8
- }