Skip to content

Commit 2892a3b

Browse files
perf: separate composer ctxs and optimize usage (#3112)
* perf: abstract away composer api and usage * fix: remove props inport and remove comments --------- Co-authored-by: Khushal Agarwal <[email protected]>
1 parent fe8c6d1 commit 2892a3b

File tree

16 files changed

+153
-92
lines changed

16 files changed

+153
-92
lines changed

package/src/components/Channel/Channel.tsx

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,6 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
721721
},
722722
} = useTheme();
723723
const [deleted, setDeleted] = useState<boolean>(false);
724-
const [editing, setEditing] = useState<LocalMessage | undefined>(undefined);
725724
const [error, setError] = useState<Error | boolean>(false);
726725
const [lastRead, setLastRead] = useState<Date | undefined>();
727726
const [thread, setThread] = useState<LocalMessage | null>(threadProps || null);
@@ -1456,14 +1455,6 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
14561455
: client.updateMessage(localMessage, undefined, options),
14571456
);
14581457

1459-
const setEditingState: MessagesContextValue['setEditingState'] = useStableCallback((message) => {
1460-
setEditing(message);
1461-
});
1462-
1463-
const clearEditingState: InputMessageInputContextValue['clearEditingState'] = useStableCallback(
1464-
() => setEditing(undefined),
1465-
);
1466-
14671458
/**
14681459
* Removes the message from local state
14691460
*/
@@ -1766,15 +1757,13 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
17661757
AutoCompleteSuggestionList,
17671758
CameraSelectorIcon,
17681759
channelId,
1769-
clearEditingState,
17701760
CommandInput,
17711761
CommandsButton,
17721762
compressImageQuality,
17731763
CooldownTimer,
17741764
CreatePollContent,
17751765
CreatePollIcon,
17761766
doFileUploadRequest,
1777-
editing,
17781767
editMessage,
17791768
FileAttachmentUploadPreview,
17801769
FileSelectorIcon,
@@ -1915,7 +1904,6 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
19151904
ScrollToBottomButton,
19161905
selectReaction,
19171906
sendReaction,
1918-
setEditingState,
19191907
shouldShowUnreadUnderlay,
19201908
StreamingMessageView,
19211909
supportedReactions,
@@ -1947,8 +1935,8 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
19471935
});
19481936

19491937
const messageComposerContext = useMemo(
1950-
() => ({ channel, editing, thread, threadInstance }),
1951-
[channel, editing, thread, threadInstance],
1938+
() => ({ channel, thread, threadInstance }),
1939+
[channel, thread, threadInstance],
19521940
);
19531941

19541942
// TODO: replace the null view with appropriate message. Currently this is waiting a design decision.

package/src/components/Channel/hooks/useCreateInputMessageInputContext.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ export const useCreateInputMessageInputContext = ({
2626
AutoCompleteSuggestionItem,
2727
AutoCompleteSuggestionList,
2828
channelId,
29-
clearEditingState,
3029
CameraSelectorIcon,
3130
CommandInput,
3231
CommandsButton,
@@ -35,7 +34,6 @@ export const useCreateInputMessageInputContext = ({
3534
CreatePollContent,
3635
CreatePollIcon,
3736
doFileUploadRequest,
38-
editing,
3937
editMessage,
4038
FileAttachmentUploadPreview,
4139
FileSelectorIcon,
@@ -72,8 +70,6 @@ export const useCreateInputMessageInputContext = ({
7270
*/
7371
channelId?: string;
7472
}) => {
75-
const editingDep = editing ? editing.id : '';
76-
7773
const inputMessageInputContext: InputMessageInputContextValue = useMemo(
7874
() => ({
7975
additionalTextInputProps,
@@ -99,15 +95,13 @@ export const useCreateInputMessageInputContext = ({
9995
AutoCompleteSuggestionItem,
10096
AutoCompleteSuggestionList,
10197
CameraSelectorIcon,
102-
clearEditingState,
10398
CommandInput,
10499
CommandsButton,
105100
compressImageQuality,
106101
CooldownTimer,
107102
CreatePollContent,
108103
CreatePollIcon,
109104
doFileUploadRequest,
110-
editing,
111105
editMessage,
112106
FileAttachmentUploadPreview,
113107
FileSelectorIcon,
@@ -140,7 +134,7 @@ export const useCreateInputMessageInputContext = ({
140134
VideoRecorderSelectorIcon,
141135
}),
142136
// eslint-disable-next-line react-hooks/exhaustive-deps
143-
[compressImageQuality, channelId, editingDep, CreatePollContent, showPollCreationDialog],
137+
[compressImageQuality, channelId, CreatePollContent, showPollCreationDialog],
144138
);
145139

146140
return inputMessageInputContext;

package/src/components/Channel/hooks/useCreateMessagesContext.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ export const useCreateMessagesContext = ({
9696
ScrollToBottomButton,
9797
selectReaction,
9898
sendReaction,
99-
setEditingState,
10099
shouldShowUnreadUnderlay,
101100
StreamingMessageView,
102101
supportedReactions,
@@ -212,7 +211,6 @@ export const useCreateMessagesContext = ({
212211
ScrollToBottomButton,
213212
selectReaction,
214213
sendReaction,
215-
setEditingState,
216214
shouldShowUnreadUnderlay,
217215
StreamingMessageView,
218216
supportedReactions,

package/src/components/Message/Message.tsx

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { useMessageActions } from './hooks/useMessageActions';
99
import { useProcessReactions } from './hooks/useProcessReactions';
1010
import { messageActions as defaultMessageActions } from './utils/messageActions';
1111

12-
import { useMessageComposer } from '../../contexts';
1312
import {
1413
ChannelContextValue,
1514
useChannelContext,
@@ -19,6 +18,10 @@ import {
1918
KeyboardContextValue,
2019
useKeyboardContext,
2120
} from '../../contexts/keyboardContext/KeyboardContext';
21+
import {
22+
MessageComposerAPIContextValue,
23+
useMessageComposerAPIContext,
24+
} from '../../contexts/messageComposerContext/MessageComposerAPIContext';
2225
import { MessageContextValue, MessageProvider } from '../../contexts/messageContext/MessageContext';
2326
import {
2427
MessagesContextValue,
@@ -32,7 +35,6 @@ import {
3235
useTranslationContext,
3336
} from '../../contexts/translationContext/TranslationContext';
3437

35-
import { useStableCallback } from '../../hooks';
3638
import { isVideoPlayerAvailable, NativeHandlers } from '../../native';
3739
import { FileTypes } from '../../types/types';
3840
import {
@@ -143,10 +145,7 @@ export type MessagePropsWithContext = Pick<
143145
'groupStyles' | 'handleReaction' | 'message' | 'isMessageAIGenerated' | 'readBy'
144146
>
145147
> &
146-
Pick<
147-
MessageContextValue,
148-
'groupStyles' | 'message' | 'isMessageAIGenerated' | 'readBy' | 'setQuotedMessage'
149-
> &
148+
Pick<MessageContextValue, 'groupStyles' | 'message' | 'isMessageAIGenerated' | 'readBy'> &
150149
Pick<
151150
MessagesContextValue,
152151
| 'sendReaction'
@@ -178,7 +177,6 @@ export type MessagePropsWithContext = Pick<
178177
| 'deleteReaction'
179178
| 'retrySendMessage'
180179
| 'selectReaction'
181-
| 'setEditingState'
182180
| 'supportedReactions'
183181
| 'updateMessage'
184182
| 'PollContent'
@@ -201,7 +199,7 @@ export type MessagePropsWithContext = Pick<
201199
onThreadSelect?: (message: LocalMessage) => void;
202200
showUnreadUnderlay?: boolean;
203201
style?: StyleProp<ViewStyle>;
204-
};
202+
} & Pick<MessageComposerAPIContextValue, 'setQuotedMessage' | 'setEditingState'>;
205203

206204
/**
207205
* Since this component doesn't consume `messages` from `MessagesContext`,
@@ -944,10 +942,7 @@ export const Message = (props: MessageProps) => {
944942
const { openThread } = useThreadContext();
945943
const { t } = useTranslationContext();
946944
const readBy = useMemo(() => getReadState(message, read), [message, read]);
947-
const messageComposer = useMessageComposer();
948-
const setQuotedMessage = useStableCallback((message: LocalMessage | null) =>
949-
messageComposer.setQuotedMessage(message),
950-
);
945+
const { setQuotedMessage, setEditingState } = useMessageComposerAPIContext();
951946

952947
return (
953948
<MemoizedMessage
@@ -961,6 +956,7 @@ export const Message = (props: MessageProps) => {
961956
messagesContext,
962957
openThread,
963958
readBy,
959+
setEditingState,
964960
setQuotedMessage,
965961
t,
966962
}}

package/src/components/Message/MessageSimple/MessageBounce.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import React from 'react';
22
import { Alert } from 'react-native';
33

4+
import {
5+
MessageComposerAPIContextValue,
6+
useMessageComposerAPIContext,
7+
} from '../../../contexts/messageComposerContext/MessageComposerAPIContext';
48
import {
59
MessageContextValue,
610
useMessageContext,
@@ -13,11 +17,11 @@ import { useTranslationContext } from '../../../contexts/translationContext/Tran
1317

1418
export type MessageBouncePropsWithContext = Pick<
1519
MessagesContextValue,
16-
'setEditingState' | 'removeMessage' | 'retrySendMessage'
20+
'removeMessage' | 'retrySendMessage'
1721
> &
1822
Pick<MessageContextValue, 'message'> & {
1923
setIsBounceDialogOpen: React.Dispatch<React.SetStateAction<boolean>>;
20-
};
24+
} & Pick<MessageComposerAPIContextValue, 'setEditingState'>;
2125

2226
export const MessageBounceWithContext = (props: MessageBouncePropsWithContext) => {
2327
const { t } = useTranslationContext();
@@ -91,7 +95,8 @@ export type MessageBounceProps = Partial<MessageBouncePropsWithContext> & {
9195

9296
export const MessageBounce = (props: MessageBounceProps) => {
9397
const { message } = useMessageContext();
94-
const { removeMessage, retrySendMessage, setEditingState } = useMessagesContext();
98+
const { removeMessage, retrySendMessage } = useMessagesContext();
99+
const { setEditingState } = useMessageComposerAPIContext();
95100
return (
96101
<MemoizedMessageBounce
97102
{...{

package/src/components/Message/hooks/useMessageActionHandlers.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Alert } from 'react-native';
22

33
import type { ChannelContextValue } from '../../../contexts/channelContext/ChannelContext';
44
import type { ChatContextValue } from '../../../contexts/chatContext/ChatContext';
5+
import { MessageComposerAPIContextValue } from '../../../contexts/messageComposerContext/MessageComposerAPIContext';
56
import type { MessageContextValue } from '../../../contexts/messageContext/MessageContext';
67
import type { MessagesContextValue } from '../../../contexts/messagesContext/MessagesContext';
78

@@ -20,16 +21,12 @@ export const useMessageActionHandlers = ({
2021
setQuotedMessage,
2122
}: Pick<
2223
MessagesContextValue,
23-
| 'sendReaction'
24-
| 'deleteMessage'
25-
| 'deleteReaction'
26-
| 'retrySendMessage'
27-
| 'setEditingState'
28-
| 'supportedReactions'
24+
'sendReaction' | 'deleteMessage' | 'deleteReaction' | 'retrySendMessage' | 'supportedReactions'
2925
> &
3026
Pick<ChannelContextValue, 'channel' | 'enforceUniqueReaction'> &
3127
Pick<ChatContextValue, 'client'> &
32-
Pick<MessageContextValue, 'message' | 'setQuotedMessage'>) => {
28+
Pick<MessageContextValue, 'message'> &
29+
Pick<MessageComposerAPIContextValue, 'setEditingState' | 'setQuotedMessage'>) => {
3330
const { t } = useTranslationContext();
3431
const handleResendMessage = () => retrySendMessage(message);
3532

package/src/components/Message/hooks/useMessageActions.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { useMessageActionHandlers } from './useMessageActionHandlers';
66

77
import type { ChannelContextValue } from '../../../contexts/channelContext/ChannelContext';
88
import type { ChatContextValue } from '../../../contexts/chatContext/ChatContext';
9+
import { MessageComposerAPIContextValue } from '../../../contexts/messageComposerContext/MessageComposerAPIContext';
910
import type { MessageContextValue } from '../../../contexts/messageContext/MessageContext';
1011
import type { MessagesContextValue } from '../../../contexts/messagesContext/MessagesContext';
1112
import { useTheme } from '../../../contexts/themeContext/ThemeContext';
@@ -50,18 +51,17 @@ export type MessageActionsHookProps = Pick<
5051
| 'removeMessage'
5152
| 'deleteReaction'
5253
| 'retrySendMessage'
53-
| 'setEditingState'
5454
| 'selectReaction'
5555
| 'supportedReactions'
5656
| 'updateMessage'
5757
> &
5858
Pick<ChannelContextValue, 'channel' | 'enforceUniqueReaction'> &
5959
Pick<ChatContextValue, 'client'> &
6060
Pick<ThreadContextValue, 'openThread'> &
61-
Pick<MessageContextValue, 'dismissOverlay' | 'message' | 'setQuotedMessage'> &
61+
Pick<MessageContextValue, 'dismissOverlay' | 'message'> &
6262
Pick<TranslationContextValue, 't'> & {
6363
onThreadSelect?: (message: LocalMessage) => void;
64-
};
64+
} & Pick<MessageComposerAPIContextValue, 'setEditingState' | 'setQuotedMessage'>;
6565

6666
export const useMessageActions = ({
6767
channel,

package/src/components/MessageInput/MessageInput.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ import {
3636
useChannelContext,
3737
} from '../../contexts/channelContext/ChannelContext';
3838
import {
39-
MessageComposerContextValue,
40-
useMessageComposerContext,
41-
} from '../../contexts/messageComposerContext/MessageComposerContext';
39+
MessageComposerAPIContextValue,
40+
useMessageComposerAPIContext,
41+
} from '../../contexts/messageComposerContext/MessageComposerAPIContext';
4242
import { useAttachmentManagerState } from '../../contexts/messageInputContext/hooks/useAttachmentManagerState';
4343
import { useMessageComposer } from '../../contexts/messageInputContext/hooks/useMessageComposer';
4444
import { useMessageComposerHasSendableData } from '../../contexts/messageInputContext/hooks/useMessageComposerHasSendableData';
@@ -142,7 +142,6 @@ type MessageInputPropsWithContext = Partial<
142142
| 'AutoCompleteSuggestionList'
143143
| 'cooldownEndsAt'
144144
| 'CooldownTimer'
145-
| 'clearEditingState'
146145
| 'closeAttachmentPicker'
147146
| 'compressImageQuality'
148147
| 'doFileUploadRequest'
@@ -173,7 +172,7 @@ type MessageInputPropsWithContext = Partial<
173172
> &
174173
Pick<MessagesContextValue, 'Reply'> &
175174
Pick<TranslationContextValue, 't'> &
176-
Pick<MessageComposerContextValue, 'editing'>;
175+
Pick<MessageComposerAPIContextValue, 'clearEditingState'> & { editing: boolean };
177176

178177
const textComposerStateSelector = (state: TextComposerState) => ({
179178
command: state.command,
@@ -773,7 +772,6 @@ export const MessageInput = (props: MessageInputProps) => {
773772
const ownCapabilities = useOwnCapabilitiesContext();
774773

775774
const { channel, members, threadList, watchers } = useChannelContext();
776-
const { editing } = useMessageComposerContext();
777775

778776
const {
779777
additionalTextInputProps,
@@ -794,7 +792,6 @@ export const MessageInput = (props: MessageInputProps) => {
794792
AudioRecordingWaveform,
795793
AutoCompleteSuggestionList,
796794
CameraSelectorIcon,
797-
clearEditingState,
798795
closeAttachmentPicker,
799796
closePollCreationDialog,
800797
compressImageQuality,
@@ -826,6 +823,9 @@ export const MessageInput = (props: MessageInputProps) => {
826823
VideoRecorderSelectorIcon,
827824
} = useMessageInputContext();
828825
const { bottomInset, bottomSheetRef, selectedPicker } = useAttachmentPickerContext();
826+
const messageComposer = useMessageComposer();
827+
const editing = !!messageComposer.editedMessage;
828+
const { clearEditingState } = useMessageComposerAPIContext();
829829

830830
const { Reply } = useMessagesContext();
831831

package/src/components/MessageInput/components/InputEditingStateHeader.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import React, { useCallback } from 'react';
22
import { Pressable, StyleSheet, Text, View } from 'react-native';
33

4-
import { useMessageComposer } from '../../../contexts/messageInputContext/hooks/useMessageComposer';
54
import {
6-
MessageInputContextValue,
7-
useMessageInputContext,
8-
} from '../../../contexts/messageInputContext/MessageInputContext';
5+
MessageComposerAPIContextValue,
6+
useMessageComposerAPIContext,
7+
} from '../../../contexts/messageComposerContext/MessageComposerAPIContext';
8+
import { useMessageComposer } from '../../../contexts/messageInputContext/hooks/useMessageComposer';
99
import { useTheme } from '../../../contexts/themeContext/ThemeContext';
1010
import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
1111

1212
import { CircleClose, Edit } from '../../../icons';
1313

1414
export type InputEditingStateHeaderProps = Partial<
15-
Pick<MessageInputContextValue, 'clearEditingState'>
15+
Pick<MessageComposerAPIContextValue, 'clearEditingState'>
1616
>;
1717

1818
export const InputEditingStateHeader = ({
1919
clearEditingState: propClearEditingState,
2020
}: InputEditingStateHeaderProps) => {
2121
const messageComposer = useMessageComposer();
2222
const { t } = useTranslationContext();
23-
const { clearEditingState: contextClearEditingState } = useMessageInputContext();
23+
const { clearEditingState: contextClearEditingState } = useMessageComposerAPIContext();
2424

2525
const clearEditingState = propClearEditingState || contextClearEditingState;
2626

0 commit comments

Comments
 (0)