Skip to content

Commit 0241ed1

Browse files
Fixing mentions issue and adding autocompleteSuggestionsLimit prop
1 parent 4021a8a commit 0241ed1

File tree

2 files changed

+49
-23
lines changed

2 files changed

+49
-23
lines changed

src/components/MessageInput/MessageInput.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ export type MessageInputProps<
164164
* Defaults to and accepts same props as: https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/Attachment/FileIcon.tsx
165165
*/
166166
AttachmentFileIcon?: React.ComponentType<FileIconProps>;
167+
/**
168+
* Max number of suggestions to display in list. Defaults to 10.
169+
*/
170+
autocompleteSuggestionsLimit?: number;
167171
/**
168172
* Compress image with quality (from 0 to 1, where 1 is best quality).
169173
* On iOS, values larger than 0.8 don't produce a noticeable quality increase in most images,
@@ -215,6 +219,7 @@ export type MessageInputProps<
215219
ImageUploadPreview?: React.ComponentType<ImageUploadPreviewProps>;
216220
/** Initial value to set on input */
217221
initialValue?: string;
222+
218223
/**
219224
* Custom UI component for AutoCompleteInput.
220225
* Defaults to and accepts same props as: https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/AutoCompleteInput/AutoCompleteInput.tsx
@@ -309,6 +314,7 @@ export const MessageInput = <
309314
hasImagePicker = true,
310315
ImageUploadPreview = ImageUploadPreviewDefault,
311316
initialValue,
317+
autocompleteSuggestionsLimit = 10,
312318
Input,
313319
maxNumberOfFiles = 10,
314320
onChangeText: onChangeTextProp,
@@ -615,6 +621,7 @@ export const MessageInput = <
615621

616622
const triggerSettings = channel
617623
? ACITriggerSettings<At, Ch, Co, Ev, Me, Re, Us>({
624+
autocompleteSuggestionsLimit,
618625
channel,
619626
onMentionSelectItem: onSelectItem,
620627
t,

src/utils/utils.ts

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,20 @@ const getMembersAndWatchers = <
150150
);
151151
};
152152

153+
type QueryMembersFunction = <
154+
At extends UnknownType = DefaultAttachmentType,
155+
Ch extends UnknownType = DefaultChannelType,
156+
Co extends string = DefaultCommandType,
157+
Ev extends UnknownType = DefaultEventType,
158+
Me extends UnknownType = DefaultMessageType,
159+
Re extends UnknownType = DefaultReactionType,
160+
Us extends UnknownType = DefaultUserType
161+
>(
162+
channel: Channel<At, Ch, Co, Ev, Me, Re, Us>,
163+
query: SuggestionUser<Us>['name'],
164+
onReady?: (users: SuggestionUser<Us>[]) => void,
165+
) => Promise<void>;
166+
153167
// TODO: test to see if this function works as it integrated a debounce function
154168
const queryMembers = async <
155169
At extends UnknownType = DefaultAttachmentType,
@@ -164,27 +178,30 @@ const queryMembers = async <
164178
query: SuggestionUser<Us>['name'],
165179
onReady?: (users: SuggestionUser<Us>[]) => void,
166180
): Promise<void> => {
167-
await debounce(
168-
async () => {
169-
if (typeof query === 'string') {
170-
const response = (await ((channel as unknown) as Channel).queryMembers({
171-
name: { $autocomplete: query },
172-
})) as ChannelMemberAPIResponse<Us>;
173-
174-
const users: SuggestionUser<Us>[] = [];
175-
response.members.forEach(
176-
(member) => isUserResponse(member.user) && users.push(member.user),
177-
);
178-
if (onReady && users) {
179-
onReady(users);
180-
}
181-
}
182-
},
183-
200,
184-
{ leading: false, trailing: true },
185-
);
181+
if (typeof query === 'string') {
182+
const response = (await ((channel as unknown) as Channel).queryMembers({
183+
name: { $autocomplete: query },
184+
})) as ChannelMemberAPIResponse<Us>;
185+
186+
const users: SuggestionUser<Us>[] = [];
187+
response.members.forEach(
188+
(member) => isUserResponse(member.user) && users.push(member.user),
189+
);
190+
if (onReady && users) {
191+
onReady(users);
192+
}
193+
}
186194
};
187195

196+
export const queryMembersDebounced = debounce<QueryMembersFunction>(
197+
queryMembers,
198+
200,
199+
{
200+
leading: false,
201+
trailing: true,
202+
},
203+
);
204+
188205
export const isMentionTrigger = (trigger: Trigger): trigger is '@' =>
189206
trigger === '@';
190207

@@ -223,7 +240,7 @@ export type TriggerSettings<
223240
data: SuggestionUser<Us>[],
224241
q: SuggestionUser<Us>['name'],
225242
) => void,
226-
) => SuggestionUser<Us>[] | Promise<void>;
243+
) => SuggestionUser<Us>[] | Promise<void> | void;
227244
output: (
228245
entity: SuggestionUser<Us>,
229246
) => {
@@ -246,6 +263,7 @@ export type ACITriggerSettingsParams<
246263
> = {
247264
channel: Channel<At, Ch, Co, Ev, Me, Re, Us>;
248265
onMentionSelectItem: (item: SuggestionUser<Us>) => void;
266+
autocompleteSuggestionsLimit?: number;
249267
} & Pick<TranslationContextValue, 't'>;
250268

251269
/**
@@ -271,6 +289,7 @@ export const ACITriggerSettings = <
271289
channel,
272290
onMentionSelectItem,
273291
t = (msg: string) => msg,
292+
autocompleteSuggestionsLimit = 10,
274293
}: ACITriggerSettingsParams<At, Ch, Co, Ev, Me, Re, Us>): TriggerSettings<
275294
Co,
276295
Us
@@ -300,7 +319,7 @@ export const ACITriggerSettings = <
300319
return 0;
301320
});
302321

303-
const result = selectedCommands.slice(0, 10);
322+
const result = selectedCommands.slice(0, autocompleteSuggestionsLimit);
304323

305324
if (onReady) {
306325
onReady(result, query);
@@ -343,7 +362,7 @@ export const ACITriggerSettings = <
343362
return false;
344363
});
345364

346-
const data = matchingUsers.slice(0, 10);
365+
const data = matchingUsers.slice(0, autocompleteSuggestionsLimit);
347366

348367
if (onReady) {
349368
onReady(data, query);
@@ -352,7 +371,7 @@ export const ACITriggerSettings = <
352371
return data;
353372
}
354373

355-
return queryMembers(channel, query, (data) => {
374+
return queryMembersDebounced(channel, query, (data) => {
356375
if (onReady) {
357376
onReady(data, query);
358377
}

0 commit comments

Comments
 (0)