) => {
const idx = evt.currentTarget.getAttribute("data-index")
if (idx) {
onSelect(+idx)
setAutocomplete(null)
}
})
useEffect(() => {
if (params.selected !== undefined) {
onSelect(params.selected)
if (params.close) {
setAutocomplete(null)
}
}
}, [onSelect, setAutocomplete, params.selected, params.close])
const selected = params.selected !== undefined ? positiveMod(params.selected, items.length) : -1
return
{items.map((item, i) =>
{render(item)}
)}
}
const emojiFuncs = {
getText: (emoji: Emoji) => emojiToMarkdown(emoji),
getKey: (emoji: Emoji) => `${emoji.c}-${emoji.u}`,
render: (emoji: Emoji) => <>{emoji.u.startsWith("mxc://")
?
: emoji.u
} :{emoji.n}:>,
}
export const EmojiAutocompleter = ({ params, room, ...rest }: AutocompleterProps) => {
const client = use(ClientContext)!
const customEmojiPacks = useCustomEmojis(client.store, room)
const items = useSortedAndFilteredEmojis((params.frozenQuery ?? params.query).slice(1), {
frequentlyUsed: client.store.frequentlyUsedEmoji,
customEmojiPacks,
})
return useAutocompleter({ params, room, ...rest, items, ...emojiFuncs })
}
const escapeDisplayname = (input: string) => escapeMarkdown(input).replace("\n", " ")
const userFuncs = {
getText: (user: AutocompleteUser) =>
`[${escapeDisplayname(user.displayName)}](https://matrix.to/#/${encodeURIComponent(user.userID)}) `,
getKey: (user: AutocompleteUser) => user.userID,
render: (user: AutocompleteUser) => <>
{user.displayName}
>,
}
export const UserAutocompleter = ({ params, room, ...rest }: AutocompleterProps) => {
const items = useFilteredMembers(room, (params.frozenQuery ?? params.query).slice(1))
return useAutocompleter({ params, room, ...rest, items, ...userFuncs })
}
export const RoomAutocompleter = ({ params }: AutocompleterProps) => {
return
Autocomplete {params.type} {params.query}
}