react-native-gifted-chat 3.3.0 → 3.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/CHANGELOG.md +435 -0
  2. package/README.md +68 -12
  3. package/lib/Actions.d.ts +16 -0
  4. package/lib/Actions.d.ts.map +1 -0
  5. package/lib/Actions.js +65 -0
  6. package/lib/Actions.js.map +1 -0
  7. package/lib/Avatar.d.ts +19 -0
  8. package/lib/Avatar.d.ts.map +1 -0
  9. package/lib/Avatar.js +93 -0
  10. package/lib/Avatar.js.map +1 -0
  11. package/lib/Bubble/index.d.ts +6 -0
  12. package/lib/Bubble/index.d.ts.map +1 -0
  13. package/lib/Bubble/index.js +269 -0
  14. package/lib/Bubble/index.js.map +1 -0
  15. package/lib/Bubble/styles.d.ts +57 -0
  16. package/lib/Bubble/styles.d.ts.map +1 -0
  17. package/lib/Bubble/styles.js +59 -0
  18. package/lib/Bubble/styles.js.map +1 -0
  19. package/lib/Bubble/types.d.ts +59 -0
  20. package/lib/Bubble/types.d.ts.map +1 -0
  21. package/lib/Bubble/types.js +2 -0
  22. package/lib/Bubble/types.js.map +1 -0
  23. package/lib/Color.d.ts +18 -0
  24. package/lib/Color.d.ts.map +1 -0
  25. package/lib/Color.js +18 -0
  26. package/lib/Color.js.map +1 -0
  27. package/lib/Composer.d.ts +9 -0
  28. package/lib/Composer.d.ts.map +1 -0
  29. package/lib/Composer.js +56 -0
  30. package/lib/Composer.js.map +1 -0
  31. package/lib/Constant.d.ts +8 -0
  32. package/lib/Constant.d.ts.map +1 -0
  33. package/lib/Constant.js +8 -0
  34. package/lib/Constant.js.map +1 -0
  35. package/lib/Day/index.d.ts +5 -0
  36. package/lib/Day/index.d.ts.map +1 -0
  37. package/lib/Day/index.js +40 -0
  38. package/lib/Day/index.js.map +1 -0
  39. package/lib/Day/styles.d.ts +21 -0
  40. package/lib/Day/styles.d.ts.map +1 -0
  41. package/lib/Day/styles.js +22 -0
  42. package/lib/Day/styles.js.map +1 -0
  43. package/lib/Day/types.d.ts +11 -0
  44. package/lib/Day/types.d.ts.map +1 -0
  45. package/lib/Day/types.js +2 -0
  46. package/lib/Day/types.js.map +1 -0
  47. package/lib/GiftedAvatar.d.ts +12 -0
  48. package/lib/GiftedAvatar.d.ts.map +1 -0
  49. package/lib/GiftedAvatar.js +101 -0
  50. package/lib/GiftedAvatar.js.map +1 -0
  51. package/lib/GiftedChat/index.d.ts +10 -0
  52. package/lib/GiftedChat/index.d.ts.map +1 -0
  53. package/lib/GiftedChat/index.js +241 -0
  54. package/lib/GiftedChat/index.js.map +1 -0
  55. package/lib/GiftedChat/styles.d.ts +13 -0
  56. package/lib/GiftedChat/styles.d.ts.map +1 -0
  57. package/lib/GiftedChat/styles.js +13 -0
  58. package/lib/GiftedChat/styles.js.map +1 -0
  59. package/lib/GiftedChat/types.d.ts +90 -0
  60. package/lib/GiftedChat/types.d.ts.map +1 -0
  61. package/lib/GiftedChat/types.js +2 -0
  62. package/lib/GiftedChat/types.js.map +1 -0
  63. package/lib/GiftedChatContext.d.ts +11 -0
  64. package/lib/GiftedChatContext.d.ts.map +1 -0
  65. package/lib/GiftedChatContext.js +10 -0
  66. package/lib/GiftedChatContext.js.map +1 -0
  67. package/lib/InputToolbar.d.ts +36 -0
  68. package/lib/InputToolbar.d.ts.map +1 -0
  69. package/lib/InputToolbar.js +108 -0
  70. package/lib/InputToolbar.js.map +1 -0
  71. package/lib/LoadEarlierMessages.d.ts +17 -0
  72. package/lib/LoadEarlierMessages.d.ts.map +1 -0
  73. package/lib/LoadEarlierMessages.js +45 -0
  74. package/lib/LoadEarlierMessages.js.map +1 -0
  75. package/lib/Message/index.d.ts +6 -0
  76. package/lib/Message/index.d.ts.map +1 -0
  77. package/lib/Message/index.js +180 -0
  78. package/lib/Message/index.js.map +1 -0
  79. package/lib/Message/styles.d.ts +18 -0
  80. package/lib/Message/styles.d.ts.map +1 -0
  81. package/lib/Message/styles.js +18 -0
  82. package/lib/Message/styles.js.map +1 -0
  83. package/lib/Message/types.d.ts +25 -0
  84. package/lib/Message/types.d.ts.map +1 -0
  85. package/lib/Message/types.js +2 -0
  86. package/lib/Message/types.js.map +1 -0
  87. package/lib/MessageAudio.d.ts +3 -0
  88. package/lib/MessageAudio.d.ts.map +1 -0
  89. package/lib/MessageAudio.js +25 -0
  90. package/lib/MessageAudio.js.map +1 -0
  91. package/lib/MessageImage.d.ts +12 -0
  92. package/lib/MessageImage.d.ts.map +1 -0
  93. package/lib/MessageImage.js +164 -0
  94. package/lib/MessageImage.js.map +1 -0
  95. package/lib/MessageReply.d.ts +15 -0
  96. package/lib/MessageReply.d.ts.map +1 -0
  97. package/lib/MessageReply.js +103 -0
  98. package/lib/MessageReply.js.map +1 -0
  99. package/lib/MessageText.d.ts +24 -0
  100. package/lib/MessageText.d.ts.map +1 -0
  101. package/lib/MessageText.js +41 -0
  102. package/lib/MessageText.js.map +1 -0
  103. package/lib/MessageVideo.d.ts +3 -0
  104. package/lib/MessageVideo.d.ts.map +1 -0
  105. package/lib/MessageVideo.js +25 -0
  106. package/lib/MessageVideo.js.map +1 -0
  107. package/lib/MessagesContainer/components/DayAnimated/index.d.ts +5 -0
  108. package/lib/MessagesContainer/components/DayAnimated/index.d.ts.map +1 -0
  109. package/lib/MessagesContainer/components/DayAnimated/index.js +92 -0
  110. package/lib/MessagesContainer/components/DayAnimated/index.js.map +1 -0
  111. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts +12 -0
  112. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts.map +1 -0
  113. package/lib/MessagesContainer/components/DayAnimated/styles.js +12 -0
  114. package/lib/MessagesContainer/components/DayAnimated/styles.js.map +1 -0
  115. package/lib/MessagesContainer/components/DayAnimated/types.d.ts +18 -0
  116. package/lib/MessagesContainer/components/DayAnimated/types.d.ts.map +1 -0
  117. package/lib/MessagesContainer/components/DayAnimated/types.js +2 -0
  118. package/lib/MessagesContainer/components/DayAnimated/types.js.map +1 -0
  119. package/lib/MessagesContainer/components/Item/index.d.ts +23 -0
  120. package/lib/MessagesContainer/components/Item/index.d.ts.map +1 -0
  121. package/lib/MessagesContainer/components/Item/index.js +120 -0
  122. package/lib/MessagesContainer/components/Item/index.js.map +1 -0
  123. package/lib/MessagesContainer/components/Item/types.d.ts +19 -0
  124. package/lib/MessagesContainer/components/Item/types.d.ts.map +1 -0
  125. package/lib/MessagesContainer/components/Item/types.js +2 -0
  126. package/lib/MessagesContainer/components/Item/types.js.map +1 -0
  127. package/lib/MessagesContainer/index.d.ts +6 -0
  128. package/lib/MessagesContainer/index.d.ts.map +1 -0
  129. package/lib/MessagesContainer/index.js +258 -0
  130. package/lib/MessagesContainer/index.js.map +1 -0
  131. package/lib/MessagesContainer/styles.d.ts +55 -0
  132. package/lib/MessagesContainer/styles.d.ts.map +1 -0
  133. package/lib/MessagesContainer/styles.js +42 -0
  134. package/lib/MessagesContainer/styles.js.map +1 -0
  135. package/lib/MessagesContainer/types.d.ts +88 -0
  136. package/lib/MessagesContainer/types.d.ts.map +1 -0
  137. package/lib/MessagesContainer/types.js +10 -0
  138. package/lib/MessagesContainer/types.js.map +1 -0
  139. package/lib/Models.d.ts +58 -0
  140. package/lib/Models.d.ts.map +1 -0
  141. package/lib/Models.js +2 -0
  142. package/lib/Models.js.map +1 -0
  143. package/lib/QuickReplies.d.ts +16 -0
  144. package/lib/QuickReplies.d.ts.map +1 -0
  145. package/lib/QuickReplies.js +108 -0
  146. package/lib/QuickReplies.js.map +1 -0
  147. package/lib/Reply/index.d.ts +2 -0
  148. package/lib/Reply/index.d.ts.map +1 -0
  149. package/lib/Reply/index.js +2 -0
  150. package/lib/Reply/index.js.map +1 -0
  151. package/lib/Reply/types.d.ts +72 -0
  152. package/lib/Reply/types.d.ts.map +1 -0
  153. package/lib/Reply/types.js +2 -0
  154. package/lib/Reply/types.js.map +1 -0
  155. package/lib/ReplyPreview.d.ts +14 -0
  156. package/lib/ReplyPreview.d.ts.map +1 -0
  157. package/lib/ReplyPreview.js +95 -0
  158. package/lib/ReplyPreview.js.map +1 -0
  159. package/lib/Send.d.ts +19 -0
  160. package/lib/Send.d.ts.map +1 -0
  161. package/lib/Send.js +57 -0
  162. package/lib/Send.js.map +1 -0
  163. package/lib/SystemMessage.d.ts +14 -0
  164. package/lib/SystemMessage.d.ts.map +1 -0
  165. package/lib/SystemMessage.js +42 -0
  166. package/lib/SystemMessage.js.map +1 -0
  167. package/lib/Time.d.ts +12 -0
  168. package/lib/Time.d.ts.map +1 -0
  169. package/lib/Time.js +39 -0
  170. package/lib/Time.js.map +1 -0
  171. package/lib/TypingIndicator/index.d.ts +5 -0
  172. package/lib/TypingIndicator/index.d.ts.map +1 -0
  173. package/lib/TypingIndicator/index.js +94 -0
  174. package/lib/TypingIndicator/index.js.map +1 -0
  175. package/lib/TypingIndicator/styles.d.ts +21 -0
  176. package/lib/TypingIndicator/styles.d.ts.map +1 -0
  177. package/lib/TypingIndicator/styles.js +22 -0
  178. package/lib/TypingIndicator/styles.js.map +1 -0
  179. package/lib/TypingIndicator/types.d.ts +6 -0
  180. package/lib/TypingIndicator/types.d.ts.map +1 -0
  181. package/lib/TypingIndicator/types.js +2 -0
  182. package/lib/TypingIndicator/types.js.map +1 -0
  183. package/lib/components/MessageReply.d.ts +29 -0
  184. package/lib/components/MessageReply.d.ts.map +1 -0
  185. package/lib/components/MessageReply.js +87 -0
  186. package/lib/components/MessageReply.js.map +1 -0
  187. package/lib/components/ReplyPreview.d.ts +17 -0
  188. package/lib/components/ReplyPreview.d.ts.map +1 -0
  189. package/lib/components/ReplyPreview.js +148 -0
  190. package/lib/components/ReplyPreview.js.map +1 -0
  191. package/lib/components/TouchableOpacity.d.ts +9 -0
  192. package/lib/components/TouchableOpacity.d.ts.map +1 -0
  193. package/lib/components/TouchableOpacity.js +37 -0
  194. package/lib/components/TouchableOpacity.js.map +1 -0
  195. package/lib/hooks/useColorScheme.d.ts +8 -0
  196. package/lib/hooks/useColorScheme.d.ts.map +1 -0
  197. package/lib/hooks/useColorScheme.js +17 -0
  198. package/lib/hooks/useColorScheme.js.map +1 -0
  199. package/lib/hooks/useUpdateLayoutEffect.d.ts +9 -0
  200. package/lib/hooks/useUpdateLayoutEffect.d.ts.map +1 -0
  201. package/lib/hooks/useUpdateLayoutEffect.js +17 -0
  202. package/lib/hooks/useUpdateLayoutEffect.js.map +1 -0
  203. package/lib/index.d.ts +31 -0
  204. package/lib/index.d.ts.map +1 -0
  205. package/lib/index.js +31 -0
  206. package/lib/index.js.map +1 -0
  207. package/lib/linkParser.d.ts +39 -0
  208. package/lib/linkParser.d.ts.map +1 -0
  209. package/lib/linkParser.js +154 -0
  210. package/lib/linkParser.js.map +1 -0
  211. package/lib/logging.d.ts +3 -0
  212. package/lib/logging.d.ts.map +1 -0
  213. package/lib/logging.js +5 -0
  214. package/lib/logging.js.map +1 -0
  215. package/lib/styles.d.ts +14 -0
  216. package/lib/styles.d.ts.map +1 -0
  217. package/lib/styles.js +23 -0
  218. package/lib/styles.js.map +1 -0
  219. package/lib/types.d.ts +19 -0
  220. package/lib/types.d.ts.map +1 -0
  221. package/lib/types.js +2 -0
  222. package/lib/types.js.map +1 -0
  223. package/lib/utils.d.ts +8 -0
  224. package/lib/utils.d.ts.map +1 -0
  225. package/lib/utils.js +105 -0
  226. package/lib/utils.js.map +1 -0
  227. package/package.json +12 -11
  228. package/src/Actions.tsx +0 -110
  229. package/src/Avatar.tsx +0 -169
  230. package/src/Bubble/index.tsx +0 -407
  231. package/src/Bubble/styles.ts +0 -66
  232. package/src/Bubble/types.ts +0 -104
  233. package/src/Color.ts +0 -17
  234. package/src/Composer.tsx +0 -100
  235. package/src/Constant.ts +0 -8
  236. package/src/Day/index.tsx +0 -63
  237. package/src/Day/styles.ts +0 -22
  238. package/src/Day/types.ts +0 -15
  239. package/src/GiftedAvatar.tsx +0 -187
  240. package/src/GiftedChat/index.tsx +0 -420
  241. package/src/GiftedChat/styles.ts +0 -10
  242. package/src/GiftedChat/types.ts +0 -156
  243. package/src/GiftedChatContext.ts +0 -25
  244. package/src/InputToolbar.tsx +0 -177
  245. package/src/LoadEarlierMessages.tsx +0 -94
  246. package/src/Message/index.tsx +0 -273
  247. package/src/Message/styles.ts +0 -18
  248. package/src/Message/types.ts +0 -26
  249. package/src/MessageAudio.tsx +0 -29
  250. package/src/MessageImage.tsx +0 -251
  251. package/src/MessageReply.tsx +0 -160
  252. package/src/MessageText.tsx +0 -111
  253. package/src/MessageVideo.tsx +0 -29
  254. package/src/MessagesContainer/components/DayAnimated/index.tsx +0 -151
  255. package/src/MessagesContainer/components/DayAnimated/styles.ts +0 -12
  256. package/src/MessagesContainer/components/DayAnimated/types.ts +0 -12
  257. package/src/MessagesContainer/components/Item/index.tsx +0 -197
  258. package/src/MessagesContainer/components/Item/types.ts +0 -13
  259. package/src/MessagesContainer/index.tsx +0 -434
  260. package/src/MessagesContainer/styles.ts +0 -42
  261. package/src/MessagesContainer/types.ts +0 -102
  262. package/src/Models.ts +0 -66
  263. package/src/QuickReplies.tsx +0 -181
  264. package/src/Reply/index.ts +0 -1
  265. package/src/Reply/types.ts +0 -80
  266. package/src/ReplyPreview.tsx +0 -132
  267. package/src/Send.tsx +0 -115
  268. package/src/SystemMessage.tsx +0 -79
  269. package/src/Time.tsx +0 -64
  270. package/src/TypingIndicator/index.tsx +0 -155
  271. package/src/TypingIndicator/styles.ts +0 -22
  272. package/src/TypingIndicator/types.ts +0 -6
  273. package/src/__tests__/Actions.test.tsx +0 -9
  274. package/src/__tests__/Avatar.test.tsx +0 -17
  275. package/src/__tests__/Bubble.test.tsx +0 -17
  276. package/src/__tests__/Color.test.tsx +0 -5
  277. package/src/__tests__/Composer.test.tsx +0 -10
  278. package/src/__tests__/Constant.test.tsx +0 -5
  279. package/src/__tests__/Day.test.tsx +0 -20
  280. package/src/__tests__/DayAnimated.test.tsx +0 -46
  281. package/src/__tests__/GiftedAvatar.test.tsx +0 -10
  282. package/src/__tests__/GiftedChat.test.tsx +0 -60
  283. package/src/__tests__/InputToolbar.test.tsx +0 -10
  284. package/src/__tests__/LoadEarlier.test.tsx +0 -10
  285. package/src/__tests__/Message.test.tsx +0 -67
  286. package/src/__tests__/MessageImage.test.tsx +0 -24
  287. package/src/__tests__/MessageReply.test.tsx +0 -54
  288. package/src/__tests__/MessageText.test.tsx +0 -15
  289. package/src/__tests__/MessagesContainer.test.tsx +0 -38
  290. package/src/__tests__/ReplyPreview.test.tsx +0 -41
  291. package/src/__tests__/Send.test.tsx +0 -21
  292. package/src/__tests__/SystemMessage.test.tsx +0 -24
  293. package/src/__tests__/Time.test.tsx +0 -26
  294. package/src/__tests__/__snapshots__/Actions.test.tsx.snap +0 -40
  295. package/src/__tests__/__snapshots__/Avatar.test.tsx.snap +0 -17
  296. package/src/__tests__/__snapshots__/Bubble.test.tsx.snap +0 -121
  297. package/src/__tests__/__snapshots__/Color.test.tsx.snap +0 -21
  298. package/src/__tests__/__snapshots__/Composer.test.tsx.snap +0 -51
  299. package/src/__tests__/__snapshots__/Constant.test.tsx.snap +0 -13
  300. package/src/__tests__/__snapshots__/Day.test.tsx.snap +0 -99
  301. package/src/__tests__/__snapshots__/DayAnimated.test.tsx.snap +0 -5
  302. package/src/__tests__/__snapshots__/GiftedAvatar.test.tsx.snap +0 -24
  303. package/src/__tests__/__snapshots__/GiftedChat.test.tsx.snap +0 -169
  304. package/src/__tests__/__snapshots__/InputToolbar.test.tsx.snap +0 -145
  305. package/src/__tests__/__snapshots__/LoadEarlier.test.tsx.snap +0 -33
  306. package/src/__tests__/__snapshots__/Message.test.tsx.snap +0 -510
  307. package/src/__tests__/__snapshots__/MessageImage.test.tsx.snap +0 -293
  308. package/src/__tests__/__snapshots__/MessageReply.test.tsx.snap +0 -181
  309. package/src/__tests__/__snapshots__/MessageText.test.tsx.snap +0 -29
  310. package/src/__tests__/__snapshots__/ReplyPreview.test.tsx.snap +0 -403
  311. package/src/__tests__/__snapshots__/Send.test.tsx.snap +0 -214
  312. package/src/__tests__/__snapshots__/SystemMessage.test.tsx.snap +0 -77
  313. package/src/__tests__/__snapshots__/Time.test.tsx.snap +0 -22
  314. package/src/__tests__/data.ts +0 -8
  315. package/src/__tests__/utils.test.ts +0 -31
  316. package/src/components/MessageReply.tsx +0 -156
  317. package/src/components/ReplyPreview.tsx +0 -230
  318. package/src/components/TouchableOpacity.tsx +0 -67
  319. package/src/hooks/useColorScheme.ts +0 -18
  320. package/src/hooks/useUpdateLayoutEffect.ts +0 -21
  321. package/src/index.ts +0 -29
  322. package/src/linkParser.tsx +0 -255
  323. package/src/logging.ts +0 -8
  324. package/src/styles.ts +0 -25
  325. package/src/types.ts +0 -25
  326. package/src/utils.ts +0 -134
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,420 +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
- Platform,
12
- View,
13
- LayoutChangeEvent,
14
- useColorScheme,
15
- } from 'react-native'
16
- import {
17
- ActionSheetProvider,
18
- ActionSheetProviderRef,
19
- } from '@expo/react-native-action-sheet'
20
- import dayjs from 'dayjs'
21
- import localizedFormat from 'dayjs/plugin/localizedFormat'
22
- import { GestureHandlerRootView, TextInput } from 'react-native-gesture-handler'
23
- import { KeyboardAvoidingView, KeyboardProvider } from 'react-native-keyboard-controller'
24
- import { SafeAreaProvider } from 'react-native-safe-area-context'
25
- import { TEST_ID } from '../Constant'
26
- import { GiftedChatContext } from '../GiftedChatContext'
27
- import { InputToolbar } from '../InputToolbar'
28
- import { MessagesContainer, AnimatedList } from '../MessagesContainer'
29
- import { IMessage, ReplyMessage } from '../Models'
30
- import stylesCommon from '../styles'
31
- import { renderComponentOrElement } from '../utils'
32
- import styles from './styles'
33
- import { GiftedChatProps } from './types'
34
-
35
- dayjs.extend(localizedFormat)
36
-
37
- /**
38
- * Default keyboard vertical offset values (similar to Stream Chat SDK)
39
- * iOS: Compensates for predictive/suggestion text bar (~44-50pt) and headers
40
- * Android: Negative offset to account for navigation bar in edge-to-edge mode
41
- */
42
- const DEFAULT_KEYBOARD_VERTICAL_OFFSET = Platform.select({
43
- ios: 50,
44
- android: 0,
45
- default: 0,
46
- })
47
-
48
- const DEFAULT_KEYBOARD_BEHAVIOR = Platform.select({
49
- ios: 'padding' as const,
50
- android: 'padding' as const,
51
- default: 'padding' as const,
52
- })
53
-
54
- function GiftedChat<TMessage extends IMessage = IMessage> (
55
- props: GiftedChatProps<TMessage>
56
- ) {
57
- const {
58
- messages = [],
59
- initialText = '',
60
- isTyping,
61
-
62
- // "random" function from here: https://stackoverflow.com/a/8084248/3452513
63
- // we do not use uuid since it would add extra native dependency (https://www.npmjs.com/package/react-native-get-random-values)
64
- // lib's user can decide which algorithm to use and pass it as a prop
65
- messageIdGenerator = () => (Math.random() + 1).toString(36).substring(7),
66
-
67
- user = {},
68
- onSend,
69
- locale = 'en',
70
- colorScheme: colorSchemeProp,
71
- renderLoading,
72
- actionSheet,
73
- textInputProps,
74
- renderChatFooter,
75
- renderInputToolbar,
76
- isInverted = true,
77
-
78
- // Reply props
79
- reply,
80
- } = props
81
-
82
- // Extract reply props for internal use
83
- const replyMessageProp = reply?.message
84
- const onClearReply = reply?.onClear
85
- const onSwipeToReply = reply?.swipe?.onSwipe
86
- const renderReplyPreview = reply?.renderPreview
87
- const replyPreviewContainerStyle = reply?.previewStyle?.containerStyle
88
- const replyPreviewTextStyle = reply?.previewStyle?.textStyle
89
-
90
- const systemColorScheme = useColorScheme()
91
- const colorScheme = colorSchemeProp !== undefined ? colorSchemeProp : systemColorScheme
92
-
93
- const actionSheetRef = useRef<ActionSheetProviderRef>(null)
94
-
95
- const messagesContainerRef = useMemo(
96
- () => props.messagesContainerRef || createRef<AnimatedList<TMessage>>(),
97
- [props.messagesContainerRef]
98
- ) as RefObject<AnimatedList<TMessage>>
99
-
100
- const textInputRef = useMemo(
101
- () => props.textInputRef || createRef<TextInput>(),
102
- [props.textInputRef]
103
- )
104
-
105
- const [isInitialized, setIsInitialized] = useState<boolean>(false)
106
- const [text, setText] = useState<string | undefined>(() => props.text || '')
107
- const [internalReplyMessage, setInternalReplyMessage] = useState<ReplyMessage | null>(null)
108
-
109
- // Use controlled or uncontrolled reply state
110
- const replyMessage = replyMessageProp !== undefined ? replyMessageProp : internalReplyMessage
111
-
112
- const getTextFromProp = useCallback(
113
- (fallback: string) => {
114
- if (props.text === undefined)
115
- return fallback
116
-
117
- return props.text
118
- },
119
- [props.text]
120
- )
121
-
122
- const scrollToBottom = useCallback(
123
- (isAnimated = true) => {
124
- if (!messagesContainerRef?.current)
125
- return
126
-
127
- if (isInverted) {
128
- messagesContainerRef.current.scrollToOffset({
129
- offset: 0,
130
- animated: isAnimated,
131
- })
132
- return
133
- }
134
-
135
- messagesContainerRef.current.scrollToEnd({ animated: isAnimated })
136
- },
137
- [isInverted, messagesContainerRef]
138
- )
139
-
140
- const handleSwipeToReply = useCallback(
141
- (message: TMessage) => {
142
- if (replyMessageProp === undefined)
143
- // Uncontrolled mode: manage state internally
144
- setInternalReplyMessage({
145
- _id: message._id,
146
- text: message.text,
147
- user: message.user,
148
- image: message.image,
149
- audio: message.audio,
150
- })
151
-
152
- onSwipeToReply?.(message)
153
- },
154
- [replyMessageProp, onSwipeToReply]
155
- )
156
-
157
- const clearReply = useCallback(() => {
158
- if (replyMessageProp === undefined)
159
- // Uncontrolled mode: manage state internally
160
- setInternalReplyMessage(null)
161
-
162
- onClearReply?.()
163
- }, [replyMessageProp, onClearReply])
164
-
165
- const renderMessages = useMemo(() => {
166
- if (!isInitialized)
167
- return null
168
-
169
- const { messagesContainerStyle, ...messagesContainerProps } = props
170
-
171
- return (
172
- <View style={[stylesCommon.fill, messagesContainerStyle]}>
173
- <MessagesContainer<TMessage>
174
- {...messagesContainerProps}
175
- isInverted={isInverted}
176
- messages={messages}
177
- forwardRef={messagesContainerRef}
178
- isTyping={isTyping}
179
- reply={{
180
- ...reply,
181
- swipe: reply?.swipe ? {
182
- ...reply.swipe,
183
- onSwipe: handleSwipeToReply,
184
- } : undefined,
185
- }}
186
- />
187
- {renderComponentOrElement(renderChatFooter, {})}
188
- </View>
189
- )
190
- }, [
191
- isInitialized,
192
- isTyping,
193
- messages,
194
- props,
195
- isInverted,
196
- messagesContainerRef,
197
- renderChatFooter,
198
- reply,
199
- handleSwipeToReply,
200
- ])
201
-
202
- const notifyInputTextReset = useCallback(() => {
203
- props.textInputProps?.onChangeText?.('')
204
- }, [props.textInputProps])
205
-
206
- const resetInputToolbar = useCallback(() => {
207
- textInputRef.current?.clear()
208
-
209
- notifyInputTextReset()
210
-
211
- setText(getTextFromProp(''))
212
- }, [
213
- getTextFromProp,
214
- textInputRef,
215
- notifyInputTextReset,
216
- ])
217
-
218
- const _onSend = useCallback(
219
- (messages: TMessage[] = [], shouldResetInputToolbar = false) => {
220
- if (!Array.isArray(messages))
221
- messages = [messages]
222
-
223
- const newMessages: TMessage[] = messages.map(message => {
224
- return {
225
- ...message,
226
- user: user!,
227
- createdAt: new Date(),
228
- _id: messageIdGenerator?.(),
229
- // Attach reply message if exists
230
- ...(replyMessage ? { replyMessage } : {}),
231
- }
232
- })
233
-
234
- if (shouldResetInputToolbar === true)
235
- resetInputToolbar()
236
-
237
- // Clear reply after sending
238
- clearReply()
239
-
240
- onSend?.(newMessages)
241
-
242
- setTimeout(() => scrollToBottom(), 10)
243
- },
244
- [messageIdGenerator, onSend, user, resetInputToolbar, scrollToBottom, replyMessage, clearReply]
245
- )
246
-
247
- const _onChangeText = useCallback(
248
- (text: string) => {
249
- props.textInputProps?.onChangeText?.(text)
250
-
251
- // Only set state if it's not being overridden by a prop.
252
- if (props.text === undefined)
253
- setText(text)
254
- },
255
- [props.text, props.textInputProps]
256
- )
257
-
258
- const onInitialLayoutViewLayout = useCallback(
259
- (e: LayoutChangeEvent) => {
260
- if (isInitialized)
261
- return
262
-
263
- const { layout } = e.nativeEvent
264
-
265
- if (layout.height <= 0)
266
- return
267
-
268
- notifyInputTextReset()
269
-
270
- setIsInitialized(true)
271
- setText(getTextFromProp(initialText))
272
- },
273
- [isInitialized, initialText, notifyInputTextReset, getTextFromProp]
274
- )
275
-
276
- const inputToolbarFragment = useMemo(() => {
277
- if (!isInitialized)
278
- return null
279
-
280
- const inputToolbarProps = {
281
- ...props,
282
- text: getTextFromProp(text!),
283
- onSend: _onSend,
284
- textInputProps: {
285
- ...textInputProps,
286
- onChangeText: _onChangeText,
287
- ref: textInputRef,
288
- },
289
- // Reply preview props
290
- replyMessage,
291
- onClearReply: clearReply,
292
- renderReplyPreview,
293
- replyPreviewContainerStyle,
294
- replyPreviewTextStyle,
295
- }
296
-
297
- if (renderInputToolbar)
298
- return renderComponentOrElement(renderInputToolbar, inputToolbarProps)
299
-
300
- return <InputToolbar {...inputToolbarProps} />
301
- }, [
302
- isInitialized,
303
- _onSend,
304
- getTextFromProp,
305
- props,
306
- text,
307
- renderInputToolbar,
308
- textInputRef,
309
- textInputProps,
310
- _onChangeText,
311
- replyMessage,
312
- clearReply,
313
- renderReplyPreview,
314
- replyPreviewContainerStyle,
315
- replyPreviewTextStyle,
316
- ])
317
-
318
- const contextValues = useMemo(
319
- () => ({
320
- actionSheet:
321
- actionSheet ||
322
- (() => ({
323
- showActionSheetWithOptions:
324
- actionSheetRef.current!.showActionSheetWithOptions,
325
- })),
326
- getLocale: () => locale,
327
- getColorScheme: () => colorScheme,
328
- }),
329
- [actionSheet, locale, colorScheme]
330
- )
331
-
332
- useEffect(() => {
333
- if (props.text != null)
334
- setText(props.text)
335
- }, [props.text])
336
-
337
- return (
338
- <GiftedChatContext.Provider value={contextValues}>
339
- <ActionSheetProvider ref={actionSheetRef}>
340
- <View
341
- testID={TEST_ID.WRAPPER}
342
- style={[stylesCommon.fill, styles.contentContainer]}
343
- onLayout={onInitialLayoutViewLayout}
344
- >
345
- {/* @ts-expect-error */}
346
- <KeyboardAvoidingView
347
- behavior={DEFAULT_KEYBOARD_BEHAVIOR}
348
- keyboardVerticalOffset={DEFAULT_KEYBOARD_VERTICAL_OFFSET}
349
- style={stylesCommon.fill}
350
- {...props.keyboardAvoidingViewProps}
351
- >
352
- <View style={stylesCommon.fill}>
353
- {isInitialized
354
- ? (
355
- <>
356
- {renderMessages}
357
- {inputToolbarFragment}
358
- </>
359
- )
360
- : (
361
- renderComponentOrElement(renderLoading, {})
362
- )}
363
- </View>
364
- </KeyboardAvoidingView>
365
- </View>
366
- </ActionSheetProvider>
367
- </GiftedChatContext.Provider>
368
- )
369
- }
370
-
371
- function GiftedChatWrapper<TMessage extends IMessage = IMessage> (props: GiftedChatProps<TMessage>) {
372
- const {
373
- keyboardProviderProps,
374
- ...rest
375
- } = props
376
-
377
- return (
378
- <GestureHandlerRootView style={styles.fill}>
379
- <SafeAreaProvider>
380
- <KeyboardProvider
381
- statusBarTranslucent
382
- navigationBarTranslucent
383
- {...keyboardProviderProps}
384
- >
385
- <GiftedChat<TMessage> {...rest} />
386
- </KeyboardProvider>
387
- </SafeAreaProvider>
388
- </GestureHandlerRootView>
389
- )
390
- }
391
-
392
- GiftedChatWrapper.append = <TMessage extends IMessage>(
393
- currentMessages: TMessage[] = [],
394
- messages: TMessage[],
395
- isInverted = true
396
- ) => {
397
- if (!Array.isArray(messages))
398
- messages = [messages]
399
-
400
- return isInverted
401
- ? messages.concat(currentMessages)
402
- : currentMessages.concat(messages)
403
- }
404
-
405
- GiftedChatWrapper.prepend = <TMessage extends IMessage>(
406
- currentMessages: TMessage[] = [],
407
- messages: TMessage[],
408
- isInverted = true
409
- ) => {
410
- if (!Array.isArray(messages))
411
- messages = [messages]
412
-
413
- return isInverted
414
- ? currentMessages.concat(messages)
415
- : messages.concat(currentMessages)
416
- }
417
-
418
- export {
419
- GiftedChatWrapper as GiftedChat
420
- }
@@ -1,10 +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
- })