react-native-gifted-chat 3.3.0 → 3.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/CHANGELOG.md +435 -0
  2. package/README.md +68 -12
  3. package/lib/Actions.d.ts +16 -0
  4. package/lib/Actions.d.ts.map +1 -0
  5. package/lib/Actions.js +65 -0
  6. package/lib/Actions.js.map +1 -0
  7. package/lib/Avatar.d.ts +19 -0
  8. package/lib/Avatar.d.ts.map +1 -0
  9. package/lib/Avatar.js +93 -0
  10. package/lib/Avatar.js.map +1 -0
  11. package/lib/Bubble/index.d.ts +6 -0
  12. package/lib/Bubble/index.d.ts.map +1 -0
  13. package/lib/Bubble/index.js +269 -0
  14. package/lib/Bubble/index.js.map +1 -0
  15. package/lib/Bubble/styles.d.ts +57 -0
  16. package/lib/Bubble/styles.d.ts.map +1 -0
  17. package/lib/Bubble/styles.js +59 -0
  18. package/lib/Bubble/styles.js.map +1 -0
  19. package/lib/Bubble/types.d.ts +59 -0
  20. package/lib/Bubble/types.d.ts.map +1 -0
  21. package/lib/Bubble/types.js +2 -0
  22. package/lib/Bubble/types.js.map +1 -0
  23. package/lib/Color.d.ts +18 -0
  24. package/lib/Color.d.ts.map +1 -0
  25. package/lib/Color.js +18 -0
  26. package/lib/Color.js.map +1 -0
  27. package/lib/Composer.d.ts +9 -0
  28. package/lib/Composer.d.ts.map +1 -0
  29. package/lib/Composer.js +56 -0
  30. package/lib/Composer.js.map +1 -0
  31. package/lib/Constant.d.ts +8 -0
  32. package/lib/Constant.d.ts.map +1 -0
  33. package/lib/Constant.js +8 -0
  34. package/lib/Constant.js.map +1 -0
  35. package/lib/Day/index.d.ts +5 -0
  36. package/lib/Day/index.d.ts.map +1 -0
  37. package/lib/Day/index.js +40 -0
  38. package/lib/Day/index.js.map +1 -0
  39. package/lib/Day/styles.d.ts +21 -0
  40. package/lib/Day/styles.d.ts.map +1 -0
  41. package/lib/Day/styles.js +22 -0
  42. package/lib/Day/styles.js.map +1 -0
  43. package/lib/Day/types.d.ts +11 -0
  44. package/lib/Day/types.d.ts.map +1 -0
  45. package/lib/Day/types.js +2 -0
  46. package/lib/Day/types.js.map +1 -0
  47. package/lib/GiftedAvatar.d.ts +12 -0
  48. package/lib/GiftedAvatar.d.ts.map +1 -0
  49. package/lib/GiftedAvatar.js +101 -0
  50. package/lib/GiftedAvatar.js.map +1 -0
  51. package/lib/GiftedChat/index.d.ts +10 -0
  52. package/lib/GiftedChat/index.d.ts.map +1 -0
  53. package/lib/GiftedChat/index.js +241 -0
  54. package/lib/GiftedChat/index.js.map +1 -0
  55. package/lib/GiftedChat/styles.d.ts +13 -0
  56. package/lib/GiftedChat/styles.d.ts.map +1 -0
  57. package/lib/GiftedChat/styles.js +13 -0
  58. package/lib/GiftedChat/styles.js.map +1 -0
  59. package/lib/GiftedChat/types.d.ts +90 -0
  60. package/lib/GiftedChat/types.d.ts.map +1 -0
  61. package/lib/GiftedChat/types.js +2 -0
  62. package/lib/GiftedChat/types.js.map +1 -0
  63. package/lib/GiftedChatContext.d.ts +11 -0
  64. package/lib/GiftedChatContext.d.ts.map +1 -0
  65. package/lib/GiftedChatContext.js +10 -0
  66. package/lib/GiftedChatContext.js.map +1 -0
  67. package/lib/InputToolbar.d.ts +36 -0
  68. package/lib/InputToolbar.d.ts.map +1 -0
  69. package/lib/InputToolbar.js +108 -0
  70. package/lib/InputToolbar.js.map +1 -0
  71. package/lib/LoadEarlierMessages.d.ts +17 -0
  72. package/lib/LoadEarlierMessages.d.ts.map +1 -0
  73. package/lib/LoadEarlierMessages.js +45 -0
  74. package/lib/LoadEarlierMessages.js.map +1 -0
  75. package/lib/Message/index.d.ts +6 -0
  76. package/lib/Message/index.d.ts.map +1 -0
  77. package/lib/Message/index.js +180 -0
  78. package/lib/Message/index.js.map +1 -0
  79. package/lib/Message/styles.d.ts +18 -0
  80. package/lib/Message/styles.d.ts.map +1 -0
  81. package/lib/Message/styles.js +18 -0
  82. package/lib/Message/styles.js.map +1 -0
  83. package/lib/Message/types.d.ts +25 -0
  84. package/lib/Message/types.d.ts.map +1 -0
  85. package/lib/Message/types.js +2 -0
  86. package/lib/Message/types.js.map +1 -0
  87. package/lib/MessageAudio.d.ts +3 -0
  88. package/lib/MessageAudio.d.ts.map +1 -0
  89. package/lib/MessageAudio.js +25 -0
  90. package/lib/MessageAudio.js.map +1 -0
  91. package/lib/MessageImage.d.ts +12 -0
  92. package/lib/MessageImage.d.ts.map +1 -0
  93. package/lib/MessageImage.js +164 -0
  94. package/lib/MessageImage.js.map +1 -0
  95. package/lib/MessageReply.d.ts +15 -0
  96. package/lib/MessageReply.d.ts.map +1 -0
  97. package/lib/MessageReply.js +103 -0
  98. package/lib/MessageReply.js.map +1 -0
  99. package/lib/MessageText.d.ts +24 -0
  100. package/lib/MessageText.d.ts.map +1 -0
  101. package/lib/MessageText.js +41 -0
  102. package/lib/MessageText.js.map +1 -0
  103. package/lib/MessageVideo.d.ts +3 -0
  104. package/lib/MessageVideo.d.ts.map +1 -0
  105. package/lib/MessageVideo.js +25 -0
  106. package/lib/MessageVideo.js.map +1 -0
  107. package/lib/MessagesContainer/components/DayAnimated/index.d.ts +5 -0
  108. package/lib/MessagesContainer/components/DayAnimated/index.d.ts.map +1 -0
  109. package/lib/MessagesContainer/components/DayAnimated/index.js +92 -0
  110. package/lib/MessagesContainer/components/DayAnimated/index.js.map +1 -0
  111. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts +12 -0
  112. package/lib/MessagesContainer/components/DayAnimated/styles.d.ts.map +1 -0
  113. package/lib/MessagesContainer/components/DayAnimated/styles.js +12 -0
  114. package/lib/MessagesContainer/components/DayAnimated/styles.js.map +1 -0
  115. package/lib/MessagesContainer/components/DayAnimated/types.d.ts +18 -0
  116. package/lib/MessagesContainer/components/DayAnimated/types.d.ts.map +1 -0
  117. package/lib/MessagesContainer/components/DayAnimated/types.js +2 -0
  118. package/lib/MessagesContainer/components/DayAnimated/types.js.map +1 -0
  119. package/lib/MessagesContainer/components/Item/index.d.ts +23 -0
  120. package/lib/MessagesContainer/components/Item/index.d.ts.map +1 -0
  121. package/lib/MessagesContainer/components/Item/index.js +120 -0
  122. package/lib/MessagesContainer/components/Item/index.js.map +1 -0
  123. package/lib/MessagesContainer/components/Item/types.d.ts +19 -0
  124. package/lib/MessagesContainer/components/Item/types.d.ts.map +1 -0
  125. package/lib/MessagesContainer/components/Item/types.js +2 -0
  126. package/lib/MessagesContainer/components/Item/types.js.map +1 -0
  127. package/lib/MessagesContainer/index.d.ts +6 -0
  128. package/lib/MessagesContainer/index.d.ts.map +1 -0
  129. package/lib/MessagesContainer/index.js +258 -0
  130. package/lib/MessagesContainer/index.js.map +1 -0
  131. package/lib/MessagesContainer/styles.d.ts +55 -0
  132. package/lib/MessagesContainer/styles.d.ts.map +1 -0
  133. package/lib/MessagesContainer/styles.js +42 -0
  134. package/lib/MessagesContainer/styles.js.map +1 -0
  135. package/lib/MessagesContainer/types.d.ts +88 -0
  136. package/lib/MessagesContainer/types.d.ts.map +1 -0
  137. package/lib/MessagesContainer/types.js +10 -0
  138. package/lib/MessagesContainer/types.js.map +1 -0
  139. package/lib/Models.d.ts +58 -0
  140. package/lib/Models.d.ts.map +1 -0
  141. package/lib/Models.js +2 -0
  142. package/lib/Models.js.map +1 -0
  143. package/lib/QuickReplies.d.ts +16 -0
  144. package/lib/QuickReplies.d.ts.map +1 -0
  145. package/lib/QuickReplies.js +108 -0
  146. package/lib/QuickReplies.js.map +1 -0
  147. package/lib/Reply/index.d.ts +2 -0
  148. package/lib/Reply/index.d.ts.map +1 -0
  149. package/lib/Reply/index.js +2 -0
  150. package/lib/Reply/index.js.map +1 -0
  151. package/lib/Reply/types.d.ts +72 -0
  152. package/lib/Reply/types.d.ts.map +1 -0
  153. package/lib/Reply/types.js +2 -0
  154. package/lib/Reply/types.js.map +1 -0
  155. package/lib/ReplyPreview.d.ts +14 -0
  156. package/lib/ReplyPreview.d.ts.map +1 -0
  157. package/lib/ReplyPreview.js +95 -0
  158. package/lib/ReplyPreview.js.map +1 -0
  159. package/lib/Send.d.ts +19 -0
  160. package/lib/Send.d.ts.map +1 -0
  161. package/lib/Send.js +57 -0
  162. package/lib/Send.js.map +1 -0
  163. package/lib/SystemMessage.d.ts +14 -0
  164. package/lib/SystemMessage.d.ts.map +1 -0
  165. package/lib/SystemMessage.js +42 -0
  166. package/lib/SystemMessage.js.map +1 -0
  167. package/lib/Time.d.ts +12 -0
  168. package/lib/Time.d.ts.map +1 -0
  169. package/lib/Time.js +39 -0
  170. package/lib/Time.js.map +1 -0
  171. package/lib/TypingIndicator/index.d.ts +5 -0
  172. package/lib/TypingIndicator/index.d.ts.map +1 -0
  173. package/lib/TypingIndicator/index.js +94 -0
  174. package/lib/TypingIndicator/index.js.map +1 -0
  175. package/lib/TypingIndicator/styles.d.ts +21 -0
  176. package/lib/TypingIndicator/styles.d.ts.map +1 -0
  177. package/lib/TypingIndicator/styles.js +22 -0
  178. package/lib/TypingIndicator/styles.js.map +1 -0
  179. package/lib/TypingIndicator/types.d.ts +6 -0
  180. package/lib/TypingIndicator/types.d.ts.map +1 -0
  181. package/lib/TypingIndicator/types.js +2 -0
  182. package/lib/TypingIndicator/types.js.map +1 -0
  183. package/lib/components/MessageReply.d.ts +29 -0
  184. package/lib/components/MessageReply.d.ts.map +1 -0
  185. package/lib/components/MessageReply.js +87 -0
  186. package/lib/components/MessageReply.js.map +1 -0
  187. package/lib/components/ReplyPreview.d.ts +17 -0
  188. package/lib/components/ReplyPreview.d.ts.map +1 -0
  189. package/lib/components/ReplyPreview.js +148 -0
  190. package/lib/components/ReplyPreview.js.map +1 -0
  191. package/lib/components/TouchableOpacity.d.ts +9 -0
  192. package/lib/components/TouchableOpacity.d.ts.map +1 -0
  193. package/lib/components/TouchableOpacity.js +37 -0
  194. package/lib/components/TouchableOpacity.js.map +1 -0
  195. package/lib/hooks/useColorScheme.d.ts +8 -0
  196. package/lib/hooks/useColorScheme.d.ts.map +1 -0
  197. package/lib/hooks/useColorScheme.js +17 -0
  198. package/lib/hooks/useColorScheme.js.map +1 -0
  199. package/lib/hooks/useUpdateLayoutEffect.d.ts +9 -0
  200. package/lib/hooks/useUpdateLayoutEffect.d.ts.map +1 -0
  201. package/lib/hooks/useUpdateLayoutEffect.js +17 -0
  202. package/lib/hooks/useUpdateLayoutEffect.js.map +1 -0
  203. package/lib/index.d.ts +31 -0
  204. package/lib/index.d.ts.map +1 -0
  205. package/lib/index.js +31 -0
  206. package/lib/index.js.map +1 -0
  207. package/lib/linkParser.d.ts +39 -0
  208. package/lib/linkParser.d.ts.map +1 -0
  209. package/lib/linkParser.js +154 -0
  210. package/lib/linkParser.js.map +1 -0
  211. package/lib/logging.d.ts +3 -0
  212. package/lib/logging.d.ts.map +1 -0
  213. package/lib/logging.js +5 -0
  214. package/lib/logging.js.map +1 -0
  215. package/lib/styles.d.ts +14 -0
  216. package/lib/styles.d.ts.map +1 -0
  217. package/lib/styles.js +23 -0
  218. package/lib/styles.js.map +1 -0
  219. package/lib/types.d.ts +19 -0
  220. package/lib/types.d.ts.map +1 -0
  221. package/lib/types.js +2 -0
  222. package/lib/types.js.map +1 -0
  223. package/lib/utils.d.ts +8 -0
  224. package/lib/utils.d.ts.map +1 -0
  225. package/lib/utils.js +105 -0
  226. package/lib/utils.js.map +1 -0
  227. package/package.json +12 -11
  228. package/src/Actions.tsx +0 -110
  229. package/src/Avatar.tsx +0 -169
  230. package/src/Bubble/index.tsx +0 -407
  231. package/src/Bubble/styles.ts +0 -66
  232. package/src/Bubble/types.ts +0 -104
  233. package/src/Color.ts +0 -17
  234. package/src/Composer.tsx +0 -100
  235. package/src/Constant.ts +0 -8
  236. package/src/Day/index.tsx +0 -63
  237. package/src/Day/styles.ts +0 -22
  238. package/src/Day/types.ts +0 -15
  239. package/src/GiftedAvatar.tsx +0 -187
  240. package/src/GiftedChat/index.tsx +0 -420
  241. package/src/GiftedChat/styles.ts +0 -10
  242. package/src/GiftedChat/types.ts +0 -156
  243. package/src/GiftedChatContext.ts +0 -25
  244. package/src/InputToolbar.tsx +0 -177
  245. package/src/LoadEarlierMessages.tsx +0 -94
  246. package/src/Message/index.tsx +0 -273
  247. package/src/Message/styles.ts +0 -18
  248. package/src/Message/types.ts +0 -26
  249. package/src/MessageAudio.tsx +0 -29
  250. package/src/MessageImage.tsx +0 -251
  251. package/src/MessageReply.tsx +0 -160
  252. package/src/MessageText.tsx +0 -111
  253. package/src/MessageVideo.tsx +0 -29
  254. package/src/MessagesContainer/components/DayAnimated/index.tsx +0 -151
  255. package/src/MessagesContainer/components/DayAnimated/styles.ts +0 -12
  256. package/src/MessagesContainer/components/DayAnimated/types.ts +0 -12
  257. package/src/MessagesContainer/components/Item/index.tsx +0 -197
  258. package/src/MessagesContainer/components/Item/types.ts +0 -13
  259. package/src/MessagesContainer/index.tsx +0 -434
  260. package/src/MessagesContainer/styles.ts +0 -42
  261. package/src/MessagesContainer/types.ts +0 -102
  262. package/src/Models.ts +0 -66
  263. package/src/QuickReplies.tsx +0 -181
  264. package/src/Reply/index.ts +0 -1
  265. package/src/Reply/types.ts +0 -80
  266. package/src/ReplyPreview.tsx +0 -132
  267. package/src/Send.tsx +0 -115
  268. package/src/SystemMessage.tsx +0 -79
  269. package/src/Time.tsx +0 -64
  270. package/src/TypingIndicator/index.tsx +0 -155
  271. package/src/TypingIndicator/styles.ts +0 -22
  272. package/src/TypingIndicator/types.ts +0 -6
  273. package/src/__tests__/Actions.test.tsx +0 -9
  274. package/src/__tests__/Avatar.test.tsx +0 -17
  275. package/src/__tests__/Bubble.test.tsx +0 -17
  276. package/src/__tests__/Color.test.tsx +0 -5
  277. package/src/__tests__/Composer.test.tsx +0 -10
  278. package/src/__tests__/Constant.test.tsx +0 -5
  279. package/src/__tests__/Day.test.tsx +0 -20
  280. package/src/__tests__/DayAnimated.test.tsx +0 -46
  281. package/src/__tests__/GiftedAvatar.test.tsx +0 -10
  282. package/src/__tests__/GiftedChat.test.tsx +0 -60
  283. package/src/__tests__/InputToolbar.test.tsx +0 -10
  284. package/src/__tests__/LoadEarlier.test.tsx +0 -10
  285. package/src/__tests__/Message.test.tsx +0 -67
  286. package/src/__tests__/MessageImage.test.tsx +0 -24
  287. package/src/__tests__/MessageReply.test.tsx +0 -54
  288. package/src/__tests__/MessageText.test.tsx +0 -15
  289. package/src/__tests__/MessagesContainer.test.tsx +0 -38
  290. package/src/__tests__/ReplyPreview.test.tsx +0 -41
  291. package/src/__tests__/Send.test.tsx +0 -21
  292. package/src/__tests__/SystemMessage.test.tsx +0 -24
  293. package/src/__tests__/Time.test.tsx +0 -26
  294. package/src/__tests__/__snapshots__/Actions.test.tsx.snap +0 -40
  295. package/src/__tests__/__snapshots__/Avatar.test.tsx.snap +0 -17
  296. package/src/__tests__/__snapshots__/Bubble.test.tsx.snap +0 -121
  297. package/src/__tests__/__snapshots__/Color.test.tsx.snap +0 -21
  298. package/src/__tests__/__snapshots__/Composer.test.tsx.snap +0 -51
  299. package/src/__tests__/__snapshots__/Constant.test.tsx.snap +0 -13
  300. package/src/__tests__/__snapshots__/Day.test.tsx.snap +0 -99
  301. package/src/__tests__/__snapshots__/DayAnimated.test.tsx.snap +0 -5
  302. package/src/__tests__/__snapshots__/GiftedAvatar.test.tsx.snap +0 -24
  303. package/src/__tests__/__snapshots__/GiftedChat.test.tsx.snap +0 -169
  304. package/src/__tests__/__snapshots__/InputToolbar.test.tsx.snap +0 -145
  305. package/src/__tests__/__snapshots__/LoadEarlier.test.tsx.snap +0 -33
  306. package/src/__tests__/__snapshots__/Message.test.tsx.snap +0 -510
  307. package/src/__tests__/__snapshots__/MessageImage.test.tsx.snap +0 -293
  308. package/src/__tests__/__snapshots__/MessageReply.test.tsx.snap +0 -181
  309. package/src/__tests__/__snapshots__/MessageText.test.tsx.snap +0 -29
  310. package/src/__tests__/__snapshots__/ReplyPreview.test.tsx.snap +0 -403
  311. package/src/__tests__/__snapshots__/Send.test.tsx.snap +0 -214
  312. package/src/__tests__/__snapshots__/SystemMessage.test.tsx.snap +0 -77
  313. package/src/__tests__/__snapshots__/Time.test.tsx.snap +0 -22
  314. package/src/__tests__/data.ts +0 -8
  315. package/src/__tests__/utils.test.ts +0 -31
  316. package/src/components/MessageReply.tsx +0 -156
  317. package/src/components/ReplyPreview.tsx +0 -230
  318. package/src/components/TouchableOpacity.tsx +0 -67
  319. package/src/hooks/useColorScheme.ts +0 -18
  320. package/src/hooks/useUpdateLayoutEffect.ts +0 -21
  321. package/src/index.ts +0 -29
  322. package/src/linkParser.tsx +0 -255
  323. package/src/logging.ts +0 -8
  324. package/src/styles.ts +0 -25
  325. package/src/types.ts +0 -25
  326. package/src/utils.ts +0 -134
@@ -1,181 +0,0 @@
1
- import React, { useState, useMemo, useCallback } from 'react'
2
- import {
3
- StyleSheet,
4
- View,
5
- StyleProp,
6
- ViewStyle,
7
- TextStyle,
8
- } from 'react-native'
9
- import { Text } from 'react-native-gesture-handler'
10
- import { Color } from './Color'
11
- import { TouchableOpacity } from './components/TouchableOpacity'
12
- import { warning } from './logging'
13
- import { IMessage, Reply } from './Models'
14
- import stylesCommon from './styles'
15
-
16
- const styles = StyleSheet.create({
17
- container: {
18
- flexDirection: 'row',
19
- flexWrap: 'wrap',
20
- maxWidth: 300,
21
- },
22
- quickReply: {
23
- borderWidth: 1,
24
- maxWidth: 200,
25
- paddingVertical: 7,
26
- paddingHorizontal: 12,
27
- minHeight: 50,
28
- borderRadius: 13,
29
- margin: 3,
30
- },
31
- quickReplyText: {
32
- overflow: 'visible',
33
- },
34
- sendLink: {
35
- borderWidth: 0,
36
- },
37
- sendLinkText: {
38
- color: Color.defaultBlue,
39
- fontWeight: '600',
40
- fontSize: 17,
41
- },
42
- })
43
-
44
- export interface QuickRepliesProps<TMessage extends IMessage = IMessage> {
45
- nextMessage?: TMessage
46
- currentMessage: TMessage
47
- color?: string
48
- sendText?: string
49
- quickReplyStyle?: StyleProp<ViewStyle>
50
- quickReplyTextStyle?: StyleProp<TextStyle>
51
- quickReplyContainerStyle?: StyleProp<ViewStyle>
52
- onQuickReply?(reply: Reply[]): void
53
- renderQuickReplySend?(): React.ReactNode
54
- }
55
-
56
- const sameReply = (currentReply: Reply) => (reply: Reply) =>
57
- currentReply.value === reply.value
58
-
59
- const diffReply = (currentReply: Reply) => (reply: Reply) =>
60
- currentReply.value !== reply.value
61
-
62
- export function QuickReplies ({
63
- currentMessage,
64
- nextMessage,
65
- color = Color.peterRiver,
66
- quickReplyStyle,
67
- quickReplyTextStyle,
68
- quickReplyContainerStyle,
69
- onQuickReply,
70
- sendText = 'Send',
71
- renderQuickReplySend,
72
- }: QuickRepliesProps<IMessage>) {
73
- const { type } = currentMessage!.quickReplies!
74
- const [replies, setReplies] = useState<Reply[]>([])
75
-
76
- const shouldComponentDisplay = useMemo(() => {
77
- const hasReplies = !!currentMessage && !!currentMessage!.quickReplies
78
- const hasNext = !!nextMessage && !!nextMessage!._id
79
- const keepIt = currentMessage!.quickReplies!.keepIt
80
-
81
- if (hasReplies && !hasNext)
82
- return true
83
-
84
- if (hasReplies && hasNext && keepIt)
85
- return true
86
-
87
- return false
88
- }, [currentMessage, nextMessage])
89
-
90
- const handleSend = useCallback((repliesData: Reply[]) => () => {
91
- onQuickReply?.(
92
- repliesData.map((reply: Reply) => ({
93
- ...reply,
94
- messageId: currentMessage!._id,
95
- }))
96
- )
97
- }, [onQuickReply, currentMessage])
98
-
99
- const handlePress = useCallback(
100
- (reply: Reply) => () => {
101
- if (currentMessage) {
102
- const { type } = currentMessage.quickReplies!
103
- switch (type) {
104
- case 'radio': {
105
- handleSend([reply])()
106
- return
107
- }
108
- case 'checkbox': {
109
- if (replies.find(sameReply(reply)))
110
- setReplies(replies.filter(diffReply(reply)))
111
- else
112
- setReplies([...replies, reply])
113
-
114
- return
115
- }
116
- default: {
117
- warning(`onQuickReply unknown type: ${type}`)
118
- }
119
- }
120
- }
121
- },
122
- [replies, currentMessage, handleSend]
123
- )
124
-
125
- const renderSendButton = useMemo(() => {
126
- if (!replies.length)
127
- return null
128
-
129
- return (
130
- <TouchableOpacity
131
- style={[stylesCommon.centerItems, styles.quickReply, styles.sendLink]}
132
- onPress={handleSend(replies)}
133
- >
134
- {renderQuickReplySend?.() || (
135
- <Text style={styles.sendLinkText}>{sendText}</Text>
136
- )}
137
- </TouchableOpacity>
138
- )
139
- }, [replies, handleSend, renderQuickReplySend, sendText])
140
-
141
- if (!shouldComponentDisplay)
142
- return null
143
-
144
- return (
145
- <View style={[styles.container, quickReplyContainerStyle]}>
146
- {currentMessage!.quickReplies!.values.map(
147
- (reply: Reply, index: number) => {
148
- const selected =
149
- type === 'checkbox' && replies.find(sameReply(reply))
150
-
151
- return (
152
- <TouchableOpacity
153
- onPress={handlePress(reply)}
154
- style={[
155
- stylesCommon.centerItems,
156
- styles.quickReply,
157
- quickReplyStyle,
158
- { borderColor: color },
159
- selected && { backgroundColor: color },
160
- ]}
161
- key={`${reply.value}-${index}`}
162
- >
163
- <Text
164
- numberOfLines={10}
165
- ellipsizeMode='tail'
166
- style={[
167
- styles.quickReplyText,
168
- { color: selected ? Color.white : color },
169
- quickReplyTextStyle,
170
- ]}
171
- >
172
- {reply.title}
173
- </Text>
174
- </TouchableOpacity>
175
- )
176
- }
177
- )}
178
- {renderSendButton}
179
- </View>
180
- )
181
- }
@@ -1 +0,0 @@
1
- export * from './types'
@@ -1,80 +0,0 @@
1
- import { ImageStyle, StyleProp, TextStyle, ViewStyle } from 'react-native'
2
- import { SharedValue } from 'react-native-reanimated'
3
-
4
- import { MessageReplyProps } from '../components/MessageReply'
5
- import { ReplyPreviewProps } from '../components/ReplyPreview'
6
- import { IMessage, ReplyMessage } from '../Models'
7
-
8
- /**
9
- * Props for swipe-to-reply gesture behavior
10
- */
11
- export interface SwipeToReplyProps<TMessage extends IMessage> {
12
- /** Enable swipe to reply on messages; default is false */
13
- isEnabled?: boolean
14
- /** Direction to swipe for reply; default is 'left' (swipe left, icon appears on right) */
15
- direction?: 'left' | 'right'
16
- /** Callback when swipe to reply is triggered */
17
- onSwipe?: (message: TMessage) => void
18
- /** Custom render for swipe action indicator */
19
- renderAction?: (
20
- progress: SharedValue<number>,
21
- translation: SharedValue<number>,
22
- position: 'left' | 'right'
23
- ) => React.ReactNode
24
- /** Style for the swipe action container */
25
- actionContainerStyle?: StyleProp<ViewStyle>
26
- }
27
-
28
- /**
29
- * Props for reply preview shown above input toolbar
30
- */
31
- export interface ReplyPreviewStyleProps {
32
- /** Style for reply preview container */
33
- containerStyle?: StyleProp<ViewStyle>
34
- /** Style for reply preview text */
35
- textStyle?: StyleProp<TextStyle>
36
- /** Style for reply preview image */
37
- imageStyle?: StyleProp<ImageStyle>
38
- }
39
-
40
- /**
41
- * Props for message reply display inside bubble
42
- */
43
- export interface MessageReplyStyleProps {
44
- /** Style for message reply container */
45
- containerStyle?: StyleProp<ViewStyle>
46
- /** Style for message reply container on left side */
47
- containerStyleLeft?: StyleProp<ViewStyle>
48
- /** Style for message reply container on right side */
49
- containerStyleRight?: StyleProp<ViewStyle>
50
- /** Style for message reply image */
51
- imageStyle?: StyleProp<ImageStyle>
52
- /** Style for message reply text */
53
- textStyle?: StyleProp<TextStyle>
54
- /** Style for message reply text on left side */
55
- textStyleLeft?: StyleProp<TextStyle>
56
- /** Style for message reply text on right side */
57
- textStyleRight?: StyleProp<TextStyle>
58
- }
59
-
60
- /**
61
- * Grouped props for reply functionality
62
- */
63
- export interface ReplyProps<TMessage extends IMessage> {
64
- /** Reply message to show in input toolbar preview */
65
- message?: ReplyMessage | null
66
- /** Callback when reply is cleared */
67
- onClear?: () => void
68
- /** Callback when message reply is pressed inside bubble */
69
- onPress?: (replyMessage: ReplyMessage) => void
70
- /** Custom render for reply preview in input toolbar */
71
- renderPreview?: (props: ReplyPreviewProps) => React.ReactNode
72
- /** Custom render for message reply inside bubble */
73
- renderMessageReply?: (props: MessageReplyProps<TMessage>) => React.ReactNode
74
- /** Swipe-to-reply configuration */
75
- swipe?: SwipeToReplyProps<TMessage>
76
- /** Reply preview styling */
77
- previewStyle?: ReplyPreviewStyleProps
78
- /** Message reply styling */
79
- messageStyle?: MessageReplyStyleProps
80
- }
@@ -1,132 +0,0 @@
1
- import React, { useMemo } from 'react'
2
- import { StyleSheet, View, StyleProp, ViewStyle, TextStyle, Pressable } from 'react-native'
3
-
4
- import { Text } from 'react-native-gesture-handler'
5
- import { Color } from './Color'
6
- import { useColorScheme } from './hooks/useColorScheme'
7
- import { ReplyMessage } from './Models'
8
-
9
- export interface ReplyPreviewProps {
10
- replyMessage: ReplyMessage
11
- onClearReply: () => void
12
- containerStyle?: StyleProp<ViewStyle>
13
- usernameStyle?: StyleProp<TextStyle>
14
- textStyle?: StyleProp<TextStyle>
15
- clearButtonStyle?: StyleProp<ViewStyle>
16
- clearButtonTextStyle?: StyleProp<TextStyle>
17
- }
18
-
19
- export function ReplyPreview ({
20
- replyMessage,
21
- onClearReply,
22
- containerStyle,
23
- usernameStyle,
24
- textStyle,
25
- clearButtonStyle,
26
- clearButtonTextStyle,
27
- }: ReplyPreviewProps) {
28
- const colorScheme = useColorScheme()
29
-
30
- const containerStyles = useMemo(() => [
31
- styles.container,
32
- colorScheme === 'dark' && styles.container_dark,
33
- containerStyle,
34
- ], [colorScheme, containerStyle])
35
-
36
- const usernameStyles = useMemo(() => [
37
- styles.username,
38
- colorScheme === 'dark' && styles.username_dark,
39
- usernameStyle,
40
- ], [colorScheme, usernameStyle])
41
-
42
- const textStyles = useMemo(() => [
43
- styles.text,
44
- colorScheme === 'dark' && styles.text_dark,
45
- textStyle,
46
- ], [colorScheme, textStyle])
47
-
48
- return (
49
- <View style={containerStyles}>
50
- <View style={styles.border} />
51
- <View style={styles.content}>
52
- <Text
53
- style={usernameStyles}
54
- numberOfLines={1}
55
- >
56
- {replyMessage.user?.name || 'User'}
57
- </Text>
58
- <Text
59
- style={textStyles}
60
- numberOfLines={1}
61
- >
62
- {replyMessage.text || (replyMessage.image ? 'Photo' : (replyMessage.audio ? 'Audio' : 'Message'))}
63
- </Text>
64
- </View>
65
- <Pressable
66
- onPress={onClearReply}
67
- style={[styles.clearButton, clearButtonStyle]}
68
- hitSlop={8}
69
- >
70
- <Text style={[styles.clearButtonText, clearButtonTextStyle]}>
71
- {'✕'}
72
- </Text>
73
- </Pressable>
74
- </View>
75
- )
76
- }
77
-
78
- const styles = StyleSheet.create({
79
- container: {
80
- flexDirection: 'row',
81
- alignItems: 'center',
82
- paddingHorizontal: 10,
83
- paddingVertical: 8,
84
- backgroundColor: '#f5f5f5',
85
- borderBottomWidth: StyleSheet.hairlineWidth,
86
- borderBottomColor: Color.defaultColor,
87
- },
88
- container_dark: {
89
- backgroundColor: '#2a2a2a',
90
- borderBottomColor: '#444',
91
- },
92
- border: {
93
- width: 3,
94
- height: '100%',
95
- backgroundColor: Color.defaultBlue,
96
- borderRadius: 1.5,
97
- marginRight: 10,
98
- },
99
- content: {
100
- flex: 1,
101
- },
102
- username: {
103
- fontSize: 13,
104
- fontWeight: '600',
105
- color: Color.defaultBlue,
106
- marginBottom: 2,
107
- },
108
- username_dark: {
109
- color: '#6eb5ff',
110
- },
111
- text: {
112
- fontSize: 13,
113
- color: '#666',
114
- },
115
- text_dark: {
116
- color: '#999',
117
- },
118
- clearButton: {
119
- width: 24,
120
- height: 24,
121
- borderRadius: 12,
122
- backgroundColor: Color.defaultColor,
123
- justifyContent: 'center',
124
- alignItems: 'center',
125
- marginLeft: 10,
126
- },
127
- clearButtonText: {
128
- fontSize: 12,
129
- fontWeight: '600',
130
- color: '#666',
131
- },
132
- })
package/src/Send.tsx DELETED
@@ -1,115 +0,0 @@
1
- import React, { useMemo, useCallback, useEffect } from 'react'
2
- import {
3
- StyleSheet,
4
- StyleProp,
5
- ViewStyle,
6
- TextStyle,
7
- } from 'react-native'
8
- import { Text } from 'react-native-gesture-handler'
9
- import Animated, { useSharedValue, useAnimatedStyle, withTiming } from 'react-native-reanimated'
10
-
11
- import { Color } from './Color'
12
- import { TouchableOpacity, TouchableOpacityProps } from './components/TouchableOpacity'
13
- import { TEST_ID } from './Constant'
14
- import { useColorScheme } from './hooks/useColorScheme'
15
- import { IMessage } from './Models'
16
- import { getColorSchemeStyle } from './styles'
17
-
18
- export interface SendProps<TMessage extends IMessage> {
19
- text?: string
20
- label?: string
21
- containerStyle?: StyleProp<ViewStyle>
22
- textStyle?: StyleProp<TextStyle>
23
- children?: React.ReactNode
24
- /** Always show send button, even when text is empty */
25
- isSendButtonAlwaysVisible?: boolean
26
- /** Text is optional, allow sending empty messages (useful for media-only messages) */
27
- isTextOptional?: boolean
28
- sendButtonProps?: Partial<TouchableOpacityProps>
29
- onSend?(
30
- messages: Partial<TMessage> | Partial<TMessage>[],
31
- shouldResetInputToolbar: boolean,
32
- ): void
33
- }
34
-
35
- export const Send = <TMessage extends IMessage = IMessage>({
36
- text,
37
- containerStyle,
38
- children,
39
- textStyle,
40
- label = 'Send',
41
- isSendButtonAlwaysVisible = false,
42
- isTextOptional = false,
43
- sendButtonProps,
44
- onSend,
45
- }: SendProps<TMessage>) => {
46
- const colorScheme = useColorScheme()
47
- const opacity = useSharedValue(0)
48
-
49
- const handleOnPress = useCallback(() => {
50
- const trimmedText = text?.trim() ?? ''
51
- const message = { text: trimmedText } as Partial<TMessage>
52
-
53
- if (onSend && (trimmedText.length || isTextOptional))
54
- onSend(message, true)
55
- }, [text, onSend, isTextOptional])
56
-
57
- const isVisible = useMemo(
58
- () => isSendButtonAlwaysVisible || !!text?.trim().length,
59
- [isSendButtonAlwaysVisible, text]
60
- )
61
-
62
- useEffect(() => {
63
- opacity.value = withTiming(isVisible ? 1 : 0, { duration: 200 })
64
- }, [isVisible, opacity])
65
-
66
- const animatedStyle = useAnimatedStyle(() => ({
67
- opacity: opacity.value,
68
- }), [opacity])
69
-
70
- return (
71
- <Animated.View style={[styles.container, containerStyle, animatedStyle]} pointerEvents={isVisible ? 'auto' : 'none'}>
72
- <TouchableOpacity
73
- testID={TEST_ID.SEND_TOUCHABLE}
74
- style={styles.touchable}
75
- onPress={handleOnPress}
76
- accessible
77
- accessibilityLabel='send'
78
- accessibilityRole='button'
79
- {...sendButtonProps}
80
- >
81
- {
82
- children ||
83
- <Text
84
- style={[
85
- getColorSchemeStyle(styles, 'text', colorScheme),
86
- textStyle,
87
- ]}
88
- >
89
- {label}
90
- </Text>
91
- }
92
- </TouchableOpacity>
93
- </Animated.View>
94
- )
95
- }
96
-
97
- const styles = StyleSheet.create({
98
- container: {
99
- justifyContent: 'flex-end',
100
- },
101
- touchable: {
102
- justifyContent: 'flex-end',
103
- },
104
- text: {
105
- color: Color.defaultBlue,
106
- fontWeight: '600',
107
- fontSize: 17,
108
- backgroundColor: Color.backgroundTransparent,
109
- paddingVertical: 10,
110
- paddingHorizontal: 10,
111
- },
112
- text_dark: {
113
- color: '#4da6ff',
114
- },
115
- })
@@ -1,79 +0,0 @@
1
- import React from 'react'
2
- import {
3
- StyleSheet,
4
- View,
5
- ViewStyle,
6
- StyleProp,
7
- TextStyle,
8
- } from 'react-native'
9
- import { Color } from './Color'
10
- import { MessageText, MessageTextProps } from './MessageText'
11
- import { IMessage } from './Models'
12
- import stylesCommon from './styles'
13
-
14
- export interface SystemMessageProps<TMessage extends IMessage> {
15
- currentMessage: TMessage
16
- containerStyle?: StyleProp<ViewStyle>
17
- messageContainerStyle?: StyleProp<ViewStyle>
18
- textStyle?: StyleProp<TextStyle>
19
- messageTextProps?: Partial<MessageTextProps<TMessage>>
20
- children?: React.ReactNode
21
- }
22
-
23
- export function SystemMessage<TMessage extends IMessage> ({
24
- currentMessage,
25
- containerStyle,
26
- messageContainerStyle,
27
- textStyle,
28
- messageTextProps,
29
- children,
30
- }: SystemMessageProps<TMessage>) {
31
- if (currentMessage == null)
32
- return null
33
-
34
- return (
35
- <View style={[stylesCommon.fill, styles.wrapper]}>
36
- <View style={[styles.container, containerStyle]}>
37
- {
38
- !!currentMessage.text && (
39
- <MessageText
40
- currentMessage={currentMessage}
41
- customTextStyle={[styles.text, textStyle]}
42
- position='left'
43
- containerStyle={{ left: [styles.messageContainer, messageContainerStyle] }}
44
- {...messageTextProps}
45
- />
46
- )
47
- }
48
- {children}
49
- </View>
50
- </View>
51
- )
52
- }
53
-
54
- const styles = StyleSheet.create({
55
- wrapper: {
56
- alignItems: 'center',
57
- marginVertical: 5,
58
- marginHorizontal: 10,
59
- },
60
- container: {
61
- maxWidth: '70%',
62
- borderRadius: 20,
63
- borderWidth: 1,
64
- borderColor: 'rgba(0,0,0,0.1)',
65
- paddingHorizontal: 10,
66
- paddingVertical: 10,
67
- backgroundColor: 'rgba(0,0,0,0.05)',
68
- },
69
- messageContainer: {
70
- marginVertical: 0,
71
- marginHorizontal: 0,
72
- },
73
- text: {
74
- backgroundColor: Color.backgroundTransparent,
75
- fontSize: 12,
76
- fontWeight: '300',
77
- textAlign: 'center',
78
- },
79
- })
package/src/Time.tsx DELETED
@@ -1,64 +0,0 @@
1
- import React, { useMemo } from 'react'
2
- import { StyleSheet, View, ViewStyle, TextStyle } from 'react-native'
3
- import dayjs from 'dayjs'
4
-
5
- import { Text } from 'react-native-gesture-handler'
6
- import { Color } from './Color'
7
- import { TIME_FORMAT } from './Constant'
8
- import { useChatContext } from './GiftedChatContext'
9
- import { LeftRightStyle, IMessage } from './Models'
10
- import { getStyleWithPosition } from './styles'
11
-
12
- const styles = StyleSheet.create({
13
- text: {
14
- fontSize: 10,
15
- textAlign: 'right',
16
- },
17
- text_left: {
18
- color: Color.timeTextColor,
19
- },
20
- text_right: {
21
- color: Color.white,
22
- },
23
- })
24
-
25
- export interface TimeProps<TMessage extends IMessage> {
26
- position?: 'left' | 'right'
27
- currentMessage: TMessage
28
- containerStyle?: LeftRightStyle<ViewStyle>
29
- timeTextStyle?: LeftRightStyle<TextStyle>
30
- timeFormat?: string
31
- }
32
-
33
- export const Time = <TMessage extends IMessage = IMessage>({
34
- position = 'left',
35
- containerStyle,
36
- currentMessage,
37
- timeFormat = TIME_FORMAT,
38
- timeTextStyle,
39
- }: TimeProps<TMessage>) => {
40
- const { getLocale } = useChatContext()
41
-
42
- const formattedTime = useMemo(() => {
43
- if (!currentMessage)
44
- return null
45
-
46
- return dayjs(currentMessage.createdAt).locale(getLocale()).format(timeFormat)
47
- }, [currentMessage, getLocale, timeFormat])
48
-
49
- if (!currentMessage)
50
- return null
51
-
52
- return (
53
- <View style={containerStyle?.[position]}>
54
- <Text
55
- style={[
56
- getStyleWithPosition(styles, 'text', position),
57
- timeTextStyle?.[position],
58
- ]}
59
- >
60
- {formattedTime}
61
- </Text>
62
- </View>
63
- )
64
- }