stream-chat-react-native-core 5.34.0 → 5.34.1-beta.2
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.
- package/lib/commonjs/components/Channel/Channel.js +0 -1
- package/lib/commonjs/components/Channel/Channel.js.map +1 -1
- package/lib/commonjs/components/Channel/hooks/useCreateInputMessageInputContext.js +1 -3
- package/lib/commonjs/components/Channel/hooks/useCreateInputMessageInputContext.js.map +1 -1
- package/lib/commonjs/components/Message/Message.js +1 -9
- package/lib/commonjs/components/Message/Message.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageContent.js +3 -10
- package/lib/commonjs/components/Message/MessageSimple/MessageContent.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js +0 -6
- package/lib/commonjs/components/Message/MessageSimple/MessageSimple.js.map +1 -1
- package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js +1 -3
- package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js.map +1 -1
- package/lib/commonjs/components/MessageInput/AttachButton.js +4 -17
- package/lib/commonjs/components/MessageInput/AttachButton.js.map +1 -1
- package/lib/commonjs/components/MessageInput/CommandsButton.js +3 -14
- package/lib/commonjs/components/MessageInput/CommandsButton.js.map +1 -1
- package/lib/commonjs/components/MessageInput/MessageInput.js +5 -14
- package/lib/commonjs/components/MessageInput/MessageInput.js.map +1 -1
- package/lib/commonjs/components/MessageInput/MoreOptionsButton.js +2 -25
- package/lib/commonjs/components/MessageInput/MoreOptionsButton.js.map +1 -1
- package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecorder.js +3 -16
- package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecorder.js.map +1 -1
- package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js +1 -12
- package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js.map +1 -1
- package/lib/commonjs/components/MessageInput/components/InputEditingStateHeader.js +15 -26
- package/lib/commonjs/components/MessageInput/components/InputEditingStateHeader.js.map +1 -1
- package/lib/commonjs/components/MessageInput/components/InputGiphySearch.js +15 -28
- package/lib/commonjs/components/MessageInput/components/InputGiphySearch.js.map +1 -1
- package/lib/commonjs/components/MessageInput/components/InputReplyStateHeader.js +15 -26
- package/lib/commonjs/components/MessageInput/components/InputReplyStateHeader.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageList.js +2 -2
- package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
- package/lib/commonjs/contexts/messageInputContext/hooks/useCreateMessageInputContext.js +1 -3
- package/lib/commonjs/contexts/messageInputContext/hooks/useCreateMessageInputContext.js.map +1 -1
- package/lib/commonjs/utils/utils.js +2 -1
- package/lib/commonjs/utils/utils.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/Channel/Channel.js +0 -1
- package/lib/module/components/Channel/Channel.js.map +1 -1
- package/lib/module/components/Channel/hooks/useCreateInputMessageInputContext.js +1 -3
- package/lib/module/components/Channel/hooks/useCreateInputMessageInputContext.js.map +1 -1
- package/lib/module/components/Message/Message.js +1 -9
- package/lib/module/components/Message/Message.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageContent.js +3 -10
- package/lib/module/components/Message/MessageSimple/MessageContent.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageSimple.js +0 -6
- package/lib/module/components/Message/MessageSimple/MessageSimple.js.map +1 -1
- package/lib/module/components/Message/hooks/useCreateMessageContext.js +1 -3
- package/lib/module/components/Message/hooks/useCreateMessageContext.js.map +1 -1
- package/lib/module/components/MessageInput/AttachButton.js +4 -17
- package/lib/module/components/MessageInput/AttachButton.js.map +1 -1
- package/lib/module/components/MessageInput/CommandsButton.js +3 -14
- package/lib/module/components/MessageInput/CommandsButton.js.map +1 -1
- package/lib/module/components/MessageInput/MessageInput.js +5 -14
- package/lib/module/components/MessageInput/MessageInput.js.map +1 -1
- package/lib/module/components/MessageInput/MoreOptionsButton.js +2 -25
- package/lib/module/components/MessageInput/MoreOptionsButton.js.map +1 -1
- package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecorder.js +3 -16
- package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecorder.js.map +1 -1
- package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js +1 -12
- package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js.map +1 -1
- package/lib/module/components/MessageInput/components/InputEditingStateHeader.js +15 -26
- package/lib/module/components/MessageInput/components/InputEditingStateHeader.js.map +1 -1
- package/lib/module/components/MessageInput/components/InputGiphySearch.js +15 -28
- package/lib/module/components/MessageInput/components/InputGiphySearch.js.map +1 -1
- package/lib/module/components/MessageInput/components/InputReplyStateHeader.js +15 -26
- package/lib/module/components/MessageInput/components/InputReplyStateHeader.js.map +1 -1
- package/lib/module/components/MessageList/MessageList.js +2 -2
- package/lib/module/components/MessageList/MessageList.js.map +1 -1
- package/lib/module/contexts/messageInputContext/hooks/useCreateMessageInputContext.js +1 -3
- package/lib/module/contexts/messageInputContext/hooks/useCreateMessageInputContext.js.map +1 -1
- package/lib/module/utils/utils.js +2 -1
- package/lib/module/utils/utils.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
- package/lib/typescript/components/Channel/hooks/useCreateInputMessageInputContext.d.ts +1 -74
- package/lib/typescript/components/Channel/hooks/useCreateInputMessageInputContext.d.ts.map +1 -1
- package/lib/typescript/components/Message/Message.d.ts +1 -1
- package/lib/typescript/components/Message/Message.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageContent.d.ts +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageContent.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageSimple.d.ts +1 -1
- package/lib/typescript/components/Message/MessageSimple/MessageSimple.d.ts.map +1 -1
- package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts +1 -1
- package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/AttachButton.d.ts +3 -5
- package/lib/typescript/components/MessageInput/AttachButton.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/CommandsButton.d.ts +1 -2
- package/lib/typescript/components/MessageInput/CommandsButton.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/MessageInput.d.ts +1 -1
- package/lib/typescript/components/MessageInput/MessageInput.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/MoreOptionsButton.d.ts +2 -9
- package/lib/typescript/components/MessageInput/MoreOptionsButton.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/components/AudioRecorder/AudioRecorder.d.ts +1 -2
- package/lib/typescript/components/MessageInput/components/AudioRecorder/AudioRecorder.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/components/AudioRecorder/AudioRecordingButton.d.ts +1 -2
- package/lib/typescript/components/MessageInput/components/AudioRecorder/AudioRecordingButton.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/components/InputEditingStateHeader.d.ts +2 -5
- package/lib/typescript/components/MessageInput/components/InputEditingStateHeader.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/components/InputGiphySearch.d.ts +4 -5
- package/lib/typescript/components/MessageInput/components/InputGiphySearch.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/components/InputReplyStateHeader.d.ts +2 -5
- package/lib/typescript/components/MessageInput/components/InputReplyStateHeader.d.ts.map +1 -1
- package/lib/typescript/contexts/messageContext/MessageContext.d.ts +2 -2
- package/lib/typescript/contexts/messageContext/MessageContext.d.ts.map +1 -1
- package/lib/typescript/contexts/messageInputContext/MessageInputContext.d.ts +4 -4
- package/lib/typescript/contexts/messageInputContext/MessageInputContext.d.ts.map +1 -1
- package/lib/typescript/contexts/messageInputContext/hooks/useCreateMessageInputContext.d.ts +1 -1
- package/lib/typescript/contexts/messageInputContext/hooks/useCreateMessageInputContext.d.ts.map +1 -1
- package/lib/typescript/utils/utils.d.ts +1 -1
- package/lib/typescript/utils/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/Channel/Channel.tsx +0 -1
- package/src/components/Channel/__tests__/ownCapabilities.test.js +0 -18
- package/src/components/Channel/hooks/useCreateInputMessageInputContext.ts +1 -11
- package/src/components/Message/Message.tsx +3 -15
- package/src/components/Message/MessageSimple/MessageContent.tsx +1 -10
- package/src/components/Message/MessageSimple/MessageSimple.tsx +2 -14
- package/src/components/Message/hooks/useCreateMessageContext.ts +0 -3
- package/src/components/MessageInput/AttachButton.tsx +12 -47
- package/src/components/MessageInput/CommandsButton.tsx +9 -23
- package/src/components/MessageInput/MessageInput.tsx +10 -22
- package/src/components/MessageInput/MoreOptionsButton.tsx +3 -53
- package/src/components/MessageInput/__tests__/__snapshots__/AttachButton.test.js.snap +2 -2
- package/src/components/MessageInput/components/AudioRecorder/AudioRecorder.tsx +36 -52
- package/src/components/MessageInput/components/AudioRecorder/AudioRecordingButton.tsx +27 -42
- package/src/components/MessageInput/components/InputEditingStateHeader.tsx +18 -44
- package/src/components/MessageInput/components/InputGiphySearch.tsx +27 -51
- package/src/components/MessageInput/components/InputReplyStateHeader.tsx +19 -44
- package/src/components/MessageList/MessageList.tsx +1 -1
- package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap +2 -2
- package/src/contexts/messageContext/MessageContext.tsx +1 -1
- package/src/contexts/messageInputContext/MessageInputContext.tsx +3 -3
- package/src/contexts/messageInputContext/hooks/useCreateMessageInputContext.ts +0 -3
- package/src/utils/utils.ts +2 -1
- package/src/version.json +1 -1
|
@@ -5,10 +5,6 @@ import Animated from 'react-native-reanimated';
|
|
|
5
5
|
|
|
6
6
|
import dayjs from 'dayjs';
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
ChannelContextValue,
|
|
10
|
-
useChannelContext,
|
|
11
|
-
} from '../../../../contexts/channelContext/ChannelContext';
|
|
12
8
|
import {
|
|
13
9
|
MessageInputContextValue,
|
|
14
10
|
useMessageInputContext,
|
|
@@ -21,42 +17,41 @@ import type { DefaultStreamChatGenerics } from '../../../../types/types';
|
|
|
21
17
|
|
|
22
18
|
type AudioRecorderPropsWithContext<
|
|
23
19
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
24
|
-
> = Pick<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
};
|
|
20
|
+
> = Pick<MessageInputContextValue<StreamChatGenerics>, 'asyncMessagesMultiSendEnabled'> & {
|
|
21
|
+
/**
|
|
22
|
+
* Function to stop and delete the voice recording.
|
|
23
|
+
*/
|
|
24
|
+
deleteVoiceRecording: () => Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Boolean used to show if the voice recording state is locked. This makes sure the mic button shouldn't be pressed any longer.
|
|
27
|
+
* When the mic is locked the `AudioRecordingInProgress` component shows up.
|
|
28
|
+
*/
|
|
29
|
+
micLocked: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* The current voice recording that is in progress.
|
|
32
|
+
*/
|
|
33
|
+
recording: AudioRecordingReturnType;
|
|
34
|
+
/**
|
|
35
|
+
* Boolean to determine if the recording has been stopped.
|
|
36
|
+
*/
|
|
37
|
+
recordingStopped: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Function to stop the ongoing voice recording.
|
|
40
|
+
*/
|
|
41
|
+
stopVoiceRecording: () => Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Function to upload the voice recording.
|
|
44
|
+
*/
|
|
45
|
+
uploadVoiceRecording: (multiSendEnabled: boolean) => Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* The duration of the voice recording.
|
|
48
|
+
*/
|
|
49
|
+
recordingDuration?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Style used in slide to cancel container.
|
|
52
|
+
*/
|
|
53
|
+
slideToCancelStyle?: StyleProp<ViewStyle>;
|
|
54
|
+
};
|
|
60
55
|
|
|
61
56
|
const StopRecording = ({
|
|
62
57
|
stopVoiceRecordingHandler,
|
|
@@ -110,10 +105,8 @@ const UploadRecording = ({
|
|
|
110
105
|
|
|
111
106
|
const DeleteRecording = ({
|
|
112
107
|
deleteVoiceRecordingHandler,
|
|
113
|
-
disabled,
|
|
114
108
|
}: {
|
|
115
109
|
deleteVoiceRecordingHandler: () => Promise<void>;
|
|
116
|
-
disabled?: boolean;
|
|
117
110
|
}) => {
|
|
118
111
|
const {
|
|
119
112
|
theme: {
|
|
@@ -125,7 +118,6 @@ const DeleteRecording = ({
|
|
|
125
118
|
} = useTheme();
|
|
126
119
|
return (
|
|
127
120
|
<Pressable
|
|
128
|
-
disabled={disabled}
|
|
129
121
|
onPress={deleteVoiceRecordingHandler}
|
|
130
122
|
style={[styles.deleteContainer, deleteContainer]}
|
|
131
123
|
testID='delete-button'
|
|
@@ -143,7 +135,6 @@ const AudioRecorderWithContext = <
|
|
|
143
135
|
const {
|
|
144
136
|
asyncMessagesMultiSendEnabled,
|
|
145
137
|
deleteVoiceRecording,
|
|
146
|
-
disabled,
|
|
147
138
|
micLocked,
|
|
148
139
|
recordingDuration,
|
|
149
140
|
recordingStopped,
|
|
@@ -165,7 +156,7 @@ const AudioRecorderWithContext = <
|
|
|
165
156
|
if (recordingStopped) {
|
|
166
157
|
return (
|
|
167
158
|
<>
|
|
168
|
-
<DeleteRecording deleteVoiceRecordingHandler={deleteVoiceRecording}
|
|
159
|
+
<DeleteRecording deleteVoiceRecordingHandler={deleteVoiceRecording} />
|
|
169
160
|
<UploadRecording
|
|
170
161
|
asyncMessagesMultiSendEnabled={asyncMessagesMultiSendEnabled}
|
|
171
162
|
uploadVoiceRecordingHandler={uploadVoiceRecording}
|
|
@@ -212,7 +203,6 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
212
203
|
) => {
|
|
213
204
|
const {
|
|
214
205
|
asyncMessagesMultiSendEnabled: prevAsyncMessagesMultiSendEnabled,
|
|
215
|
-
disabled: prevDisabled,
|
|
216
206
|
micLocked: prevMicLocked,
|
|
217
207
|
recording: prevRecording,
|
|
218
208
|
recordingDuration: prevRecordingDuration,
|
|
@@ -220,7 +210,6 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
220
210
|
} = prevProps;
|
|
221
211
|
const {
|
|
222
212
|
asyncMessagesMultiSendEnabled: nextAsyncMessagesMultiSendEnabled,
|
|
223
|
-
disabled: nextDisabled,
|
|
224
213
|
micLocked: nextMicLocked,
|
|
225
214
|
recording: nextRecording,
|
|
226
215
|
recordingDuration: nextRecordingDuration,
|
|
@@ -231,9 +220,6 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
231
220
|
prevAsyncMessagesMultiSendEnabled === nextAsyncMessagesMultiSendEnabled;
|
|
232
221
|
if (!asyncMessagesMultiSendEnabledEqual) return false;
|
|
233
222
|
|
|
234
|
-
const disabledEqual = prevDisabled === nextDisabled;
|
|
235
|
-
if (!disabledEqual) return false;
|
|
236
|
-
|
|
237
223
|
const micLockedEqual = prevMicLocked === nextMicLocked;
|
|
238
224
|
if (!micLockedEqual) return false;
|
|
239
225
|
|
|
@@ -275,14 +261,12 @@ export const AudioRecorder = <
|
|
|
275
261
|
>(
|
|
276
262
|
props: AudioRecorderProps<StreamChatGenerics>,
|
|
277
263
|
) => {
|
|
278
|
-
const { disabled = false } = useChannelContext<StreamChatGenerics>();
|
|
279
264
|
const { asyncMessagesMultiSendEnabled } = useMessageInputContext<StreamChatGenerics>();
|
|
280
265
|
|
|
281
266
|
return (
|
|
282
267
|
<MemoizedAudioRecorder
|
|
283
268
|
{...{
|
|
284
269
|
asyncMessagesMultiSendEnabled,
|
|
285
|
-
disabled,
|
|
286
270
|
}}
|
|
287
271
|
{...props}
|
|
288
272
|
/>
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Alert, Linking, Pressable, StyleSheet } from 'react-native';
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
ChannelContextValue,
|
|
6
|
-
useChannelContext,
|
|
7
|
-
} from '../../../../contexts/channelContext/ChannelContext';
|
|
8
4
|
import {
|
|
9
5
|
MessageInputContextValue,
|
|
10
6
|
useMessageInputContext,
|
|
@@ -18,33 +14,32 @@ import type { DefaultStreamChatGenerics } from '../../../../types/types';
|
|
|
18
14
|
|
|
19
15
|
type AudioRecordingButtonPropsWithContext<
|
|
20
16
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
21
|
-
> = Pick<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
};
|
|
17
|
+
> = Pick<MessageInputContextValue<StreamChatGenerics>, 'asyncMessagesMinimumPressDuration'> & {
|
|
18
|
+
/**
|
|
19
|
+
* The current voice recording that is in progress.
|
|
20
|
+
*/
|
|
21
|
+
recording: AudioRecordingReturnType;
|
|
22
|
+
/**
|
|
23
|
+
* Size of the mic button.
|
|
24
|
+
*/
|
|
25
|
+
buttonSize?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Handler to determine what should happen on long press of the mic button.
|
|
28
|
+
*/
|
|
29
|
+
handleLongPress?: () => void;
|
|
30
|
+
/**
|
|
31
|
+
* Handler to determine what should happen on press of the mic button.
|
|
32
|
+
*/
|
|
33
|
+
handlePress?: () => void;
|
|
34
|
+
/**
|
|
35
|
+
* Boolean to determine if the audio recording permissions are granted.
|
|
36
|
+
*/
|
|
37
|
+
permissionsGranted?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Function to start the voice recording.
|
|
40
|
+
*/
|
|
41
|
+
startVoiceRecording?: () => Promise<void>;
|
|
42
|
+
};
|
|
48
43
|
|
|
49
44
|
const AudioRecordingButtonWithContext = <
|
|
50
45
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
@@ -54,7 +49,6 @@ const AudioRecordingButtonWithContext = <
|
|
|
54
49
|
const {
|
|
55
50
|
asyncMessagesMinimumPressDuration,
|
|
56
51
|
buttonSize,
|
|
57
|
-
disabled,
|
|
58
52
|
handleLongPress,
|
|
59
53
|
handlePress,
|
|
60
54
|
permissionsGranted,
|
|
@@ -107,7 +101,6 @@ const AudioRecordingButtonWithContext = <
|
|
|
107
101
|
return (
|
|
108
102
|
<Pressable
|
|
109
103
|
delayLongPress={asyncMessagesMinimumPressDuration}
|
|
110
|
-
disabled={disabled}
|
|
111
104
|
onLongPress={onLongPressHandler}
|
|
112
105
|
onPress={onPressHandler}
|
|
113
106
|
style={({ pressed }) => [
|
|
@@ -132,12 +125,10 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
132
125
|
) => {
|
|
133
126
|
const {
|
|
134
127
|
asyncMessagesMinimumPressDuration: prevAsyncMessagesMinimumPressDuration,
|
|
135
|
-
disabled: prevDisabled,
|
|
136
128
|
recording: prevRecording,
|
|
137
129
|
} = prevProps;
|
|
138
130
|
const {
|
|
139
131
|
asyncMessagesMinimumPressDuration: nextAsyncMessagesMinimumPressDuration,
|
|
140
|
-
disabled: nextDisabled,
|
|
141
132
|
recording: nextRecording,
|
|
142
133
|
} = nextProps;
|
|
143
134
|
|
|
@@ -145,9 +136,6 @@ const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = Default
|
|
|
145
136
|
prevAsyncMessagesMinimumPressDuration === nextAsyncMessagesMinimumPressDuration;
|
|
146
137
|
if (!asyncMessagesMinimumPressDurationEqual) return false;
|
|
147
138
|
|
|
148
|
-
const disabledEqual = prevDisabled === nextDisabled;
|
|
149
|
-
if (!disabledEqual) return false;
|
|
150
|
-
|
|
151
139
|
const recordingEqual = prevRecording === nextRecording;
|
|
152
140
|
if (!recordingEqual) return false;
|
|
153
141
|
|
|
@@ -173,12 +161,9 @@ export const AudioRecordingButton = <
|
|
|
173
161
|
>(
|
|
174
162
|
props: AudioRecordingButtonProps<StreamChatGenerics>,
|
|
175
163
|
) => {
|
|
176
|
-
const { disabled = false } = useChannelContext<StreamChatGenerics>();
|
|
177
164
|
const { asyncMessagesMinimumPressDuration } = useMessageInputContext<StreamChatGenerics>();
|
|
178
165
|
|
|
179
|
-
return
|
|
180
|
-
<MemoizedAudioRecordingButton {...{ asyncMessagesMinimumPressDuration, disabled }} {...props} />
|
|
181
|
-
);
|
|
166
|
+
return <MemoizedAudioRecordingButton {...{ asyncMessagesMinimumPressDuration }} {...props} />;
|
|
182
167
|
};
|
|
183
168
|
|
|
184
169
|
const styles = StyleSheet.create({
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
|
3
3
|
|
|
4
|
-
import type { ChannelContextValue } from '../../../contexts/channelContext/ChannelContext';
|
|
5
4
|
import {
|
|
6
5
|
MessageInputContextValue,
|
|
7
6
|
useMessageInputContext,
|
|
@@ -25,19 +24,23 @@ const styles = StyleSheet.create({
|
|
|
25
24
|
},
|
|
26
25
|
});
|
|
27
26
|
|
|
28
|
-
export type
|
|
27
|
+
export type InputEditingStateHeaderProps<
|
|
29
28
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
30
|
-
> = Pick<MessageInputContextValue<StreamChatGenerics>, 'clearEditingState' | 'resetInput'
|
|
31
|
-
Pick<ChannelContextValue<StreamChatGenerics>, 'disabled'>;
|
|
29
|
+
> = Partial<Pick<MessageInputContextValue<StreamChatGenerics>, 'clearEditingState' | 'resetInput'>>;
|
|
32
30
|
|
|
33
|
-
export const
|
|
31
|
+
export const InputEditingStateHeader = <
|
|
34
32
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
35
33
|
>({
|
|
36
|
-
clearEditingState,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}: InputEditingStateHeaderPropsWithContext<StreamChatGenerics>) => {
|
|
34
|
+
clearEditingState: propClearEditingState,
|
|
35
|
+
resetInput: propResetInput,
|
|
36
|
+
}: InputEditingStateHeaderProps<StreamChatGenerics>) => {
|
|
40
37
|
const { t } = useTranslationContext();
|
|
38
|
+
const { clearEditingState: contextClearEditingState, resetInput: contextResetInput } =
|
|
39
|
+
useMessageInputContext<StreamChatGenerics>();
|
|
40
|
+
|
|
41
|
+
const clearEditingState = propClearEditingState || contextClearEditingState;
|
|
42
|
+
const resetInput = propResetInput || contextResetInput;
|
|
43
|
+
|
|
41
44
|
const {
|
|
42
45
|
theme: {
|
|
43
46
|
colors: { black, grey, grey_gainsboro },
|
|
@@ -54,10 +57,13 @@ export const InputEditingStateHeaderWithContext = <
|
|
|
54
57
|
{t<string>('Editing Message')}
|
|
55
58
|
</Text>
|
|
56
59
|
<TouchableOpacity
|
|
57
|
-
disabled={disabled}
|
|
58
60
|
onPress={() => {
|
|
59
|
-
resetInput
|
|
60
|
-
|
|
61
|
+
if (resetInput) {
|
|
62
|
+
resetInput();
|
|
63
|
+
}
|
|
64
|
+
if (clearEditingState) {
|
|
65
|
+
clearEditingState();
|
|
66
|
+
}
|
|
61
67
|
}}
|
|
62
68
|
testID='close-button'
|
|
63
69
|
>
|
|
@@ -67,36 +73,4 @@ export const InputEditingStateHeaderWithContext = <
|
|
|
67
73
|
);
|
|
68
74
|
};
|
|
69
75
|
|
|
70
|
-
const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(
|
|
71
|
-
prevProps: InputEditingStateHeaderPropsWithContext<StreamChatGenerics>,
|
|
72
|
-
nextProps: InputEditingStateHeaderPropsWithContext<StreamChatGenerics>,
|
|
73
|
-
) => {
|
|
74
|
-
const { disabled: prevDisabled } = prevProps;
|
|
75
|
-
const { disabled: nextDisabled } = nextProps;
|
|
76
|
-
|
|
77
|
-
const disabledEqual = prevDisabled === nextDisabled;
|
|
78
|
-
if (!disabledEqual) return false;
|
|
79
|
-
|
|
80
|
-
return true;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const MemoizedInputEditingStateHeader = React.memo(
|
|
84
|
-
InputEditingStateHeaderWithContext,
|
|
85
|
-
areEqual,
|
|
86
|
-
) as typeof InputEditingStateHeaderWithContext;
|
|
87
|
-
|
|
88
|
-
export type InputEditingStateHeaderProps<
|
|
89
|
-
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
90
|
-
> = Partial<InputEditingStateHeaderPropsWithContext<StreamChatGenerics>>;
|
|
91
|
-
|
|
92
|
-
export const InputEditingStateHeader = <
|
|
93
|
-
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
94
|
-
>(
|
|
95
|
-
props: InputEditingStateHeaderProps<StreamChatGenerics>,
|
|
96
|
-
) => {
|
|
97
|
-
const { clearEditingState, resetInput } = useMessageInputContext<StreamChatGenerics>();
|
|
98
|
-
|
|
99
|
-
return <MemoizedInputEditingStateHeader {...{ clearEditingState, resetInput }} {...props} />;
|
|
100
|
-
};
|
|
101
|
-
|
|
102
76
|
InputEditingStateHeader.displayName = 'EditingStateHeader{messageInput}';
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
|
3
3
|
|
|
4
|
-
import type { ChannelContextValue } from '../../../contexts/channelContext/ChannelContext';
|
|
5
4
|
import {
|
|
6
5
|
MessageInputContextValue,
|
|
7
6
|
useMessageInputContext,
|
|
@@ -34,23 +33,38 @@ const styles = StyleSheet.create({
|
|
|
34
33
|
},
|
|
35
34
|
});
|
|
36
35
|
|
|
37
|
-
export type
|
|
36
|
+
export type InputGiphySearchProps<
|
|
38
37
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
39
|
-
> =
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
> = Partial<
|
|
39
|
+
Pick<
|
|
40
|
+
MessageInputContextValue<StreamChatGenerics>,
|
|
41
|
+
'additionalTextInputProps' | 'cooldownEndsAt' | 'setGiphyActive' | 'setShowMoreOptions'
|
|
42
|
+
>
|
|
43
|
+
> & {
|
|
44
|
+
disabled: boolean;
|
|
45
|
+
};
|
|
44
46
|
|
|
45
|
-
export const
|
|
47
|
+
export const InputGiphySearch = <
|
|
46
48
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
47
49
|
>({
|
|
48
|
-
additionalTextInputProps,
|
|
49
|
-
cooldownEndsAt,
|
|
50
|
+
additionalTextInputProps: propAdditionalTextInputProps,
|
|
51
|
+
cooldownEndsAt: propCooldownEndsAt,
|
|
50
52
|
disabled,
|
|
51
|
-
setGiphyActive,
|
|
52
|
-
setShowMoreOptions,
|
|
53
|
-
}:
|
|
53
|
+
setGiphyActive: propSetGiphyActive,
|
|
54
|
+
setShowMoreOptions: propSetShowMoreOptions,
|
|
55
|
+
}: InputGiphySearchProps<StreamChatGenerics>) => {
|
|
56
|
+
const {
|
|
57
|
+
additionalTextInputProps: contextAdditionalTextInputProps,
|
|
58
|
+
cooldownEndsAt: contextCooldownEndsAt,
|
|
59
|
+
setGiphyActive: contextSetGiphyActive,
|
|
60
|
+
setShowMoreOptions: contextSetShowMoreOptions,
|
|
61
|
+
} = useMessageInputContext<StreamChatGenerics>();
|
|
62
|
+
|
|
63
|
+
const additionalTextInputProps = propAdditionalTextInputProps || contextAdditionalTextInputProps;
|
|
64
|
+
const cooldownEndsAt = propCooldownEndsAt || contextCooldownEndsAt;
|
|
65
|
+
const setGiphyActive = propSetGiphyActive || contextSetGiphyActive;
|
|
66
|
+
const setShowMoreOptions = propSetShowMoreOptions || contextSetShowMoreOptions;
|
|
67
|
+
|
|
54
68
|
const { seconds: cooldownRemainingSeconds } = useCountdown(cooldownEndsAt);
|
|
55
69
|
|
|
56
70
|
const {
|
|
@@ -88,42 +102,4 @@ export const InputGiphySearchWithContext = <
|
|
|
88
102
|
);
|
|
89
103
|
};
|
|
90
104
|
|
|
91
|
-
const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(
|
|
92
|
-
prevProps: InputGiphySearchPropsWithContext<StreamChatGenerics>,
|
|
93
|
-
nextProps: InputGiphySearchPropsWithContext<StreamChatGenerics>,
|
|
94
|
-
) => {
|
|
95
|
-
const { disabled: prevDisabled } = prevProps;
|
|
96
|
-
const { disabled: nextDisabled } = nextProps;
|
|
97
|
-
|
|
98
|
-
const disabledEqual = prevDisabled === nextDisabled;
|
|
99
|
-
if (!disabledEqual) return false;
|
|
100
|
-
|
|
101
|
-
return true;
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
const MemoizedInputGiphySearch = React.memo(
|
|
105
|
-
InputGiphySearchWithContext,
|
|
106
|
-
areEqual,
|
|
107
|
-
) as typeof InputGiphySearchWithContext;
|
|
108
|
-
|
|
109
|
-
export type InputGiphySearchProps<
|
|
110
|
-
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
111
|
-
> = Partial<InputGiphySearchPropsWithContext<StreamChatGenerics>>;
|
|
112
|
-
|
|
113
|
-
export const InputGiphySearch = <
|
|
114
|
-
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
115
|
-
>(
|
|
116
|
-
props: InputGiphySearchProps<StreamChatGenerics>,
|
|
117
|
-
) => {
|
|
118
|
-
const { additionalTextInputProps, cooldownEndsAt, setGiphyActive, setShowMoreOptions } =
|
|
119
|
-
useMessageInputContext<StreamChatGenerics>();
|
|
120
|
-
|
|
121
|
-
return (
|
|
122
|
-
<MemoizedInputGiphySearch
|
|
123
|
-
{...{ additionalTextInputProps, cooldownEndsAt, setGiphyActive, setShowMoreOptions }}
|
|
124
|
-
{...props}
|
|
125
|
-
/>
|
|
126
|
-
);
|
|
127
|
-
};
|
|
128
|
-
|
|
129
105
|
InputGiphySearch.displayName = 'InputGiphySearch{messageInput}';
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
|
3
3
|
|
|
4
|
-
import type { ChannelContextValue } from '../../../contexts/channelContext/ChannelContext';
|
|
5
4
|
import {
|
|
6
5
|
MessageInputContextValue,
|
|
7
6
|
useMessageInputContext,
|
|
@@ -25,19 +24,21 @@ const styles = StyleSheet.create({
|
|
|
25
24
|
},
|
|
26
25
|
});
|
|
27
26
|
|
|
28
|
-
export type
|
|
27
|
+
export type InputReplyStateHeaderProps<
|
|
29
28
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
30
|
-
> =
|
|
31
|
-
Pick<
|
|
29
|
+
> = Partial<
|
|
30
|
+
Pick<MessageInputContextValue<StreamChatGenerics>, 'clearQuotedMessageState' | 'resetInput'>
|
|
31
|
+
>;
|
|
32
32
|
|
|
33
|
-
export const
|
|
33
|
+
export const InputReplyStateHeader = <
|
|
34
34
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
35
35
|
>({
|
|
36
|
-
clearQuotedMessageState,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}: InputReplyStateHeaderPropsWithContext<StreamChatGenerics>) => {
|
|
36
|
+
clearQuotedMessageState: propClearQuotedMessageState,
|
|
37
|
+
resetInput: propResetInput,
|
|
38
|
+
}: InputReplyStateHeaderProps<StreamChatGenerics>) => {
|
|
40
39
|
const { t } = useTranslationContext();
|
|
40
|
+
const { clearQuotedMessageState: contextClearQuotedMessageState, resetInput: contextResetInput } =
|
|
41
|
+
useMessageInputContext();
|
|
41
42
|
const {
|
|
42
43
|
theme: {
|
|
43
44
|
colors: { black, grey, grey_gainsboro },
|
|
@@ -47,6 +48,9 @@ export const InputReplyStateHeaderWithContext = <
|
|
|
47
48
|
},
|
|
48
49
|
} = useTheme();
|
|
49
50
|
|
|
51
|
+
const clearQuotedMessageState = propClearQuotedMessageState || contextClearQuotedMessageState;
|
|
52
|
+
const resetInput = propResetInput || contextResetInput;
|
|
53
|
+
|
|
50
54
|
return (
|
|
51
55
|
<View style={[styles.replyBoxHeader, editingBoxHeader]}>
|
|
52
56
|
<CurveLineLeftUp pathFill={grey_gainsboro} />
|
|
@@ -54,10 +58,13 @@ export const InputReplyStateHeaderWithContext = <
|
|
|
54
58
|
{t<string>('Reply to Message')}
|
|
55
59
|
</Text>
|
|
56
60
|
<TouchableOpacity
|
|
57
|
-
disabled={disabled}
|
|
58
61
|
onPress={() => {
|
|
59
|
-
resetInput
|
|
60
|
-
|
|
62
|
+
if (resetInput) {
|
|
63
|
+
resetInput();
|
|
64
|
+
}
|
|
65
|
+
if (clearQuotedMessageState) {
|
|
66
|
+
clearQuotedMessageState();
|
|
67
|
+
}
|
|
61
68
|
}}
|
|
62
69
|
testID='close-button'
|
|
63
70
|
>
|
|
@@ -67,36 +74,4 @@ export const InputReplyStateHeaderWithContext = <
|
|
|
67
74
|
);
|
|
68
75
|
};
|
|
69
76
|
|
|
70
|
-
const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(
|
|
71
|
-
prevProps: InputReplyStateHeaderPropsWithContext<StreamChatGenerics>,
|
|
72
|
-
nextProps: InputReplyStateHeaderPropsWithContext<StreamChatGenerics>,
|
|
73
|
-
) => {
|
|
74
|
-
const { disabled: prevDisabled } = prevProps;
|
|
75
|
-
const { disabled: nextDisabled } = nextProps;
|
|
76
|
-
|
|
77
|
-
const disabledEqual = prevDisabled === nextDisabled;
|
|
78
|
-
if (!disabledEqual) return false;
|
|
79
|
-
|
|
80
|
-
return true;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const MemoizedInputReplyStateHeader = React.memo(
|
|
84
|
-
InputReplyStateHeaderWithContext,
|
|
85
|
-
areEqual,
|
|
86
|
-
) as typeof InputReplyStateHeaderWithContext;
|
|
87
|
-
|
|
88
|
-
export type InputReplyStateHeaderProps<
|
|
89
|
-
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
90
|
-
> = Partial<InputReplyStateHeaderPropsWithContext<StreamChatGenerics>>;
|
|
91
|
-
|
|
92
|
-
export const InputReplyStateHeader = <
|
|
93
|
-
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
94
|
-
>(
|
|
95
|
-
props: InputReplyStateHeaderProps<StreamChatGenerics>,
|
|
96
|
-
) => {
|
|
97
|
-
const { clearQuotedMessageState, resetInput } = useMessageInputContext<StreamChatGenerics>();
|
|
98
|
-
|
|
99
|
-
return <MemoizedInputReplyStateHeader {...{ clearQuotedMessageState, resetInput }} {...props} />;
|
|
100
|
-
};
|
|
101
|
-
|
|
102
77
|
InputReplyStateHeader.displayName = 'ReplyStateHeader{messageInput}';
|
|
@@ -1102,7 +1102,7 @@ const MessageListWithContext = <
|
|
|
1102
1102
|
{/* Don't show the empty list indicator for Thread messages */}
|
|
1103
1103
|
{processedMessageList.length === 0 && !thread ? (
|
|
1104
1104
|
<View style={[styles.flex, { backgroundColor: white_snow }]} testID='empty-state'>
|
|
1105
|
-
<EmptyStateIndicator listType='message' />
|
|
1105
|
+
{EmptyStateIndicator ? <EmptyStateIndicator listType='message' /> : null}
|
|
1106
1106
|
</View>
|
|
1107
1107
|
) : (
|
|
1108
1108
|
<FlatList
|
|
@@ -1682,7 +1682,7 @@ exports[`Thread should match thread snapshot 1`] = `
|
|
|
1682
1682
|
{
|
|
1683
1683
|
"busy": undefined,
|
|
1684
1684
|
"checked": undefined,
|
|
1685
|
-
"disabled":
|
|
1685
|
+
"disabled": undefined,
|
|
1686
1686
|
"expanded": undefined,
|
|
1687
1687
|
"selected": undefined,
|
|
1688
1688
|
}
|
|
@@ -1778,7 +1778,7 @@ exports[`Thread should match thread snapshot 1`] = `
|
|
|
1778
1778
|
{
|
|
1779
1779
|
"busy": undefined,
|
|
1780
1780
|
"checked": undefined,
|
|
1781
|
-
"disabled":
|
|
1781
|
+
"disabled": undefined,
|
|
1782
1782
|
"expanded": undefined,
|
|
1783
1783
|
"selected": undefined,
|
|
1784
1784
|
}
|
|
@@ -110,7 +110,7 @@ export type MessageContextValue<
|
|
|
110
110
|
preventPress?: boolean;
|
|
111
111
|
/** Whether or not the avatar show show next to Message */
|
|
112
112
|
showAvatar?: boolean;
|
|
113
|
-
} & Pick<ChannelContextValue<StreamChatGenerics>, 'channel' | '
|
|
113
|
+
} & Pick<ChannelContextValue<StreamChatGenerics>, 'channel' | 'members'>;
|
|
114
114
|
|
|
115
115
|
export const MessageContext = React.createContext(
|
|
116
116
|
DEFAULT_BASE_CONTEXT_VALUE as MessageContextValue,
|
|
@@ -219,7 +219,7 @@ export type LocalMessageInputContext<
|
|
|
219
219
|
|
|
220
220
|
export type InputMessageInputContextValue<
|
|
221
221
|
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
222
|
-
> =
|
|
222
|
+
> = {
|
|
223
223
|
/**
|
|
224
224
|
* Controls how many pixels to the top side the user has to scroll in order to lock the recording view and allow the user to lift their finger from the screen without stopping the recording.
|
|
225
225
|
*/
|
|
@@ -241,7 +241,7 @@ export type InputMessageInputContextValue<
|
|
|
241
241
|
*
|
|
242
242
|
* Defaults to and accepts same props as: [AttachButton](https://getstream.io/chat/docs/sdk/reactnative/ui-components/attach-button/)
|
|
243
243
|
*/
|
|
244
|
-
AttachButton: React.ComponentType<AttachButtonProps
|
|
244
|
+
AttachButton: React.ComponentType<AttachButtonProps>;
|
|
245
245
|
/**
|
|
246
246
|
* Custom UI component for audio attachment upload preview.
|
|
247
247
|
*
|
|
@@ -329,7 +329,7 @@ export type InputMessageInputContextValue<
|
|
|
329
329
|
*
|
|
330
330
|
* Defaults to and accepts same props as: [MoreOptionsButton](https://getstream.io/chat/docs/sdk/reactnative/ui-components/more-options-button/)
|
|
331
331
|
*/
|
|
332
|
-
MoreOptionsButton: React.ComponentType<MoreOptionsButtonProps
|
|
332
|
+
MoreOptionsButton: React.ComponentType<MoreOptionsButtonProps>;
|
|
333
333
|
/** Limit on the number of lines in the text input before scrolling */
|
|
334
334
|
numberOfLines: number;
|
|
335
335
|
quotedMessage: boolean | MessageType<StreamChatGenerics>;
|
|
@@ -31,7 +31,6 @@ export const useCreateMessageInputContext = <
|
|
|
31
31
|
compressImageQuality,
|
|
32
32
|
cooldownEndsAt,
|
|
33
33
|
CooldownTimer,
|
|
34
|
-
disabled,
|
|
35
34
|
doDocUploadRequest,
|
|
36
35
|
doImageUploadRequest,
|
|
37
36
|
editing,
|
|
@@ -151,7 +150,6 @@ export const useCreateMessageInputContext = <
|
|
|
151
150
|
compressImageQuality,
|
|
152
151
|
cooldownEndsAt,
|
|
153
152
|
CooldownTimer,
|
|
154
|
-
disabled,
|
|
155
153
|
doDocUploadRequest,
|
|
156
154
|
doImageUploadRequest,
|
|
157
155
|
editing,
|
|
@@ -231,7 +229,6 @@ export const useCreateMessageInputContext = <
|
|
|
231
229
|
asyncIdsLength,
|
|
232
230
|
asyncUploadsValue,
|
|
233
231
|
cooldownEndsAt,
|
|
234
|
-
disabled,
|
|
235
232
|
editingdep,
|
|
236
233
|
fileUploadsValue,
|
|
237
234
|
giphyActive,
|