pinafore/routes/_store/observers/autosuggestObservers.js

43 lines
1.5 KiB
JavaScript

import {
searchAccountsByUsername as searchAccountsByUsernameInDatabase
} from '../../_database/accountsAndRelationships'
const SEARCH_RESULTS_LIMIT = 4
const DATABASE_SEARCH_RESULTS_LIMIT = 30
async function searchAccounts (store, searchText) {
searchText = searchText.substring(1)
let { currentInstance } = store.get()
let results = await searchAccountsByUsernameInDatabase(
currentInstance, searchText, DATABASE_SEARCH_RESULTS_LIMIT)
return results.slice(0, SEARCH_RESULTS_LIMIT)
}
function searchEmoji (store, searchText) {
searchText = searchText.toLowerCase().substring(1)
let { currentCustomEmoji } = store.get()
let results = currentCustomEmoji.filter(emoji => emoji.shortcode.toLowerCase().startsWith(searchText))
.sort((a, b) => a.shortcode.toLowerCase() < b.shortcode.toLowerCase() ? -1 : 1)
.slice(0, SEARCH_RESULTS_LIMIT)
return results
}
export function autosuggestObservers (store) {
store.observe('autosuggestSearchText', async autosuggestSearchText => {
let { composeFocused } = store.get()
if (!composeFocused || !autosuggestSearchText) {
return
}
let type = autosuggestSearchText.startsWith('@') ? 'account' : 'emoji'
let results = (type === 'account')
? await searchAccounts(store, autosuggestSearchText)
: await searchEmoji(store, autosuggestSearchText)
store.setForCurrentAutosuggest({
autosuggestSelected: 0,
autosuggestSearchText: autosuggestSearchText,
autosuggestSearchResults: results,
autosuggestType: type
})
})
}