react-native-gifted-chat 3.3.2 → 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 +30 -2
  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 +8 -7
  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 -397
  241. package/src/GiftedChat/styles.ts +0 -13
  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 -184
  304. package/src/__tests__/__snapshots__/InputToolbar.test.tsx.snap +0 -123
  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 -203
  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 -349
  311. package/src/__tests__/__snapshots__/Send.test.tsx.snap +0 -148
  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 -139
@@ -1,160 +0,0 @@
1
- import React, { useMemo, useCallback } from 'react'
2
- import {
3
- StyleSheet,
4
- ViewStyle,
5
- View,
6
- Pressable,
7
- Image,
8
- TextStyle,
9
- StyleProp,
10
- ImageStyle,
11
- } from 'react-native'
12
-
13
- import { Text } from 'react-native-gesture-handler'
14
- import { Color } from './Color'
15
- import { LeftRightStyle, IMessage, ReplyMessage } from './Models'
16
- import { getStyleWithPosition } from './styles'
17
-
18
- export interface MessageReplyProps<TMessage extends IMessage> {
19
- position?: 'left' | 'right'
20
- currentMessage: TMessage
21
- containerStyle?: LeftRightStyle<ViewStyle>
22
- contentContainerStyle?: LeftRightStyle<ViewStyle>
23
- imageStyle?: StyleProp<ImageStyle>
24
- usernameStyle?: StyleProp<TextStyle>
25
- textStyle?: StyleProp<TextStyle>
26
- onPress?: (replyMessage: ReplyMessage) => void
27
- }
28
-
29
- export function MessageReply<TMessage extends IMessage = IMessage> ({
30
- currentMessage,
31
- position = 'left',
32
- containerStyle,
33
- contentContainerStyle,
34
- imageStyle,
35
- usernameStyle,
36
- textStyle,
37
- onPress: onPressProp,
38
- }: MessageReplyProps<TMessage>) {
39
- const handlePress = useCallback(() => {
40
- if (!onPressProp || !currentMessage.replyMessage)
41
- return
42
-
43
- onPressProp(currentMessage.replyMessage)
44
- }, [onPressProp, currentMessage.replyMessage])
45
-
46
- const containerStyleMemo = useMemo(() => [
47
- styles.container,
48
- getStyleWithPosition(styles, 'container', position),
49
- containerStyle?.[position],
50
- ], [position, containerStyle])
51
-
52
- const contentContainerStyleMemo = useMemo(() => [
53
- styles.contentContainer,
54
- contentContainerStyle?.[position],
55
- ], [position, contentContainerStyle])
56
-
57
- const imageStyleMemo = useMemo(() => [
58
- styles.image,
59
- imageStyle,
60
- ], [imageStyle])
61
-
62
- const usernameStyleMemo = useMemo(() => [
63
- styles.username,
64
- getStyleWithPosition(styles, 'username', position),
65
- usernameStyle,
66
- ], [position, usernameStyle])
67
-
68
- const textStyleMemo = useMemo(() => [
69
- styles.text,
70
- getStyleWithPosition(styles, 'text', position),
71
- textStyle,
72
- ], [position, textStyle])
73
-
74
- if (!currentMessage.replyMessage)
75
- return null
76
-
77
- const { replyMessage } = currentMessage
78
-
79
- return (
80
- <Pressable
81
- onPress={handlePress}
82
- style={containerStyleMemo}
83
- >
84
- <View style={contentContainerStyleMemo}>
85
- {replyMessage.image && (
86
- <Image
87
- source={{ uri: replyMessage.image }}
88
- style={imageStyleMemo}
89
- />
90
- )}
91
- <View style={styles.textContainer}>
92
- <Text
93
- style={usernameStyleMemo}
94
- numberOfLines={1}
95
- >
96
- {replyMessage.user?.name || 'User'}
97
- </Text>
98
- <Text
99
- numberOfLines={1}
100
- style={textStyleMemo}
101
- >
102
- {replyMessage.text || (replyMessage.image ? 'Photo' : (replyMessage.audio ? 'Audio' : 'Message'))}
103
- </Text>
104
- </View>
105
- </View>
106
- </Pressable>
107
- )
108
- }
109
-
110
- const styles = StyleSheet.create({
111
- container: {
112
- marginHorizontal: 10,
113
- marginTop: 5,
114
- marginBottom: 2,
115
- padding: 8,
116
- borderRadius: 8,
117
- borderLeftWidth: 3,
118
- borderLeftColor: Color.defaultBlue,
119
- minWidth: 150,
120
- },
121
- container_left: {
122
- backgroundColor: 'rgba(0, 0, 0, 0.05)',
123
- },
124
- container_right: {
125
- backgroundColor: 'rgba(255, 255, 255, 0.15)',
126
- },
127
- contentContainer: {
128
- flexDirection: 'row',
129
- alignItems: 'center',
130
- },
131
- image: {
132
- width: 36,
133
- height: 36,
134
- borderRadius: 4,
135
- marginRight: 8,
136
- },
137
- textContainer: {
138
- flex: 1,
139
- },
140
- username: {
141
- fontSize: 13,
142
- fontWeight: '600',
143
- marginBottom: 2,
144
- },
145
- username_left: {
146
- color: Color.defaultBlue,
147
- },
148
- username_right: {
149
- color: Color.white,
150
- },
151
- text: {
152
- fontSize: 13,
153
- },
154
- text_left: {
155
- color: Color.black,
156
- },
157
- text_right: {
158
- color: 'rgba(255, 255, 255, 0.8)',
159
- },
160
- })
@@ -1,111 +0,0 @@
1
- import React, { useMemo, useCallback } from 'react'
2
- import {
3
- StyleSheet,
4
- StyleProp,
5
- ViewStyle,
6
- TextStyle,
7
- View,
8
- } from 'react-native'
9
-
10
- import { Text } from 'react-native-gesture-handler'
11
- import { LinkParser, LinkMatcher, LinkType } from './linkParser'
12
- import { LeftRightStyle, IMessage } from './Models'
13
-
14
- export type MessageTextProps<TMessage extends IMessage> = {
15
- position?: 'left' | 'right'
16
- currentMessage: TMessage
17
- containerStyle?: LeftRightStyle<ViewStyle>
18
- textStyle?: LeftRightStyle<TextStyle>
19
- linkStyle?: LeftRightStyle<TextStyle>
20
- customTextStyle?: StyleProp<TextStyle>
21
- onPress?: (
22
- message: TMessage,
23
- url: string,
24
- type: LinkType
25
- ) => void
26
- // Link parser options
27
- matchers?: LinkMatcher[]
28
- email?: boolean
29
- phone?: boolean
30
- url?: boolean
31
- hashtag?: boolean
32
- mention?: boolean
33
- hashtagUrl?: string
34
- mentionUrl?: string
35
- stripPrefix?: boolean
36
- }
37
-
38
- export function MessageText<TMessage extends IMessage>({
39
- currentMessage,
40
- position = 'left',
41
- containerStyle,
42
- textStyle,
43
- linkStyle: linkStyleProp,
44
- customTextStyle,
45
- onPress: onPressProp,
46
- matchers,
47
- email = true,
48
- phone = true,
49
- url = true,
50
- hashtag = false,
51
- mention = false,
52
- hashtagUrl,
53
- mentionUrl,
54
- stripPrefix = false,
55
- }: MessageTextProps<TMessage>) {
56
- const linkStyle = useMemo(() => StyleSheet.flatten([
57
- styles.link,
58
- linkStyleProp?.[position],
59
- ]), [position, linkStyleProp])
60
-
61
- const style = useMemo(() => [
62
- styles[`text_${position}`],
63
- textStyle?.[position],
64
- customTextStyle,
65
- ], [position, textStyle, customTextStyle])
66
-
67
- const handlePress = useCallback((url: string, type: LinkType) => {
68
- onPressProp?.(currentMessage, url, type)
69
- }, [onPressProp, currentMessage])
70
-
71
- return (
72
- <View style={[styles.container, containerStyle?.[position]]}>
73
- <LinkParser
74
- text={currentMessage!.text}
75
- matchers={matchers}
76
- email={email}
77
- phone={phone}
78
- url={url}
79
- hashtag={hashtag}
80
- mention={mention}
81
- hashtagUrl={hashtagUrl}
82
- mentionUrl={mentionUrl}
83
- stripPrefix={stripPrefix}
84
- linkStyle={linkStyle}
85
- textStyle={style}
86
- onPress={onPressProp ? handlePress : undefined}
87
- TextComponent={Text}
88
- />
89
- </View>
90
- )
91
- }
92
-
93
- const styles = StyleSheet.create({
94
- container: {
95
- marginVertical: 5,
96
- marginHorizontal: 10,
97
- },
98
- text: {
99
- fontSize: 16,
100
- lineHeight: 20,
101
- },
102
- text_left: {
103
- color: 'black',
104
- },
105
- text_right: {
106
- color: 'white',
107
- },
108
- link: {
109
- textDecorationLine: 'underline',
110
- },
111
- })
@@ -1,29 +0,0 @@
1
- import React, { useMemo } from 'react'
2
- import { View, StyleSheet } from 'react-native'
3
- import { Text } from 'react-native-gesture-handler'
4
- import { Color } from './Color'
5
-
6
- const styles = StyleSheet.create({
7
- container: {
8
- padding: 10,
9
- },
10
- text: {
11
- color: Color.alizarin,
12
- fontWeight: '600',
13
- },
14
- })
15
-
16
- export function MessageVideo () {
17
- const content = useMemo(() => (
18
- <View style={styles.container}>
19
- <Text style={styles.text}>
20
- {'Video is not implemented by GiftedChat.'}
21
- </Text>
22
- <Text style={styles.text}>
23
- {'\nYou need to provide your own implementation by using renderMessageVideo prop.'}
24
- </Text>
25
- </View>
26
- ), [])
27
-
28
- return content
29
- }
@@ -1,151 +0,0 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react'
2
- import { LayoutChangeEvent } from 'react-native'
3
- import Animated, { interpolate, useAnimatedStyle, useDerivedValue, useSharedValue, useAnimatedReaction, withTiming, runOnJS } from 'react-native-reanimated'
4
- import { Day } from '../../../Day'
5
- import stylesCommon from '../../../styles'
6
- import { isSameDay } from '../../../utils'
7
- import { useAbsoluteScrolledPositionToBottomOfDay, useRelativeScrolledPositionToBottomOfDay } from '../Item'
8
-
9
- import styles from './styles'
10
- import { DayAnimatedProps } from './types'
11
-
12
- export * from './types'
13
-
14
- export const DayAnimated = ({ scrolledY, daysPositions, listHeight, renderDay, messages, isLoading, ...rest }: DayAnimatedProps) => {
15
- const opacity = useSharedValue(0)
16
- const fadeOutOpacityTimeoutId = useSharedValue<ReturnType<typeof setTimeout> | undefined>(undefined)
17
- const containerHeight = useSharedValue(0)
18
-
19
- const isScrolledOnMount = useSharedValue(false)
20
- const isLoadingAnim = useSharedValue(isLoading)
21
-
22
- const daysPositionsArray = useDerivedValue(() => Object.values(daysPositions.value).sort((a, b) => {
23
- 'worklet'
24
-
25
- return a.y - b.y
26
- }))
27
-
28
- const [createdAt, setCreatedAt] = useState<number | undefined>()
29
-
30
- const dayTopOffset = useMemo(() => 10, [])
31
- const dayBottomMargin = useMemo(() => 10, [])
32
- const absoluteScrolledPositionToBottomOfDay = useAbsoluteScrolledPositionToBottomOfDay(listHeight, scrolledY, containerHeight, dayBottomMargin, dayTopOffset)
33
- const relativeScrolledPositionToBottomOfDay = useRelativeScrolledPositionToBottomOfDay(listHeight, scrolledY, daysPositions, containerHeight, dayBottomMargin, dayTopOffset)
34
-
35
- const messagesDates = useMemo(() => {
36
- const messagesDates: number[] = []
37
-
38
- for (let i = 1; i < messages.length; i++) {
39
- const previousMessage = messages[i - 1]
40
- const message = messages[i]
41
-
42
- if (!isSameDay(previousMessage, message) || !messagesDates.includes(new Date(message.createdAt).getTime()))
43
- messagesDates.push(new Date(message.createdAt).getTime())
44
- }
45
-
46
- return messagesDates
47
- }, [messages])
48
-
49
- const createdAtDate = useDerivedValue(() => {
50
- for (let i = 0; i < daysPositionsArray.value.length; i++) {
51
- const day = daysPositionsArray.value[i]
52
- const dayPosition = day.y + day.height - containerHeight.value - dayBottomMargin
53
-
54
- if (absoluteScrolledPositionToBottomOfDay.value < dayPosition)
55
- return day.createdAt
56
- }
57
-
58
- return messagesDates[messagesDates.length - 1]
59
- }, [daysPositionsArray, absoluteScrolledPositionToBottomOfDay, messagesDates, containerHeight, dayBottomMargin])
60
-
61
- const style = useAnimatedStyle(() => ({
62
- top: interpolate(
63
- relativeScrolledPositionToBottomOfDay.value,
64
- [-dayTopOffset, -0.0001, 0, isLoadingAnim.value ? 0 : containerHeight.value + dayTopOffset],
65
- [dayTopOffset, dayTopOffset, -containerHeight.value, isLoadingAnim.value ? -containerHeight.value : dayTopOffset],
66
- 'clamp'
67
- ),
68
- }), [relativeScrolledPositionToBottomOfDay, containerHeight, dayTopOffset, isLoadingAnim])
69
-
70
- const contentStyle = useAnimatedStyle(() => ({
71
- opacity: opacity.value,
72
- }), [opacity])
73
-
74
- const fadeOut = useCallback(() => {
75
- 'worklet'
76
-
77
- opacity.value = withTiming(0, { duration: 500 })
78
- }, [opacity])
79
-
80
- const scheduleFadeOut = useCallback(() => {
81
- clearTimeout(fadeOutOpacityTimeoutId.value)
82
-
83
- fadeOutOpacityTimeoutId.value = setTimeout(fadeOut, 500)
84
- }, [fadeOut, fadeOutOpacityTimeoutId])
85
-
86
- const handleLayout = useCallback(({ nativeEvent }: LayoutChangeEvent) => {
87
- containerHeight.value = nativeEvent.layout.height
88
- }, [containerHeight])
89
-
90
- useAnimatedReaction(
91
- () => [scrolledY.value, daysPositionsArray],
92
- (value, prevValue) => {
93
- if (!isScrolledOnMount.value) {
94
- isScrolledOnMount.value = true
95
- return
96
- }
97
-
98
- if (value[0] === prevValue?.[0])
99
- return
100
-
101
- opacity.value = withTiming(1, { duration: 500 })
102
-
103
- runOnJS(scheduleFadeOut)()
104
- },
105
- [scrolledY, scheduleFadeOut, daysPositionsArray]
106
- )
107
-
108
- useAnimatedReaction(
109
- () => createdAtDate.value,
110
- (value, prevValue) => {
111
- if (value && value !== prevValue)
112
- runOnJS(setCreatedAt)(value)
113
- },
114
- [createdAtDate]
115
- )
116
-
117
- useEffect(() => {
118
- isLoadingAnim.value = isLoading
119
- }, [isLoadingAnim, isLoading])
120
-
121
- const dayContent = useMemo(() => {
122
- if (!createdAt)
123
- return null
124
-
125
- return renderDay
126
- ? renderDay({ ...rest, createdAt })
127
- : <Day
128
- {...rest}
129
- containerStyle={[styles.dayAnimatedDayContainerStyle, rest.containerStyle]}
130
- createdAt={createdAt}
131
- />
132
- }, [createdAt, renderDay, rest])
133
-
134
- if (!createdAt)
135
- return null
136
-
137
- return (
138
- <Animated.View
139
- style={[stylesCommon.centerItems, styles.dayAnimated, style]}
140
- onLayout={handleLayout}
141
- pointerEvents='none'
142
- >
143
- <Animated.View
144
- style={contentStyle}
145
- pointerEvents='none'
146
- >
147
- {dayContent}
148
- </Animated.View>
149
- </Animated.View>
150
- )
151
- }
@@ -1,12 +0,0 @@
1
- import { StyleSheet } from 'react-native'
2
-
3
- export default StyleSheet.create({
4
- dayAnimated: {
5
- position: 'absolute',
6
- width: '100%',
7
- },
8
- dayAnimatedDayContainerStyle: {
9
- marginTop: 0,
10
- marginBottom: 0,
11
- },
12
- })
@@ -1,12 +0,0 @@
1
- import { DayProps } from '../../../Day'
2
- import { IMessage } from '../../../Models'
3
- import { DaysPositions } from '../../types'
4
-
5
- export interface DayAnimatedProps extends Omit<DayProps, 'createdAt'> {
6
- scrolledY: { value: number }
7
- daysPositions: { value: DaysPositions }
8
- listHeight: { value: number }
9
- renderDay?: (props: DayProps) => React.ReactNode
10
- messages: IMessage[]
11
- isLoading: boolean
12
- }
@@ -1,197 +0,0 @@
1
- import React, { useCallback, useMemo } from 'react'
2
- import { LayoutChangeEvent, View } from 'react-native'
3
- import Animated, { interpolate, useAnimatedStyle, useDerivedValue, useSharedValue } from 'react-native-reanimated'
4
- import { Day } from '../../../Day'
5
- import { Message, MessageProps } from '../../../Message'
6
- import { IMessage } from '../../../Models'
7
- import { isSameDay } from '../../../utils'
8
- import { DaysPositions } from '../../types'
9
- import { ItemProps } from './types'
10
-
11
- export * from './types'
12
-
13
- // y-position of current scroll position relative to the bottom of the day container. (since we have inverted list it is bottom)
14
- export const useAbsoluteScrolledPositionToBottomOfDay = (listHeight: { value: number }, scrolledY: { value: number }, containerHeight: { value: number }, dayBottomMargin: number, dayTopOffset: number) => {
15
- const absoluteScrolledPositionToBottomOfDay = useDerivedValue(() =>
16
- listHeight.value + scrolledY.value - containerHeight.value - dayBottomMargin - dayTopOffset
17
- , [listHeight, scrolledY, containerHeight, dayBottomMargin, dayTopOffset])
18
-
19
- return absoluteScrolledPositionToBottomOfDay
20
- }
21
-
22
- export const useRelativeScrolledPositionToBottomOfDay = (
23
- listHeight: { value: number },
24
- scrolledY: { value: number },
25
- daysPositions: { value: DaysPositions },
26
- containerHeight: { value: number },
27
- dayBottomMargin: number,
28
- dayTopOffset: number,
29
- createdAt?: number
30
- ) => {
31
- const dayMarginTop = useMemo(() => 5, [])
32
-
33
- const absoluteScrolledPositionToBottomOfDay = useAbsoluteScrolledPositionToBottomOfDay(listHeight, scrolledY, containerHeight, dayBottomMargin, dayTopOffset)
34
-
35
- // find current day position by scrolled position
36
- const currentDayPosition = useDerivedValue(() => {
37
- 'worklet'
38
-
39
- // When createdAt is provided (called from AnimatedDayWrapper for a specific message),
40
- // directly find the day position by createdAt without sorting the entire array.
41
- // This avoids O(n log n) sorting and O(n) search for each message item.
42
- if (createdAt != null) {
43
- const values = Object.values(daysPositions.value)
44
- for (let i = 0; i < values.length; i++)
45
- if (values[i].createdAt === createdAt)
46
- return values[i]
47
- }
48
-
49
- // Fallback: sort and search when createdAt is not provided (e.g., from DayAnimated)
50
- const sortedArray = Object.values(daysPositions.value).sort((a, b) => {
51
- 'worklet'
52
-
53
- return a.y - b.y
54
- })
55
- for (let i = 0; i < sortedArray.length; i++) {
56
- const day = sortedArray[i]
57
- const dayPosition = day.y + day.height
58
- if (absoluteScrolledPositionToBottomOfDay.value < dayPosition || i === sortedArray.length - 1)
59
- return day
60
- }
61
-
62
- return undefined
63
- }, [daysPositions, absoluteScrolledPositionToBottomOfDay, createdAt])
64
-
65
- const relativeScrolledPositionToBottomOfDay = useDerivedValue(() => {
66
- const scrolledBottomY = listHeight.value + scrolledY.value - (
67
- (currentDayPosition.value?.y ?? 0) +
68
- (currentDayPosition.value?.height ?? 0) +
69
- dayMarginTop
70
- )
71
-
72
- return scrolledBottomY
73
- }, [listHeight, scrolledY, currentDayPosition, dayMarginTop])
74
-
75
- return relativeScrolledPositionToBottomOfDay
76
- }
77
-
78
- const DayWrapper = <TMessage extends IMessage>(props: MessageProps<TMessage>) => {
79
- const {
80
- renderDay: renderDayProp,
81
- currentMessage,
82
- previousMessage,
83
- } = props
84
-
85
- if (!currentMessage?.createdAt || isSameDay(currentMessage, previousMessage))
86
- return null
87
-
88
- const {
89
- /* eslint-disable @typescript-eslint/no-unused-vars */
90
- containerStyle,
91
- onMessageLayout,
92
- /* eslint-enable @typescript-eslint/no-unused-vars */
93
- ...rest
94
- } = props
95
-
96
- return (
97
- <View>
98
- {
99
- renderDayProp
100
- ? renderDayProp({ ...rest, createdAt: currentMessage.createdAt })
101
- : <Day {...rest} createdAt={currentMessage.createdAt} />
102
- }
103
- </View>
104
- )
105
- }
106
-
107
- const AnimatedDayWrapper = <TMessage extends IMessage>(props: ItemProps<TMessage>) => {
108
- const {
109
- scrolledY,
110
- daysPositions,
111
- listHeight,
112
- ...rest
113
- } = props
114
-
115
- const dayContainerHeight = useSharedValue(0)
116
- const dayTopOffset = useMemo(() => 10, [])
117
- const dayBottomMargin = useMemo(() => 10, [])
118
-
119
- const createdAt = useMemo(() =>
120
- new Date(props.currentMessage.createdAt).getTime()
121
- , [props.currentMessage.createdAt])
122
-
123
- const relativeScrolledPositionToBottomOfDay = useRelativeScrolledPositionToBottomOfDay(listHeight, scrolledY, daysPositions, dayContainerHeight, dayBottomMargin, dayTopOffset, createdAt)
124
-
125
- const handleLayoutDayContainer = useCallback(({ nativeEvent }: LayoutChangeEvent) => {
126
- dayContainerHeight.value = nativeEvent.layout.height
127
- }, [dayContainerHeight])
128
-
129
- const style = useAnimatedStyle(() => ({
130
- opacity: interpolate(
131
- relativeScrolledPositionToBottomOfDay.value,
132
- [
133
- -dayTopOffset,
134
- -0.0001,
135
- 0,
136
- dayContainerHeight.value + dayTopOffset,
137
- ],
138
- [
139
- 0,
140
- 0,
141
- 1,
142
- 1,
143
- ],
144
- 'clamp'
145
- ),
146
- }), [relativeScrolledPositionToBottomOfDay, dayContainerHeight, dayTopOffset])
147
-
148
- return (
149
- <Animated.View
150
- style={style}
151
- onLayout={handleLayoutDayContainer}
152
- >
153
- <DayWrapper<TMessage> {...rest as MessageProps<TMessage>} />
154
- </Animated.View>
155
- )
156
- }
157
-
158
- export const Item = <TMessage extends IMessage>(props: ItemProps<TMessage>) => {
159
- const {
160
- renderMessage: renderMessageProp,
161
- isDayAnimationEnabled,
162
- reply,
163
- /* eslint-disable @typescript-eslint/no-unused-vars */
164
- scrolledY: _scrolledY,
165
- daysPositions: _daysPositions,
166
- listHeight: _listHeight,
167
- /* eslint-enable @typescript-eslint/no-unused-vars */
168
- ...rest
169
- } = props
170
-
171
- // Transform reply props for Message and Bubble
172
- const messageProps = useMemo(() => ({
173
- ...rest,
174
- // Swipe to reply for Message component
175
- swipeToReply: reply?.swipe,
176
- // Message reply styling for Bubble component
177
- messageReply: reply ? {
178
- renderMessageReply: reply.renderMessageReply,
179
- onPress: reply.onPress,
180
- ...reply.messageStyle,
181
- } : undefined,
182
- }), [rest, reply])
183
-
184
- return (
185
- // do not remove key. it helps to get correct position of the day container
186
- <View key={props.currentMessage._id.toString()}>
187
- {isDayAnimationEnabled
188
- ? <AnimatedDayWrapper<TMessage> {...props} />
189
- : <DayWrapper<TMessage> {...messageProps as MessageProps<TMessage>} />}
190
- {
191
- renderMessageProp
192
- ? renderMessageProp(messageProps as MessageProps<TMessage>)
193
- : <Message<TMessage> {...messageProps as MessageProps<TMessage>} />
194
- }
195
- </View>
196
- )
197
- }
@@ -1,13 +0,0 @@
1
- import { IMessage } from '../../../Models'
2
- import { MessagesContainerProps, DaysPositions } from '../../types'
3
-
4
- export interface ItemProps<TMessage extends IMessage> extends MessagesContainerProps<TMessage> {
5
- currentMessage: TMessage
6
- previousMessage?: TMessage
7
- nextMessage?: TMessage
8
- position: 'left' | 'right'
9
- scrolledY: { value: number }
10
- daysPositions: { value: DaysPositions }
11
- listHeight: { value: number }
12
- isDayAnimationEnabled?: boolean
13
- }