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
package/src/Day/index.tsx DELETED
@@ -1,63 +0,0 @@
1
- import React, { useMemo } from 'react'
2
- import {
3
- View,
4
- } from 'react-native'
5
- import dayjs from 'dayjs'
6
- import calendar from 'dayjs/plugin/calendar'
7
- import relativeTime from 'dayjs/plugin/relativeTime'
8
-
9
- import { Text } from 'react-native-gesture-handler'
10
- import { DATE_FORMAT } from '../Constant'
11
-
12
- import { useChatContext } from '../GiftedChatContext'
13
- import stylesCommon from '../styles'
14
- import styles from './styles'
15
- import { DayProps } from './types'
16
-
17
- export * from './types'
18
-
19
- dayjs.extend(relativeTime)
20
- dayjs.extend(calendar)
21
-
22
- export function Day ({
23
- dateFormat = DATE_FORMAT,
24
- dateFormatCalendar,
25
- createdAt,
26
- containerStyle,
27
- wrapperStyle,
28
- textProps,
29
- }: DayProps) {
30
- const { getLocale } = useChatContext()
31
-
32
- const dateStr = useMemo(() => {
33
- if (createdAt == null)
34
- return null
35
-
36
- const now = dayjs().startOf('day')
37
- const date = dayjs(createdAt).locale(getLocale()).startOf('day')
38
-
39
- if (!now.isSame(date, 'year'))
40
- return date.format('D MMMM YYYY')
41
-
42
- if (now.diff(date, 'days') < 1)
43
- return date.calendar(now, {
44
- sameDay: '[Today]',
45
- ...dateFormatCalendar,
46
- })
47
-
48
- return date.format(dateFormat)
49
- }, [createdAt, dateFormat, getLocale, dateFormatCalendar])
50
-
51
- if (!dateStr)
52
- return null
53
-
54
- return (
55
- <View style={[stylesCommon.centerItems, styles.container, containerStyle]}>
56
- <View style={[styles.wrapper, wrapperStyle]}>
57
- <Text {...textProps} style={[styles.text, textProps?.style]}>
58
- {dateStr}
59
- </Text>
60
- </View>
61
- </View>
62
- )
63
- }
package/src/Day/styles.ts DELETED
@@ -1,22 +0,0 @@
1
- import { StyleSheet } from 'react-native'
2
- import { Color } from '../Color'
3
-
4
- export default StyleSheet.create({
5
- container: {
6
- marginTop: 5,
7
- marginBottom: 10,
8
- },
9
- wrapper: {
10
- backgroundColor: 'rgba(0, 0, 0, 0.75)',
11
- paddingTop: 6,
12
- paddingBottom: 6,
13
- paddingLeft: 10,
14
- paddingRight: 10,
15
- borderRadius: 15,
16
- },
17
- text: {
18
- color: Color.white,
19
- fontSize: 12,
20
- fontWeight: '600',
21
- },
22
- })
package/src/Day/types.ts DELETED
@@ -1,15 +0,0 @@
1
- import {
2
- StyleProp,
3
- ViewStyle,
4
- TextProps,
5
- } from 'react-native'
6
-
7
- export interface DayProps {
8
- createdAt: Date | number
9
- dateFormat?: string
10
- dateFormatCalendar?: object
11
- containerStyle?: StyleProp<ViewStyle>
12
- wrapperStyle?: StyleProp<ViewStyle>
13
- /** Props to pass to the Text component (e.g., style, allowFontScaling, numberOfLines) */
14
- textProps?: Partial<TextProps>
15
- }
@@ -1,187 +0,0 @@
1
- import React, { useCallback, useMemo } from 'react'
2
- import {
3
- Image,
4
- View,
5
- StyleSheet,
6
- StyleProp,
7
- ImageStyle,
8
- TextStyle,
9
- } from 'react-native'
10
- import { Text } from 'react-native-gesture-handler'
11
- import { Color } from './Color'
12
- import { TouchableOpacity } from './components/TouchableOpacity'
13
- import { User } from './Models'
14
- import stylesCommon from './styles'
15
-
16
- const {
17
- carrot,
18
- emerald,
19
- peterRiver,
20
- wisteria,
21
- alizarin,
22
- turquoise,
23
- midnightBlue,
24
- } = Color
25
-
26
- const styles = StyleSheet.create({
27
- avatarStyle: {
28
- width: 40,
29
- height: 40,
30
- borderRadius: 20,
31
- },
32
- avatarTransparent: {
33
- backgroundColor: Color.backgroundTransparent,
34
- },
35
- textStyle: {
36
- color: Color.white,
37
- fontSize: 16,
38
- backgroundColor: Color.backgroundTransparent,
39
- fontWeight: '100',
40
- },
41
- })
42
-
43
- export interface GiftedAvatarProps {
44
- user?: User
45
- avatarStyle?: StyleProp<ImageStyle>
46
- textStyle?: StyleProp<TextStyle>
47
- onPress?: (props: GiftedAvatarProps) => void
48
- onLongPress?: (props: GiftedAvatarProps) => void
49
- }
50
-
51
- export function GiftedAvatar (
52
- props: GiftedAvatarProps
53
- ) {
54
- const {
55
- user,
56
- avatarStyle,
57
- textStyle,
58
- onPress,
59
- } = props
60
-
61
- const avatarName = useMemo(() => {
62
- const userName = user?.name || ''
63
- const name = userName.toUpperCase().split(' ')
64
-
65
- if (name.length === 1)
66
- return `${name[0].charAt(0)}`
67
- else if (name.length > 1)
68
- return `${name[0].charAt(0)}${name[1].charAt(0)}`
69
- else
70
- return ''
71
- }, [user?.name])
72
-
73
- const backgroundColor = useMemo(() => {
74
- let sumChars = 0
75
- if (user?.name)
76
- for (let i = 0; i < user.name.length; i += 1)
77
- sumChars += user.name.charCodeAt(i)
78
-
79
- // inspired by https://github.com/wbinnssmith/react-user-avatar
80
- // colors from https://flatuicolors.com/
81
- const colors = [
82
- carrot,
83
- emerald,
84
- peterRiver,
85
- wisteria,
86
- alizarin,
87
- turquoise,
88
- midnightBlue,
89
- ]
90
-
91
- return colors[sumChars % colors.length]
92
- }, [user?.name])
93
-
94
- const renderAvatar = useCallback(() => {
95
- switch (typeof user?.avatar) {
96
- case 'function':
97
- return user.avatar([stylesCommon.centerItems, styles.avatarStyle, avatarStyle])
98
- case 'string':
99
- return (
100
- <Image
101
- source={{ uri: user.avatar }}
102
- style={[stylesCommon.centerItems, styles.avatarStyle, avatarStyle]}
103
- />
104
- )
105
- case 'number':
106
- return (
107
- <Image
108
- source={user.avatar}
109
- style={[stylesCommon.centerItems, styles.avatarStyle, avatarStyle]}
110
- />
111
- )
112
- default:
113
- return null
114
- }
115
- }, [user, avatarStyle])
116
-
117
- const renderInitials = useCallback(() => {
118
- return (
119
- <Text style={[styles.textStyle, textStyle]}>
120
- {avatarName}
121
- </Text>
122
- )
123
- }, [textStyle, avatarName])
124
-
125
- const handleOnPress = useCallback(() => {
126
- const {
127
- onPress,
128
- ...rest
129
- } = props
130
-
131
- onPress?.(rest)
132
- }, [props])
133
-
134
- const handleOnLongPress = useCallback(() => {
135
- const {
136
- onLongPress,
137
- ...rest
138
- } = props
139
-
140
- if (onLongPress)
141
- onLongPress(rest)
142
- }, [props])
143
-
144
- const placeholderView = useMemo(() => (
145
- <View
146
- style={[
147
- stylesCommon.centerItems,
148
- styles.avatarStyle,
149
- styles.avatarTransparent,
150
- avatarStyle,
151
- ]}
152
- accessibilityRole='image'
153
- />
154
- ), [avatarStyle])
155
-
156
- if (!user || (!user.name && !user.avatar))
157
- return placeholderView
158
-
159
- if (user.avatar)
160
- return (
161
- <TouchableOpacity
162
- enabled={!!onPress}
163
- onPress={handleOnPress}
164
- onLongPress={handleOnLongPress}
165
- accessibilityRole='image'
166
- >
167
- {renderAvatar()}
168
- </TouchableOpacity>
169
- )
170
-
171
- return (
172
- <TouchableOpacity
173
- enabled={!!onPress}
174
- onPress={handleOnPress}
175
- onLongPress={handleOnLongPress}
176
- style={[
177
- stylesCommon.centerItems,
178
- styles.avatarStyle,
179
- { backgroundColor },
180
- avatarStyle,
181
- ]}
182
- accessibilityRole='image'
183
- >
184
- {renderInitials()}
185
- </TouchableOpacity>
186
- )
187
- }
@@ -1,397 +0,0 @@
1
- import React, {
2
- createRef,
3
- useEffect,
4
- useMemo,
5
- useRef,
6
- useState,
7
- useCallback,
8
- RefObject,
9
- } from 'react'
10
- import {
11
- View,
12
- LayoutChangeEvent,
13
- useColorScheme,
14
- } from 'react-native'
15
- import {
16
- ActionSheetProvider,
17
- ActionSheetProviderRef,
18
- } from '@expo/react-native-action-sheet'
19
- import dayjs from 'dayjs'
20
- import localizedFormat from 'dayjs/plugin/localizedFormat'
21
- import { GestureHandlerRootView, TextInput } from 'react-native-gesture-handler'
22
- import { KeyboardAvoidingView, KeyboardProvider } from 'react-native-keyboard-controller'
23
- import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context'
24
- import { TEST_ID } from '../Constant'
25
- import { GiftedChatContext } from '../GiftedChatContext'
26
- import { InputToolbar } from '../InputToolbar'
27
- import { MessagesContainer, AnimatedList } from '../MessagesContainer'
28
- import { IMessage, ReplyMessage } from '../Models'
29
- import stylesCommon from '../styles'
30
- import { renderComponentOrElement } from '../utils'
31
- import styles from './styles'
32
- import { GiftedChatProps } from './types'
33
-
34
- dayjs.extend(localizedFormat)
35
-
36
- function GiftedChat<TMessage extends IMessage = IMessage> (
37
- props: GiftedChatProps<TMessage>
38
- ) {
39
- const {
40
- messages = [],
41
- initialText = '',
42
- isTyping,
43
-
44
- // "random" function from here: https://stackoverflow.com/a/8084248/3452513
45
- // we do not use uuid since it would add extra native dependency (https://www.npmjs.com/package/react-native-get-random-values)
46
- // lib's user can decide which algorithm to use and pass it as a prop
47
- messageIdGenerator = () => (Math.random() + 1).toString(36).substring(7),
48
-
49
- user = {},
50
- onSend,
51
- locale = 'en',
52
- colorScheme: colorSchemeProp,
53
- renderLoading,
54
- actionSheet,
55
- textInputProps,
56
- renderChatFooter,
57
- renderInputToolbar,
58
- isInverted = true,
59
-
60
- // Reply props
61
- reply,
62
- } = props
63
-
64
- // Extract reply props for internal use
65
- const replyMessageProp = reply?.message
66
- const onClearReply = reply?.onClear
67
- const onSwipeToReply = reply?.swipe?.onSwipe
68
- const renderReplyPreview = reply?.renderPreview
69
- const replyPreviewContainerStyle = reply?.previewStyle?.containerStyle
70
- const replyPreviewTextStyle = reply?.previewStyle?.textStyle
71
-
72
- const systemColorScheme = useColorScheme()
73
- const colorScheme = colorSchemeProp !== undefined ? colorSchemeProp : systemColorScheme
74
-
75
- const actionSheetRef = useRef<ActionSheetProviderRef>(null)
76
-
77
- const insets = useSafeAreaInsets()
78
-
79
- const messagesContainerRef = useMemo(
80
- () => props.messagesContainerRef || createRef<AnimatedList<TMessage>>(),
81
- [props.messagesContainerRef]
82
- ) as RefObject<AnimatedList<TMessage>>
83
-
84
- const textInputRef = useMemo(
85
- () => props.textInputRef || createRef<TextInput>(),
86
- [props.textInputRef]
87
- )
88
-
89
- const [isInitialized, setIsInitialized] = useState<boolean>(false)
90
- const [text, setText] = useState<string | undefined>(() => props.text || '')
91
- const [internalReplyMessage, setInternalReplyMessage] = useState<ReplyMessage | null>(null)
92
-
93
- // Use controlled or uncontrolled reply state
94
- const replyMessage = replyMessageProp !== undefined ? replyMessageProp : internalReplyMessage
95
-
96
- const getTextFromProp = useCallback(
97
- (fallback: string) => {
98
- if (props.text === undefined)
99
- return fallback
100
-
101
- return props.text
102
- },
103
- [props.text]
104
- )
105
-
106
- const scrollToBottom = useCallback(
107
- (isAnimated = true) => {
108
- if (!messagesContainerRef?.current)
109
- return
110
-
111
- if (isInverted) {
112
- messagesContainerRef.current.scrollToOffset({
113
- offset: 0,
114
- animated: isAnimated,
115
- })
116
- return
117
- }
118
-
119
- messagesContainerRef.current.scrollToEnd({ animated: isAnimated })
120
- },
121
- [isInverted, messagesContainerRef]
122
- )
123
-
124
- const handleSwipeToReply = useCallback(
125
- (message: TMessage) => {
126
- if (replyMessageProp === undefined)
127
- // Uncontrolled mode: manage state internally
128
- setInternalReplyMessage({
129
- _id: message._id,
130
- text: message.text,
131
- user: message.user,
132
- image: message.image,
133
- audio: message.audio,
134
- })
135
-
136
- onSwipeToReply?.(message)
137
- },
138
- [replyMessageProp, onSwipeToReply]
139
- )
140
-
141
- const clearReply = useCallback(() => {
142
- if (replyMessageProp === undefined)
143
- // Uncontrolled mode: manage state internally
144
- setInternalReplyMessage(null)
145
-
146
- onClearReply?.()
147
- }, [replyMessageProp, onClearReply])
148
-
149
- const renderMessages = useMemo(() => {
150
- if (!isInitialized)
151
- return null
152
-
153
- const { messagesContainerStyle, ...messagesContainerProps } = props
154
-
155
- return (
156
- <View style={[stylesCommon.fill, messagesContainerStyle]}>
157
- <MessagesContainer<TMessage>
158
- {...messagesContainerProps}
159
- isInverted={isInverted}
160
- messages={messages}
161
- forwardRef={messagesContainerRef}
162
- isTyping={isTyping}
163
- reply={{
164
- ...reply,
165
- swipe: reply?.swipe ? {
166
- ...reply.swipe,
167
- onSwipe: handleSwipeToReply,
168
- } : undefined,
169
- }}
170
- />
171
- {renderComponentOrElement(renderChatFooter, {})}
172
- </View>
173
- )
174
- }, [
175
- isInitialized,
176
- isTyping,
177
- messages,
178
- props,
179
- isInverted,
180
- messagesContainerRef,
181
- renderChatFooter,
182
- reply,
183
- handleSwipeToReply,
184
- ])
185
-
186
- const notifyInputTextReset = useCallback(() => {
187
- props.textInputProps?.onChangeText?.('')
188
- }, [props.textInputProps])
189
-
190
- const resetInputToolbar = useCallback(() => {
191
- textInputRef.current?.clear()
192
-
193
- notifyInputTextReset()
194
-
195
- setText(getTextFromProp(''))
196
- }, [
197
- getTextFromProp,
198
- textInputRef,
199
- notifyInputTextReset,
200
- ])
201
-
202
- const _onSend = useCallback(
203
- (messages: TMessage[] = [], shouldResetInputToolbar = false) => {
204
- if (!Array.isArray(messages))
205
- messages = [messages]
206
-
207
- const newMessages: TMessage[] = messages.map(message => {
208
- return {
209
- ...message,
210
- user: user!,
211
- createdAt: new Date(),
212
- _id: messageIdGenerator?.(),
213
- // Attach reply message if exists
214
- ...(replyMessage ? { replyMessage } : {}),
215
- }
216
- })
217
-
218
- if (shouldResetInputToolbar === true)
219
- resetInputToolbar()
220
-
221
- // Clear reply after sending
222
- clearReply()
223
-
224
- onSend?.(newMessages)
225
-
226
- setTimeout(() => scrollToBottom(), 10)
227
- },
228
- [messageIdGenerator, onSend, user, resetInputToolbar, scrollToBottom, replyMessage, clearReply]
229
- )
230
-
231
- const _onChangeText = useCallback(
232
- (text: string) => {
233
- props.textInputProps?.onChangeText?.(text)
234
-
235
- // Only set state if it's not being overridden by a prop.
236
- if (props.text === undefined)
237
- setText(text)
238
- },
239
- [props.text, props.textInputProps]
240
- )
241
-
242
- const onInitialLayoutViewLayout = useCallback(
243
- (e: LayoutChangeEvent) => {
244
- if (isInitialized)
245
- return
246
-
247
- const { layout } = e.nativeEvent
248
-
249
- if (layout.height <= 0)
250
- return
251
-
252
- notifyInputTextReset()
253
-
254
- setIsInitialized(true)
255
- setText(getTextFromProp(initialText))
256
- },
257
- [isInitialized, initialText, notifyInputTextReset, getTextFromProp]
258
- )
259
-
260
- const inputToolbarFragment = useMemo(() => {
261
- if (!isInitialized)
262
- return null
263
-
264
- const inputToolbarProps = {
265
- ...props,
266
- text: getTextFromProp(text!),
267
- onSend: _onSend,
268
- textInputProps: {
269
- ...textInputProps,
270
- onChangeText: _onChangeText,
271
- ref: textInputRef,
272
- },
273
- // Reply preview props
274
- replyMessage,
275
- onClearReply: clearReply,
276
- renderReplyPreview,
277
- replyPreviewContainerStyle,
278
- replyPreviewTextStyle,
279
- }
280
-
281
- if (renderInputToolbar)
282
- return renderComponentOrElement(renderInputToolbar, inputToolbarProps)
283
-
284
- return <InputToolbar {...inputToolbarProps} />
285
- }, [
286
- isInitialized,
287
- _onSend,
288
- getTextFromProp,
289
- props,
290
- text,
291
- renderInputToolbar,
292
- textInputRef,
293
- textInputProps,
294
- _onChangeText,
295
- replyMessage,
296
- clearReply,
297
- renderReplyPreview,
298
- replyPreviewContainerStyle,
299
- replyPreviewTextStyle,
300
- ])
301
-
302
- const contextValues = useMemo(
303
- () => ({
304
- actionSheet:
305
- actionSheet ||
306
- (() => ({
307
- showActionSheetWithOptions:
308
- actionSheetRef.current!.showActionSheetWithOptions,
309
- })),
310
- getLocale: () => locale,
311
- getColorScheme: () => colorScheme,
312
- }),
313
- [actionSheet, locale, colorScheme]
314
- )
315
-
316
- useEffect(() => {
317
- if (props.text != null)
318
- setText(props.text)
319
- }, [props.text])
320
-
321
- return (
322
- <GiftedChatContext.Provider value={contextValues}>
323
- <ActionSheetProvider ref={actionSheetRef}>
324
- <View
325
- testID={TEST_ID.WRAPPER}
326
- style={[stylesCommon.fill, styles.contentContainer]}
327
- onLayout={onInitialLayoutViewLayout}
328
- >
329
- {/* @ts-expect-error */}
330
- <KeyboardAvoidingView
331
- behavior='translate-with-padding'
332
- keyboardVerticalOffset={insets.top}
333
- style={stylesCommon.fill}
334
- {...props.keyboardAvoidingViewProps}
335
- >
336
- <View style={[stylesCommon.fill, !isInitialized && styles.hidden]}>
337
- {renderMessages}
338
- {inputToolbarFragment}
339
- </View>
340
- {!isInitialized && renderComponentOrElement(renderLoading, {})}
341
- </KeyboardAvoidingView>
342
- </View>
343
- </ActionSheetProvider>
344
- </GiftedChatContext.Provider>
345
- )
346
- }
347
-
348
- function GiftedChatWrapper<TMessage extends IMessage = IMessage> (props: GiftedChatProps<TMessage>) {
349
- const {
350
- keyboardProviderProps,
351
- ...rest
352
- } = props
353
-
354
- return (
355
- <GestureHandlerRootView style={styles.fill}>
356
- <SafeAreaProvider>
357
- <KeyboardProvider
358
- statusBarTranslucent
359
- navigationBarTranslucent
360
- {...keyboardProviderProps}
361
- >
362
- <GiftedChat<TMessage> {...rest} />
363
- </KeyboardProvider>
364
- </SafeAreaProvider>
365
- </GestureHandlerRootView>
366
- )
367
- }
368
-
369
- GiftedChatWrapper.append = <TMessage extends IMessage>(
370
- currentMessages: TMessage[] = [],
371
- messages: TMessage[],
372
- isInverted = true
373
- ) => {
374
- if (!Array.isArray(messages))
375
- messages = [messages]
376
-
377
- return isInverted
378
- ? messages.concat(currentMessages)
379
- : currentMessages.concat(messages)
380
- }
381
-
382
- GiftedChatWrapper.prepend = <TMessage extends IMessage>(
383
- currentMessages: TMessage[] = [],
384
- messages: TMessage[],
385
- isInverted = true
386
- ) => {
387
- if (!Array.isArray(messages))
388
- messages = [messages]
389
-
390
- return isInverted
391
- ? currentMessages.concat(messages)
392
- : messages.concat(currentMessages)
393
- }
394
-
395
- export {
396
- GiftedChatWrapper as GiftedChat
397
- }
@@ -1,13 +0,0 @@
1
- import { StyleSheet } from 'react-native'
2
-
3
- export default StyleSheet.create({
4
- fill: {
5
- flex: 1,
6
- },
7
- contentContainer: {
8
- overflow: 'hidden',
9
- },
10
- hidden: {
11
- opacity: 0,
12
- },
13
- })