import { AutocompleteQuery } from './autocompleteQuery';
import { AutocompleteMenu } from './AutocompleteMenu';
import { useMatrixClient } from '../../../hooks/useMatrixClient';
-import {
- SearchItemStrGetter,
- UseAsyncSearchOptions,
- useAsyncSearch,
-} from '../../../hooks/useAsyncSearch';
+import { UseAsyncSearchOptions, useAsyncSearch } from '../../../hooks/useAsyncSearch';
import { onTabPress } from '../../../utils/keyboard';
import { createEmoticonElement, moveCursor, replaceWithElement } from '../utils';
import { useRecentEmoji } from '../../../hooks/useRecentEmoji';
import { mxcUrlToHttp } from '../../../utils/matrix';
import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication';
import { ImageUsage, PackImageReader } from '../../../plugins/custom-emoji';
+import { getEmoticonSearchStr } from '../../../plugins/utils';
type EmoticonCompleteHandler = (key: string, shortcode: string) => void;
};
const SEARCH_OPTIONS: UseAsyncSearchOptions = {
- limit: 20,
matchOptions: {
contain: true,
},
};
-const getEmoticonStr: SearchItemStrGetter<EmoticonSearchItem> = (emoticon) => [
- `:${emoticon.shortcode}:`,
-];
-
export function EmoticonAutocomplete({
imagePackRooms,
editor,
);
}, [imagePacks]);
- const [result, search, resetSearch] = useAsyncSearch(searchList, getEmoticonStr, SEARCH_OPTIONS);
- const autoCompleteEmoticon = result ? result.items : recentEmoji;
+ const [result, search, resetSearch] = useAsyncSearch(
+ searchList,
+ getEmoticonSearchStr,
+ SEARCH_OPTIONS
+ );
+ const autoCompleteEmoticon = result ? result.items.slice(0, 20) : recentEmoji;
useEffect(() => {
if (query.text) search(query.text);
};
const SEARCH_OPTIONS: UseAsyncSearchOptions = {
- limit: 20,
matchOptions: {
contain: true,
},
SEARCH_OPTIONS
);
- const autoCompleteRoomIds = result ? result.items : allRooms.slice(0, 20);
+ const autoCompleteRoomIds = result ? result.items.slice(0, 20) : allRooms.slice(0, 20);
useEffect(() => {
if (query.text) search(query.text);
member.membership === Membership.Knock;
const SEARCH_OPTIONS: UseAsyncSearchOptions = {
- limit: 20,
+ limit: 1000,
matchOptions: {
contain: true,
},
const members = useRoomMembers(mx, roomId);
const [result, search, resetSearch] = useAsyncSearch(members, getRoomMemberStr, SEARCH_OPTIONS);
- const autoCompleteMembers = (result ? result.items : members.slice(0, 20)).filter(
+ const autoCompleteMembers = (result ? result.items.slice(0, 20) : members.slice(0, 20)).filter(
withAllowedMembership
);
import { mobileOrTablet } from '../../utils/user-agent';
import { useMediaAuthentication } from '../../hooks/useMediaAuthentication';
import { ImagePack, ImageUsage, PackImageReader } from '../../plugins/custom-emoji';
+import { getEmoticonSearchStr } from '../../plugins/utils';
const RECENT_GROUP_ID = 'recent_group';
const SEARCH_GROUP_ID = 'search_group';
)
);
-const getSearchListItemStr = (item: PackImageReader | IEmoji) => {
- const shortcode = `:${item.shortcode}:`;
- if ('body' in item) {
- return [shortcode, item.body ?? ''];
- }
- return shortcode;
-};
const SEARCH_OPTIONS: UseAsyncSearchOptions = {
- limit: 26,
+ limit: 1000,
matchOptions: {
contain: true,
},
const [result, search, resetSearch] = useAsyncSearch(
searchList,
- getSearchListItemStr,
+ getEmoticonSearchStr,
SEARCH_OPTIONS
);
+ const searchedItems = result?.items.slice(0, 100);
+
const handleOnChange: ChangeEventHandler<HTMLInputElement> = useDebounce(
useCallback(
(evt) => {
direction="Column"
gap="200"
>
- {result && (
+ {searchedItems && (
<SearchEmojiGroup
mx={mx}
tab={tab}
id={SEARCH_GROUP_ID}
- label={result.items.length ? 'Search Results' : 'No Results found'}
- emojis={result.items}
+ label={searchedItems.length ? 'Search Results' : 'No Results found'}
+ emojis={searchedItems}
useAuthentication={useAuthentication}
/>
)}
};
const SEARCH_OPTIONS: UseAsyncSearchOptions = {
- limit: 100,
+ limit: 1000,
matchOptions: {
contain: true,
},
}}
after={<Icon size="50" src={Icons.Cross} />}
>
- <Text size="B300">{`${result.items.length || 'No'} ${result.items.length === 1 ? 'Result' : 'Results'
- }`}</Text>
+ <Text size="B300">{`${result.items.length || 'No'} ${
+ result.items.length === 1 ? 'Result' : 'Results'
+ }`}</Text>
</Chip>
)
}
const member = tagOrMember;
const name = getName(member);
const avatarMxcUrl = member.getMxcAvatarUrl();
- const avatarUrl = avatarMxcUrl ? mx.mxcUrlToHttp(
- avatarMxcUrl,
- 100,
- 100,
- 'crop',
- undefined,
- false,
- useAuthentication
- ) : undefined;
+ const avatarUrl = avatarMxcUrl
+ ? mx.mxcUrlToHttp(
+ avatarMxcUrl,
+ 100,
+ 100,
+ 'crop',
+ undefined,
+ false,
+ useAuthentication
+ )
+ : undefined;
return (
<MenuItem
--- /dev/null
+import { SearchItemStrGetter } from '../hooks/useAsyncSearch';
+import { PackImageReader } from './custom-emoji';
+import { IEmoji } from './emoji';
+
+export const getEmoticonSearchStr: SearchItemStrGetter<PackImageReader | IEmoji> = (item) => {
+ const shortcode = `:${item.shortcode}:`;
+ if (item instanceof PackImageReader) {
+ if (item.body) {
+ return [shortcode, item.body];
+ }
+ return shortcode;
+ }
+
+ const names = [shortcode, item.label];
+ if (Array.isArray(item.shortcodes)) {
+ return names.concat(item.shortcodes);
+ }
+ return names;
+};