stream-chat-react-native-core 4.4.0-beta.2 → 4.4.0-beta.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 (147) hide show
  1. package/README.md +2 -2
  2. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  3. package/lib/commonjs/components/Channel/hooks/useCreatePaginatedMessageListContext.js +4 -12
  4. package/lib/commonjs/components/Channel/hooks/useCreatePaginatedMessageListContext.js.map +1 -1
  5. package/lib/commonjs/components/Channel/hooks/useCreateThreadContext.js +4 -12
  6. package/lib/commonjs/components/Channel/hooks/useCreateThreadContext.js.map +1 -1
  7. package/lib/commonjs/components/Chat/Chat.js +8 -4
  8. package/lib/commonjs/components/Chat/Chat.js.map +1 -1
  9. package/lib/commonjs/components/Chat/hooks/useAppSettings.js +80 -0
  10. package/lib/commonjs/components/Chat/hooks/useAppSettings.js.map +1 -0
  11. package/lib/commonjs/components/Chat/hooks/useCreateChatContext.js +3 -1
  12. package/lib/commonjs/components/Chat/hooks/useCreateChatContext.js.map +1 -1
  13. package/lib/commonjs/components/Message/Message.js +27 -22
  14. package/lib/commonjs/components/Message/Message.js.map +1 -1
  15. package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js +22 -14
  16. package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js.map +1 -1
  17. package/lib/commonjs/components/MessageInput/FileUploadPreview.js +108 -40
  18. package/lib/commonjs/components/MessageInput/FileUploadPreview.js.map +1 -1
  19. package/lib/commonjs/components/MessageInput/ImageUploadPreview.js +117 -24
  20. package/lib/commonjs/components/MessageInput/ImageUploadPreview.js.map +1 -1
  21. package/lib/commonjs/components/MessageInput/UploadProgressIndicator.js +52 -20
  22. package/lib/commonjs/components/MessageInput/UploadProgressIndicator.js.map +1 -1
  23. package/lib/commonjs/contexts/chatContext/ChatContext.js +2 -2
  24. package/lib/commonjs/contexts/chatContext/ChatContext.js.map +1 -1
  25. package/lib/commonjs/contexts/messageContext/MessageContext.js +2 -2
  26. package/lib/commonjs/contexts/messageContext/MessageContext.js.map +1 -1
  27. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js +145 -119
  28. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  29. package/lib/commonjs/contexts/messageInputContext/hooks/useMessageDetailsForState.js.map +1 -1
  30. package/lib/commonjs/i18n/en.json +2 -0
  31. package/lib/commonjs/i18n/fr.json +2 -0
  32. package/lib/commonjs/i18n/hi.json +2 -0
  33. package/lib/commonjs/i18n/it.json +2 -0
  34. package/lib/commonjs/i18n/ja.json +3 -1
  35. package/lib/commonjs/i18n/ko.json +3 -1
  36. package/lib/commonjs/i18n/nl.json +2 -0
  37. package/lib/commonjs/i18n/ru.json +2 -0
  38. package/lib/commonjs/i18n/tr.json +2 -0
  39. package/lib/commonjs/icons/Warning.js +38 -0
  40. package/lib/commonjs/icons/Warning.js.map +1 -0
  41. package/lib/commonjs/icons/index.js +13 -0
  42. package/lib/commonjs/icons/index.js.map +1 -1
  43. package/lib/commonjs/utils/utils.js +33 -2
  44. package/lib/commonjs/utils/utils.js.map +1 -1
  45. package/lib/commonjs/version.json +1 -1
  46. package/lib/module/components/Channel/Channel.js.map +1 -1
  47. package/lib/module/components/Channel/hooks/useCreatePaginatedMessageListContext.js +4 -12
  48. package/lib/module/components/Channel/hooks/useCreatePaginatedMessageListContext.js.map +1 -1
  49. package/lib/module/components/Channel/hooks/useCreateThreadContext.js +4 -12
  50. package/lib/module/components/Channel/hooks/useCreateThreadContext.js.map +1 -1
  51. package/lib/module/components/Chat/Chat.js +8 -4
  52. package/lib/module/components/Chat/Chat.js.map +1 -1
  53. package/lib/module/components/Chat/hooks/useAppSettings.js +80 -0
  54. package/lib/module/components/Chat/hooks/useAppSettings.js.map +1 -0
  55. package/lib/module/components/Chat/hooks/useCreateChatContext.js +3 -1
  56. package/lib/module/components/Chat/hooks/useCreateChatContext.js.map +1 -1
  57. package/lib/module/components/Message/Message.js +27 -22
  58. package/lib/module/components/Message/Message.js.map +1 -1
  59. package/lib/module/components/Message/MessageSimple/utils/renderText.js +22 -14
  60. package/lib/module/components/Message/MessageSimple/utils/renderText.js.map +1 -1
  61. package/lib/module/components/MessageInput/FileUploadPreview.js +108 -40
  62. package/lib/module/components/MessageInput/FileUploadPreview.js.map +1 -1
  63. package/lib/module/components/MessageInput/ImageUploadPreview.js +117 -24
  64. package/lib/module/components/MessageInput/ImageUploadPreview.js.map +1 -1
  65. package/lib/module/components/MessageInput/UploadProgressIndicator.js +52 -20
  66. package/lib/module/components/MessageInput/UploadProgressIndicator.js.map +1 -1
  67. package/lib/module/contexts/chatContext/ChatContext.js +2 -2
  68. package/lib/module/contexts/chatContext/ChatContext.js.map +1 -1
  69. package/lib/module/contexts/messageContext/MessageContext.js +2 -2
  70. package/lib/module/contexts/messageContext/MessageContext.js.map +1 -1
  71. package/lib/module/contexts/messageInputContext/MessageInputContext.js +145 -119
  72. package/lib/module/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  73. package/lib/module/contexts/messageInputContext/hooks/useMessageDetailsForState.js.map +1 -1
  74. package/lib/module/i18n/en.json +2 -0
  75. package/lib/module/i18n/fr.json +2 -0
  76. package/lib/module/i18n/hi.json +2 -0
  77. package/lib/module/i18n/it.json +2 -0
  78. package/lib/module/i18n/ja.json +3 -1
  79. package/lib/module/i18n/ko.json +3 -1
  80. package/lib/module/i18n/nl.json +2 -0
  81. package/lib/module/i18n/ru.json +2 -0
  82. package/lib/module/i18n/tr.json +2 -0
  83. package/lib/module/icons/Warning.js +38 -0
  84. package/lib/module/icons/Warning.js.map +1 -0
  85. package/lib/module/icons/index.js +13 -0
  86. package/lib/module/icons/index.js.map +1 -1
  87. package/lib/module/utils/utils.js +33 -2
  88. package/lib/module/utils/utils.js.map +1 -1
  89. package/lib/module/version.json +1 -1
  90. package/lib/typescript/components/Chat/hooks/__tests__/useAppSettings.test.d.ts +1 -0
  91. package/lib/typescript/components/Chat/hooks/useAppSettings.d.ts +3 -0
  92. package/lib/typescript/components/Chat/hooks/useCreateChatContext.d.ts +1 -1
  93. package/lib/typescript/components/Message/Message.d.ts +12 -2
  94. package/lib/typescript/components/MessageInput/UploadProgressIndicator.d.ts +1 -3
  95. package/lib/typescript/contexts/chatContext/ChatContext.d.ts +5 -1
  96. package/lib/typescript/contexts/messageContext/MessageContext.d.ts +4 -4
  97. package/lib/typescript/contexts/messageInputContext/MessageInputContext.d.ts +3 -3
  98. package/lib/typescript/i18n/en.json +2 -0
  99. package/lib/typescript/i18n/fr.json +2 -0
  100. package/lib/typescript/i18n/hi.json +2 -0
  101. package/lib/typescript/i18n/it.json +2 -0
  102. package/lib/typescript/i18n/ja.json +3 -1
  103. package/lib/typescript/i18n/ko.json +3 -1
  104. package/lib/typescript/i18n/nl.json +2 -0
  105. package/lib/typescript/i18n/ru.json +2 -0
  106. package/lib/typescript/i18n/tr.json +2 -0
  107. package/lib/typescript/icons/Warning.d.ts +3 -0
  108. package/lib/typescript/icons/index.d.ts +1 -0
  109. package/lib/typescript/utils/Streami18n.d.ts +6 -0
  110. package/lib/typescript/utils/utils.d.ts +15 -2
  111. package/package.json +1 -1
  112. package/src/components/Channel/Channel.tsx +1 -1
  113. package/src/components/Channel/hooks/useCreatePaginatedMessageListContext.ts +3 -9
  114. package/src/components/Channel/hooks/useCreateThreadContext.ts +3 -9
  115. package/src/components/ChannelList/hooks/listeners/__tests__/useChannelUpdated.test.tsx +1 -0
  116. package/src/components/Chat/Chat.tsx +4 -0
  117. package/src/components/Chat/hooks/__tests__/useAppSettings.test.tsx +34 -0
  118. package/src/components/Chat/hooks/useAppSettings.ts +39 -0
  119. package/src/components/Chat/hooks/useCreateChatContext.ts +2 -0
  120. package/src/components/Message/Message.tsx +56 -48
  121. package/src/components/Message/MessageSimple/utils/renderText.tsx +9 -0
  122. package/src/components/MessageInput/FileUploadPreview.tsx +60 -14
  123. package/src/components/MessageInput/ImageUploadPreview.tsx +95 -42
  124. package/src/components/MessageInput/UploadProgressIndicator.tsx +49 -22
  125. package/src/components/MessageInput/__tests__/FileUploadPreview.test.js +50 -80
  126. package/src/components/MessageInput/__tests__/ImageUploadPreview.test.js +49 -74
  127. package/src/components/MessageInput/__tests__/UploadProgressIndicator.test.js +36 -13
  128. package/src/components/MessageInput/__tests__/__snapshots__/UploadProgressIndicator.test.js.snap +122 -17
  129. package/src/contexts/chatContext/ChatContext.tsx +5 -1
  130. package/src/contexts/messageContext/MessageContext.tsx +7 -4
  131. package/src/contexts/messageInputContext/MessageInputContext.tsx +127 -96
  132. package/src/contexts/messageInputContext/hooks/useMessageDetailsForState.ts +2 -2
  133. package/src/i18n/en.json +2 -0
  134. package/src/i18n/fr.json +2 -0
  135. package/src/i18n/hi.json +2 -0
  136. package/src/i18n/it.json +2 -0
  137. package/src/i18n/ja.json +3 -1
  138. package/src/i18n/ko.json +3 -1
  139. package/src/i18n/nl.json +2 -0
  140. package/src/i18n/ru.json +2 -0
  141. package/src/i18n/tr.json +2 -0
  142. package/src/icons/Warning.tsx +12 -0
  143. package/src/icons/index.ts +1 -0
  144. package/src/utils/utils.ts +53 -1
  145. package/src/version.json +1 -1
  146. package/src/components/MessageInput/__tests__/__snapshots__/FileUploadPreview.test.js.snap +0 -4413
  147. package/src/components/MessageInput/__tests__/__snapshots__/ImageUploadPreview.test.js.snap +0 -2373
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { FlatList, Image, StyleSheet, TouchableOpacity, View } from 'react-native';
2
+ import { FlatList, Image, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
3
3
 
4
4
  import { UploadProgressIndicator } from './UploadProgressIndicator';
5
5
 
@@ -9,11 +9,14 @@ import {
9
9
  useMessageInputContext,
10
10
  } from '../../contexts/messageInputContext/MessageInputContext';
11
11
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
12
+ import { useTranslationContext } from '../../contexts/translationContext/TranslationContext';
12
13
  import { Close } from '../../icons/Close';
14
+ import { Warning } from '../../icons/Warning';
13
15
  import type { DefaultStreamChatGenerics } from '../../types/types';
14
- import { FileState, ProgressIndicatorTypes } from '../../utils/utils';
16
+ import { getIndicatorTypeForFileState, ProgressIndicatorTypes } from '../../utils/utils';
15
17
 
16
18
  const IMAGE_PREVIEW_SIZE = 100;
19
+ const WARNING_ICON_SIZE = 16;
17
20
 
18
21
  const styles = StyleSheet.create({
19
22
  dismiss: {
@@ -22,17 +25,45 @@ const styles = StyleSheet.create({
22
25
  right: 8,
23
26
  top: 8,
24
27
  },
28
+ fileSizeText: {
29
+ fontSize: 12,
30
+ paddingLeft: 10,
31
+ },
25
32
  flatList: { paddingBottom: 12 },
33
+ iconContainer: {
34
+ alignItems: 'center',
35
+ flexDirection: 'row',
36
+ justifyContent: 'center',
37
+ },
26
38
  itemContainer: {
27
39
  flexDirection: 'row',
28
40
  height: IMAGE_PREVIEW_SIZE,
29
41
  marginLeft: 8,
30
42
  },
43
+ unsupportedImage: {
44
+ borderRadius: 20,
45
+ bottom: 8,
46
+ flexDirection: 'row',
47
+ marginLeft: 3,
48
+ position: 'absolute',
49
+ },
31
50
  upload: {
32
51
  borderRadius: 10,
33
52
  height: IMAGE_PREVIEW_SIZE,
34
53
  width: IMAGE_PREVIEW_SIZE,
35
54
  },
55
+ warningIconStyle: {
56
+ borderRadius: 24,
57
+ marginLeft: 4,
58
+ marginTop: 4,
59
+ },
60
+ warningText: {
61
+ alignItems: 'center',
62
+ color: 'black',
63
+ fontSize: 10,
64
+ justifyContent: 'center',
65
+ paddingRight: 8,
66
+ },
36
67
  });
37
68
 
38
69
  type ImageUploadPreviewPropsWithContext<
@@ -46,6 +77,8 @@ export type ImageUploadPreviewProps<
46
77
  StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
47
78
  > = Partial<ImageUploadPreviewPropsWithContext<StreamChatGenerics>>;
48
79
 
80
+ type ImageUploadPreviewItem = { index: number; item: ImageUpload };
81
+
49
82
  const ImageUploadPreviewWithContext = <
50
83
  StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
51
84
  >(
@@ -55,52 +88,72 @@ const ImageUploadPreviewWithContext = <
55
88
 
56
89
  const {
57
90
  theme: {
58
- colors: { overlay, white },
91
+ colors: { overlay },
59
92
  messageInput: {
60
93
  imageUploadPreview: { dismiss, flatList, itemContainer, upload },
61
94
  },
62
95
  },
63
96
  } = useTheme();
64
97
 
65
- const renderItem = ({ index, item }: { index: number; item: ImageUpload }) => (
66
- <View
67
- style={[
68
- styles.itemContainer,
69
- index === imageUploads.length - 1 ? { marginRight: 8 } : {},
70
- itemContainer,
71
- ]}
72
- >
73
- <UploadProgressIndicator
74
- action={() => {
75
- uploadImage({ newImage: item });
76
- }}
77
- active={item.state !== FileState.UPLOADED && item.state !== FileState.FINISHED}
78
- style={styles.upload}
79
- type={
80
- item.state === FileState.UPLOADING
81
- ? ProgressIndicatorTypes.IN_PROGRESS
82
- : item.state === FileState.UPLOAD_FAILED
83
- ? ProgressIndicatorTypes.RETRY
84
- : undefined
85
- }
86
- >
87
- <Image
88
- resizeMode='cover'
89
- source={{ uri: item.file.uri || item.url }}
90
- style={[styles.upload, upload]}
91
- />
92
- </UploadProgressIndicator>
93
- <TouchableOpacity
94
- onPress={() => {
95
- removeImage(item.id);
96
- }}
97
- style={[styles.dismiss, { backgroundColor: overlay }, dismiss]}
98
- testID='remove-image-upload-preview'
99
- >
100
- <Close pathFill={white} />
101
- </TouchableOpacity>
102
- </View>
103
- );
98
+ const UnsupportedImageTypeIndicator = ({
99
+ indicatorType,
100
+ }: {
101
+ indicatorType: typeof ProgressIndicatorTypes[keyof typeof ProgressIndicatorTypes] | null;
102
+ }) => {
103
+ const {
104
+ theme: {
105
+ colors: { accent_red, overlay, white },
106
+ },
107
+ } = useTheme();
108
+
109
+ const { t } = useTranslationContext();
110
+ return indicatorType === ProgressIndicatorTypes.NOT_SUPPORTED ? (
111
+ <View style={[styles.unsupportedImage, { backgroundColor: overlay }]}>
112
+ <View style={[styles.iconContainer]}>
113
+ <Warning
114
+ height={WARNING_ICON_SIZE}
115
+ pathFill={accent_red}
116
+ style={styles.warningIconStyle}
117
+ width={WARNING_ICON_SIZE}
118
+ />
119
+ <Text style={[styles.warningText, { color: white }]}>{t('Not supported')}</Text>
120
+ </View>
121
+ </View>
122
+ ) : null;
123
+ };
124
+
125
+ const renderItem = ({ index, item }: ImageUploadPreviewItem) => {
126
+ const indicatorType = getIndicatorTypeForFileState(item.state);
127
+ const itemMarginForIndex = index === imageUploads.length - 1 ? { marginRight: 8 } : {};
128
+
129
+ return (
130
+ <View style={[styles.itemContainer, itemMarginForIndex, itemContainer]}>
131
+ <UploadProgressIndicator
132
+ action={() => {
133
+ uploadImage({ newImage: item });
134
+ }}
135
+ style={styles.upload}
136
+ type={indicatorType}
137
+ >
138
+ <Image
139
+ resizeMode='cover'
140
+ source={{ uri: item.file.uri || item.url }}
141
+ style={[styles.upload, upload]}
142
+ />
143
+ </UploadProgressIndicator>
144
+ <TouchableOpacity
145
+ onPress={() => {
146
+ removeImage(item.id);
147
+ }}
148
+ style={[styles.dismiss, { backgroundColor: overlay }, dismiss]}
149
+ testID='remove-image-upload-preview'
150
+ >
151
+ <Close />
152
+ </TouchableOpacity>
153
+ <UnsupportedImageTypeIndicator indicatorType={indicatorType} />
154
+ </View>
155
+ );
156
+ };
104
157
 
105
158
  return imageUploads.length > 0 ? (
106
159
  <FlatList
@@ -13,6 +13,8 @@ import { useTheme } from '../../contexts/themeContext/ThemeContext';
13
13
  import { Refresh } from '../../icons';
14
14
  import { ProgressIndicatorTypes } from '../../utils/utils';
15
15
 
16
+ const REFRESH_ICON_SIZE = 18;
17
+
16
18
  const styles = StyleSheet.create({
17
19
  activityIndicatorContainer: {
18
20
  alignItems: 'center',
@@ -55,27 +57,25 @@ const styles = StyleSheet.create({
55
57
  export type UploadProgressIndicatorProps = {
56
58
  /** Action triggered when clicked indicator */
57
59
  action?: (event: GestureResponderEvent) => void;
58
- /** Boolean status of upload progress */
59
- active?: boolean;
60
60
  /** style */
61
61
  style?: StyleProp<ViewStyle>;
62
62
  /** Type of active indicator */
63
- type?: 'in_progress' | 'retry';
63
+ type?: 'in_progress' | 'retry' | 'not_supported' | 'inactive' | null;
64
64
  };
65
65
 
66
66
  export const UploadProgressIndicator: React.FC<UploadProgressIndicatorProps> = (props) => {
67
- const { action, active, children, style, type } = props;
67
+ const { action, children, style, type } = props;
68
68
 
69
69
  const {
70
70
  theme: {
71
- colors: { overlay: overlayColor, white_smoke },
71
+ colors: { overlay: overlayColor },
72
72
  messageInput: {
73
73
  uploadProgressIndicator: { container, overlay },
74
74
  },
75
75
  },
76
76
  } = useTheme();
77
77
 
78
- return !active ? (
78
+ return type === ProgressIndicatorTypes.INACTIVE ? (
79
79
  <View style={[styles.overflowHidden, style]} testID='inactive-upload-progress-indicator'>
80
80
  {children}
81
81
  </View>
@@ -83,26 +83,53 @@ export const UploadProgressIndicator: React.FC<UploadProgressIndicatorProps> = (
83
83
  <View style={[styles.overflowHidden, style]} testID='active-upload-progress-indicator'>
84
84
  {children}
85
85
  <View style={[styles.overlay, { backgroundColor: overlayColor }, overlay]} />
86
- <View style={[styles.container, { backgroundColor: overlayColor }, container]}>
87
- {type === ProgressIndicatorTypes.IN_PROGRESS && (
88
- <View style={styles.activityIndicatorContainer}>
89
- <ActivityIndicator color={white_smoke} testID='upload-progress-indicator' />
90
- </View>
91
- )}
92
- {type === ProgressIndicatorTypes.RETRY && (
93
- <TouchableOpacity onPress={action} style={styles.retryButtonContainer}>
94
- <Refresh
95
- height={18}
96
- pathFill={white_smoke}
97
- testID='retry-upload-progress-indicator'
98
- width={18}
99
- />
100
- </TouchableOpacity>
101
- )}
86
+ <View
87
+ style={[
88
+ type === ProgressIndicatorTypes.NOT_SUPPORTED ? styles.overflowHidden : styles.container,
89
+ { backgroundColor: overlayColor },
90
+ container,
91
+ ]}
92
+ testID='not-supported-upload-progress-indicator'
93
+ >
94
+ {type === ProgressIndicatorTypes.IN_PROGRESS && <InProgressIndicator />}
95
+ {type === ProgressIndicatorTypes.RETRY && <RetryIndicator action={action} />}
102
96
  </View>
103
97
  </View>
104
98
  );
105
99
  };
106
100
 
101
+ const InProgressIndicator = () => {
102
+ const {
103
+ theme: {
104
+ colors: { white_smoke },
105
+ },
106
+ } = useTheme();
107
+
108
+ return (
109
+ <View style={styles.activityIndicatorContainer}>
110
+ <ActivityIndicator color={white_smoke} testID='upload-progress-indicator' />
111
+ </View>
112
+ );
113
+ };
114
+
115
+ const RetryIndicator = ({ action }: Pick<UploadProgressIndicatorProps, 'action'>) => {
116
+ const {
117
+ theme: {
118
+ colors: { white_smoke },
119
+ },
120
+ } = useTheme();
121
+
122
+ return (
123
+ <TouchableOpacity onPress={action} style={styles.retryButtonContainer}>
124
+ <Refresh
125
+ height={REFRESH_ICON_SIZE}
126
+ pathFill={white_smoke}
127
+ testID='retry-upload-progress-indicator'
128
+ width={REFRESH_ICON_SIZE}
129
+ />
130
+ </TouchableOpacity>
131
+ );
132
+ };
133
+
107
134
  UploadProgressIndicator.displayName =
108
135
  'UploadProgressIndicator{messageInput{uploadProgressIndicator}}';
@@ -31,6 +31,7 @@ describe('FileUploadPreview', () => {
31
31
  generateFileUploadPreview({ id: 'file-upload-id-1', state: FileState.UPLOADING }),
32
32
  generateFileUploadPreview({ id: 'file-upload-id-2', state: FileState.UPLOADING }),
33
33
  generateFileUploadPreview({ id: 'file-upload-id-3', state: FileState.UPLOADING }),
34
+ generateFileUploadPreview({ id: 'file-upload-id-4', state: FileState.UPLOADING }),
34
35
  ];
35
36
  const removeFile = jest.fn();
36
37
  const uploadFile = jest.fn();
@@ -47,7 +48,7 @@ describe('FileUploadPreview', () => {
47
48
  const channel = chatClient.channel('messaging', mockedChannel.id);
48
49
  await channel.query();
49
50
 
50
- const { getAllByTestId, queryAllByTestId, rerender, toJSON } = render(
51
+ const { getAllByTestId, queryAllByTestId, queryAllByText } = render(
51
52
  <OverlayProvider>
52
53
  <Chat client={chatClient}>
53
54
  <Channel channel={channel} FlatList={MockedFlatList}>
@@ -66,6 +67,7 @@ describe('FileUploadPreview', () => {
66
67
  expect(queryAllByTestId('inactive-upload-progress-indicator')).toHaveLength(0);
67
68
  expect(queryAllByTestId('upload-progress-indicator')).toHaveLength(fileUploads.length);
68
69
  expect(queryAllByTestId('retry-upload-progress-indicator')).toHaveLength(0);
70
+ expect(queryAllByText('File type not supported')).toHaveLength(0);
69
71
  expect(removeFile).toHaveBeenCalledTimes(0);
70
72
  expect(uploadFile).toHaveBeenCalledTimes(0);
71
73
  });
@@ -76,29 +78,6 @@ describe('FileUploadPreview', () => {
76
78
  expect(removeFile).toHaveBeenCalledTimes(1);
77
79
  expect(uploadFile).toHaveBeenCalledTimes(0);
78
80
  });
79
-
80
- rerender(
81
- <OverlayProvider>
82
- <Chat client={chatClient}>
83
- <Channel channel={channel} FlatList={MockedFlatList}>
84
- <FileUploadPreview
85
- fileUploads={fileUploads.map((file, index) => ({
86
- ...file,
87
- id: `${index}`,
88
- }))}
89
- removeFile={removeFile}
90
- uploadFile={uploadFile}
91
- />
92
- </Channel>
93
- </Chat>
94
- </OverlayProvider>,
95
- );
96
-
97
- const snapshot = toJSON();
98
-
99
- await waitFor(() => {
100
- expect(snapshot).toMatchSnapshot();
101
- });
102
81
  });
103
82
 
104
83
  it('should render FileUploadPreview with all uploaded files', async () => {
@@ -106,6 +85,7 @@ describe('FileUploadPreview', () => {
106
85
  generateFileUploadPreview({ id: 'file-upload-id-1', state: FileState.UPLOADED }),
107
86
  generateFileUploadPreview({ id: 'file-upload-id-2', state: FileState.UPLOADED }),
108
87
  generateFileUploadPreview({ id: 'file-upload-id-3', state: FileState.UPLOADED }),
88
+ generateFileUploadPreview({ id: 'file-upload-id-4', state: FileState.UPLOADED }),
109
89
  ];
110
90
  const removeFile = jest.fn();
111
91
  const uploadFile = jest.fn();
@@ -122,7 +102,7 @@ describe('FileUploadPreview', () => {
122
102
  const channel = chatClient.channel('messaging', mockedChannel.id);
123
103
  await channel.query();
124
104
 
125
- const { getAllByTestId, queryAllByTestId, rerender, toJSON } = render(
105
+ const { getAllByTestId, queryAllByTestId, queryAllByText } = render(
126
106
  <OverlayProvider>
127
107
  <Chat client={chatClient}>
128
108
  <Channel channel={channel} FlatList={MockedFlatList}>
@@ -143,6 +123,7 @@ describe('FileUploadPreview', () => {
143
123
  );
144
124
  expect(queryAllByTestId('upload-progress-indicator')).toHaveLength(0);
145
125
  expect(queryAllByTestId('retry-upload-progress-indicator')).toHaveLength(0);
126
+ expect(queryAllByText('File type not supported')).toHaveLength(0);
146
127
  expect(removeFile).toHaveBeenCalledTimes(0);
147
128
  expect(uploadFile).toHaveBeenCalledTimes(0);
148
129
  });
@@ -153,29 +134,6 @@ describe('FileUploadPreview', () => {
153
134
  expect(removeFile).toHaveBeenCalledTimes(1);
154
135
  expect(uploadFile).toHaveBeenCalledTimes(0);
155
136
  });
156
-
157
- rerender(
158
- <OverlayProvider>
159
- <Chat client={chatClient}>
160
- <Channel channel={channel} FlatList={MockedFlatList}>
161
- <FileUploadPreview
162
- fileUploads={fileUploads.map((file, index) => ({
163
- ...file,
164
- id: `${index}`,
165
- }))}
166
- removeFile={removeFile}
167
- uploadFile={uploadFile}
168
- />
169
- </Channel>
170
- </Chat>
171
- </OverlayProvider>,
172
- );
173
-
174
- const snapshot = toJSON();
175
-
176
- await waitFor(() => {
177
- expect(snapshot).toMatchSnapshot();
178
- });
179
137
  });
180
138
 
181
139
  it('should render FileUploadPreview with all failed files', async () => {
@@ -183,6 +141,7 @@ describe('FileUploadPreview', () => {
183
141
  generateFileUploadPreview({ id: 'file-upload-id-1', state: FileState.UPLOAD_FAILED }),
184
142
  generateFileUploadPreview({ id: 'file-upload-id-2', state: FileState.UPLOAD_FAILED }),
185
143
  generateFileUploadPreview({ id: 'file-upload-id-3', state: FileState.UPLOAD_FAILED }),
144
+ generateFileUploadPreview({ id: 'file-upload-id-4', state: FileState.UPLOAD_FAILED }),
186
145
  ];
187
146
  const removeFile = jest.fn();
188
147
  const uploadFile = jest.fn();
@@ -199,7 +158,7 @@ describe('FileUploadPreview', () => {
199
158
  const channel = chatClient.channel('messaging', mockedChannel.id);
200
159
  await channel.query();
201
160
 
202
- const { getAllByTestId, queryAllByTestId, rerender, toJSON } = render(
161
+ const { getAllByTestId, queryAllByTestId, queryAllByText } = render(
203
162
  <OverlayProvider>
204
163
  <Chat client={chatClient}>
205
164
  <Channel channel={channel} FlatList={MockedFlatList}>
@@ -218,6 +177,7 @@ describe('FileUploadPreview', () => {
218
177
  expect(queryAllByTestId('inactive-upload-progress-indicator')).toHaveLength(0);
219
178
  expect(queryAllByTestId('upload-progress-indicator')).toHaveLength(0);
220
179
  expect(queryAllByTestId('retry-upload-progress-indicator')).toHaveLength(fileUploads.length);
180
+ expect(queryAllByText('File type not supported')).toHaveLength(0);
221
181
  expect(removeFile).toHaveBeenCalledTimes(0);
222
182
  expect(uploadFile).toHaveBeenCalledTimes(0);
223
183
  });
@@ -235,16 +195,36 @@ describe('FileUploadPreview', () => {
235
195
  expect(removeFile).toHaveBeenCalledTimes(1);
236
196
  expect(uploadFile).toHaveBeenCalledTimes(1);
237
197
  });
198
+ });
199
+
200
+ it('should render FileUploadPreview with all unsupported files', async () => {
201
+ const fileUploads = [
202
+ generateFileUploadPreview({ id: 'file-upload-id-1', state: FileState.NOT_SUPPORTED }),
203
+ generateFileUploadPreview({ id: 'file-upload-id-2', state: FileState.NOT_SUPPORTED }),
204
+ generateFileUploadPreview({ id: 'file-upload-id-3', state: FileState.NOT_SUPPORTED }),
205
+ generateFileUploadPreview({ id: 'file-upload-id-4', state: FileState.NOT_SUPPORTED }),
206
+ ];
207
+ const removeFile = jest.fn();
208
+ const uploadFile = jest.fn();
209
+
210
+ const user1 = generateUser();
238
211
 
239
- rerender(
212
+ const mockedChannel = generateChannelResponse({
213
+ members: [generateMember({ user: user1 })],
214
+ messages: [generateMessage({ user: user1 }), generateMessage({ user: user1 })],
215
+ });
216
+
217
+ const chatClient = await getTestClientWithUser({ id: 'testID' });
218
+ useMockedApis(chatClient, [getOrCreateChannelApi(mockedChannel)]);
219
+ const channel = chatClient.channel('messaging', mockedChannel.id);
220
+ await channel.query();
221
+
222
+ const { getAllByTestId, queryAllByTestId, queryAllByText } = render(
240
223
  <OverlayProvider>
241
224
  <Chat client={chatClient}>
242
225
  <Channel channel={channel} FlatList={MockedFlatList}>
243
226
  <FileUploadPreview
244
- fileUploads={fileUploads.map((file, index) => ({
245
- ...file,
246
- id: `${index}`,
247
- }))}
227
+ fileUploads={fileUploads}
248
228
  removeFile={removeFile}
249
229
  uploadFile={uploadFile}
250
230
  />
@@ -253,10 +233,21 @@ describe('FileUploadPreview', () => {
253
233
  </OverlayProvider>,
254
234
  );
255
235
 
256
- const snapshot = toJSON();
236
+ await waitFor(() => {
237
+ expect(queryAllByTestId('active-upload-progress-indicator')).toHaveLength(fileUploads.length);
238
+ expect(queryAllByTestId('inactive-upload-progress-indicator')).toHaveLength(0);
239
+ expect(queryAllByTestId('upload-progress-indicator')).toHaveLength(0);
240
+ expect(queryAllByTestId('retry-upload-progress-indicator')).toHaveLength(0);
241
+ expect(queryAllByText('File type not supported')).toHaveLength(fileUploads.length);
242
+ expect(removeFile).toHaveBeenCalledTimes(0);
243
+ expect(uploadFile).toHaveBeenCalledTimes(0);
244
+ });
245
+
246
+ fireEvent.press(getAllByTestId('remove-file-upload-preview')[0]);
257
247
 
258
248
  await waitFor(() => {
259
- expect(snapshot).toMatchSnapshot();
249
+ expect(removeFile).toHaveBeenCalledTimes(1);
250
+ expect(uploadFile).toHaveBeenCalledTimes(0);
260
251
  });
261
252
  });
262
253
 
@@ -265,6 +256,7 @@ describe('FileUploadPreview', () => {
265
256
  generateFileUploadPreview({ id: 'file-upload-id-1', state: FileState.UPLOADING }),
266
257
  generateFileUploadPreview({ id: 'file-upload-id-2', state: FileState.UPLOADED }),
267
258
  generateFileUploadPreview({ id: 'file-upload-id-3', state: FileState.UPLOAD_FAILED }),
259
+ generateFileUploadPreview({ id: 'file-upload-id-3', state: FileState.NOT_SUPPORTED }),
268
260
  ];
269
261
  const removeFile = jest.fn();
270
262
  const uploadFile = jest.fn();
@@ -281,7 +273,7 @@ describe('FileUploadPreview', () => {
281
273
  const channel = chatClient.channel('messaging', mockedChannel.id);
282
274
  await channel.query();
283
275
 
284
- const { queryAllByTestId, rerender, toJSON } = render(
276
+ const { queryAllByTestId, queryAllByText } = render(
285
277
  <OverlayProvider>
286
278
  <Chat client={chatClient}>
287
279
  <Channel channel={channel} FlatList={MockedFlatList}>
@@ -301,31 +293,9 @@ describe('FileUploadPreview', () => {
301
293
  expect(queryAllByTestId('inactive-upload-progress-indicator')).toHaveLength(1);
302
294
  expect(queryAllByTestId('upload-progress-indicator')).toHaveLength(1);
303
295
  expect(queryAllByTestId('retry-upload-progress-indicator')).toHaveLength(1);
296
+ expect(queryAllByText('File type not supported')).toHaveLength(1);
304
297
  expect(removeFile).toHaveBeenCalledTimes(0);
305
298
  expect(uploadFile).toHaveBeenCalledTimes(0);
306
299
  });
307
-
308
- rerender(
309
- <OverlayProvider>
310
- <Chat client={chatClient}>
311
- <Channel channel={channel} FlatList={MockedFlatList}>
312
- <FileUploadPreview
313
- fileUploads={fileUploads.map((file, index) => ({
314
- ...file,
315
- id: `${index}`,
316
- }))}
317
- removeFile={removeFile}
318
- uploadFile={uploadFile}
319
- />
320
- </Channel>
321
- </Chat>
322
- </OverlayProvider>,
323
- );
324
-
325
- const snapshot = toJSON();
326
-
327
- await waitFor(() => {
328
- expect(snapshot).toMatchSnapshot();
329
- });
330
300
  });
331
301
  });