stream-chat-react-native-core 9.0.0-beta.26 → 9.0.0-beta.27

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 (172) hide show
  1. package/lib/commonjs/components/Attachment/Giphy/Giphy.js +19 -7
  2. package/lib/commonjs/components/Attachment/Giphy/Giphy.js.map +1 -1
  3. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerContent.js +3 -3
  4. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerContent.js.map +1 -1
  5. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerGenericContent.js +24 -16
  6. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerGenericContent.js.map +1 -1
  7. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionList.js +2 -1
  8. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteSuggestionList.js.map +1 -1
  9. package/lib/commonjs/components/ChannelPreview/ChannelDetailsBottomSheet.js +1 -1
  10. package/lib/commonjs/components/ChannelPreview/ChannelDetailsBottomSheet.js.map +1 -1
  11. package/lib/commonjs/components/ChannelPreview/ChannelPreviewMessage.js +2 -0
  12. package/lib/commonjs/components/ChannelPreview/ChannelPreviewMessage.js.map +1 -1
  13. package/lib/commonjs/components/ImageGallery/components/ImageGrid.js +5 -4
  14. package/lib/commonjs/components/ImageGallery/components/ImageGrid.js.map +1 -1
  15. package/lib/commonjs/components/Indicators/LoadingIndicator.js +3 -3
  16. package/lib/commonjs/components/Indicators/LoadingIndicator.js.map +1 -1
  17. package/lib/commonjs/components/Message/Message.js +0 -9
  18. package/lib/commonjs/components/Message/Message.js.map +1 -1
  19. package/lib/commonjs/components/Message/MessageItemView/MessageContent.js +39 -5
  20. package/lib/commonjs/components/Message/MessageItemView/MessageContent.js.map +1 -1
  21. package/lib/commonjs/components/Message/MessageItemView/MessageItemView.js +5 -5
  22. package/lib/commonjs/components/Message/MessageItemView/MessageItemView.js.map +1 -1
  23. package/lib/commonjs/components/Message/MessageItemView/MessageReplies.js +1 -1
  24. package/lib/commonjs/components/Message/MessageItemView/MessageReplies.js.map +1 -1
  25. package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js +18 -8
  26. package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js.map +1 -1
  27. package/lib/commonjs/components/MessageInput/ShowThreadMessageInChannelButton.js +2 -1
  28. package/lib/commonjs/components/MessageInput/ShowThreadMessageInChannelButton.js.map +1 -1
  29. package/lib/commonjs/components/Poll/components/MultipleVotesSettings.js +8 -0
  30. package/lib/commonjs/components/Poll/components/MultipleVotesSettings.js.map +1 -1
  31. package/lib/commonjs/components/Poll/components/PollOption.js +15 -5
  32. package/lib/commonjs/components/Poll/components/PollOption.js.map +1 -1
  33. package/lib/commonjs/components/ThreadList/ThreadList.js +3 -1
  34. package/lib/commonjs/components/ThreadList/ThreadList.js.map +1 -1
  35. package/lib/commonjs/components/ui/Button/hooks/useButtonStyles.js +1 -1
  36. package/lib/commonjs/components/ui/Button/hooks/useButtonStyles.js.map +1 -1
  37. package/lib/commonjs/contexts/themeContext/utils/theme.js +1 -0
  38. package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
  39. package/lib/commonjs/i18n/en.json +3 -2
  40. package/lib/commonjs/i18n/es.json +3 -2
  41. package/lib/commonjs/i18n/fr.json +3 -2
  42. package/lib/commonjs/i18n/he.json +3 -2
  43. package/lib/commonjs/i18n/hi.json +3 -2
  44. package/lib/commonjs/i18n/it.json +3 -2
  45. package/lib/commonjs/i18n/ja.json +3 -2
  46. package/lib/commonjs/i18n/ko.json +3 -2
  47. package/lib/commonjs/i18n/nl.json +3 -2
  48. package/lib/commonjs/i18n/pt-br.json +3 -2
  49. package/lib/commonjs/i18n/ru.json +3 -2
  50. package/lib/commonjs/i18n/tr.json +3 -2
  51. package/lib/commonjs/version.json +1 -1
  52. package/lib/module/components/Attachment/Giphy/Giphy.js +19 -7
  53. package/lib/module/components/Attachment/Giphy/Giphy.js.map +1 -1
  54. package/lib/module/components/AttachmentPicker/components/AttachmentPickerContent.js +3 -3
  55. package/lib/module/components/AttachmentPicker/components/AttachmentPickerContent.js.map +1 -1
  56. package/lib/module/components/AttachmentPicker/components/AttachmentPickerGenericContent.js +24 -16
  57. package/lib/module/components/AttachmentPicker/components/AttachmentPickerGenericContent.js.map +1 -1
  58. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionList.js +2 -1
  59. package/lib/module/components/AutoCompleteInput/AutoCompleteSuggestionList.js.map +1 -1
  60. package/lib/module/components/ChannelPreview/ChannelDetailsBottomSheet.js +1 -1
  61. package/lib/module/components/ChannelPreview/ChannelDetailsBottomSheet.js.map +1 -1
  62. package/lib/module/components/ChannelPreview/ChannelPreviewMessage.js +2 -0
  63. package/lib/module/components/ChannelPreview/ChannelPreviewMessage.js.map +1 -1
  64. package/lib/module/components/ImageGallery/components/ImageGrid.js +5 -4
  65. package/lib/module/components/ImageGallery/components/ImageGrid.js.map +1 -1
  66. package/lib/module/components/Indicators/LoadingIndicator.js +3 -3
  67. package/lib/module/components/Indicators/LoadingIndicator.js.map +1 -1
  68. package/lib/module/components/Message/Message.js +0 -9
  69. package/lib/module/components/Message/Message.js.map +1 -1
  70. package/lib/module/components/Message/MessageItemView/MessageContent.js +39 -5
  71. package/lib/module/components/Message/MessageItemView/MessageContent.js.map +1 -1
  72. package/lib/module/components/Message/MessageItemView/MessageItemView.js +5 -5
  73. package/lib/module/components/Message/MessageItemView/MessageItemView.js.map +1 -1
  74. package/lib/module/components/Message/MessageItemView/MessageReplies.js +1 -1
  75. package/lib/module/components/Message/MessageItemView/MessageReplies.js.map +1 -1
  76. package/lib/module/components/Message/MessageItemView/MessageStatus.js +18 -8
  77. package/lib/module/components/Message/MessageItemView/MessageStatus.js.map +1 -1
  78. package/lib/module/components/MessageInput/ShowThreadMessageInChannelButton.js +2 -1
  79. package/lib/module/components/MessageInput/ShowThreadMessageInChannelButton.js.map +1 -1
  80. package/lib/module/components/Poll/components/MultipleVotesSettings.js +8 -0
  81. package/lib/module/components/Poll/components/MultipleVotesSettings.js.map +1 -1
  82. package/lib/module/components/Poll/components/PollOption.js +15 -5
  83. package/lib/module/components/Poll/components/PollOption.js.map +1 -1
  84. package/lib/module/components/ThreadList/ThreadList.js +3 -1
  85. package/lib/module/components/ThreadList/ThreadList.js.map +1 -1
  86. package/lib/module/components/ui/Button/hooks/useButtonStyles.js +1 -1
  87. package/lib/module/components/ui/Button/hooks/useButtonStyles.js.map +1 -1
  88. package/lib/module/contexts/themeContext/utils/theme.js +1 -0
  89. package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
  90. package/lib/module/i18n/en.json +3 -2
  91. package/lib/module/i18n/es.json +3 -2
  92. package/lib/module/i18n/fr.json +3 -2
  93. package/lib/module/i18n/he.json +3 -2
  94. package/lib/module/i18n/hi.json +3 -2
  95. package/lib/module/i18n/it.json +3 -2
  96. package/lib/module/i18n/ja.json +3 -2
  97. package/lib/module/i18n/ko.json +3 -2
  98. package/lib/module/i18n/nl.json +3 -2
  99. package/lib/module/i18n/pt-br.json +3 -2
  100. package/lib/module/i18n/ru.json +3 -2
  101. package/lib/module/i18n/tr.json +3 -2
  102. package/lib/module/version.json +1 -1
  103. package/lib/typescript/components/Attachment/Giphy/Giphy.d.ts +1 -1
  104. package/lib/typescript/components/Attachment/Giphy/Giphy.d.ts.map +1 -1
  105. package/lib/typescript/components/AttachmentPicker/components/AttachmentPickerGenericContent.d.ts.map +1 -1
  106. package/lib/typescript/components/AutoCompleteInput/AutoCompleteSuggestionList.d.ts.map +1 -1
  107. package/lib/typescript/components/ChannelPreview/ChannelPreviewMessage.d.ts.map +1 -1
  108. package/lib/typescript/components/ImageGallery/components/ImageGrid.d.ts.map +1 -1
  109. package/lib/typescript/components/Indicators/LoadingIndicator.d.ts.map +1 -1
  110. package/lib/typescript/components/Message/Message.d.ts.map +1 -1
  111. package/lib/typescript/components/Message/MessageItemView/MessageContent.d.ts.map +1 -1
  112. package/lib/typescript/components/Message/MessageItemView/MessageItemView.d.ts.map +1 -1
  113. package/lib/typescript/components/Message/MessageItemView/MessageStatus.d.ts.map +1 -1
  114. package/lib/typescript/components/MessageInput/ShowThreadMessageInChannelButton.d.ts.map +1 -1
  115. package/lib/typescript/components/Poll/components/MultipleVotesSettings.d.ts.map +1 -1
  116. package/lib/typescript/components/Poll/components/PollOption.d.ts.map +1 -1
  117. package/lib/typescript/components/ThreadList/ThreadList.d.ts.map +1 -1
  118. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +1 -0
  119. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
  120. package/lib/typescript/contexts/themeContext/utils/theme.d.ts +1 -0
  121. package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
  122. package/lib/typescript/i18n/en.json +3 -2
  123. package/lib/typescript/i18n/es.json +3 -2
  124. package/lib/typescript/i18n/fr.json +3 -2
  125. package/lib/typescript/i18n/he.json +3 -2
  126. package/lib/typescript/i18n/hi.json +3 -2
  127. package/lib/typescript/i18n/it.json +3 -2
  128. package/lib/typescript/i18n/ja.json +3 -2
  129. package/lib/typescript/i18n/ko.json +3 -2
  130. package/lib/typescript/i18n/nl.json +3 -2
  131. package/lib/typescript/i18n/pt-br.json +3 -2
  132. package/lib/typescript/i18n/ru.json +3 -2
  133. package/lib/typescript/i18n/tr.json +3 -2
  134. package/lib/typescript/utils/i18n/Streami18n.d.ts +3 -2
  135. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  136. package/package.json +1 -1
  137. package/src/components/Attachment/Giphy/Giphy.tsx +19 -7
  138. package/src/components/Attachment/__tests__/Giphy.test.js +33 -1
  139. package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx +3 -3
  140. package/src/components/AttachmentPicker/components/AttachmentPickerGenericContent.tsx +23 -13
  141. package/src/components/AutoCompleteInput/AutoCompleteSuggestionList.tsx +3 -1
  142. package/src/components/ChannelPreview/ChannelDetailsBottomSheet.tsx +1 -1
  143. package/src/components/ChannelPreview/ChannelPreviewMessage.tsx +3 -1
  144. package/src/components/ImageGallery/components/ImageGrid.tsx +3 -1
  145. package/src/components/Indicators/LoadingIndicator.tsx +7 -5
  146. package/src/components/Message/Message.tsx +0 -11
  147. package/src/components/Message/MessageItemView/MessageContent.tsx +44 -7
  148. package/src/components/Message/MessageItemView/MessageItemView.tsx +8 -5
  149. package/src/components/Message/MessageItemView/MessageReplies.tsx +1 -1
  150. package/src/components/Message/MessageItemView/MessageStatus.tsx +16 -5
  151. package/src/components/Message/MessageItemView/__tests__/MessageContent.test.js +44 -1
  152. package/src/components/Message/MessageItemView/__tests__/MessageItemView.test.js +21 -1
  153. package/src/components/MessageInput/ShowThreadMessageInChannelButton.tsx +1 -0
  154. package/src/components/MessageInput/__tests__/__snapshots__/AttachButton.test.js.snap +1 -1
  155. package/src/components/Poll/components/MultipleVotesSettings.tsx +8 -0
  156. package/src/components/Poll/components/PollOption.tsx +25 -9
  157. package/src/components/ThreadList/ThreadList.tsx +1 -1
  158. package/src/components/ui/Button/hooks/useButtonStyles.ts +1 -1
  159. package/src/contexts/themeContext/utils/theme.ts +2 -0
  160. package/src/i18n/en.json +3 -2
  161. package/src/i18n/es.json +3 -2
  162. package/src/i18n/fr.json +3 -2
  163. package/src/i18n/he.json +3 -2
  164. package/src/i18n/hi.json +3 -2
  165. package/src/i18n/it.json +3 -2
  166. package/src/i18n/ja.json +3 -2
  167. package/src/i18n/ko.json +3 -2
  168. package/src/i18n/nl.json +3 -2
  169. package/src/i18n/pt-br.json +3 -2
  170. package/src/i18n/ru.json +3 -2
  171. package/src/i18n/tr.json +3 -2
  172. package/src/version.json +1 -1
@@ -6,7 +6,7 @@ import { useTranslationContext } from '../../contexts/translationContext/Transla
6
6
  import { primitives } from '../../theme';
7
7
  import { Spinner } from '../UIComponents/Spinner';
8
8
 
9
- type LoadingIndicatorWrapperProps = { text: string };
9
+ type LoadingIndicatorWrapperProps = { text: string | undefined };
10
10
 
11
11
  const LoadingIndicatorWrapper = ({ text }: LoadingIndicatorWrapperProps) => {
12
12
  const styles = useStyles();
@@ -14,9 +14,11 @@ const LoadingIndicatorWrapper = ({ text }: LoadingIndicatorWrapperProps) => {
14
14
  return (
15
15
  <View style={styles.container}>
16
16
  <Spinner height={20} width={20} />
17
- <Text style={styles.loadingText} testID='loading'>
18
- {text}
19
- </Text>
17
+ {text ? (
18
+ <Text style={styles.loadingText} testID='loading'>
19
+ {text}
20
+ </Text>
21
+ ) : null}
20
22
  </View>
21
23
  );
22
24
  };
@@ -44,7 +46,7 @@ export const LoadingIndicator = (props: LoadingProps) => {
44
46
  case 'message':
45
47
  return <LoadingIndicatorWrapper text={t('Loading messages...')} />;
46
48
  case 'threads':
47
- return <LoadingIndicatorWrapper text={t('Loading threads...')} />;
49
+ return <LoadingIndicatorWrapper text={undefined} />;
48
50
  default:
49
51
  return <LoadingIndicatorWrapper text={t('Loading...')} />;
50
52
  }
@@ -381,21 +381,12 @@ const MessageWithContext = (props: MessagePropsWithContext) => {
381
381
  }
382
382
  };
383
383
 
384
- const onPressQuotedMessage = (quotedMessage: LocalMessage) => {
385
- if (!goToMessage) {
386
- return;
387
- }
388
-
389
- goToMessage(quotedMessage.id);
390
- };
391
-
392
384
  const errorOrFailed = message.type === 'error' || message.status === MessageStatusTypes.FAILED;
393
385
 
394
386
  const onPress = (error = errorOrFailed) => {
395
387
  if (dismissKeyboardOnMessageTouch) {
396
388
  dismissKeyboard();
397
389
  }
398
- const quotedMessage = message.quoted_message;
399
390
  if (error) {
400
391
  /**
401
392
  * If its a Blocked message, we don't do anything as per specs.
@@ -411,8 +402,6 @@ const MessageWithContext = (props: MessagePropsWithContext) => {
411
402
  return;
412
403
  }
413
404
  showMessageOverlay();
414
- } else if (quotedMessage) {
415
- onPressQuotedMessage(quotedMessage);
416
405
  }
417
406
  };
418
407
 
@@ -121,6 +121,7 @@ const MessageContentWithContext = (props: MessageContentPropsWithContext) => {
121
121
  FileAttachmentGroup,
122
122
  Gallery,
123
123
  groupStyles,
124
+ goToMessage,
124
125
  isMessageAIGenerated,
125
126
  isMyMessage,
126
127
  isVeryLastMessage,
@@ -221,7 +222,6 @@ const MessageContentWithContext = (props: MessageContentPropsWithContext) => {
221
222
 
222
223
  const { setNativeScrollability } = useMessageListItemContext();
223
224
  const hasContentSideViews = !!(MessageContentLeadingView || MessageContentTrailingView);
224
-
225
225
  const contentBody = (
226
226
  <>
227
227
  <View
@@ -240,12 +240,45 @@ const MessageContentWithContext = (props: MessageContentPropsWithContext) => {
240
240
  case 'quoted_reply':
241
241
  return (
242
242
  message.quoted_message && (
243
- <View
243
+ <Pressable
244
+ disabled={!goToMessage}
244
245
  key={`quoted_reply_${messageContentOrderIndex}`}
246
+ onLongPress={(event) => {
247
+ if (onLongPress) {
248
+ onLongPress({
249
+ emitter: 'messageContent',
250
+ event,
251
+ });
252
+ }
253
+ }}
254
+ onPress={(event) => {
255
+ if (!message.quoted_message || !goToMessage) {
256
+ return;
257
+ }
258
+
259
+ if (onPress) {
260
+ onPress({
261
+ defaultHandler: () => goToMessage(message.quoted_message!.id),
262
+ emitter: 'messageContent',
263
+ event,
264
+ });
265
+ return;
266
+ }
267
+
268
+ goToMessage(message.quoted_message.id);
269
+ }}
270
+ onPressIn={(event) => {
271
+ if (onPressIn) {
272
+ onPressIn({
273
+ emitter: 'messageContent',
274
+ event,
275
+ });
276
+ }
277
+ }}
245
278
  style={[styles.replyContainer, replyContainer]}
246
279
  >
247
280
  <Reply mode='reply' styles={replyStyles} />
248
- </View>
281
+ </Pressable>
249
282
  )
250
283
  );
251
284
  case 'attachments':
@@ -584,7 +617,8 @@ export const MessageContent = (props: MessageContentProps) => {
584
617
  const messageHasSingleFile =
585
618
  messageContentOrder.length === 1 && messageContentOrder[0] === 'files' && isSingleFile;
586
619
  const messageHasOnlyText = messageContentOrder.length === 1 && messageContentOrder[0] === 'text';
587
- const messageHasGiphyOrImgur =
620
+ const messageHasStandaloneGiphyOrImgur =
621
+ !message.quoted_message &&
588
622
  otherAttachments.filter(
589
623
  (file) => file.type === FileTypes.Giphy || file.type === FileTypes.Imgur,
590
624
  ).length > 0;
@@ -594,17 +628,20 @@ export const MessageContent = (props: MessageContentProps) => {
594
628
  messageHasSingleMedia ||
595
629
  messageHasSingleFile ||
596
630
  messageHasOnlyText ||
597
- messageHasGiphyOrImgur;
631
+ messageHasStandaloneGiphyOrImgur;
598
632
 
599
633
  const hidePaddingHorizontal =
600
- messageHasPoll || messageHasSingleMedia || messageHasSingleFile || messageHasGiphyOrImgur;
634
+ messageHasPoll ||
635
+ messageHasSingleMedia ||
636
+ messageHasSingleFile ||
637
+ messageHasStandaloneGiphyOrImgur;
601
638
 
602
639
  const hidePaddingBottom =
603
640
  messageHasPoll ||
604
641
  messageHasSingleMedia ||
605
642
  messageHasSingleFile ||
606
643
  messageHasOnlyText ||
607
- messageHasGiphyOrImgur ||
644
+ messageHasStandaloneGiphyOrImgur ||
608
645
  (messageContentOrder.length > 1 &&
609
646
  messageContentOrder[messageContentOrder.length - 1] === 'text');
610
647
 
@@ -17,6 +17,7 @@ import { useTheme } from '../../../contexts/themeContext/ThemeContext';
17
17
  import { useStableCallback } from '../../../hooks/useStableCallback';
18
18
 
19
19
  import { primitives } from '../../../theme';
20
+ import { FileTypes } from '../../../types/types';
20
21
  import { checkMessageEquality, checkQuotedMessageEquality } from '../../../utils/utils';
21
22
  import { useMessageData } from '../hooks/useMessageData';
22
23
 
@@ -293,10 +294,14 @@ const MessageItemViewWithContext = (props: MessageItemViewPropsWithContext) => {
293
294
  });
294
295
 
295
296
  const groupStyle = `${alignment}_${groupStyles?.[0]?.toLowerCase?.()}`;
297
+ const hasStandaloneGiphyOrImgur =
298
+ !message.quoted_message &&
299
+ otherAttachments.length > 0 &&
300
+ (otherAttachments[0].type === FileTypes.Giphy || otherAttachments[0].type === FileTypes.Imgur);
296
301
 
297
302
  let noBorder = onlyEmojis && !message.quoted_message;
298
303
  if (otherAttachments.length) {
299
- if (otherAttachments[0].type === 'giphy' && !isMyMessage) {
304
+ if (hasStandaloneGiphyOrImgur && !isMyMessage) {
300
305
  noBorder = false;
301
306
  } else {
302
307
  noBorder = true;
@@ -306,10 +311,8 @@ const MessageItemViewWithContext = (props: MessageItemViewPropsWithContext) => {
306
311
  let backgroundColor = semantics.chatBgOutgoing;
307
312
  if (onlyEmojis && !message.quoted_message) {
308
313
  backgroundColor = 'transparent';
309
- } else if (otherAttachments.length) {
310
- if (otherAttachments[0].type === 'giphy') {
311
- backgroundColor = 'transparent';
312
- }
314
+ } else if (hasStandaloneGiphyOrImgur) {
315
+ backgroundColor = 'transparent';
313
316
  } else if (isMessageReceivedOrErrorType) {
314
317
  backgroundColor = semantics.chatBgIncoming;
315
318
  }
@@ -235,7 +235,7 @@ const useStyles = () => {
235
235
  gap: primitives.spacingXs,
236
236
  },
237
237
  messageRepliesText: {
238
- color: shouldUseOverlayStyles ? semantics.textOnAccent : semantics.textPrimary,
238
+ color: shouldUseOverlayStyles ? semantics.textOnAccent : semantics.textLink,
239
239
  fontSize: primitives.typographyFontSizeSm,
240
240
  fontWeight: primitives.typographyFontWeightSemiBold,
241
241
  lineHeight: primitives.typographyLineHeightTight,
@@ -29,7 +29,6 @@ const MessageStatusWithContext = (props: MessageStatusPropsWithContext) => {
29
29
  messageItemView: {
30
30
  status: { checkAllIcon, checkIcon, container, timeIcon },
31
31
  },
32
- semantics,
33
32
  },
34
33
  } = useTheme();
35
34
 
@@ -54,14 +53,14 @@ const MessageStatusWithContext = (props: MessageStatusPropsWithContext) => {
54
53
  {read ? (
55
54
  <CheckAll
56
55
  height={16}
57
- stroke={semantics.accentPrimary}
56
+ stroke={styles.readCheck.color}
58
57
  width={16}
59
58
  accessibilityLabel='Read'
60
59
  {...checkAllIcon}
61
60
  />
62
61
  ) : delivered ? (
63
62
  <CheckAll
64
- stroke={semantics.chatTextTimestamp}
63
+ stroke={styles.deliveredCheck.color}
65
64
  height={16}
66
65
  width={16}
67
66
  accessibilityLabel='Delivered'
@@ -69,7 +68,7 @@ const MessageStatusWithContext = (props: MessageStatusPropsWithContext) => {
69
68
  />
70
69
  ) : sending ? (
71
70
  <Time
72
- stroke={semantics.chatTextTimestamp}
71
+ stroke={styles.sendingCheck.color}
73
72
  height={16}
74
73
  width={16}
75
74
  accessibilityLabel='Sending'
@@ -77,7 +76,7 @@ const MessageStatusWithContext = (props: MessageStatusPropsWithContext) => {
77
76
  />
78
77
  ) : sent ? (
79
78
  <Check
80
- stroke={semantics.chatTextTimestamp}
79
+ stroke={styles.sentCheck.color}
81
80
  height={16}
82
81
  width={16}
83
82
  accessibilityLabel='Sent'
@@ -162,6 +161,18 @@ const useStyles = () => {
162
161
  flexDirection: 'row',
163
162
  gap: primitives.spacingXxs,
164
163
  },
164
+ readCheck: {
165
+ color: shouldUseOverlayStyles ? semantics.textOnAccent : semantics.accentPrimary,
166
+ },
167
+ deliveredCheck: {
168
+ color: shouldUseOverlayStyles ? semantics.textOnAccent : semantics.chatTextTimestamp,
169
+ },
170
+ sendingCheck: {
171
+ color: shouldUseOverlayStyles ? semantics.textOnAccent : semantics.chatTextTimestamp,
172
+ },
173
+ sentCheck: {
174
+ color: shouldUseOverlayStyles ? semantics.textOnAccent : semantics.chatTextTimestamp,
175
+ },
165
176
  });
166
177
  }, [shouldUseOverlayStyles, semantics]);
167
178
  };
@@ -7,7 +7,10 @@ import { ChannelsStateProvider } from '../../../../contexts/channelsStateContext
7
7
 
8
8
  import { getOrCreateChannelApi } from '../../../../mock-builders/api/getOrCreateChannel';
9
9
  import { useMockedApis } from '../../../../mock-builders/api/useMockedApis';
10
- import { generateVideoAttachment } from '../../../../mock-builders/generator/attachment';
10
+ import {
11
+ generateGiphyAttachment,
12
+ generateVideoAttachment,
13
+ } from '../../../../mock-builders/generator/attachment';
11
14
  import { generateChannelResponse } from '../../../../mock-builders/generator/channel';
12
15
  import { generateMember } from '../../../../mock-builders/generator/member';
13
16
  import { generateMessage } from '../../../../mock-builders/generator/message';
@@ -326,6 +329,46 @@ describe('MessageContent', () => {
326
329
  expect(contentContainerStyle.paddingBottom).toBe(0);
327
330
  });
328
331
 
332
+ it('keeps content padding for a quoted reply with a giphy attachment', async () => {
333
+ const user = generateUser();
334
+ const message = generateMessage({
335
+ attachments: [generateGiphyAttachment()],
336
+ quoted_message: generateMessage({ text: 'quoted message', user }),
337
+ text: '',
338
+ user,
339
+ });
340
+
341
+ renderMessage({ message });
342
+
343
+ await waitFor(() => {
344
+ expect(screen.getByTestId('message-content-wrapper')).toBeTruthy();
345
+ expect(screen.getByTestId('giphy-attachment')).toBeTruthy();
346
+ });
347
+
348
+ const giphyAttachment = screen.getByTestId('giphy-attachment');
349
+ let ancestor = giphyAttachment.parent;
350
+ let contentContainerStyle;
351
+
352
+ while (ancestor && !contentContainerStyle) {
353
+ const flattenedStyle = StyleSheet.flatten(ancestor.props.style);
354
+ if (
355
+ flattenedStyle &&
356
+ 'paddingTop' in flattenedStyle &&
357
+ 'paddingHorizontal' in flattenedStyle &&
358
+ 'paddingBottom' in flattenedStyle
359
+ ) {
360
+ contentContainerStyle = flattenedStyle;
361
+ break;
362
+ }
363
+ ancestor = ancestor.parent;
364
+ }
365
+
366
+ expect(contentContainerStyle).toBeTruthy();
367
+ expect(contentContainerStyle.paddingTop).toBeGreaterThan(0);
368
+ expect(contentContainerStyle.paddingHorizontal).toBeGreaterThan(0);
369
+ expect(contentContainerStyle.paddingBottom).toBeGreaterThan(0);
370
+ });
371
+
329
372
  it('renders the FileAttachment component when a file attachment exists', async () => {
330
373
  const user = generateUser();
331
374
  const message = generateMessage({
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
 
3
- import { Text } from 'react-native';
3
+ import { StyleSheet, Text } from 'react-native';
4
4
  import { GestureDetector } from 'react-native-gesture-handler';
5
5
 
6
6
  import { cleanup, render, screen, waitFor } from '@testing-library/react-native';
@@ -10,6 +10,7 @@ import { useMessageContext } from '../../../../contexts/messageContext/MessageCo
10
10
 
11
11
  import { getOrCreateChannelApi } from '../../../../mock-builders/api/getOrCreateChannel';
12
12
  import { useMockedApis } from '../../../../mock-builders/api/useMockedApis';
13
+ import { generateGiphyAttachment } from '../../../../mock-builders/generator/attachment';
13
14
  import { generateChannelResponse } from '../../../../mock-builders/generator/channel';
14
15
  import { generateMember } from '../../../../mock-builders/generator/member';
15
16
  import { generateMessage } from '../../../../mock-builders/generator/message';
@@ -256,4 +257,23 @@ describe('MessageItemView', () => {
256
257
  });
257
258
  });
258
259
  });
260
+
261
+ it('keeps the message shell background for a quoted reply with a giphy attachment', async () => {
262
+ const user = generateUser();
263
+ const message = generateMessage({
264
+ attachments: [generateGiphyAttachment()],
265
+ quoted_message: generateMessage({ text: 'quoted message', user }),
266
+ text: '',
267
+ user,
268
+ });
269
+
270
+ renderMessage({ message });
271
+
272
+ await waitFor(() => {
273
+ const wrapperStyle = StyleSheet.flatten(
274
+ screen.getByTestId('message-content-wrapper').props.style,
275
+ );
276
+ expect(wrapperStyle.backgroundColor).not.toBe('transparent');
277
+ });
278
+ });
259
279
  });
@@ -76,6 +76,7 @@ export const ShowThreadMessageInChannelButtonWithContext = (
76
76
  showReplyInChannel
77
77
  ? {
78
78
  backgroundColor: semantics.controlRadioCheckBgSelected,
79
+ borderWidth: 0,
79
80
  ...checkBoxActive,
80
81
  }
81
82
  : { ...checkBoxInactive },
@@ -1800,7 +1800,7 @@ exports[`AttachButton should render an disabled AttachButton 1`] = `
1800
1800
  },
1801
1801
  {
1802
1802
  "backgroundColor": undefined,
1803
- "borderColor": "#d5dbe1",
1803
+ "borderColor": "#ebeef1",
1804
1804
  "borderWidth": 1,
1805
1805
  "height": 48,
1806
1806
  "width": 48,
@@ -169,6 +169,7 @@ export const MultipleVotesSettings = () => {
169
169
  LeadingIcon={Minus}
170
170
  onPress={decrementMaxVotes}
171
171
  disabled={decrementDisabled}
172
+ style={decrementDisabled ? styles.buttonDisabled : styles.buttonEnabled}
172
173
  testID='max-votes-decrement'
173
174
  />
174
175
  <MaxVotesTextInput />
@@ -180,6 +181,7 @@ export const MultipleVotesSettings = () => {
180
181
  LeadingIcon={Plus}
181
182
  onPress={incrementMaxVotes}
182
183
  disabled={incrementDisabled}
184
+ style={incrementDisabled ? styles.buttonDisabled : styles.buttonEnabled}
183
185
  testID='max-votes-increment'
184
186
  />
185
187
  </Animated.View>
@@ -235,6 +237,12 @@ const useStyles = () => {
235
237
  paddingVertical: primitives.spacingMd,
236
238
  textAlign: I18nManager.isRTL ? 'right' : 'left',
237
239
  },
240
+ buttonEnabled: {
241
+ borderColor: semantics.borderCoreOnSurface,
242
+ },
243
+ buttonDisabled: {
244
+ borderColor: semantics.borderUtilityDisabledOnSurface,
245
+ },
238
246
  });
239
247
  }, [semantics]);
240
248
  };
@@ -124,14 +124,18 @@ export const PollOption = ({ option, showProgressBar = true, forceIncoming }: Po
124
124
  <VoteButton option={option} />
125
125
  <View style={[styles.info, info]}>
126
126
  <View style={[styles.header, header]}>
127
- <Text style={[styles.text, text]}>{option.text}</Text>
127
+ <Text ellipsizeMode='tail' numberOfLines={2} style={[styles.text, text]}>
128
+ {option.text}
129
+ </Text>
128
130
  <View style={[styles.votesContainer, votesContainer]}>
129
- <UserAvatarStack
130
- users={relevantVotes.map((vote: PollVote) => vote.user as UserResponse)}
131
- overlap={0.2}
132
- maxVisible={3}
133
- avatarSize='xs'
134
- />
131
+ {relevantVotes.length > 0 ? (
132
+ <UserAvatarStack
133
+ users={relevantVotes.map((vote: PollVote) => vote.user as UserResponse)}
134
+ overlap={0.2}
135
+ maxVisible={3}
136
+ avatarSize='xs'
137
+ />
138
+ ) : null}
135
139
 
136
140
  <Text style={[styles.votesText, votesText]}>{voteCountsByOption[option.id] || 0}</Text>
137
141
  </View>
@@ -223,10 +227,14 @@ const useStyles = () => {
223
227
  },
224
228
  header: {
225
229
  flexDirection: 'row',
226
- justifyContent: 'space-between',
230
+ alignItems: 'flex-start',
231
+ gap: primitives.spacingXs,
232
+ minWidth: 0,
227
233
  },
228
234
  text: {
229
235
  color: semantics.chatTextIncoming,
236
+ flexGrow: 1,
237
+ flexShrink: 1,
230
238
  fontSize: primitives.typographyFontSizeSm,
231
239
  fontWeight: primitives.typographyFontWeightRegular,
232
240
  lineHeight: primitives.typographyLineHeightTight,
@@ -234,9 +242,17 @@ const useStyles = () => {
234
242
  },
235
243
  info: {
236
244
  flexGrow: 1,
245
+ flexShrink: 1,
246
+ gap: primitives.spacingXs,
247
+ minWidth: 0,
248
+ },
249
+ votesContainer: {
250
+ alignItems: 'center',
251
+ flexDirection: 'row',
252
+ flexShrink: 0,
237
253
  gap: primitives.spacingXs,
254
+ minHeight: 20,
238
255
  },
239
- votesContainer: { flexDirection: 'row', gap: primitives.spacingXs, alignItems: 'center' },
240
256
  votesText: {
241
257
  color: semantics.chatTextIncoming,
242
258
  fontSize: primitives.typographyFontSizeXs,
@@ -45,7 +45,7 @@ export const DefaultThreadListLoadingIndicator = () => (
45
45
  ))}
46
46
  </View>
47
47
  );
48
- export const DefaultThreadListLoadingNextIndicator = () => <LoadingIndicator />;
48
+ export const DefaultThreadListLoadingNextIndicator = () => <LoadingIndicator listType='threads' />;
49
49
 
50
50
  const renderItem = (props: { item: Thread }) => <ThreadListItem thread={props.item} />;
51
51
 
@@ -79,7 +79,7 @@ export const useButtonStyles = ({ variant, type }: ButtonStylesConfig) => {
79
79
  borderColor: semantics.buttonSecondaryBorder,
80
80
  disabledForegroundColor: semantics.textDisabled,
81
81
  disabledBackgroundColor: undefined,
82
- disabledBorderColor: semantics.buttonSecondaryBorder,
82
+ disabledBorderColor: semantics.borderUtilityDisabled,
83
83
  },
84
84
  secondaryGhost: {
85
85
  foregroundColor: semantics.buttonSecondaryText,
@@ -107,6 +107,7 @@ export type Theme = {
107
107
  bottomSheetContentContainer: ViewStyle;
108
108
  durationText: TextStyle;
109
109
  content: {
110
+ actionContainer: ViewStyle;
110
111
  container: ViewStyle;
111
112
  infoContainer: ViewStyle;
112
113
  text: TextStyle;
@@ -1030,6 +1031,7 @@ export const defaultTheme: Theme = {
1030
1031
  bottomSheetContentContainer: {},
1031
1032
  durationText: {},
1032
1033
  content: {
1034
+ actionContainer: {},
1033
1035
  container: {},
1034
1036
  infoContainer: {},
1035
1037
  text: {},
package/src/i18n/en.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "Change in Settings",
165
165
  "Create a poll and let everyone vote": "Create a poll and let everyone vote",
166
166
  "Open Camera": "Open Camera",
167
- "Pick a document to share it with everyone": "Pick a document to share it with everyone",
168
- "Pick document": "Pick document",
167
+ "Open Files": "Open Files",
168
+ "Select files to share": "Select files to share",
169
+ "Take a photo and share": "Take a photo and share",
169
170
  "Take a video and share": "Take a video and share",
170
171
  "You have not granted access to your camera": "You have not granted access to your camera",
171
172
  "{{count}} Reactions_many": "{{count}} Reactions",
package/src/i18n/es.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "Cambiar en Ajustes",
165
165
  "Create a poll and let everyone vote": "Crea una encuesta y deja que todos voten",
166
166
  "Open Camera": "Abrir camara",
167
- "Pick a document to share it with everyone": "Elige un documento para compartirlo con todos",
168
- "Pick document": "Elegir documento",
167
+ "Open Files": "Abrir archivos",
168
+ "Select files to share": "Selecciona archivos para compartir",
169
+ "Take a photo and share": "Toma una foto y compártela",
169
170
  "Take a video and share": "Graba un video y compártelo",
170
171
  "You have not granted access to your camera": "No has concedido acceso a tu camara",
171
172
  "{{count}} Reactions_many": "{{count}} reacciones",
package/src/i18n/fr.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "Changer dans Réglages",
165
165
  "Create a poll and let everyone vote": "Créez un sondage et laissez tout le monde voter",
166
166
  "Open Camera": "Ouvrir la caméra",
167
- "Pick a document to share it with everyone": "Choisissez un document pour le partager avec tout le monde",
168
- "Pick document": "Choisir un document",
167
+ "Open Files": "Ouvrir les fichiers",
168
+ "Select files to share": "Sélectionnez des fichiers à partager",
169
+ "Take a photo and share": "Prenez une photo et partagez-la",
169
170
  "Take a video and share": "Prenez une vidéo et partagez-la",
170
171
  "You have not granted access to your camera": "Vous n'avez pas accordé l'accès à votre caméra",
171
172
  "{{count}} Reactions_many": "{{count}} réactions",
package/src/i18n/he.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "שנה בהגדרות",
165
165
  "Create a poll and let everyone vote": "צור סקר ותן לכולם להצביע",
166
166
  "Open Camera": "פתח מצלמה",
167
- "Pick a document to share it with everyone": "בחר מסמך כדי לשתף אותו עם כולם",
168
- "Pick document": "בחר מסמך",
167
+ "Open Files": "פתח קבצים",
168
+ "Select files to share": "בחר קבצים לשיתוף",
169
+ "Take a photo and share": "צלם תמונה ושתף",
169
170
  "Take a video and share": "צלם וידאו ושתף",
170
171
  "You have not granted access to your camera": "לא הענקת גישה למצלמה שלך",
171
172
  "{{count}} Reactions_many": "{{count}} תגובות",
package/src/i18n/hi.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "सेटिंग्स में बदलें",
165
165
  "Create a poll and let everyone vote": "पोल बनाएँ और सभी को वोट करने दें",
166
166
  "Open Camera": "कैमरा खोलें",
167
- "Pick a document to share it with everyone": "सभी के साथ साझा करने के लिए एक दस्तावेज़ चुनें",
168
- "Pick document": "दस्तावेज़ चुनें",
167
+ "Open Files": "फ़ाइलें खोलें",
168
+ "Select files to share": "साझा करने के लिए फ़ाइलें चुनें",
169
+ "Take a photo and share": "एक फ़ोटो लें और साझा करें",
169
170
  "Take a video and share": "वीडियो लें और साझा करें",
170
171
  "You have not granted access to your camera": "आपने अपने कैमरे के लिए अनुमति नहीं दी है",
171
172
  "{{count}} Reactions_many": "{{count}} प्रतिक्रियाएँ",
package/src/i18n/it.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "Cambia in Impostazioni",
165
165
  "Create a poll and let everyone vote": "Crea un sondaggio e lascia che tutti votino",
166
166
  "Open Camera": "Apri fotocamera",
167
- "Pick a document to share it with everyone": "Scegli un documento da condividere con tutti",
168
- "Pick document": "Scegli documento",
167
+ "Open Files": "Apri file",
168
+ "Select files to share": "Seleziona file da condividere",
169
+ "Take a photo and share": "Scatta una foto e condividila",
169
170
  "Take a video and share": "Registra un video e condividilo",
170
171
  "You have not granted access to your camera": "Non hai concesso l’accesso alla fotocamera",
171
172
  "{{count}} Reactions_many": "{{count}} reazioni",
package/src/i18n/ja.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "設定で変更",
165
165
  "Create a poll and let everyone vote": "投票を作成してみんなに投票してもらう",
166
166
  "Open Camera": "カメラを開く",
167
- "Pick a document to share it with everyone": "みんなと共有するドキュメントを選択",
168
- "Pick document": "ドキュメントを選択",
167
+ "Open Files": "ファイルを開く",
168
+ "Select files to share": "共有するファイルを選択",
169
+ "Take a photo and share": "写真を撮って共有",
169
170
  "Take a video and share": "動画を撮影して共有",
170
171
  "You have not granted access to your camera": "カメラへのアクセスが許可されていません",
171
172
  "{{count}} Reactions_many": "{{count}}件のリアクション",
package/src/i18n/ko.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "설정에서 변경",
165
165
  "Create a poll and let everyone vote": "투표를 만들어 모두가 투표하게 하세요",
166
166
  "Open Camera": "카메라 열기",
167
- "Pick a document to share it with everyone": "모두와 공유할 문서를 선택하세요",
168
- "Pick document": "문서 선택",
167
+ "Open Files": "파일 열기",
168
+ "Select files to share": "공유할 파일 선택",
169
+ "Take a photo and share": "사진을 찍고 공유",
169
170
  "Take a video and share": "동영상을 촬영하고 공유",
170
171
  "You have not granted access to your camera": "카메라 접근 권한이 없습니다",
171
172
  "{{count}} Reactions_many": "{{count}}개의 반응",
package/src/i18n/nl.json CHANGED
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "Wijzigen in Instellingen",
165
165
  "Create a poll and let everyone vote": "Maak een peiling en laat iedereen stemmen",
166
166
  "Open Camera": "Camera openen",
167
- "Pick a document to share it with everyone": "Kies een document om het met iedereen te delen",
168
- "Pick document": "Document kiezen",
167
+ "Open Files": "Bestanden openen",
168
+ "Select files to share": "Selecteer bestanden om te delen",
169
+ "Take a photo and share": "Maak een foto en deel deze",
169
170
  "Take a video and share": "Maak een video en deel deze",
170
171
  "You have not granted access to your camera": "Je hebt geen toegang tot je camera verleend",
171
172
  "{{count}} Reactions_many": "{{count}} reacties",
@@ -164,8 +164,9 @@
164
164
  "Change in Settings": "Alterar nos Ajustes",
165
165
  "Create a poll and let everyone vote": "Crie uma enquete e deixe todos votarem",
166
166
  "Open Camera": "Abrir camera",
167
- "Pick a document to share it with everyone": "Escolha um documento para compartilhar com todos",
168
- "Pick document": "Escolher documento",
167
+ "Open Files": "Abrir arquivos",
168
+ "Select files to share": "Selecione arquivos para compartilhar",
169
+ "Take a photo and share": "Tire uma foto e compartilhe",
169
170
  "Take a video and share": "Grave um video e compartilhe",
170
171
  "You have not granted access to your camera": "Você não concedeu acesso à sua câmera",
171
172
  "{{count}} Reactions_many": "{{count}} reações",