@kesha-antonov/react-native-chat 6.0.1 → 6.1.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 (179) hide show
  1. package/README.md +27 -4
  2. package/lib/Actions.d.ts.map +1 -1
  3. package/lib/Actions.js +33 -27
  4. package/lib/Actions.js.map +1 -1
  5. package/lib/Chat/Chat.d.ts.map +1 -1
  6. package/lib/Chat/Chat.js +253 -203
  7. package/lib/Chat/Chat.js.map +1 -1
  8. package/lib/Chat/ChatMessageList.d.ts.map +1 -1
  9. package/lib/Chat/ChatMessageList.js +4 -0
  10. package/lib/Chat/ChatMessageList.js.map +1 -1
  11. package/lib/Chat/index.d.ts +9 -1
  12. package/lib/Chat/index.d.ts.map +1 -1
  13. package/lib/Chat/index.js +14 -1
  14. package/lib/Chat/index.js.map +1 -1
  15. package/lib/Chat/types.d.ts +29 -0
  16. package/lib/Chat/types.d.ts.map +1 -1
  17. package/lib/Chat/types.js.map +1 -1
  18. package/lib/Chat/useMessageActions.d.ts +1 -0
  19. package/lib/Chat/useMessageActions.d.ts.map +1 -1
  20. package/lib/Chat/useMessageActions.js +97 -89
  21. package/lib/Chat/useMessageActions.js.map +1 -1
  22. package/lib/ChatHeader.d.ts +50 -0
  23. package/lib/ChatHeader.d.ts.map +1 -0
  24. package/lib/ChatHeader.js +356 -0
  25. package/lib/ChatHeader.js.map +1 -0
  26. package/lib/ChatList/ChatListCell.d.ts +1 -1
  27. package/lib/ChatList/ChatListCell.d.ts.map +1 -1
  28. package/lib/ChatList/ChatListCell.js +42 -11
  29. package/lib/ChatList/ChatListCell.js.map +1 -1
  30. package/lib/ChatList/index.js +332 -323
  31. package/lib/ChatList/index.js.map +1 -1
  32. package/lib/ChatList/types.d.ts +17 -1
  33. package/lib/ChatList/types.d.ts.map +1 -1
  34. package/lib/ChatList/types.js.map +1 -1
  35. package/lib/ChatList/utils.d.ts +4 -1
  36. package/lib/ChatList/utils.d.ts.map +1 -1
  37. package/lib/ChatList/utils.js +3 -2
  38. package/lib/ChatList/utils.js.map +1 -1
  39. package/lib/Composer.js +5 -1
  40. package/lib/Composer.js.map +1 -1
  41. package/lib/InputToolbar/fragments.d.ts +1 -1
  42. package/lib/InputToolbar/fragments.d.ts.map +1 -1
  43. package/lib/InputToolbar/fragments.js +9 -7
  44. package/lib/InputToolbar/fragments.js.map +1 -1
  45. package/lib/InputToolbar/index.d.ts.map +1 -1
  46. package/lib/InputToolbar/index.js +3 -2
  47. package/lib/InputToolbar/index.js.map +1 -1
  48. package/lib/InputToolbar/types.d.ts +6 -0
  49. package/lib/InputToolbar/types.d.ts.map +1 -1
  50. package/lib/InputToolbar/types.js.map +1 -1
  51. package/lib/InputToolbar/useActionsFragment.d.ts.map +1 -1
  52. package/lib/InputToolbar/useActionsFragment.js +83 -59
  53. package/lib/InputToolbar/useActionsFragment.js.map +1 -1
  54. package/lib/InputToolbar/useKeyboardInset.d.ts +1 -1
  55. package/lib/InputToolbar/useKeyboardInset.d.ts.map +1 -1
  56. package/lib/InputToolbar/useKeyboardInset.js +2 -2
  57. package/lib/InputToolbar/useKeyboardInset.js.map +1 -1
  58. package/lib/MessageText.d.ts.map +1 -1
  59. package/lib/MessageText.js +39 -33
  60. package/lib/MessageText.js.map +1 -1
  61. package/lib/MessagesContainer/index.d.ts.map +1 -1
  62. package/lib/MessagesContainer/index.js +113 -94
  63. package/lib/MessagesContainer/index.js.map +1 -1
  64. package/lib/MessagesContainer/types.d.ts +5 -2
  65. package/lib/MessagesContainer/types.d.ts.map +1 -1
  66. package/lib/MessagesContainer/types.js.map +1 -1
  67. package/lib/MessagesContainer/useChained.d.ts +6 -0
  68. package/lib/MessagesContainer/useChained.d.ts.map +1 -0
  69. package/lib/MessagesContainer/useChained.js +38 -0
  70. package/lib/MessagesContainer/useChained.js.map +1 -0
  71. package/lib/MessagesContainer/useListChrome.d.ts.map +1 -1
  72. package/lib/MessagesContainer/useListChrome.js +1 -1
  73. package/lib/MessagesContainer/useListChrome.js.map +1 -1
  74. package/lib/Models.d.ts +2 -1
  75. package/lib/Models.d.ts.map +1 -1
  76. package/lib/Models.js.map +1 -1
  77. package/lib/Send.d.ts.map +1 -1
  78. package/lib/Send.js +18 -13
  79. package/lib/Send.js.map +1 -1
  80. package/lib/Theme.d.ts +11 -0
  81. package/lib/Theme.d.ts.map +1 -1
  82. package/lib/Theme.js +17 -1
  83. package/lib/Theme.js.map +1 -1
  84. package/lib/attachments/AttachmentButton.js +17 -15
  85. package/lib/attachments/AttachmentButton.js.map +1 -1
  86. package/lib/attachments/AttachmentMenu/GalleryGrid.d.ts +3 -1
  87. package/lib/attachments/AttachmentMenu/GalleryGrid.d.ts.map +1 -1
  88. package/lib/attachments/AttachmentMenu/GalleryGrid.js +69 -68
  89. package/lib/attachments/AttachmentMenu/GalleryGrid.js.map +1 -1
  90. package/lib/attachments/AttachmentMenu/TabPanel.d.ts +3 -1
  91. package/lib/attachments/AttachmentMenu/TabPanel.d.ts.map +1 -1
  92. package/lib/attachments/AttachmentMenu/TabPanel.js +23 -21
  93. package/lib/attachments/AttachmentMenu/TabPanel.js.map +1 -1
  94. package/lib/attachments/AttachmentMenu/index.d.ts +6 -2
  95. package/lib/attachments/AttachmentMenu/index.d.ts.map +1 -1
  96. package/lib/attachments/AttachmentMenu/index.js +259 -247
  97. package/lib/attachments/AttachmentMenu/index.js.map +1 -1
  98. package/lib/attachments/buildMessages.d.ts +4 -4
  99. package/lib/attachments/buildMessages.d.ts.map +1 -1
  100. package/lib/attachments/buildMessages.js +9 -8
  101. package/lib/attachments/buildMessages.js.map +1 -1
  102. package/lib/attachments/types.d.ts +19 -0
  103. package/lib/attachments/types.d.ts.map +1 -1
  104. package/lib/attachments/types.js.map +1 -1
  105. package/lib/components/TouchableOpacity.d.ts +5 -0
  106. package/lib/components/TouchableOpacity.d.ts.map +1 -1
  107. package/lib/components/TouchableOpacity.js +59 -54
  108. package/lib/components/TouchableOpacity.js.map +1 -1
  109. package/lib/components/defaultMessageActions.d.ts +3 -1
  110. package/lib/components/defaultMessageActions.d.ts.map +1 -1
  111. package/lib/components/defaultMessageActions.js +9 -1
  112. package/lib/components/defaultMessageActions.js.map +1 -1
  113. package/lib/components/textHighlight.d.ts +14 -0
  114. package/lib/components/textHighlight.d.ts.map +1 -0
  115. package/lib/components/textHighlight.js +39 -0
  116. package/lib/components/textHighlight.js.map +1 -0
  117. package/lib/hooks/useKeyboardVerticalOffset.d.ts +6 -0
  118. package/lib/hooks/useKeyboardVerticalOffset.d.ts.map +1 -1
  119. package/lib/hooks/useKeyboardVerticalOffset.js +35 -13
  120. package/lib/hooks/useKeyboardVerticalOffset.js.map +1 -1
  121. package/lib/i18n.d.ts +2 -0
  122. package/lib/i18n.d.ts.map +1 -1
  123. package/lib/i18n.js +1 -0
  124. package/lib/i18n.js.map +1 -1
  125. package/lib/index.d.ts +3 -1
  126. package/lib/index.d.ts.map +1 -1
  127. package/lib/index.js +1 -0
  128. package/lib/index.js.map +1 -1
  129. package/lib/linkParser.d.ts +4 -1
  130. package/lib/linkParser.d.ts.map +1 -1
  131. package/lib/linkParser.js +115 -78
  132. package/lib/linkParser.js.map +1 -1
  133. package/lib/locales/ar.d.ts.map +1 -1
  134. package/lib/locales/ar.js +1 -0
  135. package/lib/locales/ar.js.map +1 -1
  136. package/lib/locales/de.d.ts.map +1 -1
  137. package/lib/locales/de.js +1 -0
  138. package/lib/locales/de.js.map +1 -1
  139. package/lib/locales/es.d.ts.map +1 -1
  140. package/lib/locales/es.js +1 -0
  141. package/lib/locales/es.js.map +1 -1
  142. package/lib/locales/fr.d.ts.map +1 -1
  143. package/lib/locales/fr.js +1 -0
  144. package/lib/locales/fr.js.map +1 -1
  145. package/lib/locales/hi.d.ts.map +1 -1
  146. package/lib/locales/hi.js +1 -0
  147. package/lib/locales/hi.js.map +1 -1
  148. package/lib/locales/id.d.ts.map +1 -1
  149. package/lib/locales/id.js +1 -0
  150. package/lib/locales/id.js.map +1 -1
  151. package/lib/locales/it.d.ts.map +1 -1
  152. package/lib/locales/it.js +1 -0
  153. package/lib/locales/it.js.map +1 -1
  154. package/lib/locales/ja.d.ts.map +1 -1
  155. package/lib/locales/ja.js +1 -0
  156. package/lib/locales/ja.js.map +1 -1
  157. package/lib/locales/ko.d.ts.map +1 -1
  158. package/lib/locales/ko.js +1 -0
  159. package/lib/locales/ko.js.map +1 -1
  160. package/lib/locales/nl.d.ts.map +1 -1
  161. package/lib/locales/nl.js +1 -0
  162. package/lib/locales/nl.js.map +1 -1
  163. package/lib/locales/pl.d.ts.map +1 -1
  164. package/lib/locales/pl.js +1 -0
  165. package/lib/locales/pl.js.map +1 -1
  166. package/lib/locales/pt.d.ts.map +1 -1
  167. package/lib/locales/pt.js +1 -0
  168. package/lib/locales/pt.js.map +1 -1
  169. package/lib/locales/ru.d.ts.map +1 -1
  170. package/lib/locales/ru.js +1 -0
  171. package/lib/locales/ru.js.map +1 -1
  172. package/lib/locales/tr.d.ts.map +1 -1
  173. package/lib/locales/tr.js +1 -0
  174. package/lib/locales/tr.js.map +1 -1
  175. package/lib/locales/zh.d.ts.map +1 -1
  176. package/lib/locales/zh.js +1 -0
  177. package/lib/locales/zh.js.map +1 -1
  178. package/llms.txt +1 -1
  179. package/package.json +1 -1
@@ -0,0 +1,356 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import React, { useContext, useMemo } from 'react';
3
+ import { Pressable, StyleSheet, Text, useColorScheme, View } from 'react-native';
4
+ import { SafeAreaInsetsContext } from 'react-native-safe-area-context';
5
+ import { ChatContext } from './ChatContext';
6
+ import { ChatListAvatar } from './ChatList/ChatListAvatar';
7
+ import { Icon } from './components/Icon';
8
+ import { TypingStatus } from './components/TypingStatus';
9
+ import { normalizeColorScheme } from './hooks/useColorScheme';
10
+ import { resolveLabels } from './i18n';
11
+ import { isRTLLocale } from './rtl';
12
+ import { resolveTheme } from './Theme';
13
+ const HEADER_HEIGHT = 56;
14
+ const AVATAR_SIZE = 42;
15
+ /**
16
+ * A chat screen's top bar, as a messenger draws it: back arrow, a 42 avatar, the name in 18 medium
17
+ * with a 14 status line under it ("online" and "typing" in the accent color), and buttons at the
18
+ * end. Colors come from `theme.chatList` (`headerBackground`, `headerText`, `headerSubtitle`,
19
+ * `headerSubtitleActive`), so it matches `ChatList`'s header.
20
+ */
21
+ export function ChatHeader(props) {
22
+ const $ = _c(35);
23
+ const {
24
+ theme,
25
+ darkTheme,
26
+ colorScheme: colorSchemeProp,
27
+ locale,
28
+ labels,
29
+ icons
30
+ } = props;
31
+ const systemColorScheme = useColorScheme();
32
+ const t0 = colorSchemeProp !== undefined ? colorSchemeProp : systemColorScheme;
33
+ let t1;
34
+ if ($[0] !== t0) {
35
+ t1 = normalizeColorScheme(t0);
36
+ $[0] = t0;
37
+ $[1] = t1;
38
+ } else {
39
+ t1 = $[1];
40
+ }
41
+ const colorScheme = t1;
42
+ let t2;
43
+ if ($[2] !== colorScheme || $[3] !== darkTheme || $[4] !== theme) {
44
+ t2 = resolveTheme(colorScheme, theme, darkTheme);
45
+ $[2] = colorScheme;
46
+ $[3] = darkTheme;
47
+ $[4] = theme;
48
+ $[5] = t2;
49
+ } else {
50
+ t2 = $[5];
51
+ }
52
+ const resolvedTheme = t2;
53
+ let t3;
54
+ if ($[6] !== labels || $[7] !== locale) {
55
+ t3 = resolveLabels(locale, labels);
56
+ $[6] = labels;
57
+ $[7] = locale;
58
+ $[8] = t3;
59
+ } else {
60
+ t3 = $[8];
61
+ }
62
+ const resolvedLabels = t3;
63
+ let t4;
64
+ if ($[9] !== locale) {
65
+ t4 = isRTLLocale(locale);
66
+ $[9] = locale;
67
+ $[10] = t4;
68
+ } else {
69
+ t4 = $[10];
70
+ }
71
+ const isRTL = t4;
72
+ let t5;
73
+ if ($[11] !== locale) {
74
+ t5 = () => locale ?? "en";
75
+ $[11] = locale;
76
+ $[12] = t5;
77
+ } else {
78
+ t5 = $[12];
79
+ }
80
+ let t6;
81
+ if ($[13] !== isRTL) {
82
+ t6 = () => isRTL;
83
+ $[13] = isRTL;
84
+ $[14] = t6;
85
+ } else {
86
+ t6 = $[14];
87
+ }
88
+ let t7;
89
+ if ($[15] !== colorScheme) {
90
+ t7 = () => colorScheme;
91
+ $[15] = colorScheme;
92
+ $[16] = t7;
93
+ } else {
94
+ t7 = $[16];
95
+ }
96
+ let t8;
97
+ if ($[17] !== resolvedTheme) {
98
+ t8 = () => resolvedTheme;
99
+ $[17] = resolvedTheme;
100
+ $[18] = t8;
101
+ } else {
102
+ t8 = $[18];
103
+ }
104
+ let t9;
105
+ if ($[19] !== icons) {
106
+ t9 = () => icons;
107
+ $[19] = icons;
108
+ $[20] = t9;
109
+ } else {
110
+ t9 = $[20];
111
+ }
112
+ let t10;
113
+ if ($[21] !== resolvedLabels) {
114
+ t10 = () => resolvedLabels;
115
+ $[21] = resolvedLabels;
116
+ $[22] = t10;
117
+ } else {
118
+ t10 = $[22];
119
+ }
120
+ let t11;
121
+ if ($[23] !== t10 || $[24] !== t5 || $[25] !== t6 || $[26] !== t7 || $[27] !== t8 || $[28] !== t9) {
122
+ t11 = {
123
+ actionSheet: _temp2,
124
+ getLocale: t5,
125
+ getIsRTL: t6,
126
+ getColorScheme: t7,
127
+ getTheme: t8,
128
+ getIcons: t9,
129
+ getLabels: t10
130
+ };
131
+ $[23] = t10;
132
+ $[24] = t5;
133
+ $[25] = t6;
134
+ $[26] = t7;
135
+ $[27] = t8;
136
+ $[28] = t9;
137
+ $[29] = t11;
138
+ } else {
139
+ t11 = $[29];
140
+ }
141
+ const context = t11;
142
+ let t12;
143
+ if ($[30] !== props) {
144
+ t12 = <ChatHeaderContent {...props} />;
145
+ $[30] = props;
146
+ $[31] = t12;
147
+ } else {
148
+ t12 = $[31];
149
+ }
150
+ let t13;
151
+ if ($[32] !== context || $[33] !== t12) {
152
+ t13 = <ChatContext.Provider value={context}>{t12}</ChatContext.Provider>;
153
+ $[32] = context;
154
+ $[33] = t12;
155
+ $[34] = t13;
156
+ } else {
157
+ t13 = $[34];
158
+ }
159
+ return t13;
160
+ }
161
+ function _temp2() {
162
+ return {
163
+ showActionSheetWithOptions: _temp
164
+ };
165
+ }
166
+ function _temp() {}
167
+ function ChatHeaderContent(t0) {
168
+ const $ = _c(41);
169
+ const {
170
+ title,
171
+ subtitle,
172
+ isSubtitleActive: t1,
173
+ typingUsers,
174
+ typingAction,
175
+ isGroup: t2,
176
+ avatar,
177
+ onBack,
178
+ onPressTitle,
179
+ renderRight,
180
+ renderTitle,
181
+ isTopInsetApplied: t3,
182
+ style
183
+ } = t0;
184
+ const isSubtitleActive = t1 === undefined ? false : t1;
185
+ const isGroup = t2 === undefined ? false : t2;
186
+ const isTopInsetApplied = t3 === undefined ? true : t3;
187
+ const {
188
+ getTheme,
189
+ getLabels
190
+ } = useContext(ChatContext);
191
+ let t4;
192
+ if ($[0] !== getTheme) {
193
+ t4 = getTheme();
194
+ $[0] = getTheme;
195
+ $[1] = t4;
196
+ } else {
197
+ t4 = $[1];
198
+ }
199
+ const colors = t4.chatList;
200
+ let t5;
201
+ if ($[2] !== getLabels) {
202
+ t5 = getLabels();
203
+ $[2] = getLabels;
204
+ $[3] = t5;
205
+ } else {
206
+ t5 = $[3];
207
+ }
208
+ const labels = t5;
209
+ const insets = useContext(SafeAreaInsetsContext);
210
+ const topInset = isTopInsetApplied ? insets?.top ?? 0 : 0;
211
+ const isTyping = !!typingUsers?.length;
212
+ let t6;
213
+ if ($[4] !== colors.headerSubtitle || $[5] !== colors.headerSubtitleActive || $[6] !== colors.headerText || $[7] !== isGroup || $[8] !== isSubtitleActive || $[9] !== isTyping || $[10] !== subtitle || $[11] !== title || $[12] !== typingAction || $[13] !== typingUsers) {
214
+ t6 = () => <View style={styles.text}><Text style={[styles.title, {
215
+ color: colors.headerText
216
+ }]} numberOfLines={1}>{title}</Text>{isTyping ? <TypingStatus users={typingUsers} action={typingAction} isGroup={isGroup} color={colors.headerSubtitleActive} textStyle={styles.subtitle} /> : !!subtitle && <Text style={[styles.subtitle, {
217
+ color: isSubtitleActive ? colors.headerSubtitleActive : colors.headerSubtitle
218
+ }]} numberOfLines={1}>{subtitle}</Text>}</View>;
219
+ $[4] = colors.headerSubtitle;
220
+ $[5] = colors.headerSubtitleActive;
221
+ $[6] = colors.headerText;
222
+ $[7] = isGroup;
223
+ $[8] = isSubtitleActive;
224
+ $[9] = isTyping;
225
+ $[10] = subtitle;
226
+ $[11] = title;
227
+ $[12] = typingAction;
228
+ $[13] = typingUsers;
229
+ $[14] = t6;
230
+ } else {
231
+ t6 = $[14];
232
+ }
233
+ const renderText = t6;
234
+ let t7;
235
+ if ($[15] !== colors.headerBackground || $[16] !== topInset) {
236
+ t7 = {
237
+ paddingTop: topInset,
238
+ backgroundColor: colors.headerBackground
239
+ };
240
+ $[15] = colors.headerBackground;
241
+ $[16] = topInset;
242
+ $[17] = t7;
243
+ } else {
244
+ t7 = $[17];
245
+ }
246
+ let t8;
247
+ if ($[18] !== style || $[19] !== t7) {
248
+ t8 = [styles.header, t7, style];
249
+ $[18] = style;
250
+ $[19] = t7;
251
+ $[20] = t8;
252
+ } else {
253
+ t8 = $[20];
254
+ }
255
+ let t9;
256
+ if ($[21] !== colors.headerText || $[22] !== labels || $[23] !== onBack) {
257
+ t9 = onBack ? <Pressable onPress={onBack} hitSlop={4} style={styles.button} accessibilityRole="button" accessibilityLabel={labels.chatListBack}><Icon name="arrowLeft" size={24} color={colors.headerText} fallback={<Text style={{
258
+ color: colors.headerText
259
+ }}>{"<"}</Text>} /></Pressable> : <View style={styles.edge} />;
260
+ $[21] = colors.headerText;
261
+ $[22] = labels;
262
+ $[23] = onBack;
263
+ $[24] = t9;
264
+ } else {
265
+ t9 = $[24];
266
+ }
267
+ let t10;
268
+ if ($[25] !== avatar || $[26] !== colors.headerBackground || $[27] !== onPressTitle || $[28] !== renderText || $[29] !== renderTitle || $[30] !== title) {
269
+ t10 = renderTitle ? <View style={styles.titleArea}>{renderTitle()}</View> : <Pressable onPress={onPressTitle} disabled={!onPressTitle} style={styles.titleArea} accessibilityRole={onPressTitle ? "button" : undefined}>{!!avatar && <View style={styles.avatar}><ChatListAvatar id={avatar.id} title={title} uri={avatar.uri} size={AVATAR_SIZE} ringColor={colors.headerBackground} /></View>}{renderText()}</Pressable>;
270
+ $[25] = avatar;
271
+ $[26] = colors.headerBackground;
272
+ $[27] = onPressTitle;
273
+ $[28] = renderText;
274
+ $[29] = renderTitle;
275
+ $[30] = title;
276
+ $[31] = t10;
277
+ } else {
278
+ t10 = $[31];
279
+ }
280
+ let t11;
281
+ if ($[32] !== renderRight) {
282
+ t11 = renderRight?.();
283
+ $[32] = renderRight;
284
+ $[33] = t11;
285
+ } else {
286
+ t11 = $[33];
287
+ }
288
+ let t12;
289
+ if ($[34] !== t10 || $[35] !== t11 || $[36] !== t9) {
290
+ t12 = <View style={styles.bar}>{t9}{t10}{t11}</View>;
291
+ $[34] = t10;
292
+ $[35] = t11;
293
+ $[36] = t9;
294
+ $[37] = t12;
295
+ } else {
296
+ t12 = $[37];
297
+ }
298
+ let t13;
299
+ if ($[38] !== t12 || $[39] !== t8) {
300
+ t13 = <View style={t8}>{t12}</View>;
301
+ $[38] = t12;
302
+ $[39] = t8;
303
+ $[40] = t13;
304
+ } else {
305
+ t13 = $[40];
306
+ }
307
+ return t13;
308
+ }
309
+ const styles = StyleSheet.create({
310
+ header: {
311
+ zIndex: 1,
312
+ boxShadow: '0 0.5px 0 rgba(0, 0, 0, 0.12)'
313
+ },
314
+ bar: {
315
+ height: HEADER_HEIGHT,
316
+ flexDirection: 'row',
317
+ alignItems: 'center',
318
+ paddingHorizontal: 4
319
+ },
320
+ button: {
321
+ width: 48,
322
+ height: 48,
323
+ alignItems: 'center',
324
+ justifyContent: 'center'
325
+ },
326
+ edge: {
327
+ width: 10
328
+ },
329
+ titleArea: {
330
+ flex: 1,
331
+ alignSelf: 'stretch',
332
+ flexDirection: 'row',
333
+ alignItems: 'center'
334
+ },
335
+ avatar: {
336
+ marginStart: 4
337
+ },
338
+ // The text starts 55 after the avatar's left edge: 42 + 13.
339
+ text: {
340
+ flex: 1,
341
+ marginStart: 13,
342
+ justifyContent: 'center'
343
+ },
344
+ title: {
345
+ flexShrink: 1,
346
+ fontSize: 18,
347
+ fontWeight: '500',
348
+ textAlign: 'left'
349
+ },
350
+ subtitle: {
351
+ fontSize: 14,
352
+ marginTop: 1,
353
+ textAlign: 'left'
354
+ }
355
+ });
356
+ //# sourceMappingURL=ChatHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHeader.js","names":["React","useContext","useMemo","Pressable","StyleSheet","Text","useColorScheme","View","SafeAreaInsetsContext","ChatContext","ChatListAvatar","Icon","TypingStatus","normalizeColorScheme","resolveLabels","isRTLLocale","resolveTheme","HEADER_HEIGHT","AVATAR_SIZE","ChatHeader","props","$","_c","theme","darkTheme","colorScheme","colorSchemeProp","locale","labels","icons","systemColorScheme","t0","undefined","t1","t2","resolvedTheme","t3","resolvedLabels","t4","isRTL","t5","t6","t7","t8","t9","t10","t11","actionSheet","_temp2","getLocale","getIsRTL","getColorScheme","getTheme","getIcons","getLabels","context","t12","t13","showActionSheetWithOptions","_temp","ChatHeaderContent","title","subtitle","isSubtitleActive","typingUsers","typingAction","isGroup","avatar","onBack","onPressTitle","renderRight","renderTitle","isTopInsetApplied","style","colors","chatList","insets","topInset","top","isTyping","length","headerSubtitle","headerSubtitleActive","headerText","styles","text","color","renderText","headerBackground","paddingTop","backgroundColor","header","button","chatListBack","edge","titleArea","id","uri","bar","create","zIndex","boxShadow","height","flexDirection","alignItems","paddingHorizontal","width","justifyContent","flex","alignSelf","marginStart","flexShrink","fontSize","fontWeight","textAlign","marginTop"],"sources":["../src/ChatHeader.tsx"],"sourcesContent":["import React, { ReactNode, useContext, useMemo } from 'react'\nimport { ColorSchemeName, Pressable, StyleProp, StyleSheet, Text, useColorScheme, View, ViewStyle } from 'react-native'\nimport { SafeAreaInsetsContext } from 'react-native-safe-area-context'\n\nimport { ChatContext, IChatContext } from './ChatContext'\nimport { ChatListAvatar } from './ChatList/ChatListAvatar'\nimport { Icon } from './components/Icon'\nimport { TypingAction, TypingStatus } from './components/TypingStatus'\nimport { normalizeColorScheme } from './hooks/useColorScheme'\nimport { ChatLabels, resolveLabels } from './i18n'\nimport { ChatIcons } from './Icons'\nimport { User } from './Models'\nimport { isRTLLocale } from './rtl'\nimport { PartialChatTheme, resolveTheme } from './Theme'\n\nconst HEADER_HEIGHT = 56\nconst AVATAR_SIZE = 42\n\nexport interface ChatHeaderProps {\n /** The chat's name, on one line. */\n title: string\n /** The line under the name: \"online\", \"last seen recently\", \"3 members\"... */\n subtitle?: string\n /** Draws the subtitle in the accent color, as for \"online\". */\n isSubtitleActive?: boolean\n /** Shown in place of the subtitle while someone types: \"typing\", \"Anna is typing\"... */\n typingUsers?: User[]\n typingAction?: TypingAction\n /** Names the people typing, as a group does. */\n isGroup?: boolean\n /** The avatar: a photo, or initials on the chat's color picked by `id`. Hidden without it. */\n avatar?: { id: string | number, uri?: string }\n /** Shows the back arrow. */\n onBack?: () => void\n /** Makes the avatar and the name a button, e.g. to open the profile. */\n onPressTitle?: () => void\n /** Buttons at the end of the bar: a call, a menu. */\n renderRight?: () => ReactNode\n /** Replaces the name and the subtitle, e.g. with a search field. */\n renderTitle?: () => ReactNode\n /** Pads the bar by the top safe-area inset. Default true; turn off when it sits below the status bar already. */\n isTopInsetApplied?: boolean\n style?: StyleProp<ViewStyle>\n theme?: PartialChatTheme\n darkTheme?: PartialChatTheme\n colorScheme?: ColorSchemeName\n locale?: string\n labels?: Partial<ChatLabels>\n icons?: ChatIcons\n}\n\n/**\n * A chat screen's top bar, as a messenger draws it: back arrow, a 42 avatar, the name in 18 medium\n * with a 14 status line under it (\"online\" and \"typing\" in the accent color), and buttons at the\n * end. Colors come from `theme.chatList` (`headerBackground`, `headerText`, `headerSubtitle`,\n * `headerSubtitleActive`), so it matches `ChatList`'s header.\n */\nexport function ChatHeader (props: ChatHeaderProps) {\n const { theme, darkTheme, colorScheme: colorSchemeProp, locale, labels, icons } = props\n const systemColorScheme = useColorScheme()\n const colorScheme = normalizeColorScheme(colorSchemeProp !== undefined ? colorSchemeProp : systemColorScheme)\n const resolvedTheme = useMemo(() => resolveTheme(colorScheme, theme, darkTheme), [colorScheme, theme, darkTheme])\n const resolvedLabels = useMemo(() => resolveLabels(locale, labels), [locale, labels])\n const isRTL = useMemo(() => isRTLLocale(locale), [locale])\n const context = useMemo<IChatContext>(() => ({\n actionSheet: () => ({ showActionSheetWithOptions: () => {} }),\n getLocale: () => locale ?? 'en',\n getIsRTL: () => isRTL,\n getColorScheme: () => colorScheme,\n getTheme: () => resolvedTheme,\n getIcons: () => icons,\n getLabels: () => resolvedLabels,\n }), [locale, isRTL, colorScheme, resolvedTheme, icons, resolvedLabels])\n\n return (\n <ChatContext.Provider value={context}>\n <ChatHeaderContent {...props} />\n </ChatContext.Provider>\n )\n}\n\nfunction ChatHeaderContent ({\n title,\n subtitle,\n isSubtitleActive = false,\n typingUsers,\n typingAction,\n isGroup = false,\n avatar,\n onBack,\n onPressTitle,\n renderRight,\n renderTitle,\n isTopInsetApplied = true,\n style,\n}: ChatHeaderProps) {\n const { getTheme, getLabels } = useContext(ChatContext)\n const colors = getTheme!()!.chatList\n const labels = getLabels!()!\n const insets = useContext(SafeAreaInsetsContext)\n const topInset = isTopInsetApplied ? insets?.top ?? 0 : 0\n const isTyping = !!typingUsers?.length\n\n const renderText = () => (\n <View style={styles.text}>\n <Text style={[styles.title, { color: colors.headerText }]} numberOfLines={1}>{title}</Text>\n {isTyping\n ? <TypingStatus users={typingUsers!} action={typingAction} isGroup={isGroup} color={colors.headerSubtitleActive} textStyle={styles.subtitle} />\n : !!subtitle && (\n <Text\n style={[styles.subtitle, { color: isSubtitleActive ? colors.headerSubtitleActive : colors.headerSubtitle }]}\n numberOfLines={1}\n >\n {subtitle}\n </Text>\n )}\n </View>\n )\n\n return (\n <View style={[styles.header, { paddingTop: topInset, backgroundColor: colors.headerBackground }, style]}>\n <View style={styles.bar}>\n {onBack\n ? (\n <Pressable onPress={onBack} hitSlop={4} style={styles.button} accessibilityRole='button' accessibilityLabel={labels.chatListBack}>\n <Icon name='arrowLeft' size={24} color={colors.headerText} fallback={<Text style={{ color: colors.headerText }}>{'<'}</Text>} />\n </Pressable>\n )\n : <View style={styles.edge} />}\n {renderTitle\n ? <View style={styles.titleArea}>{renderTitle()}</View>\n : (\n <Pressable\n onPress={onPressTitle}\n disabled={!onPressTitle}\n style={styles.titleArea}\n accessibilityRole={onPressTitle ? 'button' : undefined}\n >\n {!!avatar && (\n <View style={styles.avatar}>\n <ChatListAvatar id={avatar.id} title={title} uri={avatar.uri} size={AVATAR_SIZE} ringColor={colors.headerBackground} />\n </View>\n )}\n {renderText()}\n </Pressable>\n )}\n {renderRight?.()}\n </View>\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n header: {\n zIndex: 1,\n boxShadow: '0 0.5px 0 rgba(0, 0, 0, 0.12)',\n },\n bar: {\n height: HEADER_HEIGHT,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 4,\n },\n button: {\n width: 48,\n height: 48,\n alignItems: 'center',\n justifyContent: 'center',\n },\n edge: {\n width: 10,\n },\n titleArea: {\n flex: 1,\n alignSelf: 'stretch',\n flexDirection: 'row',\n alignItems: 'center',\n },\n avatar: {\n marginStart: 4,\n },\n // The text starts 55 after the avatar's left edge: 42 + 13.\n text: {\n flex: 1,\n marginStart: 13,\n justifyContent: 'center',\n },\n title: {\n flexShrink: 1,\n fontSize: 18,\n fontWeight: '500',\n textAlign: 'left',\n },\n subtitle: {\n fontSize: 14,\n marginTop: 1,\n textAlign: 'left',\n },\n})\n"],"mappings":"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","ignoreList":[]}
@@ -5,7 +5,7 @@ export declare const CHAT_LIST_ROW_HEIGHT = 70;
5
5
  * A chat's row: avatar, name, time, the last message (or a draft, or who is typing), the unread
6
6
  * counter or pin, a swipe to archive, and dragging when pinned chats can be reordered.
7
7
  */
8
- declare function ChatListCellInner<TChat extends ChatListItem>({ chat, user, isSelected, isSelectionMode, onPress, onLongPress, onSwipe, isLast, reorder, isReordering, }: ChatListCellProps<TChat>): React.JSX.Element;
8
+ declare function ChatListCellInner<TChat extends ChatListItem>({ chat, user, isSelected, isSelectionMode, onPress, onLongPress, onSwipe, isLast, reorder, isReordering, timeFormat, dateFormat, }: ChatListCellProps<TChat>): React.JSX.Element;
9
9
  /**
10
10
  * A chat's row: avatar, name, time, the last message (or a draft, or who is typing), the unread
11
11
  * counter or pin, a swipe to archive, and dragging when pinned chats can be reordered. Rows only
@@ -1 +1 @@
1
- {"version":3,"file":"ChatListCell.d.ts","sourceRoot":"","sources":["../../src/ChatList/ChatListCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAA;AAuBxD,OAAO,EAAE,iBAAiB,EAAgB,YAAY,EAAE,MAAM,SAAS,CAAA;AAIvE,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAgCtC;;;GAGG;AACH,iBAAS,iBAAiB,CAAC,KAAK,SAAS,YAAY,EAAG,EACtD,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,eAAe,EACf,OAAO,EACP,WAAW,EACX,OAAO,EACP,MAAM,EACN,OAAO,EACP,YAAoB,GACrB,EAAE,iBAAiB,CAAC,KAAK,CAAC,qBAkR1B;AAmBD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAsD,OAAO,iBAAiB,CAAA"}
1
+ {"version":3,"file":"ChatListCell.d.ts","sourceRoot":"","sources":["../../src/ChatList/ChatListCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAA;AAuBxD,OAAO,EAAE,iBAAiB,EAAgB,YAAY,EAAE,MAAM,SAAS,CAAA;AAIvE,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAgCtC;;;GAGG;AACH,iBAAS,iBAAiB,CAAC,KAAK,SAAS,YAAY,EAAG,EACtD,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,eAAe,EACf,OAAO,EACP,WAAW,EACX,OAAO,EACP,MAAM,EACN,OAAO,EACP,YAAoB,EACpB,UAAU,EACV,UAAU,GACX,EAAE,iBAAiB,CAAC,KAAK,CAAC,qBAgS1B;AAqBD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAsD,OAAO,iBAAiB,CAAA"}
@@ -75,7 +75,9 @@ function ChatListCellInner({
75
75
  onSwipe,
76
76
  isLast,
77
77
  reorder,
78
- isReordering = false
78
+ isReordering = false,
79
+ timeFormat,
80
+ dateFormat
79
81
  }) {
80
82
  // The gesture callbacks read shared values; React Compiler would memoize them into render.
81
83
  'use no memo';
@@ -90,6 +92,13 @@ function ChatListCellInner({
90
92
  width
91
93
  } = useWindowDimensions();
92
94
 
95
+ // The worklets below call these JS functions with no arguments. Handing `chat` itself to a worklet
96
+ // would copy the whole item to the UI thread, which fails on anything it cannot copy (a Date in
97
+ // `lastMessage.createdAt`, an app's own objects) - so the row's chat stays here, on the JS side.
98
+ const swipeChat = () => onSwipe?.(chat);
99
+ const startDrag = () => reorder?.onStart?.(chat);
100
+ const dropChat = to => reorder?.onDrop?.(chat, to);
101
+
93
102
  // The row swipes towards the start edge, revealing the action at the end.
94
103
  const direction = I18nManager.isRTL ? 1 : -1;
95
104
  const reveal = useSharedValue(0);
@@ -120,7 +129,7 @@ function ChatListCellInner({
120
129
  const isFling = velocity > SWIPE_ESCAPE_VELOCITY;
121
130
  if (onSwipe && (isPast || isFling)) {
122
131
  rowOffset.value = withTiming(width * direction, SWIPE_CANCEL, isFinished => {
123
- if (isFinished) runOnJS(onSwipe)(chat);
132
+ if (isFinished) runOnJS(swipeChat)();
124
133
  });
125
134
  return;
126
135
  }
@@ -145,7 +154,7 @@ function ChatListCellInner({
145
154
  drag.from.set(index);
146
155
  drag.y.set(0);
147
156
  drag.isActive.set(true);
148
- if (onDragStart) runOnJS(onDragStart)(chat);
157
+ if (onDragStart) runOnJS(startDrag)();
149
158
  },
150
159
  onUpdate: event => {
151
160
  if (!drag) return;
@@ -156,9 +165,9 @@ function ChatListCellInner({
156
165
  },
157
166
  onDeactivate: () => {
158
167
  if (!drag || drag.id.value !== chatKey) return;
159
- const to = hoverIndex(drag, count);
160
- drag.y.set(withTiming((to - index) * ROW_HEIGHT, SETTLE, () => {
161
- if (onDrop) runOnJS(onDrop)(chat, to);
168
+ const to_0 = hoverIndex(drag, count);
169
+ drag.y.set(withTiming((to_0 - index) * ROW_HEIGHT, SETTLE, () => {
170
+ if (onDrop) runOnJS(dropChat)(to_0);
162
171
  }));
163
172
  }
164
173
  });
@@ -170,8 +179,8 @@ function ChatListCellInner({
170
179
  let target = 0;
171
180
  if (drag && drag.isActive.value && drag.id.value !== chatKey) {
172
181
  const from = drag.from.value;
173
- const to_0 = hoverIndex(drag, count);
174
- if (from < index && index <= to_0) target = -ROW_HEIGHT;else if (to_0 <= index && index < from) target = ROW_HEIGHT;
182
+ const to_1 = hoverIndex(drag, count);
183
+ if (from < index && index <= to_1) target = -ROW_HEIGHT;else if (to_1 <= index && index < from) target = ROW_HEIGHT;
175
184
  }
176
185
  if (target === lastTarget.value) return;
177
186
  lastTarget.value = target;
@@ -271,11 +280,20 @@ function ChatListCellInner({
271
280
  </View>}
272
281
  </View>
273
282
  {isOutgoing && !chat.draft && <View style={styles.checks}>
274
- <Icon name={statusIcon} size={16} color={colors.check} fallback={null} />
283
+ {lastMessage?.isFailed
284
+ // Not sent: the bubble's red badge, not a check that reads as delivered
285
+ ? <View testID='chat-list-failed-badge' style={[styles.failed, {
286
+ backgroundColor: theme.colors.error
287
+ }]}>
288
+ <Text style={styles.failedText} allowFontScaling={false}>!</Text>
289
+ </View> : <Icon name={statusIcon} size={16} color={colors.check} fallback={null} />}
275
290
  </View>}
276
291
  {lastMessage?.createdAt != null && <Text style={[styles.time, {
277
292
  color: colors.date
278
- }]}>{formatChatListDate(lastMessage.createdAt, getLocale())}</Text>}
293
+ }]}>{formatChatListDate(lastMessage.createdAt, getLocale(), {
294
+ timeFormat,
295
+ dateFormat
296
+ })}</Text>}
279
297
  </View>
280
298
 
281
299
  <View style={styles.bottomLine}>
@@ -337,7 +355,7 @@ function ChatListCellInner({
337
355
 
338
356
  /** The drag props are rebuilt with the list; what matters is what they say. */
339
357
  const isSameReorder = (a, b) => a === b || !!a && !!b && a.index === b.index && a.count === b.count && a.drag === b.drag && a.onStart === b.onStart && a.onDrop === b.onDrop;
340
- const arePropsEqual = (previous, next) => previous.chat === next.chat && previous.user === next.user && previous.isSelected === next.isSelected && previous.isSelectionMode === next.isSelectionMode && previous.onPress === next.onPress && previous.onLongPress === next.onLongPress && previous.onSwipe === next.onSwipe && previous.isLast === next.isLast && previous.isReordering === next.isReordering && isSameReorder(previous.reorder, next.reorder);
358
+ const arePropsEqual = (previous, next) => previous.chat === next.chat && previous.user === next.user && previous.isSelected === next.isSelected && previous.isSelectionMode === next.isSelectionMode && previous.onPress === next.onPress && previous.onLongPress === next.onLongPress && previous.onSwipe === next.onSwipe && previous.isLast === next.isLast && previous.isReordering === next.isReordering && previous.timeFormat === next.timeFormat && previous.dateFormat === next.dateFormat && isSameReorder(previous.reorder, next.reorder);
341
359
 
342
360
  /**
343
361
  * A chat's row: avatar, name, time, the last message (or a draft, or who is typing), the unread
@@ -427,6 +445,19 @@ const styles = StyleSheet.create({
427
445
  nameIcon: {
428
446
  marginStart: 4
429
447
  },
448
+ failed: {
449
+ width: 14,
450
+ height: 14,
451
+ borderRadius: 7,
452
+ alignItems: 'center',
453
+ justifyContent: 'center'
454
+ },
455
+ failedText: {
456
+ color: '#FFFFFF',
457
+ fontSize: 10,
458
+ lineHeight: 12,
459
+ fontWeight: '700'
460
+ },
430
461
  // The checks sit 5 before the time.
431
462
  checks: {
432
463
  marginStart: 6,