react-native-gifted-chat 3.3.2 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/README.md +30 -2
  2. package/lib/Actions.d.ts +16 -0
  3. package/lib/Actions.d.ts.map +1 -0
  4. package/lib/Actions.js +64 -0
  5. package/lib/Actions.js.map +1 -0
  6. package/lib/Avatar.d.ts +19 -0
  7. package/lib/Avatar.d.ts.map +1 -0
  8. package/lib/Avatar.js +93 -0
  9. package/lib/Avatar.js.map +1 -0
  10. package/lib/Bubble/index.d.ts +6 -0
  11. package/lib/Bubble/index.d.ts.map +1 -0
  12. package/lib/Bubble/index.js +268 -0
  13. package/lib/Bubble/index.js.map +1 -0
  14. package/lib/Bubble/styles.d.ts +57 -0
  15. package/lib/Bubble/styles.d.ts.map +1 -0
  16. package/lib/Bubble/styles.js +59 -0
  17. package/lib/Bubble/styles.js.map +1 -0
  18. package/lib/Bubble/types.d.ts +59 -0
  19. package/lib/Bubble/types.d.ts.map +1 -0
  20. package/lib/Bubble/types.js +2 -0
  21. package/lib/Bubble/types.js.map +1 -0
  22. package/lib/Color.d.ts +18 -0
  23. package/lib/Color.d.ts.map +1 -0
  24. package/lib/Color.js +18 -0
  25. package/lib/Color.js.map +1 -0
  26. package/lib/Composer.d.ts +9 -0
  27. package/lib/Composer.d.ts.map +1 -0
  28. package/lib/Composer.js +56 -0
  29. package/lib/Composer.js.map +1 -0
  30. package/lib/Constant.d.ts +8 -0
  31. package/lib/Constant.d.ts.map +1 -0
  32. package/lib/Constant.js +8 -0
  33. package/lib/Constant.js.map +1 -0
  34. package/lib/Day/index.d.ts +5 -0
  35. package/lib/Day/index.d.ts.map +1 -0
  36. package/lib/Day/index.js +39 -0
  37. package/lib/Day/index.js.map +1 -0
  38. package/lib/Day/styles.d.ts +21 -0
  39. package/lib/Day/styles.d.ts.map +1 -0
  40. package/lib/Day/styles.js +22 -0
  41. package/lib/Day/styles.js.map +1 -0
  42. package/lib/Day/types.d.ts +11 -0
  43. package/lib/Day/types.d.ts.map +1 -0
  44. package/lib/Day/types.js +2 -0
  45. package/lib/Day/types.js.map +1 -0
  46. package/lib/GiftedAvatar.d.ts +12 -0
  47. package/lib/GiftedAvatar.d.ts.map +1 -0
  48. package/lib/GiftedAvatar.js +100 -0
  49. package/lib/GiftedAvatar.js.map +1 -0
  50. package/lib/GiftedChat/index.d.ts +10 -0
  51. package/lib/GiftedChat/index.d.ts.map +1 -0
  52. package/lib/GiftedChat/index.js +240 -0
  53. package/lib/GiftedChat/index.js.map +1 -0
  54. package/lib/GiftedChat/styles.d.ts +13 -0
  55. package/lib/GiftedChat/styles.d.ts.map +1 -0
  56. package/lib/GiftedChat/styles.js +13 -0
  57. package/lib/GiftedChat/styles.js.map +1 -0
  58. package/lib/GiftedChat/types.d.ts +90 -0
  59. package/lib/GiftedChat/types.d.ts.map +1 -0
  60. package/lib/GiftedChat/types.js +2 -0
  61. package/lib/GiftedChat/types.js.map +1 -0
  62. package/lib/GiftedChatContext.d.ts +12 -0
  63. package/lib/GiftedChatContext.d.ts.map +1 -0
  64. package/lib/GiftedChatContext.js +10 -0
  65. package/lib/GiftedChatContext.js.map +1 -0
  66. package/lib/InputToolbar.d.ts +36 -0
  67. package/lib/InputToolbar.d.ts.map +1 -0
  68. package/lib/InputToolbar.js +108 -0
  69. package/lib/InputToolbar.js.map +1 -0
  70. package/lib/LoadEarlierMessages.d.ts +17 -0
  71. package/lib/LoadEarlierMessages.d.ts.map +1 -0
  72. package/lib/LoadEarlierMessages.js +44 -0
  73. package/lib/LoadEarlierMessages.js.map +1 -0
  74. package/lib/Message/index.d.ts +6 -0
  75. package/lib/Message/index.d.ts.map +1 -0
  76. package/lib/Message/index.js +180 -0
  77. package/lib/Message/index.js.map +1 -0
  78. package/lib/Message/styles.d.ts +18 -0
  79. package/lib/Message/styles.d.ts.map +1 -0
  80. package/lib/Message/styles.js +18 -0
  81. package/lib/Message/styles.js.map +1 -0
  82. package/lib/Message/types.d.ts +25 -0
  83. package/lib/Message/types.d.ts.map +1 -0
  84. package/lib/Message/types.js +2 -0
  85. package/lib/Message/types.js.map +1 -0
  86. package/lib/MessageAudio.d.ts +3 -0
  87. package/lib/MessageAudio.d.ts.map +1 -0
  88. package/lib/MessageAudio.js +24 -0
  89. package/lib/MessageAudio.js.map +1 -0
  90. package/lib/MessageImage.d.ts +12 -0
  91. package/lib/MessageImage.d.ts.map +1 -0
  92. package/lib/MessageImage.js +164 -0
  93. package/lib/MessageImage.js.map +1 -0
  94. package/lib/MessageReply.d.ts +15 -0
  95. package/lib/MessageReply.d.ts.map +1 -0
  96. package/lib/MessageReply.js +102 -0
  97. package/lib/MessageReply.js.map +1 -0
  98. package/lib/MessageText.d.ts +24 -0
  99. package/lib/MessageText.d.ts.map +1 -0
  100. package/lib/MessageText.js +40 -0
  101. package/lib/MessageText.js.map +1 -0
  102. package/lib/MessageVideo.d.ts +3 -0
  103. package/lib/MessageVideo.d.ts.map +1 -0
  104. package/lib/MessageVideo.js +24 -0
  105. package/lib/MessageVideo.js.map +1 -0
  106. package/lib/MessagesContainer/components/DayAnimated/index.d.ts +5 -0
  107. package/lib/MessagesContainer/components/DayAnimated/index.d.ts.map +1 -0
  108. package/lib/MessagesContainer/components/DayAnimated/index.js +92 -0
  109. package/lib/MessagesContainer/components/DayAnimated/index.js.map +1 -0
  110. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts +12 -0
  111. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts.map +1 -0
  112. package/lib/MessagesContainer/components/DayAnimated/styles.js +12 -0
  113. package/lib/MessagesContainer/components/DayAnimated/styles.js.map +1 -0
  114. package/lib/MessagesContainer/components/DayAnimated/types.d.ts +18 -0
  115. package/lib/MessagesContainer/components/DayAnimated/types.d.ts.map +1 -0
  116. package/lib/MessagesContainer/components/DayAnimated/types.js +2 -0
  117. package/lib/MessagesContainer/components/DayAnimated/types.js.map +1 -0
  118. package/lib/MessagesContainer/components/Item/index.d.ts +23 -0
  119. package/lib/MessagesContainer/components/Item/index.d.ts.map +1 -0
  120. package/lib/MessagesContainer/components/Item/index.js +120 -0
  121. package/lib/MessagesContainer/components/Item/index.js.map +1 -0
  122. package/lib/MessagesContainer/components/Item/types.d.ts +19 -0
  123. package/lib/MessagesContainer/components/Item/types.d.ts.map +1 -0
  124. package/lib/MessagesContainer/components/Item/types.js +2 -0
  125. package/lib/MessagesContainer/components/Item/types.js.map +1 -0
  126. package/lib/MessagesContainer/index.d.ts +6 -0
  127. package/lib/MessagesContainer/index.d.ts.map +1 -0
  128. package/lib/MessagesContainer/index.js +258 -0
  129. package/lib/MessagesContainer/index.js.map +1 -0
  130. package/lib/MessagesContainer/styles.d.ts +55 -0
  131. package/lib/MessagesContainer/styles.d.ts.map +1 -0
  132. package/lib/MessagesContainer/styles.js +42 -0
  133. package/lib/MessagesContainer/styles.js.map +1 -0
  134. package/lib/MessagesContainer/types.d.ts +88 -0
  135. package/lib/MessagesContainer/types.d.ts.map +1 -0
  136. package/lib/MessagesContainer/types.js +10 -0
  137. package/lib/MessagesContainer/types.js.map +1 -0
  138. package/lib/Models.d.ts +58 -0
  139. package/lib/Models.d.ts.map +1 -0
  140. package/lib/Models.js +2 -0
  141. package/lib/Models.js.map +1 -0
  142. package/lib/QuickReplies.d.ts +16 -0
  143. package/lib/QuickReplies.d.ts.map +1 -0
  144. package/lib/QuickReplies.js +107 -0
  145. package/lib/QuickReplies.js.map +1 -0
  146. package/lib/Reply/index.d.ts +2 -0
  147. package/lib/Reply/index.d.ts.map +1 -0
  148. package/lib/Reply/index.js +2 -0
  149. package/lib/Reply/index.js.map +1 -0
  150. package/lib/Reply/types.d.ts +72 -0
  151. package/lib/Reply/types.d.ts.map +1 -0
  152. package/lib/Reply/types.js +2 -0
  153. package/lib/Reply/types.js.map +1 -0
  154. package/lib/ReplyPreview.d.ts +14 -0
  155. package/lib/ReplyPreview.d.ts.map +1 -0
  156. package/lib/ReplyPreview.js +94 -0
  157. package/lib/ReplyPreview.js.map +1 -0
  158. package/lib/Send.d.ts +19 -0
  159. package/lib/Send.d.ts.map +1 -0
  160. package/lib/Send.js +56 -0
  161. package/lib/Send.js.map +1 -0
  162. package/lib/SystemMessage.d.ts +14 -0
  163. package/lib/SystemMessage.d.ts.map +1 -0
  164. package/lib/SystemMessage.js +42 -0
  165. package/lib/SystemMessage.js.map +1 -0
  166. package/lib/Time.d.ts +12 -0
  167. package/lib/Time.d.ts.map +1 -0
  168. package/lib/Time.js +38 -0
  169. package/lib/Time.js.map +1 -0
  170. package/lib/TypingIndicator/index.d.ts +5 -0
  171. package/lib/TypingIndicator/index.d.ts.map +1 -0
  172. package/lib/TypingIndicator/index.js +94 -0
  173. package/lib/TypingIndicator/index.js.map +1 -0
  174. package/lib/TypingIndicator/styles.d.ts +21 -0
  175. package/lib/TypingIndicator/styles.d.ts.map +1 -0
  176. package/lib/TypingIndicator/styles.js +22 -0
  177. package/lib/TypingIndicator/styles.js.map +1 -0
  178. package/lib/TypingIndicator/types.d.ts +6 -0
  179. package/lib/TypingIndicator/types.d.ts.map +1 -0
  180. package/lib/TypingIndicator/types.js +2 -0
  181. package/lib/TypingIndicator/types.js.map +1 -0
  182. package/lib/components/MessageReply.d.ts +29 -0
  183. package/lib/components/MessageReply.d.ts.map +1 -0
  184. package/lib/components/MessageReply.js +87 -0
  185. package/lib/components/MessageReply.js.map +1 -0
  186. package/lib/components/ReplyPreview.d.ts +17 -0
  187. package/lib/components/ReplyPreview.d.ts.map +1 -0
  188. package/lib/components/ReplyPreview.js +148 -0
  189. package/lib/components/ReplyPreview.js.map +1 -0
  190. package/lib/components/TouchableOpacity.d.ts +9 -0
  191. package/lib/components/TouchableOpacity.d.ts.map +1 -0
  192. package/lib/components/TouchableOpacity.js +47 -0
  193. package/lib/components/TouchableOpacity.js.map +1 -0
  194. package/lib/hooks/useColorScheme.d.ts +8 -0
  195. package/lib/hooks/useColorScheme.d.ts.map +1 -0
  196. package/lib/hooks/useColorScheme.js +17 -0
  197. package/lib/hooks/useColorScheme.js.map +1 -0
  198. package/lib/hooks/useUpdateLayoutEffect.d.ts +9 -0
  199. package/lib/hooks/useUpdateLayoutEffect.d.ts.map +1 -0
  200. package/lib/hooks/useUpdateLayoutEffect.js +17 -0
  201. package/lib/hooks/useUpdateLayoutEffect.js.map +1 -0
  202. package/lib/index.d.ts +31 -0
  203. package/lib/index.d.ts.map +1 -0
  204. package/lib/index.js +31 -0
  205. package/lib/index.js.map +1 -0
  206. package/lib/linkParser.d.ts +39 -0
  207. package/lib/linkParser.d.ts.map +1 -0
  208. package/lib/linkParser.js +154 -0
  209. package/lib/linkParser.js.map +1 -0
  210. package/lib/logging.d.ts +3 -0
  211. package/lib/logging.d.ts.map +1 -0
  212. package/lib/logging.js +5 -0
  213. package/lib/logging.js.map +1 -0
  214. package/lib/styles.d.ts +14 -0
  215. package/lib/styles.d.ts.map +1 -0
  216. package/lib/styles.js +23 -0
  217. package/lib/styles.js.map +1 -0
  218. package/lib/types.d.ts +19 -0
  219. package/lib/types.d.ts.map +1 -0
  220. package/lib/types.js +2 -0
  221. package/lib/types.js.map +1 -0
  222. package/lib/utils.d.ts +8 -0
  223. package/lib/utils.d.ts.map +1 -0
  224. package/lib/utils.js +105 -0
  225. package/lib/utils.js.map +1 -0
  226. package/package.json +43 -41
  227. package/src/Actions.tsx +0 -110
  228. package/src/Avatar.tsx +0 -169
  229. package/src/Bubble/index.tsx +0 -407
  230. package/src/Bubble/styles.ts +0 -66
  231. package/src/Bubble/types.ts +0 -104
  232. package/src/Color.ts +0 -17
  233. package/src/Composer.tsx +0 -100
  234. package/src/Constant.ts +0 -8
  235. package/src/Day/index.tsx +0 -63
  236. package/src/Day/styles.ts +0 -22
  237. package/src/Day/types.ts +0 -15
  238. package/src/GiftedAvatar.tsx +0 -187
  239. package/src/GiftedChat/index.tsx +0 -397
  240. package/src/GiftedChat/styles.ts +0 -13
  241. package/src/GiftedChat/types.ts +0 -156
  242. package/src/GiftedChatContext.ts +0 -25
  243. package/src/InputToolbar.tsx +0 -177
  244. package/src/LoadEarlierMessages.tsx +0 -94
  245. package/src/Message/index.tsx +0 -273
  246. package/src/Message/styles.ts +0 -18
  247. package/src/Message/types.ts +0 -26
  248. package/src/MessageAudio.tsx +0 -29
  249. package/src/MessageImage.tsx +0 -251
  250. package/src/MessageReply.tsx +0 -160
  251. package/src/MessageText.tsx +0 -111
  252. package/src/MessageVideo.tsx +0 -29
  253. package/src/MessagesContainer/components/DayAnimated/index.tsx +0 -151
  254. package/src/MessagesContainer/components/DayAnimated/styles.ts +0 -12
  255. package/src/MessagesContainer/components/DayAnimated/types.ts +0 -12
  256. package/src/MessagesContainer/components/Item/index.tsx +0 -197
  257. package/src/MessagesContainer/components/Item/types.ts +0 -13
  258. package/src/MessagesContainer/index.tsx +0 -434
  259. package/src/MessagesContainer/styles.ts +0 -42
  260. package/src/MessagesContainer/types.ts +0 -102
  261. package/src/Models.ts +0 -66
  262. package/src/QuickReplies.tsx +0 -181
  263. package/src/Reply/index.ts +0 -1
  264. package/src/Reply/types.ts +0 -80
  265. package/src/ReplyPreview.tsx +0 -132
  266. package/src/Send.tsx +0 -115
  267. package/src/SystemMessage.tsx +0 -79
  268. package/src/Time.tsx +0 -64
  269. package/src/TypingIndicator/index.tsx +0 -155
  270. package/src/TypingIndicator/styles.ts +0 -22
  271. package/src/TypingIndicator/types.ts +0 -6
  272. package/src/__tests__/Actions.test.tsx +0 -9
  273. package/src/__tests__/Avatar.test.tsx +0 -17
  274. package/src/__tests__/Bubble.test.tsx +0 -17
  275. package/src/__tests__/Color.test.tsx +0 -5
  276. package/src/__tests__/Composer.test.tsx +0 -10
  277. package/src/__tests__/Constant.test.tsx +0 -5
  278. package/src/__tests__/Day.test.tsx +0 -20
  279. package/src/__tests__/DayAnimated.test.tsx +0 -46
  280. package/src/__tests__/GiftedAvatar.test.tsx +0 -10
  281. package/src/__tests__/GiftedChat.test.tsx +0 -60
  282. package/src/__tests__/InputToolbar.test.tsx +0 -10
  283. package/src/__tests__/LoadEarlier.test.tsx +0 -10
  284. package/src/__tests__/Message.test.tsx +0 -67
  285. package/src/__tests__/MessageImage.test.tsx +0 -24
  286. package/src/__tests__/MessageReply.test.tsx +0 -54
  287. package/src/__tests__/MessageText.test.tsx +0 -15
  288. package/src/__tests__/MessagesContainer.test.tsx +0 -38
  289. package/src/__tests__/ReplyPreview.test.tsx +0 -41
  290. package/src/__tests__/Send.test.tsx +0 -21
  291. package/src/__tests__/SystemMessage.test.tsx +0 -24
  292. package/src/__tests__/Time.test.tsx +0 -26
  293. package/src/__tests__/__snapshots__/Actions.test.tsx.snap +0 -40
  294. package/src/__tests__/__snapshots__/Avatar.test.tsx.snap +0 -17
  295. package/src/__tests__/__snapshots__/Bubble.test.tsx.snap +0 -121
  296. package/src/__tests__/__snapshots__/Color.test.tsx.snap +0 -21
  297. package/src/__tests__/__snapshots__/Composer.test.tsx.snap +0 -51
  298. package/src/__tests__/__snapshots__/Constant.test.tsx.snap +0 -13
  299. package/src/__tests__/__snapshots__/Day.test.tsx.snap +0 -99
  300. package/src/__tests__/__snapshots__/DayAnimated.test.tsx.snap +0 -5
  301. package/src/__tests__/__snapshots__/GiftedAvatar.test.tsx.snap +0 -24
  302. package/src/__tests__/__snapshots__/GiftedChat.test.tsx.snap +0 -184
  303. package/src/__tests__/__snapshots__/InputToolbar.test.tsx.snap +0 -123
  304. package/src/__tests__/__snapshots__/LoadEarlier.test.tsx.snap +0 -33
  305. package/src/__tests__/__snapshots__/Message.test.tsx.snap +0 -510
  306. package/src/__tests__/__snapshots__/MessageImage.test.tsx.snap +0 -203
  307. package/src/__tests__/__snapshots__/MessageReply.test.tsx.snap +0 -181
  308. package/src/__tests__/__snapshots__/MessageText.test.tsx.snap +0 -29
  309. package/src/__tests__/__snapshots__/ReplyPreview.test.tsx.snap +0 -349
  310. package/src/__tests__/__snapshots__/Send.test.tsx.snap +0 -148
  311. package/src/__tests__/__snapshots__/SystemMessage.test.tsx.snap +0 -77
  312. package/src/__tests__/__snapshots__/Time.test.tsx.snap +0 -22
  313. package/src/__tests__/data.ts +0 -8
  314. package/src/__tests__/utils.test.ts +0 -31
  315. package/src/components/MessageReply.tsx +0 -156
  316. package/src/components/ReplyPreview.tsx +0 -230
  317. package/src/components/TouchableOpacity.tsx +0 -67
  318. package/src/hooks/useColorScheme.ts +0 -18
  319. package/src/hooks/useUpdateLayoutEffect.ts +0 -21
  320. package/src/index.ts +0 -29
  321. package/src/linkParser.tsx +0 -255
  322. package/src/logging.ts +0 -8
  323. package/src/styles.ts +0 -25
  324. package/src/types.ts +0 -25
  325. 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
- })