Skip to content

Commit c755738

Browse files
committed
perf: memoize the suggestions context value
1 parent e9f7c21 commit c755738

File tree

2 files changed

+40
-19
lines changed

2 files changed

+40
-19
lines changed

package/src/components/Channel/Channel.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,11 +1951,13 @@ const ChannelWithContext = <
19511951
VideoThumbnail,
19521952
});
19531953

1954-
const suggestionsContext = {
1955-
AutoCompleteSuggestionHeader,
1956-
AutoCompleteSuggestionItem,
1957-
AutoCompleteSuggestionList,
1958-
};
1954+
const suggestionsContext = useMemo(() => {
1955+
return {
1956+
AutoCompleteSuggestionHeader,
1957+
AutoCompleteSuggestionItem,
1958+
AutoCompleteSuggestionList,
1959+
};
1960+
}, [AutoCompleteSuggestionHeader, AutoCompleteSuggestionItem, AutoCompleteSuggestionList]);
19591961

19601962
const threadContext = useCreateThreadContext({
19611963
allowThreadMessagesInChannel,

package/src/contexts/suggestionsContext/SuggestionsContext.tsx

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { PropsWithChildren, useContext, useState } from 'react';
1+
import React, { PropsWithChildren, useCallback, useContext, useMemo, useState } from 'react';
22

33
import type { CommandResponse, UserResponse } from 'stream-chat';
44

@@ -95,35 +95,54 @@ export const SuggestionsProvider = <
9595
children,
9696
value,
9797
}: PropsWithChildren<{ value?: Partial<SuggestionsContextValue<StreamChatGenerics>> }>) => {
98+
const { AutoCompleteSuggestionHeader, AutoCompleteSuggestionItem, AutoCompleteSuggestionList } =
99+
value ?? {};
98100
const [triggerType, setTriggerType] = useState<SuggestionComponentType | null>(null);
99101
const [suggestions, setSuggestions] = useState<Suggestions<StreamChatGenerics>>();
100102
const [suggestionsViewActive, setSuggestionsViewActive] = useState(false);
101103

102-
const openSuggestions = (component: SuggestionComponentType) => {
104+
const openSuggestions = useCallback((component: SuggestionComponentType) => {
103105
setTriggerType(component);
104106
setSuggestionsViewActive(true);
105-
};
106-
107-
const updateSuggestions = (newSuggestions: Suggestions<StreamChatGenerics>) => {
108-
setSuggestions(newSuggestions);
109-
setSuggestionsViewActive(!!triggerType);
110-
};
107+
}, []);
108+
109+
const updateSuggestions = useCallback(
110+
(newSuggestions: Suggestions<StreamChatGenerics>) => {
111+
setSuggestions(newSuggestions);
112+
setSuggestionsViewActive(!!triggerType);
113+
},
114+
[triggerType],
115+
);
111116

112-
const closeSuggestions = () => {
117+
const closeSuggestions = useCallback(() => {
113118
setTriggerType(null);
114119
setSuggestions(undefined);
115120
setSuggestionsViewActive(false);
116-
};
117-
118-
const suggestionsContext = {
119-
...value,
121+
}, []);
122+
123+
const suggestionsContext = useMemo(() => {
124+
return {
125+
AutoCompleteSuggestionHeader,
126+
AutoCompleteSuggestionItem,
127+
AutoCompleteSuggestionList,
128+
closeSuggestions,
129+
openSuggestions,
130+
suggestions,
131+
suggestionsViewActive,
132+
triggerType,
133+
updateSuggestions,
134+
};
135+
}, [
136+
AutoCompleteSuggestionHeader,
137+
AutoCompleteSuggestionItem,
138+
AutoCompleteSuggestionList,
120139
closeSuggestions,
121140
openSuggestions,
122141
suggestions,
123142
suggestionsViewActive,
124143
triggerType,
125144
updateSuggestions,
126-
};
145+
]);
127146

128147
return (
129148
<SuggestionsContext.Provider value={suggestionsContext as unknown as SuggestionsContextValue}>

0 commit comments

Comments
 (0)