stream-chat-react-native-core 4.9.0-beta.3 → 4.10.0-beta.1

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 (150) hide show
  1. package/lib/commonjs/components/Attachment/Gallery.js +246 -190
  2. package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
  3. package/lib/commonjs/components/Attachment/VideoThumbnail.js +11 -5
  4. package/lib/commonjs/components/Attachment/VideoThumbnail.js.map +1 -1
  5. package/lib/commonjs/components/Attachment/utils/buildGallery/buildThumbnail.js +1 -0
  6. package/lib/commonjs/components/Attachment/utils/buildGallery/buildThumbnail.js.map +1 -1
  7. package/lib/commonjs/components/ChannelPreview/ChannelPreview.js +7 -3
  8. package/lib/commonjs/components/ChannelPreview/ChannelPreview.js.map +1 -1
  9. package/lib/commonjs/components/ChannelPreview/hooks/useLatestMessagePreview.js +2 -1
  10. package/lib/commonjs/components/ChannelPreview/hooks/useLatestMessagePreview.js.map +1 -1
  11. package/lib/commonjs/components/Chat/Chat.js +9 -5
  12. package/lib/commonjs/components/Chat/Chat.js.map +1 -1
  13. package/lib/commonjs/components/ImageGallery/ImageGallery.js +25 -22
  14. package/lib/commonjs/components/ImageGallery/ImageGallery.js.map +1 -1
  15. package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js +15 -15
  16. package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
  17. package/lib/commonjs/components/Message/Message.js +13 -8
  18. package/lib/commonjs/components/Message/Message.js.map +1 -1
  19. package/lib/commonjs/components/Message/MessageSimple/MessageTextContainer.js +7 -4
  20. package/lib/commonjs/components/Message/MessageSimple/MessageTextContainer.js.map +1 -1
  21. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js +34 -35
  22. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  23. package/lib/commonjs/contexts/messageOverlayContext/MessageOverlayContext.js +2 -2
  24. package/lib/commonjs/contexts/messageOverlayContext/MessageOverlayContext.js.map +1 -1
  25. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js +15 -13
  26. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js.map +1 -1
  27. package/lib/commonjs/contexts/translationContext/TranslationContext.js +8 -4
  28. package/lib/commonjs/contexts/translationContext/TranslationContext.js.map +1 -1
  29. package/lib/commonjs/hooks/useStreami18n.js.map +1 -1
  30. package/lib/commonjs/hooks/useTranslatedMessage.js +34 -0
  31. package/lib/commonjs/hooks/useTranslatedMessage.js.map +1 -0
  32. package/lib/commonjs/mock-builders/api/getOrCreateChannel.js.map +1 -1
  33. package/lib/commonjs/mock-builders/generator/attachment.js +3 -2
  34. package/lib/commonjs/mock-builders/generator/attachment.js.map +1 -1
  35. package/lib/commonjs/mock-builders/generator/channel.js +8 -4
  36. package/lib/commonjs/mock-builders/generator/channel.js.map +1 -1
  37. package/lib/commonjs/utils/getUrlOfImageAttachment.js +1 -1
  38. package/lib/commonjs/utils/getUrlOfImageAttachment.js.map +1 -1
  39. package/lib/commonjs/version.json +1 -1
  40. package/lib/module/components/Attachment/Gallery.js +246 -190
  41. package/lib/module/components/Attachment/Gallery.js.map +1 -1
  42. package/lib/module/components/Attachment/VideoThumbnail.js +11 -5
  43. package/lib/module/components/Attachment/VideoThumbnail.js.map +1 -1
  44. package/lib/module/components/Attachment/utils/buildGallery/buildThumbnail.js +1 -0
  45. package/lib/module/components/Attachment/utils/buildGallery/buildThumbnail.js.map +1 -1
  46. package/lib/module/components/ChannelPreview/ChannelPreview.js +7 -3
  47. package/lib/module/components/ChannelPreview/ChannelPreview.js.map +1 -1
  48. package/lib/module/components/ChannelPreview/hooks/useLatestMessagePreview.js +2 -1
  49. package/lib/module/components/ChannelPreview/hooks/useLatestMessagePreview.js.map +1 -1
  50. package/lib/module/components/Chat/Chat.js +9 -5
  51. package/lib/module/components/Chat/Chat.js.map +1 -1
  52. package/lib/module/components/ImageGallery/ImageGallery.js +25 -22
  53. package/lib/module/components/ImageGallery/ImageGallery.js.map +1 -1
  54. package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js +15 -15
  55. package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
  56. package/lib/module/components/Message/Message.js +13 -8
  57. package/lib/module/components/Message/Message.js.map +1 -1
  58. package/lib/module/components/Message/MessageSimple/MessageTextContainer.js +7 -4
  59. package/lib/module/components/Message/MessageSimple/MessageTextContainer.js.map +1 -1
  60. package/lib/module/contexts/messageInputContext/MessageInputContext.js +34 -35
  61. package/lib/module/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  62. package/lib/module/contexts/messageOverlayContext/MessageOverlayContext.js +2 -2
  63. package/lib/module/contexts/messageOverlayContext/MessageOverlayContext.js.map +1 -1
  64. package/lib/module/contexts/overlayContext/OverlayProvider.js +15 -13
  65. package/lib/module/contexts/overlayContext/OverlayProvider.js.map +1 -1
  66. package/lib/module/contexts/translationContext/TranslationContext.js +8 -4
  67. package/lib/module/contexts/translationContext/TranslationContext.js.map +1 -1
  68. package/lib/module/hooks/useStreami18n.js.map +1 -1
  69. package/lib/module/hooks/useTranslatedMessage.js +34 -0
  70. package/lib/module/hooks/useTranslatedMessage.js.map +1 -0
  71. package/lib/module/mock-builders/api/getOrCreateChannel.js.map +1 -1
  72. package/lib/module/mock-builders/generator/attachment.js +3 -2
  73. package/lib/module/mock-builders/generator/attachment.js.map +1 -1
  74. package/lib/module/mock-builders/generator/channel.js +8 -4
  75. package/lib/module/mock-builders/generator/channel.js.map +1 -1
  76. package/lib/module/utils/getUrlOfImageAttachment.js +1 -1
  77. package/lib/module/utils/getUrlOfImageAttachment.js.map +1 -1
  78. package/lib/module/version.json +1 -1
  79. package/lib/typescript/components/Attachment/VideoThumbnail.d.ts +3 -1
  80. package/lib/typescript/components/Attachment/utils/buildGallery/types.d.ts +1 -0
  81. package/lib/typescript/components/ChannelPreview/__tests__/ChannelPreview.test.d.ts +1 -0
  82. package/lib/typescript/components/Message/MessageSimple/__tests__/MessageTextContainer.test.d.ts +1 -0
  83. package/lib/typescript/contexts/messageInputContext/MessageInputContext.d.ts +1 -0
  84. package/lib/typescript/contexts/messageInputContext/__tests__/MessageInputContext.test.d.ts +1 -0
  85. package/lib/typescript/contexts/messageInputContext/__tests__/isValidMessage.test.d.ts +1 -0
  86. package/lib/typescript/contexts/messageInputContext/__tests__/pickFile.test.d.ts +1 -0
  87. package/lib/typescript/contexts/messageInputContext/__tests__/removeFile.test.d.ts +1 -0
  88. package/lib/typescript/contexts/messageInputContext/__tests__/removeImage.test.d.ts +1 -0
  89. package/lib/typescript/contexts/messageInputContext/__tests__/sendMessage.test.d.ts +1 -0
  90. package/lib/typescript/contexts/messageInputContext/__tests__/sendMessageAsync.test.d.ts +1 -0
  91. package/lib/typescript/contexts/messageInputContext/__tests__/updateMessage.test.d.ts +1 -0
  92. package/lib/typescript/contexts/messageInputContext/__tests__/uploadFile.test.d.ts +1 -0
  93. package/lib/typescript/contexts/messageInputContext/__tests__/uploadImage.test.d.ts +1 -0
  94. package/lib/typescript/contexts/messageInputContext/__tests__/useMessageDetailsForState.test.d.ts +1 -0
  95. package/lib/typescript/contexts/messageOverlayContext/MessageOverlayContext.d.ts +2 -1
  96. package/lib/typescript/contexts/translationContext/TranslationContext.d.ts +7 -2
  97. package/lib/typescript/hooks/__tests__/useTranslatedMessage.test.d.ts +1 -0
  98. package/lib/typescript/hooks/useStreami18n.d.ts +2 -2
  99. package/lib/typescript/hooks/useTranslatedMessage.d.ts +3 -0
  100. package/lib/typescript/mock-builders/api/getOrCreateChannel.d.ts +13 -1
  101. package/lib/typescript/mock-builders/event/messageNew.d.ts +2 -0
  102. package/lib/typescript/mock-builders/event/messageRead.d.ts +8 -0
  103. package/lib/typescript/mock-builders/generator/attachment.d.ts +10 -0
  104. package/lib/typescript/mock-builders/generator/channel.d.ts +27 -23
  105. package/lib/typescript/mock-builders/generator/message.d.ts +38 -0
  106. package/lib/typescript/mock-builders/generator/user.d.ts +9 -9
  107. package/package.json +7 -6
  108. package/src/components/Attachment/Gallery.tsx +231 -140
  109. package/src/components/Attachment/VideoThumbnail.tsx +12 -5
  110. package/src/components/Attachment/__tests__/Attachment.test.js +12 -0
  111. package/src/components/Attachment/__tests__/Gallery.test.js +23 -1
  112. package/src/components/Attachment/utils/buildGallery/buildThumbnail.ts +1 -0
  113. package/src/components/Attachment/utils/buildGallery/types.ts +1 -0
  114. package/src/components/ChannelPreview/ChannelPreview.tsx +7 -1
  115. package/src/components/ChannelPreview/__tests__/{ChannelPreview.test.js → ChannelPreview.test.tsx} +79 -41
  116. package/src/components/ChannelPreview/hooks/__tests__/useLatestMessagePreview.test.tsx +56 -21
  117. package/src/components/ChannelPreview/hooks/useLatestMessagePreview.ts +4 -1
  118. package/src/components/Chat/Chat.tsx +6 -3
  119. package/src/components/ImageGallery/ImageGallery.tsx +10 -6
  120. package/src/components/ImageGallery/components/ImageGalleryFooter.tsx +2 -1
  121. package/src/components/Message/Message.tsx +8 -1
  122. package/src/components/Message/MessageSimple/MessageTextContainer.tsx +7 -1
  123. package/src/components/Message/MessageSimple/__tests__/MessageTextContainer.test.tsx +108 -0
  124. package/src/components/Message/MessageSimple/__tests__/__snapshots__/{MessageTextContainer.test.js.snap → MessageTextContainer.test.tsx.snap} +0 -0
  125. package/src/contexts/messageInputContext/MessageInputContext.tsx +10 -4
  126. package/src/contexts/messageInputContext/__tests__/MessageInputContext.test.tsx +208 -0
  127. package/src/contexts/messageInputContext/__tests__/__snapshots__/sendMessage.test.tsx.snap +113 -0
  128. package/src/contexts/messageInputContext/__tests__/__snapshots__/sendMessageAsync.test.tsx.snap +33 -0
  129. package/src/contexts/messageInputContext/__tests__/isValidMessage.test.tsx +71 -0
  130. package/src/contexts/messageInputContext/__tests__/pickFile.test.tsx +67 -0
  131. package/src/contexts/messageInputContext/__tests__/removeFile.test.tsx +82 -0
  132. package/src/contexts/messageInputContext/__tests__/removeImage.test.tsx +80 -0
  133. package/src/contexts/messageInputContext/__tests__/sendMessage.test.tsx +286 -0
  134. package/src/contexts/messageInputContext/__tests__/sendMessageAsync.test.tsx +124 -0
  135. package/src/contexts/messageInputContext/__tests__/updateMessage.test.tsx +92 -0
  136. package/src/contexts/messageInputContext/__tests__/uploadFile.test.tsx +76 -0
  137. package/src/contexts/messageInputContext/__tests__/uploadImage.test.tsx +55 -0
  138. package/src/contexts/messageInputContext/__tests__/useMessageDetailsForState.test.tsx +62 -0
  139. package/src/contexts/messageOverlayContext/MessageOverlayContext.tsx +2 -1
  140. package/src/contexts/overlayContext/OverlayProvider.tsx +4 -3
  141. package/src/contexts/translationContext/TranslationContext.tsx +10 -1
  142. package/src/hooks/__tests__/useTranslatedMessage.test.tsx +106 -0
  143. package/src/hooks/useStreami18n.ts +2 -2
  144. package/src/hooks/useTranslatedMessage.ts +30 -0
  145. package/src/mock-builders/api/{getOrCreateChannel.js → getOrCreateChannel.ts} +8 -1
  146. package/src/mock-builders/generator/attachment.js +4 -2
  147. package/src/mock-builders/generator/{channel.js → channel.ts} +19 -10
  148. package/src/utils/getUrlOfImageAttachment.ts +1 -1
  149. package/src/version.json +1 -1
  150. package/src/components/Message/MessageSimple/__tests__/MessageTextContainer.test.js +0 -65
@@ -0,0 +1,208 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+
3
+ import type { TextInput } from 'react-native';
4
+
5
+ import { act, renderHook } from '@testing-library/react-hooks';
6
+
7
+ import type { AppSettingsAPIResponse, StreamChat } from 'stream-chat';
8
+
9
+ import { ChatContextValue, ChatProvider } from '../../../contexts/chatContext/ChatContext';
10
+
11
+ import {
12
+ generateFileAttachment,
13
+ generateImageAttachment,
14
+ } from '../../../mock-builders/generator/attachment';
15
+
16
+ import { generateMessage } from '../../../mock-builders/generator/message';
17
+ import { generateUser } from '../../../mock-builders/generator/user';
18
+
19
+ import * as NativeUtils from '../../../native';
20
+ import type { DefaultStreamChatGenerics } from '../../../types/types';
21
+ import { FileState } from '../../../utils/utils';
22
+ import {
23
+ InputMessageInputContextValue,
24
+ MessageInputContextValue,
25
+ MessageInputProvider,
26
+ useMessageInputContext,
27
+ } from '../MessageInputContext';
28
+
29
+ type WrapperType<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
30
+ Partial<InputMessageInputContextValue<StreamChatGenerics>>;
31
+
32
+ afterEach(jest.clearAllMocks);
33
+
34
+ describe('MessageInputContext', () => {
35
+ const Wrapper = <
36
+ StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
37
+ >({
38
+ children,
39
+ ...rest
40
+ }: PropsWithChildren<WrapperType<StreamChatGenerics>>) => (
41
+ <ChatProvider
42
+ value={
43
+ {
44
+ appSettings: {
45
+ app: {
46
+ file_upload_config: {
47
+ blocked_file_extensions: ['.mp3'],
48
+ blocked_mime_types: ['video/mp4'],
49
+ },
50
+ image_upload_config: {
51
+ blocked_file_extensions: ['.png'],
52
+ blocked_mime_types: ['image/png'],
53
+ },
54
+ },
55
+ } as unknown as AppSettingsAPIResponse<StreamChatGenerics>,
56
+ client: {
57
+ updateMessage: jest.fn().mockResolvedValue({ message: generateMessage() }),
58
+ } as unknown as StreamChat<StreamChatGenerics>,
59
+ } as ChatContextValue<StreamChatGenerics>
60
+ }
61
+ >
62
+ <MessageInputProvider
63
+ value={
64
+ {
65
+ ...rest,
66
+ } as MessageInputContextValue<StreamChatGenerics>
67
+ }
68
+ >
69
+ {children}
70
+ </MessageInputProvider>
71
+ </ChatProvider>
72
+ );
73
+
74
+ it('appendText works', () => {
75
+ const { result } = renderHook(() => useMessageInputContext(), {
76
+ initialProps: {
77
+ editing: true,
78
+ hasImagePicker: true,
79
+ },
80
+ wrapper: Wrapper,
81
+ });
82
+
83
+ act(() => {
84
+ result.current.setFileUploads([]);
85
+ result.current.setImageUploads([]);
86
+ result.current.setMentionedUsers([]);
87
+ result.current.setText('dummy');
88
+ result.current.appendText('text');
89
+ });
90
+
91
+ expect(result.current.text).toBe('dummytext');
92
+ });
93
+
94
+ it('uploadNewImage with blocked image extensions to be not supported', () => {
95
+ const { result } = renderHook(() => useMessageInputContext(), {
96
+ initialProps: {
97
+ editing: true,
98
+ maxNumberOfFiles: 2,
99
+ },
100
+ wrapper: Wrapper,
101
+ });
102
+
103
+ act(() => {
104
+ result.current.uploadNewImage(
105
+ generateImageAttachment({
106
+ uri: 'https://www.bastiaanmulder.nl/wp-content/uploads/2013/11/dummy-image-square.png',
107
+ }),
108
+ );
109
+ });
110
+
111
+ expect(result.current.imageUploads[0].state).toBe(FileState.NOT_SUPPORTED);
112
+ });
113
+
114
+ it('onSelectItem works', () => {
115
+ const mentioned_user = generateUser();
116
+ const initialUsers = [mentioned_user.id];
117
+
118
+ const { result } = renderHook(() => useMessageInputContext(), {
119
+ initialProps: {
120
+ editing: true,
121
+ hasImagePicker: true,
122
+ },
123
+ wrapper: Wrapper,
124
+ });
125
+
126
+ act(() => {
127
+ result.current.setFileUploads([]);
128
+ result.current.setImageUploads([]);
129
+ result.current.setMentionedUsers(initialUsers);
130
+ result.current.onSelectItem(mentioned_user);
131
+ });
132
+
133
+ expect(result.current.mentionedUsers.length).toBe(2);
134
+ });
135
+
136
+ it('setInputBoxRef works', () => {
137
+ const setInputRefMock = jest.fn();
138
+ const inputRef = React.createRef<TextInput | null>();
139
+ const { result } = renderHook(() => useMessageInputContext(), {
140
+ initialProps: {
141
+ editing: true,
142
+ setInputRef: setInputRefMock,
143
+ },
144
+ wrapper: Wrapper,
145
+ });
146
+
147
+ act(() => {
148
+ result.current.setInputBoxRef(inputRef.current);
149
+ });
150
+
151
+ expect(setInputRefMock).toHaveBeenCalled();
152
+ });
153
+
154
+ it('openCommandsPicker works', () => {
155
+ const { result } = renderHook(() => useMessageInputContext(), {
156
+ initialProps: {
157
+ editing: true,
158
+ hasImagePicker: true,
159
+ },
160
+ wrapper: Wrapper,
161
+ });
162
+
163
+ act(() => {
164
+ result.current.openCommandsPicker();
165
+ });
166
+
167
+ expect(result.current.text).toBe('/');
168
+ });
169
+
170
+ it('openMentionPicker works', () => {
171
+ const { result } = renderHook(() => useMessageInputContext(), {
172
+ initialProps: {
173
+ editing: true,
174
+ hasImagePicker: true,
175
+ },
176
+ wrapper: Wrapper,
177
+ });
178
+
179
+ act(() => {
180
+ result.current.openMentionsPicker();
181
+ });
182
+
183
+ expect(result.current.text).toBe('@');
184
+ });
185
+
186
+ it('openAttachmentPicker works', async () => {
187
+ jest.spyOn(NativeUtils, 'pickDocument').mockImplementation(
188
+ jest.fn().mockResolvedValue({
189
+ cancelled: false,
190
+ docs: [generateFileAttachment(), generateImageAttachment()],
191
+ }),
192
+ );
193
+ const { result } = renderHook(() => useMessageInputContext(), {
194
+ initialProps: {
195
+ editing: true,
196
+ hasFilePicker: true,
197
+ hasImagePicker: false,
198
+ },
199
+ wrapper: Wrapper,
200
+ });
201
+
202
+ act(() => {
203
+ result.current.openAttachmentPicker();
204
+ });
205
+
206
+ expect(await result.current.pickFile()).toBe(undefined);
207
+ });
208
+ });
@@ -0,0 +1,113 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`MessageInputContext's sendMessage exit sendMessage when edit message is not boolean image upload status is uploaded successfully 1`] = `
4
+ Object {
5
+ "attachments": Array [
6
+ Object {
7
+ "fallback": undefined,
8
+ "image_url": undefined,
9
+ "mime_type": false,
10
+ "original_height": undefined,
11
+ "original_width": undefined,
12
+ "type": "image",
13
+ },
14
+ ],
15
+ "created_at": "Sat Jul 02 2022 23:55:13 GMT+0530 (India Standard Time)",
16
+ "html": "<p>regular</p>",
17
+ "id": "7a85f744-cc89-4f82-a1d4-5456432cc8bf",
18
+ "mentioned_users": Array [
19
+ "dummy1",
20
+ "dummy2",
21
+ ],
22
+ "quoted_message": undefined,
23
+ "text": "",
24
+ "type": "regular",
25
+ "updated_at": "Sat Jul 02 2022 23:55:13 GMT+0530 (India Standard Time)",
26
+ "user": Object {
27
+ "banned": false,
28
+ "created_at": "2020-04-27T13:39:49.331742Z",
29
+ "id": "5d6f6322-567e-4e1e-af90-97ef1ed5cc23",
30
+ "image": "fc86ddcb-bac4-400c-9afd-b0c0a1c0cd33",
31
+ "name": "50cbdd0e-ca7e-4478-9e2c-be0f1ac6a995",
32
+ "online": false,
33
+ "role": "user",
34
+ "updated_at": "2020-04-27T13:39:49.332087Z",
35
+ },
36
+ }
37
+ `;
38
+
39
+ exports[`MessageInputContext's sendMessage exit sendMessage when file upload status is uploaded successfully 1`] = `
40
+ Object {
41
+ "attachments": Array [
42
+ Object {
43
+ "asset_url": undefined,
44
+ "file_size": undefined,
45
+ "mime_type": "file",
46
+ "title": "dummy.pdf",
47
+ "type": "file",
48
+ },
49
+ Object {
50
+ "asset_url": undefined,
51
+ "duration": undefined,
52
+ "file_size": undefined,
53
+ "mime_type": "video/mp4",
54
+ "thumb_url": undefined,
55
+ "title": "dummy.pdf",
56
+ "type": "video",
57
+ },
58
+ Object {
59
+ "asset_url": undefined,
60
+ "duration": undefined,
61
+ "file_size": undefined,
62
+ "mime_type": "audio/mp3",
63
+ "title": "dummy.pdf",
64
+ "type": "audio",
65
+ },
66
+ Object {
67
+ "fallback": "dummy.pdf",
68
+ "image_url": undefined,
69
+ "mime_type": "application/pdf",
70
+ "type": "image",
71
+ },
72
+ ],
73
+ "mentioned_users": Array [
74
+ "dummy1",
75
+ "dummy2",
76
+ ],
77
+ "parent_id": undefined,
78
+ "quoted_message_id": undefined,
79
+ "show_in_channel": undefined,
80
+ "text": "",
81
+ }
82
+ `;
83
+
84
+ exports[`MessageInputContext's sendMessage exit sendMessage when image upload status is uploaded successfully 1`] = `
85
+ Object {
86
+ "attachments": Array [
87
+ Object {
88
+ "fallback": undefined,
89
+ "image_url": undefined,
90
+ "mime_type": false,
91
+ "original_height": undefined,
92
+ "original_width": undefined,
93
+ "type": "image",
94
+ },
95
+ Object {
96
+ "fallback": undefined,
97
+ "image_url": undefined,
98
+ "mime_type": false,
99
+ "original_height": undefined,
100
+ "original_width": undefined,
101
+ "type": "image",
102
+ },
103
+ ],
104
+ "mentioned_users": Array [
105
+ "dummy1",
106
+ "dummy2",
107
+ ],
108
+ "parent_id": undefined,
109
+ "quoted_message_id": undefined,
110
+ "show_in_channel": undefined,
111
+ "text": "",
112
+ }
113
+ `;
@@ -0,0 +1,33 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`MessageInputContext's sendMessageAsync sendImageAsync is been called with finished file upload state and checked for snapshot) 1`] = `
4
+ Object {
5
+ "attachments": Array [
6
+ Object {
7
+ "image_url": "https://www.test.com",
8
+ "type": "image",
9
+ },
10
+ ],
11
+ "mentioned_users": Array [],
12
+ "parent_id": undefined,
13
+ "quoted_message_id": undefined,
14
+ "show_in_channel": undefined,
15
+ "text": "",
16
+ }
17
+ `;
18
+
19
+ exports[`MessageInputContext's sendMessageAsync sendImageAsync is been called with uploaded file upload state and checked for snapshot) 1`] = `
20
+ Object {
21
+ "attachments": Array [
22
+ Object {
23
+ "image_url": "https://www.test.com",
24
+ "type": "image",
25
+ },
26
+ ],
27
+ "mentioned_users": Array [],
28
+ "parent_id": undefined,
29
+ "quoted_message_id": undefined,
30
+ "show_in_channel": undefined,
31
+ "text": "",
32
+ }
33
+ `;
@@ -0,0 +1,71 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import { act } from 'react-test-renderer';
3
+
4
+ import { renderHook } from '@testing-library/react-hooks';
5
+
6
+ import {
7
+ generateFileUploadPreview,
8
+ generateImageUploadPreview,
9
+ } from '../../../mock-builders/generator/attachment';
10
+ import type { DefaultStreamChatGenerics } from '../../../types/types';
11
+ import { FileState } from '../../../utils/utils';
12
+ import {
13
+ InputMessageInputContextValue,
14
+ MessageInputContextValue,
15
+ MessageInputProvider,
16
+ useMessageInputContext,
17
+ } from '../MessageInputContext';
18
+
19
+ type WrapperType<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
20
+ Partial<InputMessageInputContextValue<StreamChatGenerics>>;
21
+
22
+ const Wrapper = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({
23
+ children,
24
+ ...rest
25
+ }: PropsWithChildren<WrapperType<StreamChatGenerics>>) => (
26
+ <MessageInputProvider
27
+ value={
28
+ {
29
+ ...rest,
30
+ } as MessageInputContextValue<StreamChatGenerics>
31
+ }
32
+ >
33
+ {children}
34
+ </MessageInputProvider>
35
+ );
36
+
37
+ describe("MessageInputContext's isValidMessage", () => {
38
+ const initialProps = {
39
+ editing: true,
40
+ hasImagePicker: true,
41
+ };
42
+
43
+ it.each([
44
+ [[], [], [], 0, '', false],
45
+ [[], [], [], 0, 'Dummy Text', true],
46
+ [[generateFileUploadPreview()], [], [], 0, '', true],
47
+ [[], [generateImageUploadPreview()], [], 0, '', true],
48
+ [[], [generateImageUploadPreview({ state: FileState.UPLOAD_FAILED })], [], 0, '', false],
49
+ [[generateFileUploadPreview({ state: FileState.UPLOAD_FAILED })], [], [], 0, '', false],
50
+ [[generateFileUploadPreview({ state: FileState.UPLOADING })], [], [], 0, '', false],
51
+ [[], [generateImageUploadPreview({ state: FileState.UPLOADING })], [], 0, '', false],
52
+ ])(
53
+ 'isValidMessage with fileUploads %p, imageUploads %p, mentionedUsers %p, numberOfUploads %d, text %s gives %p',
54
+ (fileUploads, imageUploads, mentionedUsers, numberOfUploads, text, isValidMessageStatus) => {
55
+ const { result } = renderHook(() => useMessageInputContext(), {
56
+ initialProps,
57
+ wrapper: Wrapper,
58
+ });
59
+
60
+ act(() => {
61
+ result.current.setFileUploads(fileUploads);
62
+ result.current.setImageUploads(imageUploads);
63
+ result.current.setMentionedUsers(mentionedUsers);
64
+ result.current.setNumberOfUploads(numberOfUploads);
65
+ result.current.setText(text);
66
+ });
67
+
68
+ expect(result.current.isValidMessage()).toBe(isValidMessageStatus);
69
+ },
70
+ );
71
+ });
@@ -0,0 +1,67 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import { Alert } from 'react-native';
3
+ import { act } from 'react-test-renderer';
4
+
5
+ import { renderHook } from '@testing-library/react-hooks';
6
+
7
+ import type { DefaultStreamChatGenerics } from '../../../types/types';
8
+ import {
9
+ InputMessageInputContextValue,
10
+ MessageInputContextValue,
11
+ MessageInputProvider,
12
+ useMessageInputContext,
13
+ } from '../MessageInputContext';
14
+
15
+ type WrapperType<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
16
+ Partial<InputMessageInputContextValue<StreamChatGenerics>>;
17
+
18
+ const Wrapper = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({
19
+ children,
20
+ ...rest
21
+ }: PropsWithChildren<WrapperType<StreamChatGenerics>>) => (
22
+ <MessageInputProvider
23
+ value={
24
+ {
25
+ ...rest,
26
+ } as MessageInputContextValue<StreamChatGenerics>
27
+ }
28
+ >
29
+ {children}
30
+ </MessageInputProvider>
31
+ );
32
+
33
+ afterEach(jest.clearAllMocks);
34
+
35
+ describe("MessageInputContext's pickFile", () => {
36
+ jest.spyOn(Alert, 'alert');
37
+
38
+ const initialProps = {
39
+ editing: true,
40
+ maxNumberOfFiles: 2,
41
+ };
42
+
43
+ it.each([
44
+ [3, 1],
45
+ [1, 0],
46
+ ])(
47
+ 'run pickFile when numberOfUploads is %d and alert is triggered %d number of times',
48
+ (numberOfUploads, numberOfTimesCalled) => {
49
+ const { rerender, result } = renderHook(() => useMessageInputContext(), {
50
+ initialProps,
51
+ wrapper: Wrapper,
52
+ });
53
+
54
+ act(() => {
55
+ result.current.setNumberOfUploads(numberOfUploads);
56
+ });
57
+
58
+ rerender({ editing: false, maxNumberOfFiles: 2 });
59
+
60
+ act(() => {
61
+ result.current.pickFile();
62
+ });
63
+
64
+ expect(Alert.alert).toHaveBeenCalledTimes(numberOfTimesCalled);
65
+ },
66
+ );
67
+ });
@@ -0,0 +1,82 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import { act } from 'react-test-renderer';
3
+
4
+ import { renderHook } from '@testing-library/react-hooks';
5
+
6
+ import { waitFor } from '@testing-library/react-native';
7
+
8
+ import { generateFileUploadPreview } from '../../../mock-builders/generator/attachment';
9
+ import type { DefaultStreamChatGenerics } from '../../../types/types';
10
+ import {
11
+ InputMessageInputContextValue,
12
+ MessageInputContextValue,
13
+ MessageInputProvider,
14
+ useMessageInputContext,
15
+ } from '../MessageInputContext';
16
+
17
+ type WrapperType<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
18
+ Partial<InputMessageInputContextValue<StreamChatGenerics>>;
19
+
20
+ const Wrapper = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({
21
+ children,
22
+ ...rest
23
+ }: PropsWithChildren<WrapperType<StreamChatGenerics>>) => (
24
+ <MessageInputProvider
25
+ value={
26
+ {
27
+ ...rest,
28
+ } as MessageInputContextValue<StreamChatGenerics>
29
+ }
30
+ >
31
+ {children}
32
+ </MessageInputProvider>
33
+ );
34
+
35
+ describe("MessageInputContext's removeFile", () => {
36
+ const initialProps = {
37
+ editing: true,
38
+ };
39
+
40
+ const file = generateFileUploadPreview({
41
+ file: {
42
+ id: 'test',
43
+ name: 'Test Image',
44
+ uri: 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg',
45
+ },
46
+ });
47
+
48
+ it.each([
49
+ [file.id, 0, 0],
50
+ ['dummy', 1, 1],
51
+ ])(
52
+ 'removeFile is been called with %s and checked for expectedFileUploadsLength %i, and expectedNumberOfUploadsLength %i)',
53
+ async (fileId, expectedFileUploadsLength, expectedNumberOfUploadsLength) => {
54
+ const { rerender, result } = renderHook(() => useMessageInputContext(), {
55
+ initialProps,
56
+ wrapper: Wrapper,
57
+ });
58
+
59
+ act(() => {
60
+ result.current.setFileUploads([file]);
61
+ result.current.setNumberOfUploads(1);
62
+ });
63
+
64
+ rerender({ editing: false });
65
+
66
+ await waitFor(() => {
67
+ expect(result.current.fileUploads.length).toBe(1);
68
+ });
69
+
70
+ act(() => {
71
+ result.current.removeFile(fileId);
72
+ });
73
+
74
+ rerender({ editing: true });
75
+
76
+ await waitFor(() => {
77
+ expect(result.current.fileUploads.length).toBe(expectedFileUploadsLength);
78
+ expect(result.current.numberOfUploads).toBe(expectedNumberOfUploadsLength);
79
+ });
80
+ },
81
+ );
82
+ });
@@ -0,0 +1,80 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import { act } from 'react-test-renderer';
3
+
4
+ import { renderHook } from '@testing-library/react-hooks';
5
+
6
+ import { waitFor } from '@testing-library/react-native';
7
+
8
+ import { generateImageUploadPreview } from '../../../mock-builders/generator/attachment';
9
+ import type { DefaultStreamChatGenerics } from '../../../types/types';
10
+ import {
11
+ InputMessageInputContextValue,
12
+ MessageInputContextValue,
13
+ MessageInputProvider,
14
+ useMessageInputContext,
15
+ } from '../MessageInputContext';
16
+
17
+ type WrapperType<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =
18
+ Partial<InputMessageInputContextValue<StreamChatGenerics>>;
19
+
20
+ const Wrapper = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({
21
+ children,
22
+ ...rest
23
+ }: PropsWithChildren<WrapperType<StreamChatGenerics>>) => (
24
+ <MessageInputProvider
25
+ value={
26
+ {
27
+ ...rest,
28
+ } as MessageInputContextValue<StreamChatGenerics>
29
+ }
30
+ >
31
+ {children}
32
+ </MessageInputProvider>
33
+ );
34
+
35
+ describe("MessageInputContext's removeImage", () => {
36
+ const initialProps = {
37
+ editing: true,
38
+ };
39
+ const image = generateImageUploadPreview({
40
+ file: {
41
+ id: 'test',
42
+ name: 'Test Image',
43
+ uri: 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg',
44
+ },
45
+ });
46
+ it.each([
47
+ [image.id, 0, 0],
48
+ ['dummy', 1, 1],
49
+ ])(
50
+ 'removeImage is been called with %s and checked for expectedImageUploadsLength %i, and expectedNumberOfUploadsLength %i)',
51
+ async (imageId, expectedImageUploadsLength, expectedNumberOfUploadsLength) => {
52
+ const { rerender, result } = renderHook(() => useMessageInputContext(), {
53
+ initialProps,
54
+ wrapper: Wrapper,
55
+ });
56
+
57
+ act(() => {
58
+ result.current.setImageUploads([image]);
59
+ result.current.setNumberOfUploads(1);
60
+ });
61
+
62
+ rerender({ editing: false });
63
+
64
+ await waitFor(() => {
65
+ expect(result.current.imageUploads.length).toBe(1);
66
+ });
67
+
68
+ act(() => {
69
+ result.current.removeImage(imageId);
70
+ });
71
+
72
+ rerender({ editing: true });
73
+
74
+ await waitFor(() => {
75
+ expect(result.current.imageUploads.length).toBe(expectedImageUploadsLength);
76
+ expect(result.current.numberOfUploads).toBe(expectedNumberOfUploadsLength);
77
+ });
78
+ },
79
+ );
80
+ });